diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 85af15abca..4c9e2d3b01 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,4 +1,3 @@ - FROM us-docker.pkg.dev/elide-fw/tools/codespace:latest ENTRYPOINT ["/usr/local/share/docker-init.sh"] CMD ["sleep", "infinity"] diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index f2f3ec2f53..29266b1b95 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -8,10 +8,7 @@ "java.debug.settings.enableRunDebugCodeLens": true, "java.test.editor.enableShortcuts": true }, - "runArgs": [ - "--init", - "--privileged" - ], + "runArgs": ["--init", "--privileged"], "overrideCommand": false, "extensions": [ "asf.apache-netbeans-java", diff --git a/.editorconfig b/.editorconfig index 8bb2049083..660b8512bf 100644 --- a/.editorconfig +++ b/.editorconfig @@ -16,5 +16,8 @@ indent_size = 2 [*.{kt,kts}] disabled_rules = indent,experimental:argument-list-wrapping,no-wildcard-imports +[packages/proto/build/generated/source/proto] +disabled_rules = indent,experimental:spacing-between-declarations-with-annotations,parameter-list-wrapping,no-wildcard-imports,experimental:spacing-between-declarations-with-comments,experimental:argument-list-wrapping,comment-spacing,no-semi,no-consecutive-blank-lines,no-blank-line-before-rbrace,curly-spacing + [tools/plugin/gradle-plugin/plugin-build/plugin/src/model/**/*.*] disabled_rules = indent,experimental:spacing-between-declarations-with-annotations,parameter-list-wrapping,no-wildcard-imports,experimental:spacing-between-declarations-with-comments,experimental:argument-list-wrapping,comment-spacing,no-semi,no-consecutive-blank-lines,no-blank-line-before-rbrace,curly-spacing diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index f8fcc748bb..e84bec6a2a 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -*.* @sgammon \ No newline at end of file +*.* @sgammon diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md index 705a849a70..b8e7b7bc22 100644 --- a/.github/CODE_OF_CONDUCT.md +++ b/.github/CODE_OF_CONDUCT.md @@ -1,3 +1 @@ - **Coming soon.** - diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index fead12c042..42ad125474 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,5 +1,3 @@ - ## Pull Request Template **Coming soon.** - diff --git a/.github/SECURITY.md b/.github/SECURITY.md index 705a849a70..b8e7b7bc22 100644 --- a/.github/SECURITY.md +++ b/.github/SECURITY.md @@ -1,3 +1 @@ - **Coming soon.** - diff --git a/.github/codeql/codeql-config.yml b/.github/codeql/codeql-config.yml new file mode 100644 index 0000000000..3f78f53bba --- /dev/null +++ b/.github/codeql/codeql-config.yml @@ -0,0 +1,18 @@ +name: "CodeQL" + +languages: java, javascript + +queries: + - uses: security-and-quality + +packs: + - codeql/java-queries + +paths: + - packages + +paths-ignore: + - node_modules + - build + - samples + - tools/plugin diff --git a/.github/dependency-review-config.yml b/.github/dependency-review-config.yml new file mode 100644 index 0000000000..e3cef798f3 --- /dev/null +++ b/.github/dependency-review-config.yml @@ -0,0 +1,11 @@ +license-check: true +vulnerability-check: true +fail-on-severity: "high" + +allow-ghsas: + ## Allow `node-fetch`, because it is unused in actual outputs made by this library. + - "GHSA-r683-j2x4-v87g" + - "GHSA-w7rc-rwvf-8q5r" + + ## Allow `jszip`, because we do not use it in the browser. + - "GHSA-jg8v-48h5-wgxg" diff --git a/.github/labeler.yml b/.github/labeler.yml index 79e40d480a..eec5b32076 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,11 +1,11 @@ frontend: - - any: ['graalvm*/**/*'] - all: ['module:graalvm'] - - any: ['frontend/**/*'] - all: ['module:frontend'] - - any: ['rpc/**/*'] - all: ['module:rpc'] - - any: ['server/**/*'] - all: ['module:server'] - - any: ['base/**/*'] - all: ['module:base'] + - any: ["graalvm*/**/*"] + all: ["module:graalvm"] + - any: ["frontend/**/*"] + all: ["module:frontend"] + - any: ["rpc/**/*"] + all: ["module:rpc"] + - any: ["server/**/*"] + all: ["module:server"] + - any: ["base/**/*"] + all: ["module:base"] diff --git a/renovate.json b/.github/renovate.json similarity index 87% rename from renovate.json rename to .github/renovate.json index f5cb089520..e35c8386a7 100644 --- a/renovate.json +++ b/.github/renovate.json @@ -1,8 +1,6 @@ { "enabled": true, - "extends": [ - "config:base" - ], + "extends": ["config:base"], "enabledManagers": [ "bazel", "cloudbuild", @@ -17,9 +15,7 @@ "gradle", "gradle-wrapper" ], - "baseBranches": [ - "v3" - ], + "baseBranches": ["v3"], "pinDigests": true, "rangeStrategy": "pin", "updateLockFiles": true, @@ -43,7 +39,5 @@ "groupName": "Firebase" } ], - "postUpdateOptions": [ - "yarnDedupeHighest" - ] + "postUpdateOptions": ["yarnDedupeHighest"] } diff --git a/.github/workflows/build.ci.yml b/.github/workflows/build.ci.yml index 70c3f2a761..211cb86f9b 100644 --- a/.github/workflows/build.ci.yml +++ b/.github/workflows/build.ci.yml @@ -15,85 +15,125 @@ env: GRADLE_CACHE_PUSH: true jobs: + ## + ## Job: Dependency Review + ## + dependency-review: + name: "Dependency Review" + runs-on: "ubuntu-latest" + permissions: + contents: "read" + id-token: "write" + checks: "write" + pull-requests: "write" + steps: + - name: "Setup: Checkout" + uses: "actions/checkout@v3" + - name: "Patch: Neutralize Yarn Lock" + run: mv kotlin-js-store/yarn.lock kotlin-js-store/yarn.inert + - name: "Dependency Review" + uses: "actions/dependency-review-action@v3" + continue-on-error: true + with: + config-file: "./.github/dependency-review-config.yml" + license-check: true + vulnerability-check: true + fail-on-severity: "low" + - name: "Patch: Restore Yarn Lock" + run: mv kotlin-js-store/yarn.inert kotlin-js-store/yarn.lock + ## ## Job: Library Build ## gradle: strategy: + fail-fast: false matrix: - os: [ubuntu-latest] + os: [ubuntu] experimental: [false] gu-binary: [gu] java: [17] - gvm: [latest] include: - - os: ubuntu-latest + - os: ubuntu experimental: false gu-binary: gu java: 11 - gvm: latest - - os: macos-latest - experimental: true + - os: macos + experimental: false gu-binary: gu java: 17 - gvm: latest - - os: macos-latest - experimental: true + - os: macos + experimental: false gu-binary: gu java: 11 - gvm: latest - - os: windows-latest - experimental: true - gu-binary: gu.cmd - java: 17 - gvm: latest - - os: windows-latest - experimental: true - gu-binary: gu.cmd - java: 11 - gvm: latest - runs-on: ${{ matrix.os }} + name: "Build" + runs-on: ${{ matrix.os }}-latest continue-on-error: ${{ matrix.experimental }} permissions: - contents: 'read' - id-token: 'write' - checks: 'write' - pull-requests: 'write' + contents: "read" + actions: "read" + id-token: "write" + checks: "write" + pull-requests: "write" + security-events: "write" defaults: run: shell: bash steps: + ## Setup: Checkout Code + - name: "Setup: Checkout" + uses: actions/checkout@v3 + ## Setup: GraalVM - - uses: graalvm/setup-graalvm@v1 + - name: "Setup: GraalVM" + uses: graalvm/setup-graalvm@v1 with: - components: 'native-image' - version: ${{ matrix.gvm }} + components: "native-image,js" + version: latest java-version: ${{ matrix.java }} github-token: ${{ secrets.GITHUB_TOKEN }} - ## Setup: Checkout Code - - uses: actions/checkout@v3 + ## Setup: Node + - name: "Setup: Node" + uses: actions/setup-node@v3 + with: + node-version: 18 + cache: "yarn" + + ## Setup: Run Yarn + - name: "Setup: Yarn" + run: yarn + + ## Setup: GCloud Auth + - id: "auth" + name: "Setup: Authorize Service Account" + uses: "google-github-actions/auth@v1" + with: + credentials_json: "${{ secrets.BUILDBOT_SERVICE_ACCOUNT }}" + create_credentials_file: true + export_environment_variables: true + cleanup_credentials: true ## CI: Build - name: "🛠️ Build" - uses: gradle/gradle-build-action@v2 + uses: gradle/gradle-build-action@v2.3.3 id: gradlebuild continue-on-error: ${{ matrix.experimental }} env: CI: true with: - cache-read-only: ${{ matrix.os != 'ubuntu-latest' }} + cache-read-only: false arguments: | assemble --scan --dependency-verification=lenient -Pelide.ci=true - -PbuildSamples=true + -PbuildSamples=false -Pversions.java.language=${{ matrix.java }} ## CI: Build @@ -101,51 +141,105 @@ jobs: if: failure() uses: actions/upload-artifact@v3 with: - name: build-reports-${{ matrix.os }}-java${{ matrix.java }}-gvm-${{ matrix.gvm }} + name: build-reports-${{ matrix.os }}-latest-java${{ matrix.java }}-gvm-latest path: | build/reports/**/*.* + ## Run Detekt + - name: "Run: Detekt" + if: ${{ matrix.os == 'ubuntu' && matrix.java == '17' }} + run: ./gradlew detekt -Pelide.ci=true -PbuildSamples=false -Pversions.java.language=${{ matrix.java }} + continue-on-error: true + + ## Upload SARIF to GitHub. + - name: "Report: SARIF" + if: ${{ matrix.os == 'ubuntu' && matrix.java == '17' }} + uses: github/codeql-action/upload-sarif@v2 + with: + sarif_file: ./build/reports/detekt/elide.sarif + category: detekt + ## ## Job: Testsuite (JVM) ## tests-jvm: - runs-on: buildjet-4vcpu-ubuntu-2004 + name: "Tests: JVM" + runs-on: ubuntu-latest continue-on-error: true + needs: [dependency-review, gradle] + permissions: - contents: 'read' - id-token: 'write' - checks: 'write' - pull-requests: 'write' + contents: "read" + id-token: "write" + checks: "write" + pull-requests: "write" + steps: ## Setup: Checkout Code - - uses: actions/checkout@v3 + - name: "Setup: Checkout" + uses: actions/checkout@v3 + + ## Setup: Expand Git History + - name: "Setup: Git History" + run: git fetch --unshallow || exit 0 ## Setup: GraalVM - - uses: graalvm/setup-graalvm@v1 + - name: "Setup: GraalVM" + uses: graalvm/setup-graalvm@v1 with: - components: 'native-image' + components: "native-image,js" version: latest java-version: 17 github-token: ${{ secrets.GITHUB_TOKEN }} + ## Setup: GCloud Auth + - id: "auth" + name: "Setup: Authorize Service Account" + uses: "google-github-actions/auth@v1" + with: + credentials_json: "${{ secrets.BUILDBOT_SERVICE_ACCOUNT }}" + create_credentials_file: true + export_environment_variables: true + cleanup_credentials: true + + ## Setup: Node + - name: "Setup: Node" + uses: actions/setup-node@v3 + with: + node-version: 16 + cache: "yarn" + + ## Setup: Run Yarn + - name: "Setup: Yarn" + run: yarn + ## Run JVM Tests - name: "Run Tests (JVM)" - uses: gradle/gradle-build-action@v2 + uses: gradle/gradle-build-action@v2.3.3 + env: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} with: cache-read-only: false arguments: | + build test + check jacocoTestReport - --scan - --dependency-verification=strict + koverMergedHtmlReport + koverMergedXmlReport + koverMergedReport :tools:reports:reports + sonar + --scan + --warning-mode=none + --dependency-verification=lenient -Pelide.ci=true -PbuildSamples=true + -PbuildDocs=false -Pversions.java.language=17 + -x nativeTest + -x testNativeImage -x nativeCompile - -x :packages:graalvm:test - -x :packages:graalvm-js:test - -x :packages:graalvm-react:test ## Collect Reports - uses: actions/upload-artifact@v3 @@ -155,22 +249,24 @@ jobs: **/build/reports/jacoco/test/jacocoTestReport.xml **/build/reports/jacoco/testCodeCoverageReport/jacocoTestReport.xml **/build/reports/jacoco/testCodeCoverageReport/testCodeCoverageReport.xml + build/reports/kover/merged/html/**/*.* tools/reports/build/reports/**/*.xml tools/reports/build/test-results/**/*.xml ## Annotate test results - - name: Annotate test results + - name: "Annotate: Test Results" uses: elide-tools/action-junit-report@v3 if: always() # always run even if the previous step fails with: - report_paths: '**/build/test-results/test/TEST-*.xml' + report_paths: "**/build/test-results/test/TEST-*.xml" ## Inflate missing git history - - name: "Inflate Git history" - run: git fetch --unshallow + - name: "Setup: Git History" + run: git fetch --unshallow || exit 0 ## Upload to Codecov (JVM) - - uses: codecov/codecov-action@v3 + - name: "Report: Codecov" + uses: codecov/codecov-action@v3 with: token: ${{ secrets.CODECOV_TOKEN }} files: ./tools/reports/build/reports/jacoco/testCodeCoverageReport/testCodeCoverageReport.xml @@ -178,69 +274,79 @@ jobs: fail_ci_if_error: false verbose: true - ## Run Sonar - - name: "Run Sonar" - uses: gradle/gradle-build-action@v2 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - with: - cache-read-only: false - arguments: | - jacocoTestReport - sonarqube - --scan - -Pelide.ci=true - -PbuildSamples=false - -Pversions.java.language=17 - -x test - -x jvmTest - -x nativeCompile - -x test - ## ## Job: Testsuite (Native) ## tests-native: - runs-on: buildjet-16vcpu-ubuntu-2004 - needs: [tests-jvm] - continue-on-error: true # temporary + name: "Tests: Native" + runs-on: ubuntu-latest + needs: [tests-jvm, dependency-review] + continue-on-error: true # temporary if: | ( github.ref == 'refs/heads/stable' || - contains(github.event.pull_request.labels.*.name, 'ci:build-img-jvm') || - contains(github.event.head_commit.message, 'ci:build-img-jvm') || + contains(github.event.pull_request.labels.*.name, 'ci:test-native') || + contains(github.event.head_commit.message, 'ci:test-native') || startsWith(github.ref, 'refs/tags/v') ) steps: ## Setup: Checkout Code - - uses: actions/checkout@v3 + - name: "Setup: Checkout" + uses: actions/checkout@v3 ## Setup: GraalVM - - uses: graalvm/setup-graalvm@v1 + - name: "Setup: GraalVM" + uses: graalvm/setup-graalvm@v1 with: - components: 'native-image' + components: "native-image,js" version: latest java-version: 17 github-token: ${{ secrets.GITHUB_TOKEN }} - ## Setup: `gu` components - - name: Install native-image component - run: | - gu install native-image espresso - gu rebuild-images + ## Setup: GCloud Auth + - id: "auth" + name: "Setup: Authorize Service Account" + uses: "google-github-actions/auth@v1" + with: + credentials_json: "${{ secrets.BUILDBOT_SERVICE_ACCOUNT }}" + create_credentials_file: true + export_environment_variables: true + cleanup_credentials: true + + ## Setup: Node + - name: "Setup: Node" + uses: actions/setup-node@v3 + with: + node-version: 18 + cache: "yarn" + + ## Setup: Run Yarn + - name: "Setup: Yarn" + uses: actions/setup-node@v3 + with: + node-version: 18 + cache: "yarn" ## Run Native Tests - name: "Run Tests (Native)" - uses: gradle/gradle-build-action@v2 + uses: gradle/gradle-build-action@v2.3.3 with: cache-read-only: false arguments: | - graalvm:test - graalvm-js:test - graalvm-react:test + build + test + check + jacocoTestReport + koverMergedHtmlReport + koverMergedXmlReport + koverMergedReport :tools:reports:reports + --scan + --warning-mode=none + --dependency-verification=lenient -Pelide.ci=true + -PbuildSamples=false + -PbuildDocs=false -Pversions.java.language=17 ## Collect Reports @@ -258,8 +364,9 @@ jobs: ## Job: Docker Samples (JVM) ## docker-jvm: - runs-on: buildjet-4vcpu-ubuntu-2004 - needs: [gradle] + name: "Docker: JVM" + runs-on: ubuntu-latest + needs: [gradle, dependency-review] if: | ( github.ref == 'refs/heads/stable' || @@ -269,44 +376,56 @@ jobs: ) permissions: - contents: 'read' - id-token: 'write' + contents: "read" + id-token: "write" + checks: "write" + pull-requests: "write" + + strategy: + fail-fast: false + matrix: + project: ["server:hellocss"] + include: + - project: "fullstack:react-ssr:server" steps: ## Setup: GraalVM - - uses: graalvm/setup-graalvm@v1 + - name: "Setup: GraalVM" + uses: graalvm/setup-graalvm@v1 with: - components: 'native-image' + components: "native-image,js" version: latest java-version: 17 github-token: ${{ secrets.GITHUB_TOKEN }} ## Setup: QEMU - - name: Set up QEMU + - name: "Setup: QEMU" uses: docker/setup-qemu-action@v2 ## Setup: Docker - - uses: docker/setup-buildx-action@v2 + - name: "Setup: Docker" + uses: docker/setup-buildx-action@v2 id: buildx with: install: true ## Setup: Checkout Code - - uses: actions/checkout@v3 + - name: "Setup: Checkout" + uses: actions/checkout@v3 ## Setup: GCloud Auth - - id: 'auth' - name: 'Authorize Service Account' - uses: 'google-github-actions/auth@v0' + - id: "auth" + name: "Setup: Authorize Service Account" + uses: "google-github-actions/auth@v1" with: - credentials_json: '${{ secrets.BUILDBOT_SERVICE_ACCOUNT }}' + credentials_json: "${{ secrets.BUILDBOT_SERVICE_ACCOUNT }}" create_credentials_file: true export_environment_variables: true cleanup_credentials: true ## Setup: GCloud SDK - - name: 'Set up Cloud SDK' - uses: 'google-github-actions/setup-gcloud@v0' + - name: "Setup: Setup Cloud SDK" + uses: "google-github-actions/setup-gcloud@v1" with: version: 389.0.0 project_id: elide-fw @@ -327,79 +446,27 @@ jobs: ## -- Samples -- ## ## Docker Samples: Server - Hello World - JVM - - name: "Samples/Server: Hello World (JVM)" - uses: gradle/gradle-build-action@v2 - with: - arguments: | - -Pelide.ci=true - -x nativeCompile - -x test - :samples:server:helloworld:dockerBuild - :samples:server:helloworld:dockerPush - - ## Docker Samples: Server - Hello CSS - JVM - - name: "Samples/Server: Hello CSS (JVM)" - uses: gradle/gradle-build-action@v2 - with: - arguments: | - -Pelide.ci=true - -x nativeCompile - -x test - :samples:server:hellocss:dockerBuild - :samples:server:hellocss:dockerPush - - ## Docker Samples: Fullstack - Basic - JVM - - name: "Samples/Fullstack: Basic (JVM)" - uses: gradle/gradle-build-action@v2 - with: - arguments: | - -Pelide.ci=true - -x nativeCompile - -x test - :samples:fullstack:basic:server:dockerBuild - :samples:fullstack:basic:server:dockerPush - - ## Docker Samples: Fullstack - React - JVM - - name: "Samples/Fullstack: React (JVM)" - uses: gradle/gradle-build-action@v2 - with: - arguments: | - -Pelide.ci=true - -x nativeCompile - -x test - :samples:fullstack:react:server:dockerBuild - :samples:fullstack:react:server:dockerPush - - ## Docker Samples: Fullstack - SSR - JVM - - name: "Samples/Fullstack: Vanilla SSR (JVM)" - uses: gradle/gradle-build-action@v2 - with: - arguments: | - -Pelide.ci=true - -x nativeCompile - -x test - :samples:fullstack:ssr:server:dockerBuild - :samples:fullstack:ssr:server:dockerPush - - ## Docker Samples: Fullstack - React SSR - JVM - - name: "Samples/Fullstack: React SSR (JVM)" - uses: gradle/gradle-build-action@v2 + - name: "Build/Push: '${{ matrix.project }}' (JVM)" + uses: gradle/gradle-build-action@v2.3.3 with: arguments: | -Pelide.ci=true + -Pversions.java.language=17 + -Pelide.runtime=JVM -x nativeCompile -x test - :samples:fullstack:react-ssr:server:dockerBuild - :samples:fullstack:react-ssr:server:dockerPush - + :samples:${{ matrix.project }}:optimizedDockerBuild + :samples:${{ matrix.project }}:optimizedDockerPush ## ## Job: Docker Samples (JVM) ## docker-native: - runs-on: buildjet-16vcpu-ubuntu-2004 - needs: [gradle] + name: "Docker: Native" + runs-on: ubuntu-latest + needs: [gradle, dependency-review] + continue-on-error: true if: | ( github.ref == 'refs/heads/stable' || @@ -409,50 +476,56 @@ jobs: ) permissions: - contents: 'read' - id-token: 'write' + contents: "read" + id-token: "write" + checks: "write" + pull-requests: "write" + + strategy: + fail-fast: false + matrix: + project: ["server:hellocss"] + include: + - project: "fullstack:react-ssr:server" steps: ## Setup: GraalVM - - uses: graalvm/setup-graalvm@v1 + - name: "Setup: GraalVM" + uses: graalvm/setup-graalvm@v1 with: - components: 'native-image' + components: "native-image,js" version: latest java-version: 17 github-token: ${{ secrets.GITHUB_TOKEN }} ## Setup: QEMU - - name: Set up QEMU + - name: "Setup: QEMU" uses: docker/setup-qemu-action@v2 ## Setup: Docker - - uses: docker/setup-buildx-action@v2 + - name: "Setup: Docker" + uses: docker/setup-buildx-action@v2 id: buildx with: install: true ## Setup: Checkout Code - - uses: actions/checkout@v3 - - ## Setup: `gu` components - - name: Install native-image component - run: | - gu install native-image espresso - gu rebuild-images + - name: "Setup: Checkout" + uses: actions/checkout@v3 ## Setup: GCloud Auth - - id: 'auth' - name: 'Authorize Service Account' - uses: 'google-github-actions/auth@v0' + - id: "auth" + name: "Authorize Service Account" + uses: "google-github-actions/auth@v1" with: - credentials_json: '${{ secrets.BUILDBOT_SERVICE_ACCOUNT }}' + credentials_json: "${{ secrets.BUILDBOT_SERVICE_ACCOUNT }}" create_credentials_file: true export_environment_variables: true cleanup_credentials: true ## Setup: GCloud SDK - - name: 'Set up Cloud SDK' - uses: 'google-github-actions/setup-gcloud@v0' + - name: "Setup: Cloud SDK" + uses: "google-github-actions/setup-gcloud@v1" with: version: 389.0.0 project_id: elide-fw @@ -473,61 +546,63 @@ jobs: ## -- Samples -- ## ## Docker Samples: Server - Hello World - Native - - name: "Samples/Server: Hello World (Native)" - uses: gradle/gradle-build-action@v2 + - name: "Build/Push: '${{ matrix.project }}' (Native)" + uses: gradle/gradle-build-action@v2.3.3 + continue-on-error: true with: arguments: | + -Pversions.java.language=17 + -Pelide.runtime=NATIVE -Pelide.ci=true -x test - :samples:server:helloworld:dockerBuildNative - :samples:server:helloworld:dockerPushNative + :samples:${{ matrix.project }}:optimizedDockerBuildNative + :samples:${{ matrix.project }}:optimizedDockerPushNative - ## Docker Samples: Server - Hello CSS - Native - - name: "Samples/Server: Hello CSS (Native)" - uses: gradle/gradle-build-action@v2 - with: - arguments: | - -Pelide.ci=true - -x test - :samples:server:hellocss:dockerBuildNative - :samples:server:hellocss:dockerPushNative + ## + ## Deploy: Samples + ## - ## Docker Samples: Fullstack - Basic - Native - - name: "Samples/Fullstack: Basic (Native)" - uses: gradle/gradle-build-action@v2 - with: - arguments: | - -Pelide.ci=true - -x test - :samples:fullstack:basic:server:dockerBuildNative - :samples:fullstack:basic:server:dockerPushNative + deploy-samples: + strategy: + matrix: + category: [fullstack] + app: [react-ssr] + variant: [jvm] - ## Docker Samples: Fullstack - React - Native - - name: "Samples/Fullstack: React (Native)" - uses: gradle/gradle-build-action@v2 - with: - arguments: | - -Pelide.ci=true - -x test - :samples:fullstack:react:server:dockerBuildNative - :samples:fullstack:react:server:dockerPushNative + name: "Deploy" + runs-on: ubuntu-latest + needs: [gradle, tests-jvm, tests-native, docker-jvm, docker-native] + if: | + ( + github.ref == 'refs/heads/stable' || + contains(github.event.pull_request.labels.*.name, 'ci:deploy-samples') || + contains(github.event.head_commit.message, 'ci:deploy-samples') || + startsWith(github.ref, 'refs/tags/v') + ) - ## Docker Samples: Fullstack - SSR - Native - - name: "Samples/Fullstack: Vanilla SSR (Native)" - uses: gradle/gradle-build-action@v2 - with: - arguments: | - -Pelide.ci=true - -x test - :samples:fullstack:ssr:server:dockerBuildNative - :samples:fullstack:ssr:server:dockerPushNative + permissions: + contents: "read" + id-token: "write" + checks: "write" + pull-requests: "write" - ## Docker Samples: Fullstack - React SSR - Native - - name: "Samples/Fullstack: React SSR (Native)" - uses: gradle/gradle-build-action@v2 - with: - arguments: | - -Pelide.ci=true - -x test - :samples:fullstack:react-ssr:server:dockerBuildNative - :samples:fullstack:react-ssr:server:dockerPushNative + steps: + ## Setup: Checkout Code + - name: "Setup: Checkout" + uses: actions/checkout@v3 + + ## Setup: Fly + - name: "Setup: Fly" + uses: superfly/flyctl-actions/setup-flyctl@master + + - name: "Deploy: ${{ matrix.sample }} (${{ matrix.variant }})" + env: + FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }} + SAMPLE_CATEGORY: ${{ matrix.category }} + SAMPLE_APP: ${{ matrix.app }} + SAMPLE_VARIANT: ${{ matrix.variant }} + run: | + cd samples/$SAMPLE_CATEGORY/$SAMPLE_APP && \ + flyctl deploy \ + --remote-only \ + --image "us-docker.pkg.dev/elide-fw/samples/$SAMPLE_CATEGORY/$SAMPLE_APP/$SAMPLE_VARIANT:opt-latest"; diff --git a/.github/workflows/codeql.ci.yml b/.github/workflows/codeql.ci.yml index 14aac13de1..4a5c9ba27f 100644 --- a/.github/workflows/codeql.ci.yml +++ b/.github/workflows/codeql.ci.yml @@ -2,11 +2,11 @@ name: "CodeQL" on: push: - branches: [ "v3" ] + branches: ["v3"] pull_request: - branches: [ "v3" ] + branches: ["v3"] schedule: - - cron: '17 14 * * 3' + - cron: "17 14 * * 3" jobs: analyze: @@ -20,57 +20,17 @@ jobs: strategy: fail-fast: false matrix: - language: [ 'javascript', 'typescript' ] + language: ["javascript", "java"] steps: - name: Checkout repository uses: actions/checkout@v3 - ## Setup: Java - - uses: actions/setup-java@v3 - with: - distribution: 'zulu' - java-version: '11' - - ## Setup: GraalVM - - uses: graalvm/setup-graalvm@v1 - with: - version: '21.1.0' - java-version: '17' - components: 'native-image' - # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@v2 with: - languages: ${{ matrix.language }} - - ## Prep: Download Caches - - name: Cache dependencies - uses: actions/cache@v3 - with: - path: | - ./node_modules - ./build - ./*/build - ./*/*/build - key: elide-${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}-yarn-${{ hashFiles('**/*.yarn.lock') }} - restore-keys: | - elide-${{ runner.os }} - elide- - - ## CI: Re-Build - - name: "🛠️ Build" - uses: gradle/gradle-build-action@v2 - env: - CI: true - with: - arguments: | - build - -Pelide.ci=true - -PbuildSamples=false - -x nativeCompile - -x test + config-file: ./.github/codeql/codeql-config.yml ## Code QL: Perform analysis - name: Perform CodeQL Analysis diff --git a/.github/workflows/dep-review.ci.yml b/.github/workflows/dep-review.ci.yml deleted file mode 100644 index 8966511e05..0000000000 --- a/.github/workflows/dep-review.ci.yml +++ /dev/null @@ -1,20 +0,0 @@ -# Dependency Review Action -# -# This Action will scan dependency manifest files that change as part of a Pull Request, surfacing known-vulnerable versions of the packages declared or updated in the PR. Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable packages will be blocked from merging. -# -# Source repository: https://github.com/actions/dependency-review-action -# Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement -name: 'Dependency Review' -on: [pull_request] - -permissions: - contents: read - -jobs: - dependency-review: - runs-on: ubuntu-latest - steps: - - name: 'Checkout Repository' - uses: actions/checkout@v3 - - name: 'Dependency Review' - uses: actions/dependency-review-action@v1 diff --git a/.github/workflows/gradle-wrapper-validation.yml b/.github/workflows/gradle-wrapper-validation.yml new file mode 100644 index 0000000000..11d9ea3600 --- /dev/null +++ b/.github/workflows/gradle-wrapper-validation.yml @@ -0,0 +1,18 @@ +name: Validate Gradle Wrapper +on: + push: + branches: + - main + pull_request: + branches: + - "*" + +jobs: + validation: + name: Validation + runs-on: ubuntu-latest + steps: + - name: Checkout latest code + uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3 + - name: Validate Gradle Wrapper + uses: gradle/wrapper-validation-action@55e685c48d84285a5b0418cd094606e199cca3b6 # tag=v1 diff --git a/.github/workflows/model.ci.yml b/.github/workflows/model.ci.yml index 4d340be275..1f8f0ccba7 100644 --- a/.github/workflows/model.ci.yml +++ b/.github/workflows/model.ci.yml @@ -19,7 +19,7 @@ jobs: run: shell: bash permissions: - contents: 'read' + contents: "read" steps: ## Setup: Checkout Code - uses: actions/checkout@v3 @@ -41,7 +41,7 @@ jobs: run: shell: bash permissions: - contents: 'read' + contents: "read" continue-on-error: ${{ contains(github.event.pull_request.labels.*.name, 'ci:buf-breaking-ignore') }} steps: ## Setup: Checkout Code @@ -54,9 +54,9 @@ jobs: # Job: Breaking - uses: bufbuild/buf-breaking-action@v1 + continue-on-error: ${{ contains(github.event.pull_request.labels.*.name, 'ci:buf-breaking-ignore') }} with: - against: | - ${{ (contains(github.event.pull_request.labels.*.name, 'ci:buf-breaking-ignore') && ('https://github.com/elide-dev/v3.git#ref=${{ GITHUB_REF }}')) || 'https://github.com/elide-dev/v3.git#branch=v3' }} + against: https://github.com/elide-dev/v3.git#branch=v3 ## ## Job: Buf Push @@ -73,7 +73,7 @@ jobs: startsWith(github.ref, 'refs/tags/v') ) permissions: - contents: 'read' + contents: "read" steps: ## Setup: Checkout Code - uses: actions/checkout@v3 diff --git a/.github/workflows/qodana.ci.yml b/.github/workflows/qodana.ci.yml new file mode 100644 index 0000000000..87272a6313 --- /dev/null +++ b/.github/workflows/qodana.ci.yml @@ -0,0 +1,25 @@ +name: Qodana +on: + workflow_dispatch: + pull_request: + push: + branches: + - main + - v3 + - stable + - "releases/*" + +jobs: + qodana: + name: "Scan" + runs-on: ubuntu-latest + continue-on-error: true + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: "Qodana Scan" + uses: JetBrains/qodana-action@v2022.2.3 + - uses: github/codeql-action/upload-sarif@v2 + with: + sarif_file: ${{ runner.temp }}/qodana/results/qodana.sarif.json diff --git a/.gitignore b/.gitignore index d641d2147d..2c3104c2b2 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,6 @@ packages/*/out packages/*/build .gradle/ buildSrc/.gradle/ -kotlin-js-store/yarn.lock .buildstate.tar.gz local.properties node_modules/ diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000000..d24fdfc601 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +npx lint-staged diff --git a/.npmrc b/.npmrc deleted file mode 100644 index d20f3d36d0..0000000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -registry=https://buildcache.dyme.cloud/npm/ diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000000..aeb7442611 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,12 @@ +build +coverage +docs +kotlin-js-store +.idea +.gradle +proto +proto/buf.pb.json +buildSrc +benchmarks +tools/plugin +*.gradle.kts diff --git a/.snyk b/.snyk index ddc02a1a26..4e2227219b 100644 --- a/.snyk +++ b/.snyk @@ -4,4 +4,3 @@ exclude: - docs - vendor - third_party - diff --git a/.version b/.version index f0bca05f68..ca7b7207f1 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -1.0-v3-alpha1-rc31 +1.0-v3-alpha1-rc33 diff --git a/.yarnrc b/.yarnrc deleted file mode 100644 index 1f4c0fac95..0000000000 --- a/.yarnrc +++ /dev/null @@ -1 +0,0 @@ -registry "https://buildcache.dyme.cloud/npm/" diff --git a/LICENSE b/LICENSE index 6d2f6d37fc..aa89c56365 100644 --- a/LICENSE +++ b/LICENSE @@ -1,37 +1,21 @@ -The Prosperity Public License 2.0.0 - -Source Code: https://github.com/sgammon/elide - -This license lets you use and share this software for free, -with a trial-length time limit on commercial use. Specifically: - -If you follow the rules below, you may do everything with this -software that would otherwise infringe either the contributor's -copyright in it, any patent claim the contributor can license -that covers this software as of the contributor's latest -contribution, or both. - -1. You must limit use of this software in any manner primarily - intended for or directed toward commercial advantage or - private monetary compensation to a trial period of 32 - consecutive calendar days. This limit does not apply to use in - developing feedback, modifications, or extensions that you - contribute back to those giving this license. - -2. Ensure everyone who gets a copy of this software from you, in - source code or any other form, gets the text of this license - and the contributor and source code lines above. - -3. Do not make any legal claim against anyone for infringing any - patent claim they would infringe by using this software alone, - accusing this software, with or without changes, alone or as - part of a larger application. - -You are excused for unknowingly breaking rule 1 if you stop -doing anything requiring this license within 30 days of -learning you broke the rule. - -**This software comes as is, without any warranty at all. As far -as the law allows, the contributor will not be liable for any -damages related to this software or this license, for any kind of -legal claim.** \ No newline at end of file +MIT License + +Copyright (c) 2022, Sam Gammon. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/LICENSES.txt b/LICENSES.txt index e1f760cd86..fba3a6894a 100644 --- a/LICENSES.txt +++ b/LICENSES.txt @@ -52,6 +52,12 @@ SOFTWARE. -------------------- +`KotlinX Serialization` (https://github.com/Kotlin/kotlinx.serialization) + +Copyright 2017-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + +-------------------- + `Kotlin Base64` (gist.github.com/MarkusKramer/4db02c9983c76efc6aa56cf0bdc75a5b) Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. diff --git a/Makefile b/Makefile index 7550d0b794..a91c09c0f9 100644 --- a/Makefile +++ b/Makefile @@ -4,12 +4,15 @@ # VERSION ?= $(shell cat .version) +STRICT ?= yes +RELOCK ?= no SAMPLES ?= no # Flags that control this makefile, along with their defaults: # # DEBUG ?= no +# STRICT ?= yes # RELEASE ?= no # JVMDEBUG ?= no # NATIVE ?= no @@ -17,6 +20,7 @@ SAMPLES ?= no # DRY ?= no # SCAN ?= no # IGNORE_ERRORS ?= no +# RELOCK ?= no GRADLE ?= ./gradlew YARN ?= $(shell which yarn) @@ -42,10 +46,18 @@ else BUILD_ARGS += -PbuildSamples=false endif +ifeq ($(RELOCK),yes) +BUILD_ARGS += --write-verification-metadata sha256,pgp --export-keys --write-locks +endif + ifeq ($(CI),yes) BUILD_ARGS += -Pelide.ci=true endif +ifeq ($(STRICT),yes) +BUILD_ARGS += --warning-mode=none -Pelide.strict=true +endif + ifeq ($(SCAN),yes) BUILD_ARGS += --scan endif @@ -98,6 +110,16 @@ test: ## Run the library testsuite, and code-sample tests if SAMPLES=yes. $(info Running testsuite...) $(CMD)$(GRADLE) test $(_ARGS) +publish: ## Publish a new version of all Elide packages. + $(info Publishing packages for version "$(VERSION)"...) + $(CMD)$(GRADLE) publish \ + -Pversion=$(VERSION) \ + -PbuildSamples=false \ + -PbuildDocs=false \ + -x test \ + -x jvmTest \ + -x jsTest; + clean: ## Clean build outputs and caches. @echo "Cleaning targets..." $(CMD)$(RM) -fr$(POSIX_FLAGS) $(TARGET) diff --git a/README.md b/README.md index b327d508ac..f9c27ac853 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,15 @@ -# `elide` (v3) - -_elide: verb. to omit (a sound or syllable) when speaking. to join together; to merge._ +

+ + + + + + +

+ +

+elide: verb. to omit (a sound or syllable) when speaking. to join together; to merge. +


@@ -11,54 +20,27 @@ _elide: verb. to omit (a sound or syllable) when speaking. to join together; to [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=elide-dev_v3&metric=sqale_rating&token=7e7d03a5cb8a12b7297eb6eedf5fe9b93ade6d75)](https://sonarcloud.io/summary/new_code?id=elide-dev_v3) [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Felide-dev%2Fv3.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Felide-dev%2Fv3?ref=badge_shield) - -[![Kotlin](https://img.shields.io/badge/Kotlin-1.7.10-blue.svg?logo=kotlin)](http://kotlinlang.org) -[![Kotlin](https://img.shields.io/badge/Java-17-blue.svg?logo=java)](https://openjdk.org/projects/jdk/17/) +[![Kotlin](https://img.shields.io/badge/Kotlin-1.7.21-blue.svg?logo=kotlin)](http://kotlinlang.org) +[![Java 17](https://img.shields.io/badge/Java-17-blue.svg?logo=java)](https://openjdk.org/projects/jdk/17/) [![ECMA](https://img.shields.io/badge/ECMA-2020-blue.svg?logo=javascript)](https://reactjs.org/) -[![GraalVM](https://img.shields.io/badge/GraalVM-22.1.x-blue.svg?logo=oracle)](https://www.graalvm.org/) -[![Micronaut](https://img.shields.io/badge/Micronaut-3.5.x-blue.svg?logo=java)](https://micronaut.io) -[![React](https://img.shields.io/badge/React-18.x-blue.svg?logo=react)](https://reactjs.org/) - +[![GraalVM](https://img.shields.io/badge/GraalVM-22.3.x-blue.svg?logo=oracle)](https://www.graalvm.org/) -_**Elide is under construction. You can also browse to [`v2`][12] or [`v1`][11].**_ +_**Elide is currently in alpha.**_ -Latest version: `1.0-v3-alpha1-rc31` +Latest version: `1.0-v3-alpha1-rc33`
Elide is a **Kotlin/Multiplatform meta-framework** for **rapid, cross-platform application development**. Write once in Kotlin and deploy everywhere: your server, the browser, and native app targets. - -### What do you mean by _meta-framework_? - -Elide could be characterized as a _meta-framework_ in the sense that it is powered entirely by mature and well-supported -software under the hood. Via a thin combination of build tooling and runtime interfaces, the developer can -leverage these tools together without worrying about performance or compatibility. - - -#### Cross-platform features - -- **Primitives.** Access the entire [Kotlin Standard Library](), with additional sugar added, and the full suite of - [KotlinX]() extensions including [`serialization`](https://kotlinlang.org/docs/serialization.html), - [`atomicfu`](https://github.com/Kotlin/kotlinx.atomicfu), - [`coroutines`](https://github.com/Kotlin/kotlinx.coroutines), and - [`datetime`](https://github.com/Kotlin/kotlinx-datetime). - -- **Logging.** Use an identical interface across platforms, which calls into the best layer available for that system. - For example, on the JVM, logging calls into `slf4j`, and in JavaScript, `console.*`. - -- **Observability.** Generate uniform logs across platforms, which correlate and provide a fully observable picture of - application behavior. - -- **Data modeling.** Express data models once, with support for databasing, serialization/de-serialization, and data - exchange via RESTful APIs, gRPC, or gRPC-Web. - - ## Distinguishing features -- **Native development with Kotlin.** Write your core application logic and models once, and share them across platforms - transparently. Leverage [Kotest](https://kotest.io) for cross-platform, write-once-run-native testing. +- **Pure Kotlin.** Write your core application logic and models once, and share them across platforms transparently. + Leverage [Kotest](https://kotest.io) for cross-platform, write-once-run-native testing. Enjoy first-class support for + the full suite of KotlinX libraries, including [`serialization`](https://kotlinlang.org/docs/serialization.html), + [`atomicfu`](https://github.com/Kotlin/kotlinx.atomicfu), [`coroutines`](https://github.com/Kotlin/kotlinx.coroutines) + and [`datetime`](https://github.com/Kotlin/kotlinx-datetime). - **Isomorphic SSR with React.** Write your UI in React, using JavaScript, TypeScript, or Kotlin. Package it for serving via [client-side rendering or hybrid isomorphic rendering](https://web.dev/rendering-on-the-web/) directly from your @@ -69,6 +51,8 @@ leverage these tools together without worrying about performance or compatibilit [Kotlin data classes](https://kotlinlang.org/docs/data-classes.html), the same Elide model is code-generated for use with your database, API, and UI. +- **Extreme performance.** Enjoy fast development locally with Kotlin and Gradle, and insanely fast runtime performance + thanks to GraalVM Native, Netty, and Micronaut. Deploy to bare metal, Docker `scratch` images, or JARs. ## Code samples @@ -78,6 +62,7 @@ Docker images. Click through to each one for a short tour and getting started gu "Blah blah blah, okay, show me some code." Certainly: **`App.kt`** (for the server) + ```kotlin /** GET `/`: Controller for index page. */ @Controller class Index { @@ -111,6 +96,7 @@ Docker images. Click through to each one for a short tour and getting started gu ``` **`main.kt`** (for the browser) + ```kotlin // React props for a component external interface HelloProps: Props { @@ -150,13 +136,11 @@ pasted into the README. What we get out of this is surprising: - Build & test virtualized on any platform - Ship & perform natively on any platform - What's going on here? Elide has helped us wire together code from **Micronaut** (that's where `@Controller` comes from), **Kotlin/JS**, **GraalVM**, and **esbuild** to make the above code make sense on both platforms. The React code builds for the browser _and_ a pure server environment; both are embedded into the JAR and served through a thin runtime layer provided by the framework. - #### Why is this useful? If you're participating in the React and Java ecosystems, this gives you a fantastic best-of-both-worlds runtime option: @@ -167,7 +151,6 @@ of app is challenging and error-prone. Elide _intentionally_ leverages existing docs, _instead of_ re-providing existing functionality so that you always have an escape hatch up to a more industrial toolset if you need it. - ### Trying it out > **Note** @@ -180,30 +163,32 @@ The `react-ssr` sample is recommended, because it demoes the broadest set of fun code for each sample is in the [`samples/`](./samples) directory. If you're going to build from source, make sure to see the _Requirements to build_ section. - **Run the `helloworld` sample via Docker (JVM):** + ``` docker run --rm -it -p 8080:8080 ghcr.io/elide-dev/samples-server-helloworld-jvm ``` **Run the `react-ssr` sample via Docker (JVM):** + ``` docker run --rm -it -p 8080:8080 ghcr.io/elide-dev/samples-fullstack-react-ssr-jvm:latest ``` **Run the `react-ssr` sample via Gradle (JVM):** + ``` git clone git@github.com:elide-dev/v3.git && cd v3 ./gradlew :samples:fullstack:react-ssr:server:run ``` **Run the `react-ssr` sample via Gradle (Native):** + ``` git clone git@github.com:elide-dev/v3.git && cd v3 ./gradlew :samples:fullstack:react-ssr:server:runNative ``` - #### Requirements to build To build the JVM or JS samples in Kotlin, you will need **JDK 11 or later**. [Zulu](https://www.azul.com/downloads/) is @@ -226,7 +211,6 @@ To summarize: - **For building native:** GraalVM (consult compat table for version advice). - **For building browser/embedded JS:** Recent Node.js toolchain. 16.x+ is recommended. - ### Powered-by Elide is modular. You can mix and match the following technologies in **server**, **client**, or **hybrid/fullstack** @@ -251,18 +235,12 @@ development scenarios: [`protobuf`](https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/formats.md#protobuf-experimental) module, and includes **native support for [gRPC Web](https://github.com/grpc/grpc-web)** without running a proxy. -- [**Closure**][7]. Use the Closure Tools family of software to develop performant and low-level JavaScript apps that - are served directly from your application JAR. Render Soy templates server-side with Google's blazing-fast - [Soy Sauce](https://github.com/google/closure-templates/blob/master/documentation/dev/adv-java.md) runtime, via - pre-compiling templates to Java bytecode. - -- [**Bazel**][8]. Built-in support for Bazel. Load directly from a tarball; build only what you use. Extensive suite of - utility macros and rules. - - [**Gradle**][9]. Early support for building multi-platform Kotlin applications via Gradle, including integrated support for [Webpack](https://webpack.js.org/)-based frontend builds and [esbuild](https://esbuild.github.io/)-based embedded SSR builds. +- [**`esbuild`**][14]. Elide leverages ESBuild when compiling and minifying JS code for the server or browser. ESBuild + sports extremely fast build times, modern language support, and tunable minification/DCE. ## Version compatibility @@ -273,131 +251,14 @@ Following this guide is recommended but optional. Depending on the style of deve not need some of these components: | Status | **Java** | **Kotlin** | **GraalVM** | **Micronaut** | **React** | **Protobuf/gRPC** | -|-----------------------------------------------------------------|-----------|------------|-------------|---------------|-----------|-------------------| -| ![Status](https://img.shields.io/badge/-experimental-important) | `Java 19` | `1.7.21` | `22.1.x` | `3.6.x` | `18.x` | `3.20.1`/`1.46.0` | -| ![Status](https://img.shields.io/badge/-tested-success) | `Java 17` | `1.7.21` | `22.1.x` | `3.6.x` | `18.x` | `3.20.1`/`1.46.0` | -| ![Status](https://img.shields.io/badge/-tested-success) | `Java 11` | `1.7.21` | `22.1.x` | `3.5.x` | `18.x` | `3.20.1`/`1.46.0` | +| --------------------------------------------------------------- | --------- | ---------- | ----------- | ------------- | --------- | ----------------- | +| ![Status](https://img.shields.io/badge/-experimental-important) | `Java 19` | `1.7.21` | `22.3.x` | `3.7.x` | `18.x` | `3.20.1`/`1.46.0` | +| ![Status](https://img.shields.io/badge/-tested-success) | `Java 17` | `1.7.21` | `22.3.x` | `3.7.x` | `18.x` | `3.20.1`/`1.46.0` | +| ![Status](https://img.shields.io/badge/-tested-success) | `Java 11` | `1.7.21` | `22.3.x` | `3.5.x` | `18.x` | `3.20.1`/`1.46.0` | | ![Status](https://img.shields.io/badge/-no%20support-yellow) | `Java 8` | -- | -- | -- | -- | -- | - If you aren't using certain components on this list, for example, gRPC/Protobuf, you can ignore that column entirely. - -## Platform Support - -Elide itself generally supports any platform supported by GraalVM. This includes **Linux**, **macOS**, and **Windows**. -Client-side, all major browsers are supported, along with Android and iOS via Kotlin/Native. - -Please consult the table below for a complete list of supported platforms and architectures: - -| Build | OS | Arch | Libc | Supported | Notes | -|-------|:---------------|----------|--------|:---------:|:-----------------------| -| [![Build](https://github.com/elide-dev/v3/actions/workflows/build.ci.yml/badge.svg)](https://github.com/elide-dev/v3/actions/workflows/build.ci.yml) | Linux (Ubuntu) | `x86_64` | `libc` | ✅ | Default JVM platform | -| [![Build](https://github.com/elide-dev/v3/actions/workflows/build.ci.yml/badge.svg)](https://github.com/elide-dev/v3/actions/workflows/build.ci.yml) | macOS | `x86_64` | `libc` | ✅ | Supported dev platform | -| [![Build](https://github.com/elide-dev/v3/actions/workflows/build.ci.yml/badge.svg)](https://github.com/elide-dev/v3/actions/workflows/build.ci.yml) | macOS | `arm64` | `libc` | ✅ | Supported dev platform | -| [![Build](https://github.com/elide-dev/v3/actions/workflows/build.ci.yml/badge.svg)](https://github.com/elide-dev/v3/actions/workflows/build.ci.yml) | Linux (Alpine) | `x86_64` | `musl` | ☢️ | _Experimental_ | -| [![Build](https://github.com/elide-dev/v3/actions/workflows/build.ci.yml/badge.svg)](https://github.com/elide-dev/v3/actions/workflows/build.ci.yml) | Linux (Ubuntu) | `arm64` | `libc` | ☢️ | _Experimental_ | -| [![Build](https://github.com/elide-dev/v3/actions/workflows/build.ci.yml/badge.svg)](https://github.com/elide-dev/v3/actions/workflows/build.ci.yml) | Windows | `x86_64` | N/A | ☢️ | _Experimental_ | - -Bazel, Gradle, GraalVM, and Kotlin/Native must support a given platform for Elide to work across architectures. - - -### **"What about [x] functionality that I want/need?"** - -Java, and, by extension, Kotlin, has **one of the broadest and most active software ecosystems** on the planet, closely -followed by NodeJS, via NPM. - -Elide supports both and allows you to access software written for both. Here are some examples to get you going. - -- _I want to..._ - - **Server-side (Micronaut)** - - ... localize my app: [Micronaut i18n](https://guides.micronaut.io/latest/localized-message-source-gradle-kotlin.html) - - ... build an event-driven app: [RabbitMQ](https://guides.micronaut.io/latest/micronaut-rabbitmq.html), [nats.io](https://micronaut-projects.github.io/micronaut-nats/latest/guide/) - - ... connect to my SQL database: [Hibernate](https://guides.micronaut.io/latest/micronaut-jpa-hibernate-gradle-java.html), [Exposed](https://github.com/JetBrains/Exposed) - - ... connect to my NoSQL database: Micronaut supports [MongoDB](https://micronaut-projects.github.io/micronaut-mongodb/latest/guide/) and [Cassandra](https://micronaut-projects.github.io/micronaut-cassandra/latest/guide), Elide additionally provides [Firestore](https://firebase.google.com/docs/firestore) and [Redis](https://redis.io) - - ... send emails to users: [Micronaut Email](https://micronaut-projects.github.io/micronaut-email/latest/guide/) (Sendgrid, Postmark, SES, Mailjet, JavaMail) - - ... use a templating engine: [Micronaut Views](https://micronaut-projects.github.io/micronaut-views/latest/guide/) (Soy, Thymeleaf, Velocity, Freemarker, Rocker, Handlebars, JTE) - - ... cache intelligently: [Micronaut Cache](https://guides.micronaut.io/latest/micronaut-cache-gradle-kotlin.html), (Ehcache, Redis, Hazelcast, Infinispan) - - ... authorize my users: [Micronaut Security](https://micronaut-projects.github.io/micronaut-security/latest/guide/) (JWT, OAuth2, OIDC, LDAP, X.509) - - ... build containers: compatibility with [Docker Gradle Plugin](https://github.com/bmuschko/gradle-docker-plugin), [`rules_docker`](https://github.com/bazelbuild/rules_docker), and [Jib](https://github.com/GoogleContainerTools/jib) - - ... host on [Kubernetes](https://kubernetes.io): [Micronaut Kubernetes](https://micronaut-projects.github.io/micronaut-kubernetes/snapshot/guide/), [Skaffold](https://skaffold.dev) is supported - - **Serve an API** - - ... you can use [gRPC](https://grpc.io): [Micronaut gRPC](https://micronaut-projects.github.io/micronaut-grpc/snapshot/guide/index.html), with native [gRPC-Web](https://github.com/grpc/grpc-web) support coming soon - - ... you can use [GraphQL](https://graphql.org): [Micronaut GraphQL](https://micronaut-projects.github.io/micronaut-graphql/latest/guide/) (RESTful or via WebSockets) - - ... you can use [OpenAPI](https://www.openapis.org): [Micronaut OpenAPI](https://micronaut-projects.github.io/micronaut-openapi/latest/guide/index.html) can generate your specs directly from your code - - **Build a web app** - - ... you can use pure Kotlin: [`kotlinx.html`](https://github.com/Kotlin/kotlinx.html), [Kotlin/JS](https://kotlinlang.org/docs/js-get-started.html) - - ... you can use TypeScript or pure JS: [`esbuild`](https://esbuild.github.io/) can be used to build both bundle types - - ... you can use [Angular](https://angular.io/): SSR is supported via [Angular Universal](https://angular.io/guide/universal) - - ... you can use [Vue](https://vuejs.org/): SSR is supported [out of the box](https://vuejs.org/guide/scaling-up/ssr.html) - - ... you can use [J2CL](https://github.com/google/j2cl) & [Closure][7]: rule-level support for [Elemental2](https://github.com/google/elemental2) as well - - **Build a mobile app** - - (tbd) - - -## About this framework - -Elide has existed in different forms for over a decade. It was first released under the name `canteen` in 2011 as a -Python package. Later, the code evolved into Bazel/Java, then Bazel/Kotlin, and now Bazel/Gradle/Kotlin. - -These frameworks were distinct from each other, written for a moment in time, but they shared authors, design patterns, -and goals: - -- **The developer should have to write as little code as possible** without resorting to convention. Elide, in this way, - is partly a reaction to the drawbacks of Rails-style architectures (and Next.js, which came much later). - -- **If it builds, it should work.** As much as possible, type checking and code-gen should be leveraged where a human - developer adds little or no value. Aligning types is a detailed and error-prone process, which is well suited for a - computer. - -- **A thing is just a thing. Not what is said of that thing.** Data is the effective king of runtime. An application's - concepts should be strongly expressed as models, and the developer _should not have to repeat themselves_ across - platforms to actualize or interchange expressions of those concepts. - - -### History - - -#### Adopters - -Collectively, over a span of 10+ years, Elide has served millions of requests per month on behalf of the following -organizations (newest first): - -- **[Cookies](https://cookies.co).** Elide powered all customer-facing digital properties, including the main Cookies - site and e-commerce experience, with traffic reaching millions of users and unique hits per month. - -- **[Bloombox](https://github.com/bloombox).** Elide powered the APIs underlying Bloombox's B2B retail application, - scaling to millions of requests per month. - -- **[Ampush](https://ampush.com).** Elide powered internal ad-tech systems at Ampush, which reached millions of events - and requests per day. - -- **[Keen IO](https://keen.io).** Elide powered the Keen website for a time, which reached millions of developers across - the span of its early use in Python. - - - -#### Timeline - -- [2012] **`canteen`**: Leveraged Python meta-classes and cooperative greenlets after the release of - [`gevent`](http://www.gevent.org/). "Holds more water than a [flask](https://pypi.org/project/Flask/)." Inspired - heavily by [`tipfy`](https://github.com/moraes/tipfy). Created at [Keen IO](https://keen.io) and adopted to run - production systems at [Ampush Media](https://ampush.com). - -- [2015]: **`gust`**: Written to integrate Kotlin with Bazel, ultimately with support for Soy, J2CL, Protobuf, - and the Closure ecosystem of tools (via [`rules_closure`](https://github.com/bazelbuild/rules_closure), shout out to - @jart!). Powered production systems at Momentum Ideas and [Bloombox](https://github.com/bloombox). - -- [2020]: **`gust` (`elide` v1)**: Rewritten in Java/Kotlin, with native support for Bazel, to continue `gust`'s - evolution for production use at [Cookies](https://cookies.co). - -- [2021]: **`elide` v2**: New model layer support with the addition of Redis, Firestore, and Spanner, to support the - launch of [Cookies](https://cookies.co)' integrated e-commerce experience. - -- [2022-now]: **`elide` v3**: Complete rewrite into pure Kotlin to leverage Kotlin Multiplatform, with native support - for polyglot development via GraalVM, gRPC/Protobuf, and React. Build tooling support through Bazel and Gradle. - - [1]: https://kotlinlang.org/ [2]: https://graalvm.org/ [3]: https://micronaut.io/ @@ -411,7 +272,20 @@ organizations (newest first): [11]: https://github.com/sgammon/elide/tree/master [12]: https://github.com/sgammon/elide [13]: https://buf.build +[14]: https://esbuild.github.io/ + +## Reports +### Licensing + +Elide itself is licensed [under MIT](LICENSE) as of November 2022. Dependencies are scanned for license compatibility; +the report is available via FOSSA: -## License [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Felide-dev%2Fv3.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Felide-dev%2Fv3?ref=badge_large) + +### Coverage + +Code coverage is continuously reported to [Codecov](https://app.codecov.io/gh/elide-dev/v3) and +[SonarCloud](https://sonarcloud.io/project/overview?id=elide-dev_v3): + +[![Coverage grid](https://codecov.io/gh/elide-dev/v3/branch/v3/graphs/tree.svg?token=FXxhJlpKG3)](https://codecov.io/gh/elide-dev/v3) diff --git a/benchmarks/README.md b/benchmarks/README.md index bf73b73ece..9641acb78d 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -1,4 +1,3 @@ - ## Benchmarks This directory contains benchmark definitions for various Elide packages and functions. diff --git a/benchmarks/server/jmh/resources/manifests/app.assets.pb.json b/benchmarks/server/jmh/resources/manifests/app.assets.pb.json index e6f02f75ce..c6c19fa4d5 100644 --- a/benchmarks/server/jmh/resources/manifests/app.assets.pb.json +++ b/benchmarks/server/jmh/resources/manifests/app.assets.pb.json @@ -1 +1,196 @@ -{"version":2,"settings":{"minify":false,"prepack":false,"rewriting":false,"compression":[],"digestSettings":{"algorithm":"SHA256","tail":8,"rounds":1}},"generated":"2022-07-11T22:02:27.047363Z","digest":"uXDYHuoLU8mD7HzEP8oH7yLRKJapNfV76MEXPagCzcc=","styles":{"styles.base":{"module":"styles.base","dependencies":{"direct":[],"transitive":[]},"asset":[{"token":"dfc596ab194ad356f6e9dd562c43f4fb4c3c86d26eb9d6caf33fe06a753eb23d","filename":"basestyles.css","stylesheet":{"id":"","media":"","prefetch":false,"preload":false,"push":false},"renaming":false}],"compressable":false,"cacheable":false}},"scripts":{"scripts.ui":{"module":"scripts.ui","asset":[{"token":"473706a992fbe2fe9ede3de0f5353bc76664dfb005cb843c63684ccb6368a94c","filename":"frontend.js","script":{"id":"","defer":false,"async":false,"module":false,"noModule":false,"prefetch":false,"preload":false,"push":false}}],"dependencies":{"direct":[],"transitive":[]},"compressable":false,"cacheable":false,"external":false}},"generic":{},"asset":[{"module":"styles.base","filename":"basestyles.css","token":"dfc596ab194ad356f6e9dd562c43f4fb4c3c86d26eb9d6caf33fe06a753eb23d","variant":[{"compression":"IDENTITY","data":{"raw":"CkBpbXBvcnQgdXJsKCdodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUpldEJyYWlucytNb25vJmRpc3BsYXk9c3dhcCcpOwoKQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICJjb2xvci1lbW9qaSI7CiAgc3JjOiBsb2NhbCgiQXBwbGUgQ29sb3IgRW1vamkiKSwKICAgICAgIGxvY2FsKCJUd2Vtb2ppIE1vemlsbGEiKSwKICAgICAgIGxvY2FsKCJTZWdvZSBVSSBFbW9qaSIpLAogICAgICAgbG9jYWwoIlNlZ29lIFVJIFN5bWJvbCIpLAogICAgICAgbG9jYWwoIk5vdG8gQ29sb3IgRW1vamkiKSwKICAgICAgIGxvY2FsKCJFbW9qaU9uZSBDb2xvciIpLAogICAgICAgbG9jYWwoIkFuZHJvaWQgRW1vamkiKTsKfQoKaHRtbCB7CiAgLS1lbGlkZS1jb2xvci1wcmltYXJ5OiAjNWEwMGZmOwogIC0tZWxpZGUtY29sb3Itc2Vjb25kYXJ5OiAjOWIwOWFiOwp9Cgpib2R5IHsKICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMjI1ZGVnLCB2YXIoLS1lbGlkZS1jb2xvci1wcmltYXJ5KSAwJSwgdmFyKC0tZWxpZGUtY29sb3Itc2Vjb25kYXJ5KSAxMDAlKTsKICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBTZWdvZSBVSSwgc2Fucy1zZXJpZiwgY29sb3ItZW1vamk7Cn0KCnByZSB7CiAgZm9udC1mYW1pbHk6ICdKZXRCcmFpbnMgTW9ubycsIHVpLW1vbm9zcGFjZSwKICAgIE1lbmxvLCBNb25hY28sCiAgICAiQ2FzY2FkaWEgTW9ubyIsICJTZWdvZSBVSSBNb25vIiwKICAgICJSb2JvdG8gTW9ubyIsCiAgICAiT3h5Z2VuIE1vbm8iLAogICAgIlVidW50dSBNb25vc3BhY2UiLAogICAgIlNvdXJjZSBDb2RlIFBybyIsCiAgICAiRmlyYSBNb25vIiwKICAgICJEcm9pZCBTYW5zIE1vbm8iLAogICAgIkNvdXJpZXIgTmV3IiwgbW9ub3NwYWNlOwp9Cg==","integrity":[{"hash":"SHA256","salt":"","fingerprint":"38WWqxlK01b26d1WLEP0+0w8htJuudbK8z/ganU+sj0="}]},"size":"910","integrity":[]},{"compression":"BROTLI","data":{"raw":"H40DABwFblszFKETwhGkP5n/SgFENxeTYDGYFKaP/uAt/f1L20p1mLxrMwlpwOD19ohNXO7Xsg30/KyB/Z7atC7rojm0gKZIl4XTIRvmrPkLiF9qspXcG31w1J7xQqa6p4XpbznQwf8rdWLPT9Ouad9Z7Ck7NWwwdU4sWDeru0hL/N9u23dd/IbDT+C7qhHI1n7VoB+/X/JMSBN/+qMlB/KeFR9SLGRmuaUMAFDcUrn1mclLhgc1RUwwO02czrxF05L0huKM7WGwqouw7RIZCwCWFsYNv/U4ZfjISIPo+wqo4RfWPz1zf0WwzWE4kzLhYtZ96rUVPT31IIXnoon1XJk/b0QJBi8SmdntDgKK3AUmptkXrW1NxJr0UcftQWsWlEEjEkSNDSl/i/vOCf0HTf/qVtuzd9z3DpmFgOGWYy8BSmKgjIInhjt/NX4sGOOml0snEr4ro5IZHpaBqY/BC1USshPgJtGSNM4u3Oex5q7qiIRivFxkuW2yzTNnKfo19PWTcHG6XglqGwQMThtFmv0A58mLEigqZbe7dP8A","integrity":[]},"size":"414","integrity":[{"hash":"SHA256","salt":"","fingerprint":"xn0VXHBRx0PvPQYbu9Kk/USjlH/L6dA2lNXsoNx2ciE="}]},{"compression":"DEFLATE","data":{"raw":"eNp9Uttu00AQffdXjIxKYmE3JlIfGquibaASSGkRph8w3l27S9c71q5NcBH/znqdmJYE/OQ9c85czkxwKeuGTAudUfPZQ9s2drVYlKRbe1oRVUpgI+0po3rBrF2+K7GWqr/4JNprg1LbNxvS9JpL2yjsL+wWm1mUBcHlkCEpkQn4GQDsXoN0BSEjRSYRNX2TYeai1rAVKGKo5uFV0ygB64EBHzwjih3FfzvK162XwoaepFJ4SMhFRQLuP/4rwRTP+7ogdUi4pZb+34OH7/Su08P4leaGJN/Ls+BXEDy0tfJuJIlQkotk9KExskbjfHl1hmlaltkBwwpGmo+c8yI9x8LnK4j3Pl+B7LEy1GnubJRaoEkqg1wK3c6XyzMuqhi+o5kfrRtBenIsPBWN4G2ankTZ32tMcFhVYnvbijqGa1f5cYMs9+8bx4xhb3QMFrV1KY0sY3i2fj9HY44cyWy6MBgubBZDJ5Pa/dnGHdVo90ZoRfEQR0YjFK7RMjc6elUYw59lj8DI+kLFsOLn0N2PvhL6BXRfdLrtPOSr7vGcOsOG1XMBn81Ev5EGX+jf+xPIcTfDHl47uRQGbsXWNTjNNHjxGxd9GQ0=","integrity":[]},"size":"455","integrity":[{"hash":"SHA256","salt":"","fingerprint":"i1CaombANv8D7V3MywL0YPTpuCbso0miSpm2lb3ludw="}]},{"compression":"GZIP","data":{"raw":"H4sIAAAAAAAAAH1S227TQBB991eMjEpiYTcmUh8aq6JtoBJIaRGmHzDeXbtL1zvWrk1wEf/Oep2YlgT85D1zzlzOTHAp64ZMC51R89lD2zZ2tViUpFt7WhFVSmAj7SmjesGsXb4rsZaqv/gk2muDUts3G9L0mkvbKOwv7BabWZQFweWQISmRCfgZAOxeg3QFISNFJhE1fZNh5qLWsBUoYqjm4VXTKAHrgQEfPCOKHcV/O8rXrZfChp6kUnhIyEVFAu4//ivBFM/7uiB1SLillv7fg4fv9K7Tw/iV5oYk38uz4FcQPLS18m4kiVCSi2T0oTGyRuN8eXWGaVqW2QHDCkaaj5zzIj3HwucriPc+X4HssTLUae5slFqgSSqDXArdzpfLMy6qGL6jmR+tG0F6ciw8FY3gbZqeRNnfa0xwWFVie9uKOoZrV/lxgyz37xvHjGFvdAwWtXUpjSxjeLZ+P0djjhzJbLowGC5sFkMnk9r92cYd1Wj3RmhF8RBHRiMUrtEyNzp6VRjDn2WPwMj6QsWw4ufQ3Y++EvoFdF90uu085Kvu8Zw6w4bVcwGfzUS/kQZf6N/7E8hxN8MeXju5FAZuxdY1OM00ePEbFKpyVI4DAAA=","integrity":[]},"size":"467","integrity":[{"hash":"SHA256","salt":"","fingerprint":"QJiXnajP5WiceSDE0hXfnS19Lb6jaeEWw0K++2q3Qo0="}]}]},{"module":"scripts.ui","filename":"frontend.js","token":"473706a992fbe2fe9ede3de0f5353bc76664dfb005cb843c63684ccb6368a94c","variant":[{"compression":"IDENTITY","data":{"raw":"LyoKICogQVRURU5USU9OOiBUaGUgImV2YWwiIGRldnRvb2wgaGFzIGJlZW4gdXNlZCAobWF5YmUgYnkgZGVmYXVsdCBpbiBtb2RlOiAiZGV2ZWxvcG1lbnQiKS4KICogVGhpcyBkZXZ0b29sIGlzIG5laXRoZXIgbWFkZSBmb3IgcHJvZHVjdGlvbiBub3IgZm9yIHJlYWRhYmxlIG91dHB1dCBmaWxlcy4KICogSXQgdXNlcyAiZXZhbCgpIiBjYWxscyB0byBjcmVhdGUgYSBzZXBhcmF0ZSBzb3VyY2UgZmlsZSBpbiB0aGUgYnJvd3NlciBkZXZ0b29scy4KICogSWYgeW91IGFyZSB0cnlpbmcgdG8gcmVhZCB0aGUgb3V0cHV0IGZpbGUsIHNlbGVjdCBhIGRpZmZlcmVudCBkZXZ0b29sIChodHRwczovL3dlYnBhY2suanMub3JnL2NvbmZpZ3VyYXRpb24vZGV2dG9vbC8pCiAqIG9yIGRpc2FibGUgdGhlIGRlZmF1bHQgZGV2dG9vbCB3aXRoICJkZXZ0b29sOiBmYWxzZSIuCiAqIElmIHlvdSBhcmUgbG9va2luZyBmb3IgcHJvZHVjdGlvbi1yZWFkeSBvdXRwdXQgZmlsZXMsIHNlZSBtb2RlOiAicHJvZHVjdGlvbiIgKGh0dHBzOi8vd2VicGFjay5qcy5vcmcvY29uZmlndXJhdGlvbi9tb2RlLykuCiAqLwooZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkgewoJaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKQoJCW1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOwoJZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpCgkJZGVmaW5lKFtdLCBmYWN0b3J5KTsKCWVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKQoJCWV4cG9ydHNbImZyb250ZW5kIl0gPSBmYWN0b3J5KCk7CgllbHNlCgkJcm9vdFsiZnJvbnRlbmQiXSA9IGZhY3RvcnkoKTsKfSkodGhpcywgZnVuY3Rpb24oKSB7CnJldHVybiAvKioqKioqLyAoKCkgPT4geyAvLyB3ZWJwYWNrQm9vdHN0cmFwCi8qKioqKiovIAl2YXIgX193ZWJwYWNrX21vZHVsZXNfXyA9ICh7CgovKioqLyAiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vY2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoidXNlIHN0cmljdCI7CmV2YWwoIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LWRvbS5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cblxuXG5pZiAodHJ1ZSkge1xuICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQobmV3IEVycm9yKCkpO1xufVxuICAgICAgICAgIHZhciBSZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIHJlYWN0ICovIFwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2luZGV4LmpzXCIpO1xudmFyIFNjaGVkdWxlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIHNjaGVkdWxlciAqLyBcIi4uLy4uL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvaW5kZXguanNcIik7XG5cbnZhciBSZWFjdFNoYXJlZEludGVybmFscyA9IFJlYWN0Ll9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEO1xuXG52YXIgc3VwcHJlc3NXYXJuaW5nID0gZmFsc2U7XG5mdW5jdGlvbiBzZXRTdXBwcmVzc1dhcm5pbmcobmV3U3VwcHJlc3NXYXJuaW5nKSB7XG4gIHtcbiAgICBzdXBwcmVzc1dhcm5pbmcgPSBuZXdTdXBwcmVzc1dhcm5pbmc7XG4gIH1cbn0gLy8gSW4gREVWLCBjYWxscyB0byBjb25zb2xlLndhcm4gYW5kIGNvbnNvbGUuZXJyb3IgZ2V0IHJlcGxhY2VkXG4vLyBieSBjYWxscyB0byB0aGVzZSBtZXRob2RzIGJ5IGEgQmFiZWwgcGx1Z2luLlxuLy9cbi8vIEluIFBST0QgKG9yIGluIHBhY2thZ2VzIHdpdGhvdXQgYWNjZXNzIHRvIFJlYWN0IGludGVybmFscyksXG4vLyB0aGV5IGFyZSBsZWZ0IGFzIHRoZXkgYXJlIGluc3RlYWQuXG5cbmZ1bmN0aW9uIHdhcm4oZm9ybWF0KSB7XG4gIHtcbiAgICBpZiAoIXN1cHByZXNzV2FybmluZykge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgcHJpbnRXYXJuaW5nKCd3YXJuJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGVycm9yKGZvcm1hdCkge1xuICB7XG4gICAgaWYgKCFzdXBwcmVzc1dhcm5pbmcpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnZXJyb3InLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykge1xuICAvLyBXaGVuIGNoYW5naW5nIHRoaXMgbG9naWMsIHlvdSBtaWdodCB3YW50IHRvIGFsc29cbiAgLy8gdXBkYXRlIGNvbnNvbGVXaXRoU3RhY2tEZXYud3d3LmpzIGFzIHdlbGwuXG4gIHtcbiAgICB2YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gICAgdmFyIHN0YWNrID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKCk7XG5cbiAgICBpZiAoc3RhY2sgIT09ICcnKSB7XG4gICAgICBmb3JtYXQgKz0gJyVzJztcbiAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChbc3RhY2tdKTtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuXG5cbiAgICB2YXIgYXJnc1dpdGhGb3JtYXQgPSBhcmdzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIFN0cmluZyhpdGVtKTtcbiAgICB9KTsgLy8gQ2FyZWZ1bDogUk4gY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcmVmaXhcblxuICAgIGFyZ3NXaXRoRm9ybWF0LnVuc2hpZnQoJ1dhcm5pbmc6ICcgKyBmb3JtYXQpOyAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBzcHJlYWQgKG9yIC5hcHBseSkgZGlyZWN0bHkgYmVjYXVzZSBpdFxuICAgIC8vIGJyZWFrcyBJRTk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2MTBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG5cbiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlW2xldmVsXSwgY29uc29sZSwgYXJnc1dpdGhGb3JtYXQpO1xuICB9XG59XG5cbnZhciBGdW5jdGlvbkNvbXBvbmVudCA9IDA7XG52YXIgQ2xhc3NDb21wb25lbnQgPSAxO1xudmFyIEluZGV0ZXJtaW5hdGVDb21wb25lbnQgPSAyOyAvLyBCZWZvcmUgd2Uga25vdyB3aGV0aGVyIGl0IGlzIGZ1bmN0aW9uIG9yIGNsYXNzXG5cbnZhciBIb3N0Um9vdCA9IDM7IC8vIFJvb3Qgb2YgYSBob3N0IHRyZWUuIENvdWxkIGJlIG5lc3RlZCBpbnNpZGUgYW5vdGhlciBub2RlLlxuXG52YXIgSG9zdFBvcnRhbCA9IDQ7IC8vIEEgc3VidHJlZS4gQ291bGQgYmUgYW4gZW50cnkgcG9pbnQgdG8gYSBkaWZmZXJlbnQgcmVuZGVyZXIuXG5cbnZhciBIb3N0Q29tcG9uZW50ID0gNTtcbnZhciBIb3N0VGV4dCA9IDY7XG52YXIgRnJhZ21lbnQgPSA3O1xudmFyIE1vZGUgPSA4O1xudmFyIENvbnRleHRDb25zdW1lciA9IDk7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gMTA7XG52YXIgRm9yd2FyZFJlZiA9IDExO1xudmFyIFByb2ZpbGVyID0gMTI7XG52YXIgU3VzcGVuc2VDb21wb25lbnQgPSAxMztcbnZhciBNZW1vQ29tcG9uZW50ID0gMTQ7XG52YXIgU2ltcGxlTWVtb0NvbXBvbmVudCA9IDE1O1xudmFyIExhenlDb21wb25lbnQgPSAxNjtcbnZhciBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQgPSAxNztcbnZhciBEZWh5ZHJhdGVkRnJhZ21lbnQgPSAxODtcbnZhciBTdXNwZW5zZUxpc3RDb21wb25lbnQgPSAxOTtcbnZhciBTY29wZUNvbXBvbmVudCA9IDIxO1xudmFyIE9mZnNjcmVlbkNvbXBvbmVudCA9IDIyO1xudmFyIExlZ2FjeUhpZGRlbkNvbXBvbmVudCA9IDIzO1xudmFyIENhY2hlQ29tcG9uZW50ID0gMjQ7XG52YXIgVHJhY2luZ01hcmtlckNvbXBvbmVudCA9IDI1O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgZW5hYmxlQ2xpZW50UmVuZGVyRmFsbGJhY2tPblRleHRNaXNtYXRjaCA9IHRydWU7IC8vIFRPRE86IE5lZWQgdG8gcmV2aWV3IHRoaXMgY29kZSBvbmUgbW9yZSB0aW1lIGJlZm9yZSBsYW5kaW5nXG4vLyB0aGUgcmVhY3QtcmVjb25jaWxlciBwYWNrYWdlLlxuXG52YXIgZW5hYmxlTmV3UmVjb25jaWxlciA9IGZhbHNlOyAvLyBTdXBwb3J0IGxlZ2FjeSBQcmltZXIgc3VwcG9ydCBvbiBpbnRlcm5hbCBGQiB3d3dcblxudmFyIGVuYWJsZUxhenlDb250ZXh0UHJvcGFnYXRpb24gPSBmYWxzZTsgLy8gRkItb25seSB1c2FnZS4gVGhlIG5ldyBBUEkgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MuXG5cbnZhciBlbmFibGVMZWdhY3lIaWRkZW4gPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpYmVyXG5cbnZhciBlbmFibGVTdXNwZW5zZUF2b2lkVGhpc0ZhbGxiYWNrID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaXp6XG4vLyBSZWFjdCBET00gQ2hvcHBpbmcgQmxvY2tcbi8vXG4vLyBTaW1pbGFyIHRvIG1haW4gQ2hvcHBpbmcgQmxvY2sgYnV0IG9ubHkgZmxhZ3MgcmVsYXRlZCB0byBSZWFjdCBET00uIFRoZXNlIGFyZVxuLy8gZ3JvdXBlZCBiZWNhdXNlIHdlIHdpbGwgbGlrZWx5IGJhdGNoIGFsbCBvZiB0aGVtIGludG8gYSBzaW5nbGUgbWFqb3IgcmVsZWFzZS5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBEaXNhYmxlIHN1cHBvcnQgZm9yIGNvbW1lbnQgbm9kZXMgYXMgUmVhY3QgRE9NIGNvbnRhaW5lcnMuIEFscmVhZHkgZGlzYWJsZWRcbi8vIGluIG9wZW4gc291cmNlLCBidXQgd3d3IGNvZGViYXNlIHN0aWxsIHJlbGllcyBvbiBpdC4gTmVlZCB0byByZW1vdmUuXG5cbnZhciBkaXNhYmxlQ29tbWVudHNBc0RPTUNvbnRhaW5lcnMgPSB0cnVlOyAvLyBEaXNhYmxlIGphdmFzY3JpcHQ6IFVSTCBzdHJpbmdzIGluIGhyZWYgZm9yIFhTUyBwcm90ZWN0aW9uLlxuLy8gYW5kIGNsaWVudCByZW5kZXJpbmcsIG1vc3RseSB0byBhbGxvdyBKU1ggYXR0cmlidXRlcyB0byBhcHBseSB0byB0aGUgY3VzdG9tXG4vLyBlbGVtZW50J3Mgb2JqZWN0IHByb3BlcnRpZXMgaW5zdGVhZCBvZiBvbmx5IEhUTUwgYXR0cmlidXRlcy5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTEzNDdcblxudmFyIGVuYWJsZUN1c3RvbUVsZW1lbnRQcm9wZXJ0eVN1cHBvcnQgPSBmYWxzZTsgLy8gRGlzYWJsZXMgY2hpbGRyZW4gZm9yIDx0ZXh0YXJlYT4gZWxlbWVudHNcbnZhciB3YXJuQWJvdXRTdHJpbmdSZWZzID0gZmFsc2U7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBEZWJ1Z2dpbmcgYW5kIERldlRvb2xzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQWRkcyB1c2VyIHRpbWluZyBtYXJrcyBmb3IgZS5nLiBzdGF0ZSB1cGRhdGVzLCBzdXNwZW5zZSwgYW5kIHdvcmsgbG9vcCBzdHVmZixcbi8vIGZvciBhbiBleHBlcmltZW50YWwgdGltZWxpbmUgdG9vbC5cblxudmFyIGVuYWJsZVNjaGVkdWxpbmdQcm9maWxlciA9IHRydWU7IC8vIEhlbHBzIGlkZW50aWZ5IHNpZGUgZWZmZWN0cyBpbiByZW5kZXItcGhhc2UgbGlmZWN5Y2xlIGhvb2tzIGFuZCBzZXRTdGF0ZVxuXG52YXIgZW5hYmxlUHJvZmlsZXJUaW1lciA9IHRydWU7IC8vIFJlY29yZCBkdXJhdGlvbnMgZm9yIGNvbW1pdCBhbmQgcGFzc2l2ZSBlZmZlY3RzIHBoYXNlcy5cblxudmFyIGVuYWJsZVByb2ZpbGVyQ29tbWl0SG9va3MgPSB0cnVlOyAvLyBQaGFzZSBwYXJhbSBwYXNzZWQgdG8gb25SZW5kZXIgY2FsbGJhY2sgZGlmZmVyZW50aWF0ZXMgYmV0d2VlbiBhbiBcInVwZGF0ZVwiIGFuZCBhIFwiY2FzY2FkaW5nLXVwZGF0ZVwiLlxuXG52YXIgYWxsTmF0aXZlRXZlbnRzID0gbmV3IFNldCgpO1xuLyoqXG4gKiBNYXBwaW5nIGZyb20gcmVnaXN0cmF0aW9uIG5hbWUgdG8gZXZlbnQgbmFtZVxuICovXG5cblxudmFyIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMgPSB7fTtcbi8qKlxuICogTWFwcGluZyBmcm9tIGxvd2VyY2FzZSByZWdpc3RyYXRpb24gbmFtZXMgdG8gdGhlIHByb3Blcmx5IGNhc2VkIHZlcnNpb24sXG4gKiB1c2VkIHRvIHdhcm4gaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBldmVudCBoYW5kbGVycy4gQXZhaWxhYmxlXG4gKiBvbmx5IGluIHRydWUuXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5cbnZhciBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzID0gIHt9IDsgLy8gVHJ1c3QgdGhlIGRldmVsb3BlciB0byBvbmx5IHVzZSBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzIGluIHRydWVcblxuZnVuY3Rpb24gcmVnaXN0ZXJUd29QaGFzZUV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGRlcGVuZGVuY2llcykge1xuICByZWdpc3RlckRpcmVjdEV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGRlcGVuZGVuY2llcyk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQocmVnaXN0cmF0aW9uTmFtZSArICdDYXB0dXJlJywgZGVwZW5kZW5jaWVzKTtcbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyRGlyZWN0RXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKSB7XG4gIHtcbiAgICBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tyZWdpc3RyYXRpb25OYW1lXSkge1xuICAgICAgZXJyb3IoJ0V2ZW50UmVnaXN0cnk6IE1vcmUgdGhhbiBvbmUgcGx1Z2luIGF0dGVtcHRlZCB0byBwdWJsaXNoIHRoZSBzYW1lICcgKyAncmVnaXN0cmF0aW9uIG5hbWUsIGAlc2AuJywgcmVnaXN0cmF0aW9uTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tyZWdpc3RyYXRpb25OYW1lXSA9IGRlcGVuZGVuY2llcztcblxuICB7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gcmVnaXN0cmF0aW9uTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNbbG93ZXJDYXNlZE5hbWVdID0gcmVnaXN0cmF0aW9uTmFtZTtcblxuICAgIGlmIChyZWdpc3RyYXRpb25OYW1lID09PSAnb25Eb3VibGVDbGljaycpIHtcbiAgICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMub25kYmxjbGljayA9IHJlZ2lzdHJhdGlvbk5hbWU7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXBlbmRlbmNpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBhbGxOYXRpdmVFdmVudHMuYWRkKGRlcGVuZGVuY2llc1tpXSk7XG4gIH1cbn1cblxudmFyIGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpO1xuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG4vKlxuICogVGhlIGAnJyArIHZhbHVlYCBwYXR0ZXJuICh1c2VkIGluIGluIHBlcmYtc2Vuc2l0aXZlIGNvZGUpIHRocm93cyBmb3IgU3ltYm9sXG4gKiBhbmQgVGVtcG9yYWwuKiB0eXBlcy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzIyMDY0LlxuICpcbiAqIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgd2lsbCB0aHJvdyBhbiBlYXNpZXItdG8tdW5kZXJzdGFuZCxcbiAqIGVhc2llci10by1kZWJ1ZyBleGNlcHRpb24gd2l0aCBhIGNsZWFyIGVycm9ycyBtZXNzYWdlIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGVcbiAqIHByb2JsZW0uIChJbnN0ZWFkIG9mIGEgY29uZnVzaW5nIGV4Y2VwdGlvbiB0aHJvd24gaW5zaWRlIHRoZSBpbXBsZW1lbnRhdGlvblxuICogb2YgdGhlIGB2YWx1ZWAgb2JqZWN0KS5cbiAqL1xuLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cbmZ1bmN0aW9uIHR5cGVOYW1lKHZhbHVlKSB7XG4gIHtcbiAgICAvLyB0b1N0cmluZ1RhZyBpcyBuZWVkZWQgZm9yIG5hbWVzcGFjZWQgdHlwZXMgbGlrZSBUZW1wb3JhbC5JbnN0YW50XG4gICAgdmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wudG9TdHJpbmdUYWc7XG4gICAgdmFyIHR5cGUgPSBoYXNUb1N0cmluZ1RhZyAmJiB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddIHx8IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgfHwgJ09iamVjdCc7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cbn0gLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cblxuXG5mdW5jdGlvbiB3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkge1xuICB7XG4gICAgdHJ5IHtcbiAgICAgIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICAvLyBJZiB5b3UgZW5kZWQgdXAgaGVyZSBieSBmb2xsb3dpbmcgYW4gZXhjZXB0aW9uIGNhbGwgc3RhY2ssIGhlcmUncyB3aGF0J3NcbiAgLy8gaGFwcGVuZWQ6IHlvdSBzdXBwbGllZCBhbiBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIFJlYWN0IChhcyBhIHByb3AsIGtleSxcbiAgLy8gRE9NIGF0dHJpYnV0ZSwgQ1NTIHByb3BlcnR5LCBzdHJpbmcgcmVmLCBldGMuKSBhbmQgd2hlbiBSZWFjdCB0cmllZCB0b1xuICAvLyBjb2VyY2UgaXQgdG8gYSBzdHJpbmcgdXNpbmcgYCcnICsgdmFsdWVgLCBhbiBleGNlcHRpb24gd2FzIHRocm93bi5cbiAgLy9cbiAgLy8gVGhlIG1vc3QgY29tbW9uIHR5cGVzIHRoYXQgd2lsbCBjYXVzZSB0aGlzIGV4Y2VwdGlvbiBhcmUgYFN5bWJvbGAgaW5zdGFuY2VzXG4gIC8vIGFuZCBUZW1wb3JhbCBvYmplY3RzIGxpa2UgYFRlbXBvcmFsLkluc3RhbnRgLiBCdXQgYW55IG9iamVjdCB0aGF0IGhhcyBhXG4gIC8vIGB2YWx1ZU9mYCBvciBgW1N5bWJvbC50b1ByaW1pdGl2ZV1gIG1ldGhvZCB0aGF0IHRocm93cyB3aWxsIGFsc28gY2F1c2UgdGhpc1xuICAvLyBleGNlcHRpb24uIChMaWJyYXJ5IGF1dGhvcnMgZG8gdGhpcyB0byBwcmV2ZW50IHVzZXJzIGZyb20gdXNpbmcgYnVpbHQtaW5cbiAgLy8gbnVtZXJpYyBvcGVyYXRvcnMgbGlrZSBgK2Agb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMgbGlrZSBgPj1gIGJlY2F1c2UgY3VzdG9tXG4gIC8vIG1ldGhvZHMgYXJlIG5lZWRlZCB0byBwZXJmb3JtIGFjY3VyYXRlIGFyaXRobWV0aWMgb3IgY29tcGFyaXNvbi4pXG4gIC8vXG4gIC8vIFRvIGZpeCB0aGUgcHJvYmxlbSwgY29lcmNlIHRoaXMgb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZyBiZWZvcmVcbiAgLy8gcGFzc2luZyBpdCB0byBSZWFjdC4gVGhlIG1vc3QgcmVsaWFibGUgd2F5IGlzIHVzdWFsbHkgYFN0cmluZyh2YWx1ZSlgLlxuICAvL1xuICAvLyBUbyBmaW5kIHdoaWNoIHZhbHVlIGlzIHRocm93aW5nLCBjaGVjayB0aGUgYnJvd3NlciBvciBkZWJ1Z2dlciBjb25zb2xlLlxuICAvLyBCZWZvcmUgdGhpcyBleGNlcHRpb24gd2FzIHRocm93biwgdGhlcmUgc2hvdWxkIGJlIGBjb25zb2xlLmVycm9yYCBvdXRwdXRcbiAgLy8gdGhhdCBzaG93cyB0aGUgdHlwZSAoU3ltYm9sLCBUZW1wb3JhbC5QbGFpbkRhdGUsIGV0Yy4pIHRoYXQgY2F1c2VkIHRoZVxuICAvLyBwcm9ibGVtIGFuZCBob3cgdGhhdCB0eXBlIHdhcyB1c2VkOiBrZXksIGF0cnJpYnV0ZSwgaW5wdXQgdmFsdWUgcHJvcCwgZXRjLlxuICAvLyBJbiBtb3N0IGNhc2VzLCB0aGlzIGNvbnNvbGUgb3V0cHV0IGFsc28gc2hvd3MgdGhlIGNvbXBvbmVudCBhbmQgaXRzXG4gIC8vIGFuY2VzdG9yIGNvbXBvbmVudHMgd2hlcmUgdGhlIGV4Y2VwdGlvbiBoYXBwZW5lZC5cbiAgLy9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gIHJldHVybiAnJyArIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBhdHRyaWJ1dGVOYW1lKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGAlc2AgYXR0cmlidXRlIGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIGF0dHJpYnV0ZU5hbWUsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tLZXlTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBrZXkgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja1Byb3BTdHJpbmdDb2VyY2lvbih2YWx1ZSwgcHJvcE5hbWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQgYCVzYCBwcm9wIGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHByb3BOYW1lLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrQ1NTUHJvcGVydHlTdHJpbmdDb2VyY2lvbih2YWx1ZSwgcHJvcE5hbWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQgYCVzYCBDU1MgcHJvcGVydHkgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgcHJvcE5hbWUsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tIdG1sU3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQgSFRNTCBtYXJrdXAgdXNlcyBhIHZhbHVlIG9mIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignRm9ybSBmaWVsZCB2YWx1ZXMgKHZhbHVlLCBjaGVja2VkLCBkZWZhdWx0VmFsdWUsIG9yIGRlZmF1bHRDaGVja2VkIHByb3BzKScgKyAnIG11c3QgYmUgc3RyaW5ncywgbm90ICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cblxuLy8gQSByZXNlcnZlZCBhdHRyaWJ1dGUuXG4vLyBJdCBpcyBoYW5kbGVkIGJ5IFJlYWN0IHNlcGFyYXRlbHkgYW5kIHNob3VsZG4ndCBiZSB3cml0dGVuIHRvIHRoZSBET00uXG52YXIgUkVTRVJWRUQgPSAwOyAvLyBBIHNpbXBsZSBzdHJpbmcgYXR0cmlidXRlLlxuLy8gQXR0cmlidXRlcyB0aGF0IGFyZW4ndCBpbiB0aGUgZmlsdGVyIGFyZSBwcmVzdW1lZCB0byBoYXZlIHRoaXMgdHlwZS5cblxudmFyIFNUUklORyA9IDE7IC8vIEEgc3RyaW5nIGF0dHJpYnV0ZSB0aGF0IGFjY2VwdHMgYm9vbGVhbnMgaW4gUmVhY3QuIEluIEhUTUwsIHRoZXNlIGFyZSBjYWxsZWRcbi8vIFwiZW51bWVyYXRlZFwiIGF0dHJpYnV0ZXMgd2l0aCBcInRydWVcIiBhbmQgXCJmYWxzZVwiIGFzIHBvc3NpYmxlIHZhbHVlcy5cbi8vIFdoZW4gdHJ1ZSwgaXQgc2hvdWxkIGJlIHNldCB0byBhIFwidHJ1ZVwiIHN0cmluZy5cbi8vIFdoZW4gZmFsc2UsIGl0IHNob3VsZCBiZSBzZXQgdG8gYSBcImZhbHNlXCIgc3RyaW5nLlxuXG52YXIgQk9PTEVBTklTSF9TVFJJTkcgPSAyOyAvLyBBIHJlYWwgYm9vbGVhbiBhdHRyaWJ1dGUuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBwcmVzZW50IChzZXQgZWl0aGVyIHRvIGFuIGVtcHR5IHN0cmluZyBvciBpdHMgbmFtZSkuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgb21pdHRlZC5cblxudmFyIEJPT0xFQU4gPSAzOyAvLyBBbiBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIGZsYWcgYXMgd2VsbCBhcyB3aXRoIGEgdmFsdWUuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBwcmVzZW50IChzZXQgZWl0aGVyIHRvIGFuIGVtcHR5IHN0cmluZyBvciBpdHMgbmFtZSkuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgb21pdHRlZC5cbi8vIEZvciBhbnkgb3RoZXIgdmFsdWUsIHNob3VsZCBiZSBwcmVzZW50IHdpdGggdGhhdCB2YWx1ZS5cblxudmFyIE9WRVJMT0FERURfQk9PTEVBTiA9IDQ7IC8vIEFuIGF0dHJpYnV0ZSB0aGF0IG11c3QgYmUgbnVtZXJpYyBvciBwYXJzZSBhcyBhIG51bWVyaWMuXG4vLyBXaGVuIGZhbHN5LCBpdCBzaG91bGQgYmUgcmVtb3ZlZC5cblxudmFyIE5VTUVSSUMgPSA1OyAvLyBBbiBhdHRyaWJ1dGUgdGhhdCBtdXN0IGJlIHBvc2l0aXZlIG51bWVyaWMgb3IgcGFyc2UgYXMgYSBwb3NpdGl2ZSBudW1lcmljLlxuLy8gV2hlbiBmYWxzeSwgaXQgc2hvdWxkIGJlIHJlbW92ZWQuXG5cbnZhciBQT1NJVElWRV9OVU1FUklDID0gNjtcblxuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xudmFyIEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgPSBcIjpBLVpfYS16XFxcXHUwMEMwLVxcXFx1MDBENlxcXFx1MDBEOC1cXFxcdTAwRjZcXFxcdTAwRjgtXFxcXHUwMkZGXFxcXHUwMzcwLVxcXFx1MDM3RFxcXFx1MDM3Ri1cXFxcdTFGRkZcXFxcdTIwMEMtXFxcXHUyMDBEXFxcXHUyMDcwLVxcXFx1MjE4RlxcXFx1MkMwMC1cXFxcdTJGRUZcXFxcdTMwMDEtXFxcXHVEN0ZGXFxcXHVGOTAwLVxcXFx1RkRDRlxcXFx1RkRGMC1cXFxcdUZGRkRcIjtcbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiAqL1xuXG52YXIgQVRUUklCVVRFX05BTUVfQ0hBUiA9IEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgKyBcIlxcXFwtLjAtOVxcXFx1MDBCN1xcXFx1MDMwMC1cXFxcdTAzNkZcXFxcdTIwM0YtXFxcXHUyMDQwXCI7XG52YXIgVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVggPSBuZXcgUmVnRXhwKCdeWycgKyBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSICsgJ11bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG52YXIgaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZSA9IHt9O1xudmFyIHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZSA9IHt9O1xuZnVuY3Rpb24gaXNBdHRyaWJ1dGVOYW1lU2FmZShhdHRyaWJ1dGVOYW1lKSB7XG4gIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZSwgYXR0cmlidXRlTmFtZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUsIGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYLnRlc3QoYXR0cmlidXRlTmFtZSkpIHtcbiAgICB2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGVbYXR0cmlidXRlTmFtZV0gPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG5cbiAge1xuICAgIGVycm9yKCdJbnZhbGlkIGF0dHJpYnV0ZSBuYW1lOiBgJXNgJywgYXR0cmlidXRlTmFtZSk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzaG91bGRJZ25vcmVBdHRyaWJ1dGUobmFtZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHByb3BlcnR5SW5mby50eXBlID09PSBSRVNFUlZFRDtcbiAgfVxuXG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChuYW1lLmxlbmd0aCA+IDIgJiYgKG5hbWVbMF0gPT09ICdvJyB8fCBuYW1lWzBdID09PSAnTycpICYmIChuYW1lWzFdID09PSAnbicgfHwgbmFtZVsxXSA9PT0gJ04nKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCAmJiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gUkVTRVJWRUQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgIGNhc2UgJ2Z1bmN0aW9uJzogLy8gJEZsb3dJc3N1ZSBzeW1ib2wgaXMgcGVyZmVjdGx5IHZhbGlkIGhlcmVcblxuICAgIGNhc2UgJ3N5bWJvbCc6XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAge1xuICAgICAgICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuICFwcm9wZXJ0eUluZm8uYWNjZXB0c0Jvb2xlYW5zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBwcmVmaXggPSBuYW1lLnRvTG93ZXJDYXNlKCkuc2xpY2UoMCwgNSk7XG4gICAgICAgICAgcmV0dXJuIHByZWZpeCAhPT0gJ2RhdGEtJyAmJiBwcmVmaXggIT09ICdhcmlhLSc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG5cbiAgICBzd2l0Y2ggKHByb3BlcnR5SW5mby50eXBlKSB7XG4gICAgICBjYXNlIEJPT0xFQU46XG4gICAgICAgIHJldHVybiAhdmFsdWU7XG5cbiAgICAgIGNhc2UgT1ZFUkxPQURFRF9CT09MRUFOOlxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IGZhbHNlO1xuXG4gICAgICBjYXNlIE5VTUVSSUM6XG4gICAgICAgIHJldHVybiBpc05hTih2YWx1ZSk7XG5cbiAgICAgIGNhc2UgUE9TSVRJVkVfTlVNRVJJQzpcbiAgICAgICAgcmV0dXJuIGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA8IDE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0UHJvcGVydHlJbmZvKG5hbWUpIHtcbiAgcmV0dXJuIHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBwcm9wZXJ0aWVzW25hbWVdIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIHR5cGUsIG11c3RVc2VQcm9wZXJ0eSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZXNwYWNlLCBzYW5pdGl6ZVVSTCwgcmVtb3ZlRW1wdHlTdHJpbmcpIHtcbiAgdGhpcy5hY2NlcHRzQm9vbGVhbnMgPSB0eXBlID09PSBCT09MRUFOSVNIX1NUUklORyB8fCB0eXBlID09PSBCT09MRUFOIHx8IHR5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTjtcbiAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTtcbiAgdGhpcy5hdHRyaWJ1dGVOYW1lc3BhY2UgPSBhdHRyaWJ1dGVOYW1lc3BhY2U7XG4gIHRoaXMubXVzdFVzZVByb3BlcnR5ID0gbXVzdFVzZVByb3BlcnR5O1xuICB0aGlzLnByb3BlcnR5TmFtZSA9IG5hbWU7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMuc2FuaXRpemVVUkwgPSBzYW5pdGl6ZVVSTDtcbiAgdGhpcy5yZW1vdmVFbXB0eVN0cmluZyA9IHJlbW92ZUVtcHR5U3RyaW5nO1xufSAvLyBXaGVuIGFkZGluZyBhdHRyaWJ1dGVzIHRvIHRoaXMgbGlzdCwgYmUgc3VyZSB0byBhbHNvIGFkZCB0aGVtIHRvXG4vLyB0aGUgYHBvc3NpYmxlU3RhbmRhcmROYW1lc2AgbW9kdWxlIHRvIGVuc3VyZSBjYXNpbmcgYW5kIGluY29ycmVjdFxuLy8gbmFtZSB3YXJuaW5ncy5cblxuXG52YXIgcHJvcGVydGllcyA9IHt9OyAvLyBUaGVzZSBwcm9wcyBhcmUgcmVzZXJ2ZWQgYnkgUmVhY3QuIFRoZXkgc2hvdWxkbid0IGJlIHdyaXR0ZW4gdG8gdGhlIERPTS5cblxudmFyIHJlc2VydmVkUHJvcHMgPSBbJ2NoaWxkcmVuJywgJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJywgLy8gVE9ETzogVGhpcyBwcmV2ZW50cyB0aGUgYXNzaWdubWVudCBvZiBkZWZhdWx0VmFsdWUgdG8gcmVndWxhclxuLy8gZWxlbWVudHMgKG5vdCBqdXN0IGlucHV0cykuIE5vdyB0aGF0IFJlYWN0RE9NSW5wdXQgYXNzaWducyB0byB0aGVcbi8vIGRlZmF1bHRWYWx1ZSBwcm9wZXJ0eSAtLSBkbyB3ZSBuZWVkIHRoaXM/XG4nZGVmYXVsdFZhbHVlJywgJ2RlZmF1bHRDaGVja2VkJywgJ2lubmVySFRNTCcsICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLCAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJywgJ3N0eWxlJ107XG5cbnJlc2VydmVkUHJvcHMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBSRVNFUlZFRCwgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIEEgZmV3IFJlYWN0IHN0cmluZyBhdHRyaWJ1dGVzIGhhdmUgYSBkaWZmZXJlbnQgbmFtZS5cbi8vIFRoaXMgaXMgYSBtYXBwaW5nIGZyb20gUmVhY3QgcHJvcCBuYW1lcyB0byB0aGUgYXR0cmlidXRlIG5hbWVzLlxuXG5bWydhY2NlcHRDaGFyc2V0JywgJ2FjY2VwdC1jaGFyc2V0J10sIFsnY2xhc3NOYW1lJywgJ2NsYXNzJ10sIFsnaHRtbEZvcicsICdmb3InXSwgWydodHRwRXF1aXYnLCAnaHR0cC1lcXVpdiddXS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gIHZhciBuYW1lID0gX3JlZlswXSxcbiAgICAgIGF0dHJpYnV0ZU5hbWUgPSBfcmVmWzFdO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgXCJlbnVtZXJhdGVkXCIgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgYWNjZXB0IFwidHJ1ZVwiIGFuZCBcImZhbHNlXCIuXG4vLyBJbiBSZWFjdCwgd2UgbGV0IHVzZXJzIHBhc3MgYHRydWVgIGFuZCBgZmFsc2VgIGV2ZW4gdGhvdWdoIHRlY2huaWNhbGx5XG4vLyB0aGVzZSBhcmVuJ3QgYm9vbGVhbiBhdHRyaWJ1dGVzICh0aGV5IGFyZSBjb2VyY2VkIHRvIHN0cmluZ3MpLlxuXG5bJ2NvbnRlbnRFZGl0YWJsZScsICdkcmFnZ2FibGUnLCAnc3BlbGxDaGVjaycsICd2YWx1ZSddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTklTSF9TVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSBcImVudW1lcmF0ZWRcIiBTVkcgYXR0cmlidXRlcyB0aGF0IGFjY2VwdCBcInRydWVcIiBhbmQgXCJmYWxzZVwiLlxuLy8gSW4gUmVhY3QsIHdlIGxldCB1c2VycyBwYXNzIGB0cnVlYCBhbmQgYGZhbHNlYCBldmVuIHRob3VnaCB0ZWNobmljYWxseVxuLy8gdGhlc2UgYXJlbid0IGJvb2xlYW4gYXR0cmlidXRlcyAodGhleSBhcmUgY29lcmNlZCB0byBzdHJpbmdzKS5cbi8vIFNpbmNlIHRoZXNlIGFyZSBTVkcgYXR0cmlidXRlcywgdGhlaXIgYXR0cmlidXRlIG5hbWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cblxuWydhdXRvUmV2ZXJzZScsICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJywgJ2ZvY3VzYWJsZScsICdwcmVzZXJ2ZUFscGhhJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOSVNIX1NUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSBIVE1MIGJvb2xlYW4gYXR0cmlidXRlcy5cblxuWydhbGxvd0Z1bGxTY3JlZW4nLCAnYXN5bmMnLCAvLyBOb3RlOiB0aGVyZSBpcyBhIHNwZWNpYWwgY2FzZSB0aGF0IHByZXZlbnRzIGl0IGZyb20gYmVpbmcgd3JpdHRlbiB0byB0aGUgRE9NXG4vLyBvbiB0aGUgY2xpZW50IHNpZGUgYmVjYXVzZSB0aGUgYnJvd3NlcnMgYXJlIGluY29uc2lzdGVudC4gSW5zdGVhZCB3ZSBjYWxsIGZvY3VzKCkuXG4nYXV0b0ZvY3VzJywgJ2F1dG9QbGF5JywgJ2NvbnRyb2xzJywgJ2RlZmF1bHQnLCAnZGVmZXInLCAnZGlzYWJsZWQnLCAnZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUnLCAnZGlzYWJsZVJlbW90ZVBsYXliYWNrJywgJ2Zvcm1Ob1ZhbGlkYXRlJywgJ2hpZGRlbicsICdsb29wJywgJ25vTW9kdWxlJywgJ25vVmFsaWRhdGUnLCAnb3BlbicsICdwbGF5c0lubGluZScsICdyZWFkT25seScsICdyZXF1aXJlZCcsICdyZXZlcnNlZCcsICdzY29wZWQnLCAnc2VhbWxlc3MnLCAvLyBNaWNyb2RhdGFcbidpdGVtU2NvcGUnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU4sIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSB0aGUgZmV3IFJlYWN0IHByb3BzIHRoYXQgd2Ugc2V0IGFzIERPTSBwcm9wZXJ0aWVzXG4vLyByYXRoZXIgdGhhbiBhdHRyaWJ1dGVzLiBUaGVzZSBhcmUgYWxsIGJvb2xlYW5zLlxuXG5bJ2NoZWNrZWQnLCAvLyBOb3RlOiBgb3B0aW9uLnNlbGVjdGVkYCBpcyBub3QgdXBkYXRlZCBpZiBgc2VsZWN0Lm11bHRpcGxlYCBpc1xuLy8gZGlzYWJsZWQgd2l0aCBgcmVtb3ZlQXR0cmlidXRlYC4gV2UgaGF2ZSBzcGVjaWFsIGxvZ2ljIGZvciBoYW5kbGluZyB0aGlzLlxuJ211bHRpcGxlJywgJ211dGVkJywgJ3NlbGVjdGVkJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOLCB0cnVlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgYXJlIFwib3ZlcmxvYWRlZCBib29sZWFuc1wiOiB0aGV5IGJlaGF2ZSBsaWtlXG4vLyBib29sZWFucywgYnV0IGNhbiBhbHNvIGFjY2VwdCBhIHN0cmluZyB2YWx1ZS5cblxuWydjYXB0dXJlJywgJ2Rvd25sb2FkJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBPVkVSTE9BREVEX0JPT0xFQU4sIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgbXVzdCBiZSBwb3NpdGl2ZSBudW1iZXJzLlxuXG5bJ2NvbHMnLCAncm93cycsICdzaXplJywgJ3NwYW4nIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFBPU0lUSVZFX05VTUVSSUMsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgbXVzdCBiZSBudW1iZXJzLlxuXG5bJ3Jvd1NwYW4nLCAnc3RhcnQnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIE5VTUVSSUMsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7XG52YXIgQ0FNRUxJWkUgPSAvW1xcLVxcOl0oW2Etel0pL2c7XG5cbnZhciBjYXBpdGFsaXplID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gIHJldHVybiB0b2tlblsxXS50b1VwcGVyQ2FzZSgpO1xufTsgLy8gVGhpcyBpcyBhIGxpc3Qgb2YgYWxsIFNWRyBhdHRyaWJ1dGVzIHRoYXQgbmVlZCBzcGVjaWFsIGNhc2luZywgbmFtZXNwYWNpbmcsXG4vLyBvciBib29sZWFuIHZhbHVlIGFzc2lnbm1lbnQuIFJlZ3VsYXIgYXR0cmlidXRlcyB0aGF0IGp1c3QgYWNjZXB0IHN0cmluZ3Ncbi8vIGFuZCBoYXZlIHRoZSBzYW1lIG5hbWVzIGFyZSBvbWl0dGVkLCBqdXN0IGxpa2UgaW4gdGhlIEhUTUwgYXR0cmlidXRlIGZpbHRlci5cbi8vIFNvbWUgb2YgdGhlc2UgYXR0cmlidXRlcyBjYW4gYmUgaGFyZCB0byBmaW5kLiBUaGlzIGxpc3Qgd2FzIGNyZWF0ZWQgYnlcbi8vIHNjcmFwaW5nIHRoZSBNRE4gZG9jdW1lbnRhdGlvbi5cblxuXG5bJ2FjY2VudC1oZWlnaHQnLCAnYWxpZ25tZW50LWJhc2VsaW5lJywgJ2FyYWJpYy1mb3JtJywgJ2Jhc2VsaW5lLXNoaWZ0JywgJ2NhcC1oZWlnaHQnLCAnY2xpcC1wYXRoJywgJ2NsaXAtcnVsZScsICdjb2xvci1pbnRlcnBvbGF0aW9uJywgJ2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVycycsICdjb2xvci1wcm9maWxlJywgJ2NvbG9yLXJlbmRlcmluZycsICdkb21pbmFudC1iYXNlbGluZScsICdlbmFibGUtYmFja2dyb3VuZCcsICdmaWxsLW9wYWNpdHknLCAnZmlsbC1ydWxlJywgJ2Zsb29kLWNvbG9yJywgJ2Zsb29kLW9wYWNpdHknLCAnZm9udC1mYW1pbHknLCAnZm9udC1zaXplJywgJ2ZvbnQtc2l6ZS1hZGp1c3QnLCAnZm9udC1zdHJldGNoJywgJ2ZvbnQtc3R5bGUnLCAnZm9udC12YXJpYW50JywgJ2ZvbnQtd2VpZ2h0JywgJ2dseXBoLW5hbWUnLCAnZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCcsICdnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCcsICdob3Jpei1hZHYteCcsICdob3Jpei1vcmlnaW4teCcsICdpbWFnZS1yZW5kZXJpbmcnLCAnbGV0dGVyLXNwYWNpbmcnLCAnbGlnaHRpbmctY29sb3InLCAnbWFya2VyLWVuZCcsICdtYXJrZXItbWlkJywgJ21hcmtlci1zdGFydCcsICdvdmVybGluZS1wb3NpdGlvbicsICdvdmVybGluZS10aGlja25lc3MnLCAncGFpbnQtb3JkZXInLCAncGFub3NlLTEnLCAncG9pbnRlci1ldmVudHMnLCAncmVuZGVyaW5nLWludGVudCcsICdzaGFwZS1yZW5kZXJpbmcnLCAnc3RvcC1jb2xvcicsICdzdG9wLW9wYWNpdHknLCAnc3RyaWtldGhyb3VnaC1wb3NpdGlvbicsICdzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcycsICdzdHJva2UtZGFzaGFycmF5JywgJ3N0cm9rZS1kYXNob2Zmc2V0JywgJ3N0cm9rZS1saW5lY2FwJywgJ3N0cm9rZS1saW5lam9pbicsICdzdHJva2UtbWl0ZXJsaW1pdCcsICdzdHJva2Utb3BhY2l0eScsICdzdHJva2Utd2lkdGgnLCAndGV4dC1hbmNob3InLCAndGV4dC1kZWNvcmF0aW9uJywgJ3RleHQtcmVuZGVyaW5nJywgJ3VuZGVybGluZS1wb3NpdGlvbicsICd1bmRlcmxpbmUtdGhpY2tuZXNzJywgJ3VuaWNvZGUtYmlkaScsICd1bmljb2RlLXJhbmdlJywgJ3VuaXRzLXBlci1lbScsICd2LWFscGhhYmV0aWMnLCAndi1oYW5naW5nJywgJ3YtaWRlb2dyYXBoaWMnLCAndi1tYXRoZW1hdGljYWwnLCAndmVjdG9yLWVmZmVjdCcsICd2ZXJ0LWFkdi15JywgJ3ZlcnQtb3JpZ2luLXgnLCAndmVydC1vcmlnaW4teScsICd3b3JkLXNwYWNpbmcnLCAnd3JpdGluZy1tb2RlJywgJ3htbG5zOnhsaW5rJywgJ3gtaGVpZ2h0JyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICB2YXIgbmFtZSA9IGF0dHJpYnV0ZU5hbWUucmVwbGFjZShDQU1FTElaRSwgY2FwaXRhbGl6ZSk7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLCBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBTdHJpbmcgU1ZHIGF0dHJpYnV0ZXMgd2l0aCB0aGUgeGxpbmsgbmFtZXNwYWNlLlxuXG5bJ3hsaW5rOmFjdHVhdGUnLCAneGxpbms6YXJjcm9sZScsICd4bGluazpyb2xlJywgJ3hsaW5rOnNob3cnLCAneGxpbms6dGl0bGUnLCAneGxpbms6dHlwZScgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFN0cmluZyBTVkcgYXR0cmlidXRlcyB3aXRoIHRoZSB4bWwgbmFtZXNwYWNlLlxuXG5bJ3htbDpiYXNlJywgJ3htbDpsYW5nJywgJ3htbDpzcGFjZScgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScsIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXR0cmlidXRlIGV4aXN0cyBib3RoIGluIEhUTUwgYW5kIFNWRy5cbi8vIFRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBjYXNlLXNlbnNpdGl2ZSBpbiBTVkcgc28gd2UgY2FuJ3QganVzdCB1c2Vcbi8vIHRoZSBSZWFjdCBuYW1lIGxpa2Ugd2UgZG8gZm9yIGF0dHJpYnV0ZXMgdGhhdCBleGlzdCBvbmx5IGluIEhUTUwuXG5cblsndGFiSW5kZXgnLCAnY3Jvc3NPcmlnaW4nXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHByb3BlcnRpZXNbYXR0cmlidXRlTmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKGF0dHJpYnV0ZU5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXR0cmlidXRlcyBhY2NlcHQgVVJMcy4gVGhlc2UgbXVzdCBub3QgYWxsb3cgamF2YXNjcmlwdDogVVJMUy5cbi8vIFRoZXNlIHdpbGwgYWxzbyBuZWVkIHRvIGFjY2VwdCBUcnVzdGVkIFR5cGVzIG9iamVjdCBpbiB0aGUgZnV0dXJlLlxuXG52YXIgeGxpbmtIcmVmID0gJ3hsaW5rSHJlZic7XG5wcm9wZXJ0aWVzW3hsaW5rSHJlZl0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKCd4bGlua0hyZWYnLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbid4bGluazpocmVmJywgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCB0cnVlLCAvLyBzYW5pdGl6ZVVSTFxuZmFsc2UpO1xuWydzcmMnLCAnaHJlZicsICdhY3Rpb24nLCAnZm9ybUFjdGlvbiddLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgcHJvcGVydGllc1thdHRyaWJ1dGVOYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQoYXR0cmlidXRlTmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgdHJ1ZSwgLy8gc2FuaXRpemVVUkxcbiAgdHJ1ZSk7XG59KTtcblxuLy8gYW5kIGFueSBuZXdsaW5lIG9yIHRhYiBhcmUgZmlsdGVyZWQgb3V0IGFzIGlmIHRoZXkncmUgbm90IHBhcnQgb2YgdGhlIFVSTC5cbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsLXBhcnNpbmdcbi8vIFRhYiBvciBuZXdsaW5lIGFyZSBkZWZpbmVkIGFzIFxcclxcblxcdDpcbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNhc2NpaS10YWItb3ItbmV3bGluZVxuLy8gQSBDMCBjb250cm9sIGlzIGEgY29kZSBwb2ludCBpbiB0aGUgcmFuZ2UgXFx1MDAwMCBOVUxMIHRvIFxcdTAwMUZcbi8vIElORk9STUFUSU9OIFNFUEFSQVRPUiBPTkUsIGluY2x1c2l2ZTpcbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNjMC1jb250cm9sLW9yLXNwYWNlXG5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cblxudmFyIGlzSmF2YVNjcmlwdFByb3RvY29sID0gL15bXFx1MDAwMC1cXHUwMDFGIF0qaltcXHJcXG5cXHRdKmFbXFxyXFxuXFx0XSp2W1xcclxcblxcdF0qYVtcXHJcXG5cXHRdKnNbXFxyXFxuXFx0XSpjW1xcclxcblxcdF0qcltcXHJcXG5cXHRdKmlbXFxyXFxuXFx0XSpwW1xcclxcblxcdF0qdFtcXHJcXG5cXHRdKlxcOi9pO1xudmFyIGRpZFdhcm4gPSBmYWxzZTtcblxuZnVuY3Rpb24gc2FuaXRpemVVUkwodXJsKSB7XG4gIHtcbiAgICBpZiAoIWRpZFdhcm4gJiYgaXNKYXZhU2NyaXB0UHJvdG9jb2wudGVzdCh1cmwpKSB7XG4gICAgICBkaWRXYXJuID0gdHJ1ZTtcblxuICAgICAgZXJyb3IoJ0EgZnV0dXJlIHZlcnNpb24gb2YgUmVhY3Qgd2lsbCBibG9jayBqYXZhc2NyaXB0OiBVUkxzIGFzIGEgc2VjdXJpdHkgcHJlY2F1dGlvbi4gJyArICdVc2UgZXZlbnQgaGFuZGxlcnMgaW5zdGVhZCBpZiB5b3UgY2FuLiBJZiB5b3UgbmVlZCB0byBnZW5lcmF0ZSB1bnNhZmUgSFRNTCB0cnkgJyArICd1c2luZyBkYW5nZXJvdXNseVNldElubmVySFRNTCBpbnN0ZWFkLiBSZWFjdCB3YXMgcGFzc2VkICVzLicsIEpTT04uc3RyaW5naWZ5KHVybCkpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9yIGEgcHJvcGVydHkgb24gYSBub2RlLiBPbmx5IHVzZWQgaW4gREVWIGZvciBTU1IgdmFsaWRhdGlvbi5cbiAqIFRoZSBcImV4cGVjdGVkXCIgYXJndW1lbnQgaXMgdXNlZCBhcyBhIGhpbnQgb2Ygd2hhdCB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMuXG4gKiBTb21lIHByb3BlcnRpZXMgaGF2ZSBtdWx0aXBsZSBlcXVpdmFsZW50IHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCBuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvKSB7XG4gIHtcbiAgICBpZiAocHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eSkge1xuICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWU7XG4gICAgICByZXR1cm4gbm9kZVtwcm9wZXJ0eU5hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGNoZWNrIHByb3RlY3RzIG11bHRpcGxlIHVzZXMgb2YgYGV4cGVjdGVkYCwgd2hpY2ggaXMgd2h5IHRoZVxuICAgICAgLy8gcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb24gcnVsZSBpcyBkaXNhYmxlZCBpbiBzZXZlcmFsIHNwb3RzXG4gICAgICAvLyBiZWxvdy5cbiAgICAgIHtcbiAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihleHBlY3RlZCwgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICggcHJvcGVydHlJbmZvLnNhbml0aXplVVJMKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmVuJ3QgZnVsbHkgZGlzYWJsZWQgamF2YXNjcmlwdDogVVJMcywgYW5kIGlmXG4gICAgICAgIC8vIHRoZSBoeWRyYXRpb24gaXMgc3VjY2Vzc2Z1bCBvZiBhIGphdmFzY3JpcHQ6IFVSTCwgd2VcbiAgICAgICAgLy8gc3RpbGwgd2FudCB0byB3YXJuIG9uIHRoZSBjbGllbnQuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgICBzYW5pdGl6ZVVSTCgnJyArIGV4cGVjdGVkKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZTtcbiAgICAgIHZhciBzdHJpbmdWYWx1ZSA9IG51bGw7XG5cbiAgICAgIGlmIChwcm9wZXJ0eUluZm8udHlwZSA9PT0gT1ZFUkxPQURFRF9CT09MRUFOKSB7XG4gICAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuXG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09ICcnICsgZXhwZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgICAgICAvLyBXZSBoYWQgYW4gYXR0cmlidXRlIGJ1dCBzaG91bGRuJ3QgaGF2ZSBoYWQgb25lLCBzbyByZWFkIGl0XG4gICAgICAgICAgLy8gZm9yIHRoZSBlcnJvciBtZXNzYWdlLlxuICAgICAgICAgIHJldHVybiBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8udHlwZSA9PT0gQk9PTEVBTikge1xuICAgICAgICAgIC8vIElmIHRoaXMgd2FzIGEgYm9vbGVhbiwgaXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgdmFsdWUgaXNcbiAgICAgICAgICAvLyB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgaXQgaXMgdGhlIHNhbWUgYXMgdGhlIGV4cGVjdGVkLlxuICAgICAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICAgICAgfSAvLyBFdmVuIGlmIHRoaXMgcHJvcGVydHkgdXNlcyBhIG5hbWVzcGFjZSB3ZSB1c2UgZ2V0QXR0cmlidXRlXG4gICAgICAgIC8vIGJlY2F1c2Ugd2UgYXNzdW1lIGl0cyBuYW1lc3BhY2VkIG5hbWUgaXMgdGhlIHNhbWUgYXMgb3VyIGNvbmZpZy5cbiAgICAgICAgLy8gVG8gdXNlIGdldEF0dHJpYnV0ZU5TIHdlIG5lZWQgdGhlIGxvY2FsIG5hbWUgd2hpY2ggd2UgZG9uJ3QgaGF2ZVxuICAgICAgICAvLyBpbiBvdXIgY29uZmlnIGF0bS5cblxuXG4gICAgICAgIHN0cmluZ1ZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdWYWx1ZSA9PT0gbnVsbCA/IGV4cGVjdGVkIDogc3RyaW5nVmFsdWU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgfSBlbHNlIGlmIChzdHJpbmdWYWx1ZSA9PT0gJycgKyBleHBlY3RlZCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9yIGEgYXR0cmlidXRlIG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdXNlZCBhcyBhIGhpbnQgb2Ygd2hhdCB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMuIFNvbWVcbiAqIGF0dHJpYnV0ZXMgaGF2ZSBtdWx0aXBsZSBlcXVpdmFsZW50IHZhbHVlcy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRWYWx1ZUZvckF0dHJpYnV0ZShub2RlLCBuYW1lLCBleHBlY3RlZCwgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAge1xuICAgIGlmICghaXNBdHRyaWJ1dGVOYW1lU2FmZShuYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghbm9kZS5oYXNBdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgIHJldHVybiBleHBlY3RlZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShuYW1lKTtcblxuICAgIHtcbiAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24oZXhwZWN0ZWQsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gJycgKyBleHBlY3RlZCkge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBmb3IgYSBwcm9wZXJ0eSBvbiBhIG5vZGUuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICovXG5cbmZ1bmN0aW9uIHNldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgbmFtZSwgdmFsdWUsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIHZhciBwcm9wZXJ0eUluZm8gPSBnZXRQcm9wZXJ0eUluZm8obmFtZSk7XG5cbiAgaWYgKHNob3VsZElnbm9yZUF0dHJpYnV0ZShuYW1lLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgdmFsdWUgPSBudWxsO1xuICB9XG5cblxuICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcgfHwgcHJvcGVydHlJbmZvID09PSBudWxsKSB7XG4gICAgaWYgKGlzQXR0cmlidXRlTmFtZVNhZmUobmFtZSkpIHtcbiAgICAgIHZhciBfYXR0cmlidXRlTmFtZSA9IG5hbWU7XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShfYXR0cmlidXRlTmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB7XG4gICAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwgbmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShfYXR0cmlidXRlTmFtZSwgICcnICsgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBtdXN0VXNlUHJvcGVydHkgPSBwcm9wZXJ0eUluZm8ubXVzdFVzZVByb3BlcnR5O1xuXG4gIGlmIChtdXN0VXNlUHJvcGVydHkpIHtcbiAgICB2YXIgcHJvcGVydHlOYW1lID0gcHJvcGVydHlJbmZvLnByb3BlcnR5TmFtZTtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdmFyIHR5cGUgPSBwcm9wZXJ0eUluZm8udHlwZTtcbiAgICAgIG5vZGVbcHJvcGVydHlOYW1lXSA9IHR5cGUgPT09IEJPT0xFQU4gPyBmYWxzZSA6ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb250cmFyeSB0byBgc2V0QXR0cmlidXRlYCwgb2JqZWN0IHByb3BlcnRpZXMgYXJlIHByb3Blcmx5XG4gICAgICAvLyBgdG9TdHJpbmdgZWQgYnkgSUU4LzkuXG4gICAgICBub2RlW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0gLy8gVGhlIHJlc3QgYXJlIHRyZWF0ZWQgYXMgYXR0cmlidXRlcyB3aXRoIHNwZWNpYWwgY2FzZXMuXG5cblxuICB2YXIgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lLFxuICAgICAgYXR0cmlidXRlTmFtZXNwYWNlID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWVzcGFjZTtcblxuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgX3R5cGUgPSBwcm9wZXJ0eUluZm8udHlwZTtcbiAgICB2YXIgYXR0cmlidXRlVmFsdWU7XG5cbiAgICBpZiAoX3R5cGUgPT09IEJPT0xFQU4gfHwgX3R5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTiAmJiB2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgLy8gSWYgYXR0cmlidXRlIHR5cGUgaXMgYm9vbGVhbiwgd2Uga25vdyBmb3Igc3VyZSBpdCB3b24ndCBiZSBhbiBleGVjdXRpb24gc2lua1xuICAgICAgLy8gYW5kIHdlIHdvbid0IHJlcXVpcmUgVHJ1c3RlZCBUeXBlIGhlcmUuXG4gICAgICBhdHRyaWJ1dGVWYWx1ZSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBgc2V0QXR0cmlidXRlYCB3aXRoIG9iamVjdHMgYmVjb21lcyBvbmx5IGBbb2JqZWN0XWAgaW4gSUU4LzksXG4gICAgICAvLyAoJycgKyB2YWx1ZSkgbWFrZXMgaXQgb3V0cHV0IHRoZSBjb3JyZWN0IHRvU3RyaW5nKCktdmFsdWUuXG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BlcnR5SW5mby5zYW5pdGl6ZVVSTCkge1xuICAgICAgICBzYW5pdGl6ZVVSTChhdHRyaWJ1dGVWYWx1ZS50b1N0cmluZygpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYXR0cmlidXRlTmFtZXNwYWNlKSB7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZU5TKGF0dHJpYnV0ZU5hbWVzcGFjZSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbi8vIEFUVEVOVElPTlxuLy8gV2hlbiBhZGRpbmcgbmV3IHN5bWJvbHMgdG8gdGhpcyBmaWxlLFxuLy8gUGxlYXNlIGNvbnNpZGVyIGFsc28gYWRkaW5nIHRvICdyZWFjdC1kZXZ0b29scy1zaGFyZWQvc3JjL2JhY2tlbmQvUmVhY3RTeW1ib2xzJ1xuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpO1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJyk7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJyk7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubGF6eScpO1xudmFyIFJFQUNUX1NDT1BFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zY29wZScpO1xudmFyIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZGVidWdfdHJhY2VfbW9kZScpO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Qub2Zmc2NyZWVuJyk7XG52YXIgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubGVnYWN5X2hpZGRlbicpO1xudmFyIFJFQUNUX0NBQ0hFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jYWNoZScpO1xudmFyIFJFQUNUX1RSQUNJTkdfTUFSS0VSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC50cmFjaW5nX21hcmtlcicpO1xudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcblxuLy8gSGVscGVycyB0byBwYXRjaCBjb25zb2xlLmxvZ3MgdG8gYXZvaWQgbG9nZ2luZyBkdXJpbmcgc2lkZS1lZmZlY3QgZnJlZVxuLy8gcmVwbGF5aW5nIG9uIHJlbmRlciBmdW5jdGlvbi4gVGhpcyBjdXJyZW50bHkgb25seSBwYXRjaGVzIHRoZSBvYmplY3Rcbi8vIGxhemlseSB3aGljaCB3b24ndCBjb3ZlciBpZiB0aGUgbG9nIGZ1bmN0aW9uIHdhcyBleHRyYWN0ZWQgZWFnZXJseS5cbi8vIFdlIGNvdWxkIGFsc28gZWFnZXJseSBwYXRjaCB0aGUgbWV0aG9kLlxudmFyIGRpc2FibGVkRGVwdGggPSAwO1xudmFyIHByZXZMb2c7XG52YXIgcHJldkluZm87XG52YXIgcHJldldhcm47XG52YXIgcHJldkVycm9yO1xudmFyIHByZXZHcm91cDtcbnZhciBwcmV2R3JvdXBDb2xsYXBzZWQ7XG52YXIgcHJldkdyb3VwRW5kO1xuXG5mdW5jdGlvbiBkaXNhYmxlZExvZygpIHt9XG5cbmRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9IHRydWU7XG5mdW5jdGlvbiBkaXNhYmxlTG9ncygpIHtcbiAge1xuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHByZXZMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgIHByZXZJbmZvID0gY29uc29sZS5pbmZvO1xuICAgICAgcHJldldhcm4gPSBjb25zb2xlLndhcm47XG4gICAgICBwcmV2RXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgcHJldkdyb3VwID0gY29uc29sZS5ncm91cDtcbiAgICAgIHByZXZHcm91cENvbGxhcHNlZCA9IGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQ7XG4gICAgICBwcmV2R3JvdXBFbmQgPSBjb25zb2xlLmdyb3VwRW5kOyAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5MDk5XG5cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogZGlzYWJsZWRMb2csXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGluZm86IHByb3BzLFxuICAgICAgICBsb2c6IHByb3BzLFxuICAgICAgICB3YXJuOiBwcm9wcyxcbiAgICAgICAgZXJyb3I6IHByb3BzLFxuICAgICAgICBncm91cDogcHJvcHMsXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBFbmQ6IHByb3BzXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgZGlzYWJsZWREZXB0aCsrO1xuICB9XG59XG5mdW5jdGlvbiByZWVuYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBkaXNhYmxlZERlcHRoLS07XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgbG9nOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZMb2dcbiAgICAgICAgfSksXG4gICAgICAgIGluZm86IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldldhcm5cbiAgICAgICAgfSksXG4gICAgICAgIGVycm9yOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZFcnJvclxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXA6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWRcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwRW5kOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZERlcHRoIDwgMCkge1xuICAgICAgZXJyb3IoJ2Rpc2FibGVkRGVwdGggZmVsbCBiZWxvdyB6ZXJvLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG52YXIgcHJlZml4O1xuZnVuY3Rpb24gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEV4dHJhY3QgdGhlIFZNIHNwZWNpZmljIHByZWZpeCB1c2VkIGJ5IGVhY2ggbGluZS5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIHZhciBtYXRjaCA9IHguc3RhY2sudHJpbSgpLm1hdGNoKC9cXG4oICooYXQgKT8pLyk7XG4gICAgICAgIHByZWZpeCA9IG1hdGNoICYmIG1hdGNoWzFdIHx8ICcnO1xuICAgICAgfVxuICAgIH0gLy8gV2UgdXNlIHRoZSBwcmVmaXggdG8gZW5zdXJlIG91ciBzdGFja3MgbGluZSB1cCB3aXRoIG5hdGl2ZSBzdGFjayBmcmFtZXMuXG5cblxuICAgIHJldHVybiAnXFxuJyArIHByZWZpeCArIG5hbWU7XG4gIH1cbn1cbnZhciByZWVudHJ5ID0gZmFsc2U7XG52YXIgY29tcG9uZW50RnJhbWVDYWNoZTtcblxue1xuICB2YXIgUG9zc2libHlXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwO1xuICBjb21wb25lbnRGcmFtZUNhY2hlID0gbmV3IFBvc3NpYmx5V2Vha01hcCgpO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBjb25zdHJ1Y3QpIHtcbiAgLy8gSWYgc29tZXRoaW5nIGFza2VkIGZvciBhIHN0YWNrIGluc2lkZSBhIGZha2UgcmVuZGVyLCBpdCBzaG91bGQgZ2V0IGlnbm9yZWQuXG4gIGlmICggIWZuIHx8IHJlZW50cnkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB7XG4gICAgdmFyIGZyYW1lID0gY29tcG9uZW50RnJhbWVDYWNoZS5nZXQoZm4pO1xuXG4gICAgaWYgKGZyYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmcmFtZTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29udHJvbDtcbiAgcmVlbnRyeSA9IHRydWU7XG4gIHZhciBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7IC8vICRGbG93Rml4TWUgSXQgZG9lcyBhY2NlcHQgdW5kZWZpbmVkLlxuXG4gIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gdW5kZWZpbmVkO1xuICB2YXIgcHJldmlvdXNEaXNwYXRjaGVyO1xuXG4gIHtcbiAgICBwcmV2aW91c0Rpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQ7IC8vIFNldCB0aGUgZGlzcGF0Y2hlciBpbiBERVYgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGNhbGwgaW4gdGhlIHJlbmRlciBmdW5jdGlvblxuICAgIC8vIGZvciB3YXJuaW5ncy5cblxuICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IG51bGw7XG4gICAgZGlzYWJsZUxvZ3MoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBzaG91bGQgdGhyb3cuXG4gICAgaWYgKGNvbnN0cnVjdCkge1xuICAgICAgLy8gU29tZXRoaW5nIHNob3VsZCBiZSBzZXR0aW5nIHRoZSBwcm9wcyBpbiB0aGUgY29uc3RydWN0b3IuXG4gICAgICB2YXIgRmFrZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH07IC8vICRGbG93Rml4TWVcblxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmFrZS5wcm90b3R5cGUsICdwcm9wcycsIHtcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gV2UgdXNlIGEgdGhyb3dpbmcgc2V0dGVyIGluc3RlYWQgb2YgZnJvemVuIG9yIG5vbi13cml0YWJsZSBwcm9wc1xuICAgICAgICAgIC8vIGJlY2F1c2UgdGhhdCB3b24ndCB0aHJvdyBpbiBhIG5vbi1zdHJpY3QgbW9kZSBmdW5jdGlvbi5cbiAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmNvbnN0cnVjdCkge1xuICAgICAgICAvLyBXZSBjb25zdHJ1Y3QgYSBkaWZmZXJlbnQgY29udHJvbCBmb3IgdGhpcyBjYXNlIHRvIGluY2x1ZGUgYW55IGV4dHJhXG4gICAgICAgIC8vIGZyYW1lcyBhZGRlZCBieSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoRmFrZSwgW10pO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChmbiwgW10sIEZha2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBGYWtlLmNhbGwoKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgZm4uY2FsbChGYWtlLnByb3RvdHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgfVxuXG4gICAgICBmbigpO1xuICAgIH1cbiAgfSBjYXRjaCAoc2FtcGxlKSB7XG4gICAgLy8gVGhpcyBpcyBpbmxpbmVkIG1hbnVhbGx5IGJlY2F1c2UgY2xvc3VyZSBkb2Vzbid0IGRvIGl0IGZvciB1cy5cbiAgICBpZiAoc2FtcGxlICYmIGNvbnRyb2wgJiYgdHlwZW9mIHNhbXBsZS5zdGFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlIGZpcnN0IGZyYW1lIGZyb20gdGhlIHNhbXBsZSB0aGF0IGlzbid0IGFsc28gaW4gdGhlIGNvbnRyb2wuXG4gICAgICAvLyBTa2lwcGluZyBvbmUgZnJhbWUgdGhhdCB3ZSBhc3N1bWUgaXMgdGhlIGZyYW1lIHRoYXQgY2FsbHMgdGhlIHR3by5cbiAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZS5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgY29udHJvbExpbmVzID0gY29udHJvbC5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgcyA9IHNhbXBsZUxpbmVzLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgYyA9IGNvbnRyb2xMaW5lcy5sZW5ndGggLSAxO1xuXG4gICAgICB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCAmJiBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgIC8vIFdlIGV4cGVjdCBhdCBsZWFzdCBvbmUgc3RhY2sgZnJhbWUgdG8gYmUgc2hhcmVkLlxuICAgICAgICAvLyBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIHRoZSByb290IG1vc3Qgb25lLiBIb3dldmVyLCBzdGFjayBmcmFtZXMgbWF5IGJlXG4gICAgICAgIC8vIGN1dCBvZmYgZHVlIHRvIG1heGltdW0gc3RhY2sgbGltaXRzLiBJbiB0aGlzIGNhc2UsIG9uZSBtYXliZSBjdXQgb2ZmXG4gICAgICAgIC8vIGVhcmxpZXIgdGhhbiB0aGUgb3RoZXIuIFdlIGFzc3VtZSB0aGF0IHRoZSBzYW1wbGUgaXMgbG9uZ2VyIG9yIHRoZSBzYW1lXG4gICAgICAgIC8vIGFuZCB0aGVyZSBmb3IgY3V0IG9mZiBlYXJsaWVyLiBTbyB3ZSBzaG91bGQgZmluZCB0aGUgcm9vdCBtb3N0IGZyYW1lIGluXG4gICAgICAgIC8vIHRoZSBzYW1wbGUgc29tZXdoZXJlIGluIHRoZSBjb250cm9sLlxuICAgICAgICBjLS07XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBzID49IDEgJiYgYyA+PSAwOyBzLS0sIGMtLSkge1xuICAgICAgICAvLyBOZXh0IHdlIGZpbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHdoaWNoIHNob3VsZCBiZSB0aGVcbiAgICAgICAgLy8gZnJhbWUgdGhhdCBjYWxsZWQgb3VyIHNhbXBsZSBmdW5jdGlvbiBhbmQgdGhlIGNvbnRyb2wuXG4gICAgICAgIGlmIChzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgLy8gSW4gVjgsIHRoZSBmaXJzdCBsaW5lIGlzIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgYnV0IG90aGVyIFZNcyBkb24ndC5cbiAgICAgICAgICAvLyBJZiB3ZSdyZSBhYm91dCB0byByZXR1cm4gdGhlIGZpcnN0IGxpbmUsIGFuZCB0aGUgY29udHJvbCBpcyBhbHNvIG9uIHRoZSBzYW1lXG4gICAgICAgICAgLy8gbGluZSwgdGhhdCdzIGEgcHJldHR5IGdvb2QgaW5kaWNhdG9yIHRoYXQgb3VyIHNhbXBsZSB0aHJldyBhdCBzYW1lIGxpbmUgYXNcbiAgICAgICAgICAvLyB0aGUgY29udHJvbC4gSS5lLiBiZWZvcmUgd2UgZW50ZXJlZCB0aGUgc2FtcGxlIGZyYW1lLiBTbyB3ZSBpZ25vcmUgdGhpcyByZXN1bHQuXG4gICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBwYXNzZWQgYSBjbGFzcyB0byBmdW5jdGlvbiBjb21wb25lbnQsIG9yIG5vbi1mdW5jdGlvbi5cbiAgICAgICAgICBpZiAocyAhPT0gMSB8fCBjICE9PSAxKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgIHMtLTtcbiAgICAgICAgICAgICAgYy0tOyAvLyBXZSBtYXkgc3RpbGwgaGF2ZSBzaW1pbGFyIGludGVybWVkaWF0ZSBmcmFtZXMgZnJvbSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgICAgICAgIC8vIFRoZSBuZXh0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHNob3VsZCBiZSBvdXIgbWF0Y2ggdGhvdWdoLlxuXG4gICAgICAgICAgICAgIGlmIChjIDwgMCB8fCBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgICAgICAgLy8gVjggYWRkcyBhIFwibmV3XCIgcHJlZml4IGZvciBuYXRpdmUgY2xhc3Nlcy4gTGV0J3MgcmVtb3ZlIGl0IHRvIG1ha2UgaXQgcHJldHRpZXIuXG4gICAgICAgICAgICAgICAgdmFyIF9mcmFtZSA9ICdcXG4nICsgc2FtcGxlTGluZXNbc10ucmVwbGFjZSgnIGF0IG5ldyAnLCAnIGF0ICcpOyAvLyBJZiBvdXIgY29tcG9uZW50IGZyYW1lIGlzIGxhYmVsZWQgXCI8YW5vbnltb3VzPlwiXG4gICAgICAgICAgICAgICAgLy8gYnV0IHdlIGhhdmUgYSB1c2VyLXByb3ZpZGVkIFwiZGlzcGxheU5hbWVcIlxuICAgICAgICAgICAgICAgIC8vIHNwbGljZSBpdCBpbiB0byBtYWtlIHRoZSBzdGFjayBtb3JlIHJlYWRhYmxlLlxuXG5cbiAgICAgICAgICAgICAgICBpZiAoZm4uZGlzcGxheU5hbWUgJiYgX2ZyYW1lLmluY2x1ZGVzKCc8YW5vbnltb3VzPicpKSB7XG4gICAgICAgICAgICAgICAgICBfZnJhbWUgPSBfZnJhbWUucmVwbGFjZSgnPGFub255bW91cz4nLCBmbi5kaXNwbGF5TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgX2ZyYW1lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IC8vIFJldHVybiB0aGUgbGluZSB3ZSBmb3VuZC5cblxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mcmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcmVlbnRyeSA9IGZhbHNlO1xuXG4gICAge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50ID0gcHJldmlvdXNEaXNwYXRjaGVyO1xuICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgfVxuXG4gICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlO1xuICB9IC8vIEZhbGxiYWNrIHRvIGp1c3QgdXNpbmcgdGhlIG5hbWUgaWYgd2UgY291bGRuJ3QgbWFrZSBpdCB0aHJvdy5cblxuXG4gIHZhciBuYW1lID0gZm4gPyBmbi5kaXNwbGF5TmFtZSB8fCBmbi5uYW1lIDogJyc7XG4gIHZhciBzeW50aGV0aWNGcmFtZSA9IG5hbWUgPyBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lKSA6ICcnO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgc3ludGhldGljRnJhbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzeW50aGV0aWNGcmFtZTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVDbGFzc0NvbXBvbmVudEZyYW1lKGN0b3IsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoY3RvciwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmbiwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgZmFsc2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZENvbnN0cnVjdChDb21wb25lbnQpIHtcbiAgdmFyIHByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4gIHJldHVybiAhIShwcm90b3R5cGUgJiYgcHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZSwgc291cmNlLCBvd25lckZuKSB7XG5cbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHtcbiAgICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKHR5cGUsIHNob3VsZENvbnN0cnVjdCh0eXBlKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSh0eXBlKTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2UnKTtcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZUxpc3QnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLnJlbmRlcik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAvLyBNZW1vIG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUudHlwZSwgc291cmNlLCBvd25lckZuKTtcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBMYXp5IG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihpbml0KHBheWxvYWQpLCBzb3VyY2UsIG93bmVyRm4pO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHt9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlRmliZXIoZmliZXIpIHtcbiAgdmFyIG93bmVyID0gIGZpYmVyLl9kZWJ1Z093bmVyID8gZmliZXIuX2RlYnVnT3duZXIudHlwZSA6IG51bGwgO1xuICB2YXIgc291cmNlID0gIGZpYmVyLl9kZWJ1Z1NvdXJjZSA7XG5cbiAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSk7XG5cbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ0xhenknKTtcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG5cbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUpO1xuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmaWJlci50eXBlLnJlbmRlcik7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQ2xhc3NDb21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHdvcmtJblByb2dyZXNzKSB7XG4gIHRyeSB7XG4gICAgdmFyIGluZm8gPSAnJztcbiAgICB2YXIgbm9kZSA9IHdvcmtJblByb2dyZXNzO1xuXG4gICAgZG8ge1xuICAgICAgaW5mbyArPSBkZXNjcmliZUZpYmVyKG5vZGUpO1xuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH0gd2hpbGUgKG5vZGUpO1xuXG4gICAgcmV0dXJuIGluZm87XG4gIH0gY2F0Y2ggKHgpIHtcbiAgICByZXR1cm4gJ1xcbkVycm9yIGdlbmVyYXRpbmcgc3RhY2s6ICcgKyB4Lm1lc3NhZ2UgKyAnXFxuJyArIHguc3RhY2s7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBkaXNwbGF5TmFtZSA9IG91dGVyVHlwZS5kaXNwbGF5TmFtZTtcblxuICBpZiAoZGlzcGxheU5hbWUpIHtcbiAgICByZXR1cm4gZGlzcGxheU5hbWU7XG4gIH1cblxuICB2YXIgZnVuY3Rpb25OYW1lID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8ICcnO1xuICByZXR1cm4gZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgXCIoXCIgKyBmdW5jdGlvbk5hbWUgKyBcIilcIiA6IHdyYXBwZXJOYW1lO1xufSAvLyBLZWVwIGluIHN5bmMgd2l0aCByZWFjdC1yZWNvbmNpbGVyL2dldENvbXBvbmVudE5hbWVGcm9tRmliZXJcblxuXG5mdW5jdGlvbiBnZXRDb250ZXh0TmFtZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8ICdDb250ZXh0Jztcbn0gLy8gTm90ZSB0aGF0IHRoZSByZWNvbmNpbGVyIHBhY2thZ2Ugc2hvdWxkIGdlbmVyYWxseSBwcmVmZXIgdG8gdXNlIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoKSBpbnN0ZWFkLlxuXG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICAvLyBIb3N0IHJvb3QsIHRleHQgbm9kZSBvciBqdXN0IGludmFsaWQgdHlwZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBpZiAodHlwZW9mIHR5cGUudGFnID09PSAnbnVtYmVyJykge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgb2JqZWN0IGluIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSgpLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG5cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgIHZhciBwcm92aWRlciA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJztcblxuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICB2YXIgb3V0ZXJOYW1lID0gdHlwZS5kaXNwbGF5TmFtZSB8fCBudWxsO1xuXG4gICAgICAgIGlmIChvdXRlck5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gb3V0ZXJOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdNZW1vJztcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUkMShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIG91dGVyVHlwZS5kaXNwbGF5TmFtZSB8fCAoZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgXCIoXCIgKyBmdW5jdGlvbk5hbWUgKyBcIilcIiA6IHdyYXBwZXJOYW1lKTtcbn0gLy8gS2VlcCBpbiBzeW5jIHdpdGggc2hhcmVkL2dldENvbXBvbmVudE5hbWVGcm9tVHlwZVxuXG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lJDEodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59XG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHtcbiAgdmFyIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgIHR5cGUgPSBmaWJlci50eXBlO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSBDYWNoZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnQ2FjaGUnO1xuXG4gICAgY2FzZSBDb250ZXh0Q29uc3VtZXI6XG4gICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUkMShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lJDEocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICBjYXNlIERlaHlkcmF0ZWRGcmFnbWVudDpcbiAgICAgIHJldHVybiAnRGVoeWRyYXRlZEZyYWdtZW50JztcblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHJldHVybiBnZXRXcmFwcGVkTmFtZSQxKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgY2FzZSBGcmFnbWVudDpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgLy8gSG9zdCBjb21wb25lbnQgdHlwZSBpcyB0aGUgZGlzcGxheSBuYW1lIChlLmcuIFwiZGl2XCIsIFwiVmlld1wiKVxuICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAgcmV0dXJuICdSb290JztcblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICByZXR1cm4gJ1RleHQnO1xuXG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgICAgLy8gTmFtZSBjb21lcyBmcm9tIHRoZSB0eXBlIGluIHRoaXMgY2FzZTsgd2UgZG9uJ3QgaGF2ZSBhIHRhZy5cbiAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG5cbiAgICBjYXNlIE1vZGU6XG4gICAgICBpZiAodHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSkge1xuICAgICAgICAvLyBEb24ndCBiZSBsZXNzIHNwZWNpZmljIHRoYW4gc2hhcmVkL2dldENvbXBvbmVudE5hbWVGcm9tVHlwZVxuICAgICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJ01vZGUnO1xuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICByZXR1cm4gJ09mZnNjcmVlbic7XG5cbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdTY29wZSc7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcblxuICAgIGNhc2UgVHJhY2luZ01hcmtlckNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnVHJhY2luZ01hcmtlcic7XG4gICAgLy8gVGhlIGRpc3BsYXkgbmFtZSBmb3IgdGhpcyB0YWdzIGNvbWUgZnJvbSB0aGUgdXNlci1wcm92aWRlZCB0eXBlOlxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbnZhciBjdXJyZW50ID0gbnVsbDtcbnZhciBpc1JlbmRlcmluZyA9IGZhbHNlO1xuZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB7XG4gIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIG93bmVyID0gY3VycmVudC5fZGVidWdPd25lcjtcblxuICAgIGlmIChvd25lciAhPT0gbnVsbCAmJiB0eXBlb2Ygb3duZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihvd25lcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlclN0YWNrSW5EZXYoKSB7XG4gIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0gLy8gU2FmZSBiZWNhdXNlIGlmIGN1cnJlbnQgZmliZXIgZXhpc3RzLCB3ZSBhcmUgcmVjb25jaWxpbmcsXG4gICAgLy8gYW5kIGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgdmVyc2lvbi5cblxuXG4gICAgcmV0dXJuIGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChjdXJyZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldEN1cnJlbnRGaWJlcigpIHtcbiAge1xuICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gbnVsbDtcbiAgICBjdXJyZW50ID0gbnVsbDtcbiAgICBpc1JlbmRlcmluZyA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBzZXRDdXJyZW50RmliZXIoZmliZXIpIHtcbiAge1xuICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gZmliZXIgPT09IG51bGwgPyBudWxsIDogZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldjtcbiAgICBjdXJyZW50ID0gZmliZXI7XG4gICAgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyKCkge1xuICB7XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldElzUmVuZGVyaW5nKHJlbmRlcmluZykge1xuICB7XG4gICAgaXNSZW5kZXJpbmcgPSByZW5kZXJpbmc7XG4gIH1cbn1cblxuLy8gRmxvdyBkb2VzIG5vdCBhbGxvdyBzdHJpbmcgY29uY2F0ZW5hdGlvbiBvZiBtb3N0IG5vbi1zdHJpbmcgdHlwZXMuIFRvIHdvcmtcbi8vIGFyb3VuZCB0aGlzIGxpbWl0YXRpb24sIHdlIHVzZSBhbiBvcGFxdWUgdHlwZSB0aGF0IGNhbiBvbmx5IGJlIG9idGFpbmVkIGJ5XG4vLyBwYXNzaW5nIHRoZSB2YWx1ZSB0aHJvdWdoIGdldFRvU3RyaW5nVmFsdWUgZmlyc3QuXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICAvLyBUaGUgY29lcmNpb24gc2FmZXR5IGNoZWNrIGlzIHBlcmZvcm1lZCBpbiBnZXRUb1N0cmluZ1ZhbHVlKCkuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldFRvU3RyaW5nVmFsdWUodmFsdWUpIHtcbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICB7XG4gICAgICAgIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBmdW5jdGlvbiwgc3ltYm9sIGFyZSBhc3NpZ25lZCBhcyBlbXB0eSBzdHJpbmdzXG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxudmFyIGhhc1JlYWRPbmx5VmFsdWUgPSB7XG4gIGJ1dHRvbjogdHJ1ZSxcbiAgY2hlY2tib3g6IHRydWUsXG4gIGltYWdlOiB0cnVlLFxuICBoaWRkZW46IHRydWUsXG4gIHJhZGlvOiB0cnVlLFxuICByZXNldDogdHJ1ZSxcbiAgc3VibWl0OiB0cnVlXG59O1xuZnVuY3Rpb24gY2hlY2tDb250cm9sbGVkVmFsdWVQcm9wcyh0YWdOYW1lLCBwcm9wcykge1xuICB7XG4gICAgaWYgKCEoaGFzUmVhZE9ubHlWYWx1ZVtwcm9wcy50eXBlXSB8fCBwcm9wcy5vbkNoYW5nZSB8fCBwcm9wcy5vbklucHV0IHx8IHByb3BzLnJlYWRPbmx5IHx8IHByb3BzLmRpc2FibGVkIHx8IHByb3BzLnZhbHVlID09IG51bGwpKSB7XG4gICAgICBlcnJvcignWW91IHByb3ZpZGVkIGEgYHZhbHVlYCBwcm9wIHRvIGEgZm9ybSBmaWVsZCB3aXRob3V0IGFuICcgKyAnYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiAnICsgJ3RoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRWYWx1ZWAuIE90aGVyd2lzZSwgJyArICdzZXQgZWl0aGVyIGBvbkNoYW5nZWAgb3IgYHJlYWRPbmx5YC4nKTtcbiAgICB9XG5cbiAgICBpZiAoIShwcm9wcy5vbkNoYW5nZSB8fCBwcm9wcy5yZWFkT25seSB8fCBwcm9wcy5kaXNhYmxlZCB8fCBwcm9wcy5jaGVja2VkID09IG51bGwpKSB7XG4gICAgICBlcnJvcignWW91IHByb3ZpZGVkIGEgYGNoZWNrZWRgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gJyArICdgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmICcgKyAndGhlIGZpZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVsdENoZWNrZWRgLiBPdGhlcndpc2UsICcgKyAnc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ2hlY2thYmxlKGVsZW0pIHtcbiAgdmFyIHR5cGUgPSBlbGVtLnR5cGU7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWU7XG4gIHJldHVybiBub2RlTmFtZSAmJiBub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmICh0eXBlID09PSAnY2hlY2tib3gnIHx8IHR5cGUgPT09ICdyYWRpbycpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFja2VyKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuX3ZhbHVlVHJhY2tlcjtcbn1cblxuZnVuY3Rpb24gZGV0YWNoVHJhY2tlcihub2RlKSB7XG4gIG5vZGUuX3ZhbHVlVHJhY2tlciA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlRnJvbU5vZGUobm9kZSkge1xuICB2YXIgdmFsdWUgPSAnJztcblxuICBpZiAoIW5vZGUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBpZiAoaXNDaGVja2FibGUobm9kZSkpIHtcbiAgICB2YWx1ZSA9IG5vZGUuY2hlY2tlZCA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBub2RlLnZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiB0cmFja1ZhbHVlT25Ob2RlKG5vZGUpIHtcbiAgdmFyIHZhbHVlRmllbGQgPSBpc0NoZWNrYWJsZShub2RlKSA/ICdjaGVja2VkJyA6ICd2YWx1ZSc7XG4gIHZhciBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihub2RlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgdmFsdWVGaWVsZCk7XG5cbiAge1xuICAgIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbihub2RlW3ZhbHVlRmllbGRdKTtcbiAgfVxuXG4gIHZhciBjdXJyZW50VmFsdWUgPSAnJyArIG5vZGVbdmFsdWVGaWVsZF07IC8vIGlmIHNvbWVvbmUgaGFzIGFscmVhZHkgZGVmaW5lZCBhIHZhbHVlIG9yIFNhZmFyaSwgdGhlbiBiYWlsXG4gIC8vIGFuZCBkb24ndCB0cmFjayB2YWx1ZSB3aWxsIGNhdXNlIG92ZXIgcmVwb3J0aW5nIG9mIGNoYW5nZXMsXG4gIC8vIGJ1dCBpdCdzIGJldHRlciB0aGVuIGEgaGFyZCBmYWlsdXJlXG4gIC8vIChuZWVkZWQgZm9yIGNlcnRhaW4gdGVzdHMgdGhhdCBzcHlPbiBpbnB1dCB2YWx1ZXMgYW5kIFNhZmFyaSlcblxuICBpZiAobm9kZS5oYXNPd25Qcm9wZXJ0eSh2YWx1ZUZpZWxkKSB8fCB0eXBlb2YgZGVzY3JpcHRvciA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIGRlc2NyaXB0b3IuZ2V0ICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBkZXNjcmlwdG9yLnNldCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBnZXQgPSBkZXNjcmlwdG9yLmdldCxcbiAgICAgIHNldCA9IGRlc2NyaXB0b3Iuc2V0O1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobm9kZSwgdmFsdWVGaWVsZCwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXQuY2FsbCh0aGlzKTtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICBzZXQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgfVxuICB9KTsgLy8gV2UgY291bGQndmUgcGFzc2VkIHRoaXMgdGhlIGZpcnN0IHRpbWVcbiAgLy8gYnV0IGl0IHRyaWdnZXJzIGEgYnVnIGluIElFMTEgYW5kIEVkZ2UgMTQvMTUuXG4gIC8vIENhbGxpbmcgZGVmaW5lUHJvcGVydHkoKSBhZ2FpbiBzaG91bGQgYmUgZXF1aXZhbGVudC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTc2OFxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCB2YWx1ZUZpZWxkLCB7XG4gICAgZW51bWVyYWJsZTogZGVzY3JpcHRvci5lbnVtZXJhYmxlXG4gIH0pO1xuICB2YXIgdHJhY2tlciA9IHtcbiAgICBnZXRWYWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICB9LFxuICAgIHNldFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHtcbiAgICAgICAgY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudFZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICB9LFxuICAgIHN0b3BUcmFja2luZzogZnVuY3Rpb24gKCkge1xuICAgICAgZGV0YWNoVHJhY2tlcihub2RlKTtcbiAgICAgIGRlbGV0ZSBub2RlW3ZhbHVlRmllbGRdO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHRyYWNrZXI7XG59XG5cbmZ1bmN0aW9uIHRyYWNrKG5vZGUpIHtcbiAgaWYgKGdldFRyYWNrZXIobm9kZSkpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gVE9ETzogT25jZSBpdCdzIGp1c3QgRmliZXIgd2UgY2FuIG1vdmUgdGhpcyB0byBub2RlLl93cmFwcGVyU3RhdGVcblxuXG4gIG5vZGUuX3ZhbHVlVHJhY2tlciA9IHRyYWNrVmFsdWVPbk5vZGUobm9kZSk7XG59XG5mdW5jdGlvbiB1cGRhdGVWYWx1ZUlmQ2hhbmdlZChub2RlKSB7XG4gIGlmICghbm9kZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB0cmFja2VyID0gZ2V0VHJhY2tlcihub2RlKTsgLy8gaWYgdGhlcmUgaXMgbm8gdHJhY2tlciBhdCB0aGlzIHBvaW50IGl0J3MgdW5saWtlbHlcbiAgLy8gdGhhdCB0cnlpbmcgYWdhaW4gd2lsbCBzdWNjZWVkXG5cbiAgaWYgKCF0cmFja2VyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgbGFzdFZhbHVlID0gdHJhY2tlci5nZXRWYWx1ZSgpO1xuICB2YXIgbmV4dFZhbHVlID0gZ2V0VmFsdWVGcm9tTm9kZShub2RlKTtcblxuICBpZiAobmV4dFZhbHVlICE9PSBsYXN0VmFsdWUpIHtcbiAgICB0cmFja2VyLnNldFZhbHVlKG5leHRWYWx1ZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEFjdGl2ZUVsZW1lbnQoZG9jKSB7XG4gIGRvYyA9IGRvYyB8fCAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IGRvY3VtZW50IDogdW5kZWZpbmVkKTtcblxuICBpZiAodHlwZW9mIGRvYyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGRvYy5hY3RpdmVFbGVtZW50IHx8IGRvYy5ib2R5O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGRvYy5ib2R5O1xuICB9XG59XG5cbnZhciBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSBmYWxzZTtcbnZhciBkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkID0gZmFsc2U7XG52YXIgZGlkV2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gaXNDb250cm9sbGVkKHByb3BzKSB7XG4gIHZhciB1c2VzQ2hlY2tlZCA9IHByb3BzLnR5cGUgPT09ICdjaGVja2JveCcgfHwgcHJvcHMudHlwZSA9PT0gJ3JhZGlvJztcbiAgcmV0dXJuIHVzZXNDaGVja2VkID8gcHJvcHMuY2hlY2tlZCAhPSBudWxsIDogcHJvcHMudmFsdWUgIT0gbnVsbDtcbn1cbi8qKlxuICogSW1wbGVtZW50cyBhbiA8aW5wdXQ+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIHNldHRpbmcgdGhlc2Ugb3B0aW9uYWxcbiAqIHByb3BzOiBgY2hlY2tlZGAsIGB2YWx1ZWAsIGBkZWZhdWx0Q2hlY2tlZGAsIGFuZCBgZGVmYXVsdFZhbHVlYC5cbiAqXG4gKiBJZiBgY2hlY2tlZGAgb3IgYHZhbHVlYCBhcmUgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9uc1xuICogdGhhdCBhZmZlY3QgdGhlIGNoZWNrZWQgc3RhdGUgb3IgdmFsdWUgd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogSWYgdGhleSBhcmUgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIG5vdFxuICogdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LiBJbnN0ZWFkLCB0aGUgcHJvcHMgbXVzdCBjaGFuZ2UgaW4gb3JkZXIgZm9yXG4gKiB0aGUgcmVuZGVyZWQgZWxlbWVudCB0byBiZSB1cGRhdGVkLlxuICpcbiAqIFRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgYmUgaW5pdGlhbGl6ZWQgYXMgdW5jaGVja2VkIChvciBgZGVmYXVsdENoZWNrZWRgKVxuICogd2l0aCBhbiBlbXB0eSB2YWx1ZSAob3IgYGRlZmF1bHRWYWx1ZWApLlxuICpcbiAqIFNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEyL1dELWh0bWw1LTIwMTIxMDI1L3RoZS1pbnB1dC1lbGVtZW50Lmh0bWxcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyhlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciBjaGVja2VkID0gcHJvcHMuY2hlY2tlZDtcbiAgdmFyIGhvc3RQcm9wcyA9IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBkZWZhdWx0Q2hlY2tlZDogdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRWYWx1ZTogdW5kZWZpbmVkLFxuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgY2hlY2tlZDogY2hlY2tlZCAhPSBudWxsID8gY2hlY2tlZCA6IG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZFxuICB9KTtcbiAgcmV0dXJuIGhvc3RQcm9wcztcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUoZWxlbWVudCwgcHJvcHMpIHtcbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ2lucHV0JywgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLmNoZWNrZWQgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkKSB7XG4gICAgICBlcnJvcignJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggY2hlY2tlZCBhbmQgZGVmYXVsdENoZWNrZWQgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIGNoZWNrZWQgcHJvcCwgb3IgdGhlIGRlZmF1bHRDaGVja2VkIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKTtcblxuICAgICAgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSkge1xuICAgICAgZXJyb3IoJyVzIGNvbnRhaW5zIGFuIGlucHV0IG9mIHR5cGUgJXMgd2l0aCBib3RoIHZhbHVlIGFuZCBkZWZhdWx0VmFsdWUgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnLCBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8ICdBIGNvbXBvbmVudCcsIHByb3BzLnR5cGUpO1xuXG4gICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZSA9PSBudWxsID8gJycgOiBwcm9wcy5kZWZhdWx0VmFsdWU7XG4gIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICBpbml0aWFsQ2hlY2tlZDogcHJvcHMuY2hlY2tlZCAhPSBudWxsID8gcHJvcHMuY2hlY2tlZCA6IHByb3BzLmRlZmF1bHRDaGVja2VkLFxuICAgIGluaXRpYWxWYWx1ZTogZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSAhPSBudWxsID8gcHJvcHMudmFsdWUgOiBkZWZhdWx0VmFsdWUpLFxuICAgIGNvbnRyb2xsZWQ6IGlzQ29udHJvbGxlZChwcm9wcylcbiAgfTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUNoZWNrZWQoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG5cbiAgaWYgKGNoZWNrZWQgIT0gbnVsbCkge1xuICAgIHNldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgJ2NoZWNrZWQnLCBjaGVja2VkLCBmYWxzZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHVwZGF0ZVdyYXBwZXIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIHtcbiAgICB2YXIgY29udHJvbGxlZCA9IGlzQ29udHJvbGxlZChwcm9wcyk7XG5cbiAgICBpZiAoIW5vZGUuX3dyYXBwZXJTdGF0ZS5jb250cm9sbGVkICYmIGNvbnRyb2xsZWQgJiYgIWRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyBhbiB1bmNvbnRyb2xsZWQgaW5wdXQgdG8gYmUgY29udHJvbGxlZC4gJyArICdUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgdGhlIHZhbHVlIGNoYW5naW5nIGZyb20gdW5kZWZpbmVkIHRvICcgKyAnYSBkZWZpbmVkIHZhbHVlLCB3aGljaCBzaG91bGQgbm90IGhhcHBlbi4gJyArICdEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycpO1xuXG4gICAgICBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5fd3JhcHBlclN0YXRlLmNvbnRyb2xsZWQgJiYgIWNvbnRyb2xsZWQgJiYgIWRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyBhIGNvbnRyb2xsZWQgaW5wdXQgdG8gYmUgdW5jb250cm9sbGVkLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSB0aGUgdmFsdWUgY2hhbmdpbmcgZnJvbSBhIGRlZmluZWQgdG8gJyArICd1bmRlZmluZWQsIHdoaWNoIHNob3VsZCBub3QgaGFwcGVuLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJyk7XG5cbiAgICAgIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNoZWNrZWQoZWxlbWVudCwgcHJvcHMpO1xuICB2YXIgdmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlKTtcbiAgdmFyIHR5cGUgPSBwcm9wcy50eXBlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgaWYgKHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAodmFsdWUgPT09IDAgJiYgbm9kZS52YWx1ZSA9PT0gJycgfHwgLy8gV2UgZXhwbGljaXRseSB3YW50IHRvIGNvZXJjZSB0byBudW1iZXIgaGVyZSBpZiBwb3NzaWJsZS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgbm9kZS52YWx1ZSAhPSB2YWx1ZSkge1xuICAgICAgICBub2RlLnZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS52YWx1ZSAhPT0gdG9TdHJpbmcodmFsdWUpKSB7XG4gICAgICBub2RlLnZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlID09PSAnc3VibWl0JyB8fCB0eXBlID09PSAncmVzZXQnKSB7XG4gICAgLy8gU3VibWl0L3Jlc2V0IGlucHV0cyBuZWVkIHRoZSBhdHRyaWJ1dGUgcmVtb3ZlZCBjb21wbGV0ZWx5IHRvIGF2b2lkXG4gICAgLy8gYmxhbmstdGV4dCBidXR0b25zLlxuICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIHZhbHVlIGF0dHJpYnV0ZSwgdGhlIHZhbHVlIGNvbWVzIGZyb20gYSBjYXNjYWRlIG9mXG4gICAgLy8gcHJvcGVydGllczpcbiAgICAvLyAgMS4gVGhlIHZhbHVlIFJlYWN0IHByb3BlcnR5XG4gICAgLy8gIDIuIFRoZSBkZWZhdWx0VmFsdWUgUmVhY3QgcHJvcGVydHlcbiAgICAvLyAgMy4gT3RoZXJ3aXNlIHRoZXJlIHNob3VsZCBiZSBubyBjaGFuZ2VcbiAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykpIHtcbiAgICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCBwcm9wcy50eXBlLCB2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdFZhbHVlJykpIHtcbiAgICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCBwcm9wcy50eXBlLCBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLmRlZmF1bHRWYWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIGNoZWNrZWQgYXR0cmlidXRlLCBpdCBvbmx5IGNoYW5nZXMgd2hlbiBpdCBuZWVkc1xuICAgIC8vIHRvIGJlIHJlbW92ZWQsIHN1Y2ggYXMgdHJhbnNpdGlvbmluZyBmcm9tIGEgY2hlY2tib3ggaW50byBhIHRleHQgaW5wdXRcbiAgICBpZiAocHJvcHMuY2hlY2tlZCA9PSBudWxsICYmIHByb3BzLmRlZmF1bHRDaGVja2VkICE9IG51bGwpIHtcbiAgICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhIXByb3BzLmRlZmF1bHRDaGVja2VkO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlcihlbGVtZW50LCBwcm9wcywgaXNIeWRyYXRpbmcpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50OyAvLyBEbyBub3QgYXNzaWduIHZhbHVlIGlmIGl0IGlzIGFscmVhZHkgc2V0LiBUaGlzIHByZXZlbnRzIHVzZXIgdGV4dCBpbnB1dFxuICAvLyBmcm9tIGJlaW5nIGxvc3QgZHVyaW5nIFNTUiBoeWRyYXRpb24uXG5cbiAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCd2YWx1ZScpIHx8IHByb3BzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmFsdWUnKSkge1xuICAgIHZhciB0eXBlID0gcHJvcHMudHlwZTtcbiAgICB2YXIgaXNCdXR0b24gPSB0eXBlID09PSAnc3VibWl0JyB8fCB0eXBlID09PSAncmVzZXQnOyAvLyBBdm9pZCBzZXR0aW5nIHZhbHVlIGF0dHJpYnV0ZSBvbiBzdWJtaXQvcmVzZXQgaW5wdXRzIGFzIGl0IG92ZXJyaWRlcyB0aGVcbiAgICAvLyBkZWZhdWx0IHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBicm93c2VyLiBTZWU6ICMxMjg3MlxuXG4gICAgaWYgKGlzQnV0dG9uICYmIChwcm9wcy52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHByb3BzLnZhbHVlID09PSBudWxsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBpbml0aWFsVmFsdWUgPSB0b1N0cmluZyhub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKTsgLy8gRG8gbm90IGFzc2lnbiB2YWx1ZSBpZiBpdCBpcyBhbHJlYWR5IHNldC4gVGhpcyBwcmV2ZW50cyB1c2VyIHRleHQgaW5wdXRcbiAgICAvLyBmcm9tIGJlaW5nIGxvc3QgZHVyaW5nIFNTUiBoeWRyYXRpb24uXG5cbiAgICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgICB7XG4gICAgICAgIC8vIFdoZW4gc3luY2luZyB0aGUgdmFsdWUgYXR0cmlidXRlLCB0aGUgdmFsdWUgcHJvcGVydHkgc2hvdWxkIHVzZVxuICAgICAgICAvLyB0aGUgd3JhcHBlclN0YXRlLl9pbml0aWFsVmFsdWUgcHJvcGVydHkuIFRoaXMgdXNlczpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAxLiBUaGUgdmFsdWUgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgICAgIC8vICAgMi4gVGhlIGRlZmF1bHRWYWx1ZSBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnRcbiAgICAgICAgLy8gICAzLiBBbiBlbXB0eSBzdHJpbmdcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSAhPT0gbm9kZS52YWx1ZSkge1xuICAgICAgICAgIG5vZGUudmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBPdGhlcndpc2UsIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgaXMgc3luY2hyb25pemVkIHRvIHRoZSBwcm9wZXJ0eSxcbiAgICAgIC8vIHNvIHdlIGFzc2lnbiBkZWZhdWx0VmFsdWUgdG8gdGhlIHNhbWUgdGhpbmcgYXMgdGhlIHZhbHVlIHByb3BlcnR5XG4gICAgICAvLyBhc3NpZ25tZW50IHN0ZXAgYWJvdmUuXG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICB9XG4gIH0gLy8gTm9ybWFsbHksIHdlJ2QganVzdCBkbyBgbm9kZS5jaGVja2VkID0gbm9kZS5jaGVja2VkYCB1cG9uIGluaXRpYWwgbW91bnQsIGxlc3MgdGhpcyBidWdcbiAgLy8gdGhpcyBpcyBuZWVkZWQgdG8gd29yayBhcm91bmQgYSBjaHJvbWUgYnVnIHdoZXJlIHNldHRpbmcgZGVmYXVsdENoZWNrZWRcbiAgLy8gd2lsbCBzb21ldGltZXMgaW5mbHVlbmNlIHRoZSB2YWx1ZSBvZiBjaGVja2VkIChldmVuIGFmdGVyIGRldGFjaG1lbnQpLlxuICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTYwODQxNlxuICAvLyBXZSBuZWVkIHRvIHRlbXBvcmFyaWx5IHVuc2V0IG5hbWUgdG8gYXZvaWQgZGlzcnVwdGluZyByYWRpbyBidXR0b24gZ3JvdXBzLlxuXG5cbiAgdmFyIG5hbWUgPSBub2RlLm5hbWU7XG5cbiAgaWYgKG5hbWUgIT09ICcnKSB7XG4gICAgbm9kZS5uYW1lID0gJyc7XG4gIH1cblxuICB7XG4gICAgLy8gV2hlbiBzeW5jaW5nIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSwgYm90aCB0aGUgY2hlY2tlZCBwcm9wZXJ0eSBhbmRcbiAgICAvLyBhdHRyaWJ1dGUgYXJlIGFzc2lnbmVkIGF0IHRoZSBzYW1lIHRpbWUgdXNpbmcgZGVmYXVsdENoZWNrZWQuIFRoaXMgdXNlczpcbiAgICAvL1xuICAgIC8vICAgMS4gVGhlIGNoZWNrZWQgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgLy8gICAyLiBUaGUgZGVmYXVsdENoZWNrZWQgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgLy8gICAzLiBPdGhlcndpc2UsIGZhbHNlXG4gICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICFub2RlLmRlZmF1bHRDaGVja2VkO1xuICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhIW5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZDtcbiAgfVxuXG4gIGlmIChuYW1lICE9PSAnJykge1xuICAgIG5vZGUubmFtZSA9IG5hbWU7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB1cGRhdGVXcmFwcGVyKG5vZGUsIHByb3BzKTtcbiAgdXBkYXRlTmFtZWRDb3VzaW5zKG5vZGUsIHByb3BzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTmFtZWRDb3VzaW5zKHJvb3ROb2RlLCBwcm9wcykge1xuICB2YXIgbmFtZSA9IHByb3BzLm5hbWU7XG5cbiAgaWYgKHByb3BzLnR5cGUgPT09ICdyYWRpbycgJiYgbmFtZSAhPSBudWxsKSB7XG4gICAgdmFyIHF1ZXJ5Um9vdCA9IHJvb3ROb2RlO1xuXG4gICAgd2hpbGUgKHF1ZXJ5Um9vdC5wYXJlbnROb2RlKSB7XG4gICAgICBxdWVyeVJvb3QgPSBxdWVyeVJvb3QucGFyZW50Tm9kZTtcbiAgICB9IC8vIElmIGByb290Tm9kZS5mb3JtYCB3YXMgbm9uLW51bGwsIHRoZW4gd2UgY291bGQgdHJ5IGBmb3JtLmVsZW1lbnRzYCxcbiAgICAvLyBidXQgdGhhdCBzb21ldGltZXMgYmVoYXZlcyBzdHJhbmdlbHkgaW4gSUU4LiBXZSBjb3VsZCBhbHNvIHRyeSB1c2luZ1xuICAgIC8vIGBmb3JtLmdldEVsZW1lbnRzQnlOYW1lYCwgYnV0IHRoYXQgd2lsbCBvbmx5IHJldHVybiBkaXJlY3QgY2hpbGRyZW5cbiAgICAvLyBhbmQgd29uJ3QgaW5jbHVkZSBpbnB1dHMgdGhhdCB1c2UgdGhlIEhUTUw1IGBmb3JtPWAgYXR0cmlidXRlLiBTaW5jZVxuICAgIC8vIHRoZSBpbnB1dCBtaWdodCBub3QgZXZlbiBiZSBpbiBhIGZvcm0uIEl0IG1pZ2h0IG5vdCBldmVuIGJlIGluIHRoZVxuICAgIC8vIGRvY3VtZW50LiBMZXQncyBqdXN0IHVzZSB0aGUgbG9jYWwgYHF1ZXJ5U2VsZWN0b3JBbGxgIHRvIGVuc3VyZSB3ZSBkb24ndFxuICAgIC8vIG1pc3MgYW55dGhpbmcuXG5cblxuICAgIHtcbiAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24obmFtZSwgJ25hbWUnKTtcbiAgICB9XG5cbiAgICB2YXIgZ3JvdXAgPSBxdWVyeVJvb3QucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbbmFtZT0nICsgSlNPTi5zdHJpbmdpZnkoJycgKyBuYW1lKSArICddW3R5cGU9XCJyYWRpb1wiXScpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG90aGVyTm9kZSA9IGdyb3VwW2ldO1xuXG4gICAgICBpZiAob3RoZXJOb2RlID09PSByb290Tm9kZSB8fCBvdGhlck5vZGUuZm9ybSAhPT0gcm9vdE5vZGUuZm9ybSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gVGhpcyB3aWxsIHRocm93IGlmIHJhZGlvIGJ1dHRvbnMgcmVuZGVyZWQgYnkgZGlmZmVyZW50IGNvcGllcyBvZiBSZWFjdFxuICAgICAgLy8gYW5kIHRoZSBzYW1lIG5hbWUgYXJlIHJlbmRlcmVkIGludG8gdGhlIHNhbWUgZm9ybSAoc2FtZSBhcyAjMTkzOSkuXG4gICAgICAvLyBUaGF0J3MgcHJvYmFibHkgb2theTsgd2UgZG9uJ3Qgc3VwcG9ydCBpdCBqdXN0IGFzIHdlIGRvbid0IHN1cHBvcnRcbiAgICAgIC8vIG1peGluZyBSZWFjdCByYWRpbyBidXR0b25zIHdpdGggbm9uLVJlYWN0IG9uZXMuXG5cblxuICAgICAgdmFyIG90aGVyUHJvcHMgPSBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlKG90aGVyTm9kZSk7XG5cbiAgICAgIGlmICghb3RoZXJQcm9wcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0RE9NSW5wdXQ6IE1peGluZyBSZWFjdCBhbmQgbm9uLVJlYWN0IHJhZGlvIGlucHV0cyB3aXRoIHRoZSAnICsgJ3NhbWUgYG5hbWVgIGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgICB9IC8vIFdlIG5lZWQgdXBkYXRlIHRoZSB0cmFja2VkIHZhbHVlIG9uIHRoZSBuYW1lZCBjb3VzaW4gc2luY2UgdGhlIHZhbHVlXG4gICAgICAvLyB3YXMgY2hhbmdlZCBidXQgdGhlIGlucHV0IHNhdyBubyBldmVudCBvciB2YWx1ZSBzZXRcblxuXG4gICAgICB1cGRhdGVWYWx1ZUlmQ2hhbmdlZChvdGhlck5vZGUpOyAvLyBJZiB0aGlzIGlzIGEgY29udHJvbGxlZCByYWRpbyBidXR0b24gZ3JvdXAsIGZvcmNpbmcgdGhlIGlucHV0IHRoYXRcbiAgICAgIC8vIHdhcyBwcmV2aW91c2x5IGNoZWNrZWQgdG8gdXBkYXRlIHdpbGwgY2F1c2UgaXQgdG8gYmUgY29tZSByZS1jaGVja2VkXG4gICAgICAvLyBhcyBhcHByb3ByaWF0ZS5cblxuICAgICAgdXBkYXRlV3JhcHBlcihvdGhlck5vZGUsIG90aGVyUHJvcHMpO1xuICAgIH1cbiAgfVxufSAvLyBJbiBDaHJvbWUsIGFzc2lnbmluZyBkZWZhdWx0VmFsdWUgdG8gY2VydGFpbiBpbnB1dCB0eXBlcyB0cmlnZ2VycyBpbnB1dCB2YWxpZGF0aW9uLlxuLy8gRm9yIG51bWJlciBpbnB1dHMsIHRoZSBkaXNwbGF5IHZhbHVlIGxvc2VzIHRyYWlsaW5nIGRlY2ltYWwgcG9pbnRzLiBGb3IgZW1haWwgaW5wdXRzLFxuLy8gQ2hyb21lIHJhaXNlcyBcIlRoZSBzcGVjaWZpZWQgdmFsdWUgPHg+IGlzIG5vdCBhIHZhbGlkIGVtYWlsIGFkZHJlc3NcIi5cbi8vXG4vLyBIZXJlIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUgZGVmYXVsdFZhbHVlIGhhcyBhY3R1YWxseSBjaGFuZ2VkLCBhdm9pZGluZyB0aGVzZSBwcm9ibGVtc1xuLy8gd2hlbiB0aGUgdXNlciBpcyBpbnB1dHRpbmcgdGV4dFxuLy9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzI1M1xuXG5cbmZ1bmN0aW9uIHNldERlZmF1bHRWYWx1ZShub2RlLCB0eXBlLCB2YWx1ZSkge1xuICBpZiAoIC8vIEZvY3VzZWQgbnVtYmVyIGlucHV0cyBzeW5jaHJvbml6ZSBvbiBibHVyLiBTZWUgQ2hhbmdlRXZlbnRQbHVnaW4uanNcbiAgdHlwZSAhPT0gJ251bWJlcicgfHwgZ2V0QWN0aXZlRWxlbWVudChub2RlLm93bmVyRG9jdW1lbnQpICE9PSBub2RlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChub2RlLmRlZmF1bHRWYWx1ZSAhPT0gdG9TdHJpbmcodmFsdWUpKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TZWxlY3RlZFNldE9uT3B0aW9uID0gZmFsc2U7XG52YXIgZGlkV2FybkludmFsaWRDaGlsZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5JbnZhbGlkSW5uZXJIVE1MID0gZmFsc2U7XG4vKipcbiAqIEltcGxlbWVudHMgYW4gPG9wdGlvbj4gaG9zdCBjb21wb25lbnQgdGhhdCB3YXJucyB3aGVuIGBzZWxlY3RlZGAgaXMgc2V0LlxuICovXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcHMoZWxlbWVudCwgcHJvcHMpIHtcbiAge1xuICAgIC8vIElmIGEgdmFsdWUgaXMgbm90IHByb3ZpZGVkLCB0aGVuIHRoZSBjaGlsZHJlbiBtdXN0IGJlIHNpbXBsZS5cbiAgICBpZiAocHJvcHMudmFsdWUgPT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ29iamVjdCcgJiYgcHJvcHMuY2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgICAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChwcm9wcy5jaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgaWYgKGNoaWxkID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgY2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZENoaWxkKSB7XG4gICAgICAgICAgICBkaWRXYXJuSW52YWxpZENoaWxkID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ0Nhbm5vdCBpbmZlciB0aGUgb3B0aW9uIHZhbHVlIG9mIGNvbXBsZXggY2hpbGRyZW4uICcgKyAnUGFzcyBhIGB2YWx1ZWAgcHJvcCBvciB1c2UgYSBwbGFpbiBzdHJpbmcgYXMgY2hpbGRyZW4gdG8gPG9wdGlvbj4uJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgICAgICBpZiAoIWRpZFdhcm5JbnZhbGlkSW5uZXJIVE1MKSB7XG4gICAgICAgICAgZGlkV2FybkludmFsaWRJbm5lckhUTUwgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1Bhc3MgYSBgdmFsdWVgIHByb3AgaWYgeW91IHNldCBkYW5nZXJvdXNseUlubmVySFRNTCBzbyBSZWFjdCBrbm93cyAnICsgJ3doaWNoIHZhbHVlIHNob3VsZCBiZSBzZWxlY3RlZC4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gVE9ETzogUmVtb3ZlIHN1cHBvcnQgZm9yIGBzZWxlY3RlZGAgaW4gPG9wdGlvbj4uXG5cblxuICAgIGlmIChwcm9wcy5zZWxlY3RlZCAhPSBudWxsICYmICFkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbikge1xuICAgICAgZXJyb3IoJ1VzZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBvbiA8c2VsZWN0PiBpbnN0ZWFkIG9mICcgKyAnc2V0dGluZyBgc2VsZWN0ZWRgIG9uIDxvcHRpb24+LicpO1xuXG4gICAgICBkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbiA9IHRydWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgLy8gdmFsdWU9XCJcIiBzaG91bGQgbWFrZSBhIHZhbHVlIGF0dHJpYnV0ZSAoIzYyMTkpXG4gIGlmIChwcm9wcy52YWx1ZSAhPSBudWxsKSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgdG9TdHJpbmcoZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSkpKTtcbiAgfVxufVxuXG52YXIgaXNBcnJheUltcGwgPSBBcnJheS5pc0FycmF5OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG5cbmZ1bmN0aW9uIGlzQXJyYXkoYSkge1xuICByZXR1cm4gaXNBcnJheUltcGwoYSk7XG59XG5cbnZhciBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMTtcblxue1xuICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMSA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSB7XG4gIHZhciBvd25lck5hbWUgPSBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpO1xuXG4gIGlmIChvd25lck5hbWUpIHtcbiAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgb3duZXJOYW1lICsgJ2AuJztcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxudmFyIHZhbHVlUHJvcE5hbWVzID0gWyd2YWx1ZScsICdkZWZhdWx0VmFsdWUnXTtcbi8qKlxuICogVmFsaWRhdGlvbiBmdW5jdGlvbiBmb3IgYHZhbHVlYCBhbmQgYGRlZmF1bHRWYWx1ZWAuXG4gKi9cblxuZnVuY3Rpb24gY2hlY2tTZWxlY3RQcm9wVHlwZXMocHJvcHMpIHtcbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ3NlbGVjdCcsIHByb3BzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVQcm9wTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wTmFtZSA9IHZhbHVlUHJvcE5hbWVzW2ldO1xuXG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBwcm9wTmFtZUlzQXJyYXkgPSBpc0FycmF5KHByb3BzW3Byb3BOYW1lXSk7XG5cbiAgICAgIGlmIChwcm9wcy5tdWx0aXBsZSAmJiAhcHJvcE5hbWVJc0FycmF5KSB7XG4gICAgICAgIGVycm9yKCdUaGUgYCVzYCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11c3QgYmUgYW4gYXJyYXkgaWYgJyArICdgbXVsdGlwbGVgIGlzIHRydWUuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkpO1xuICAgICAgfSBlbHNlIGlmICghcHJvcHMubXVsdGlwbGUgJiYgcHJvcE5hbWVJc0FycmF5KSB7XG4gICAgICAgIGVycm9yKCdUaGUgYCVzYCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11c3QgYmUgYSBzY2FsYXIgJyArICd2YWx1ZSBpZiBgbXVsdGlwbGVgIGlzIGZhbHNlLiVzJywgcHJvcE5hbWUsIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlT3B0aW9ucyhub2RlLCBtdWx0aXBsZSwgcHJvcFZhbHVlLCBzZXREZWZhdWx0U2VsZWN0ZWQpIHtcbiAgdmFyIG9wdGlvbnMgPSBub2RlLm9wdGlvbnM7XG5cbiAgaWYgKG11bHRpcGxlKSB7XG4gICAgdmFyIHNlbGVjdGVkVmFsdWVzID0gcHJvcFZhbHVlO1xuICAgIHZhciBzZWxlY3RlZFZhbHVlID0ge307XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBQcmVmaXggdG8gYXZvaWQgY2hhb3Mgd2l0aCBzcGVjaWFsIGtleXMuXG4gICAgICBzZWxlY3RlZFZhbHVlWyckJyArIHNlbGVjdGVkVmFsdWVzW2ldXSA9IHRydWU7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG9wdGlvbnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgc2VsZWN0ZWQgPSBzZWxlY3RlZFZhbHVlLmhhc093blByb3BlcnR5KCckJyArIG9wdGlvbnNbX2ldLnZhbHVlKTtcblxuICAgICAgaWYgKG9wdGlvbnNbX2ldLnNlbGVjdGVkICE9PSBzZWxlY3RlZCkge1xuICAgICAgICBvcHRpb25zW19pXS5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VsZWN0ZWQgJiYgc2V0RGVmYXVsdFNlbGVjdGVkKSB7XG4gICAgICAgIG9wdGlvbnNbX2ldLmRlZmF1bHRTZWxlY3RlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIERvIG5vdCBzZXQgYHNlbGVjdC52YWx1ZWAgYXMgZXhhY3QgYmVoYXZpb3IgaXNuJ3QgY29uc2lzdGVudCBhY3Jvc3MgYWxsXG4gICAgLy8gYnJvd3NlcnMgZm9yIGFsbCBjYXNlcy5cbiAgICB2YXIgX3NlbGVjdGVkVmFsdWUgPSB0b1N0cmluZyhnZXRUb1N0cmluZ1ZhbHVlKHByb3BWYWx1ZSkpO1xuXG4gICAgdmFyIGRlZmF1bHRTZWxlY3RlZCA9IG51bGw7XG5cbiAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBvcHRpb25zLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgIGlmIChvcHRpb25zW19pMl0udmFsdWUgPT09IF9zZWxlY3RlZFZhbHVlKSB7XG4gICAgICAgIG9wdGlvbnNbX2kyXS5zZWxlY3RlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHNldERlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgICAgIG9wdGlvbnNbX2kyXS5kZWZhdWx0U2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGVmYXVsdFNlbGVjdGVkID09PSBudWxsICYmICFvcHRpb25zW19pMl0uZGlzYWJsZWQpIHtcbiAgICAgICAgZGVmYXVsdFNlbGVjdGVkID0gb3B0aW9uc1tfaTJdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkZWZhdWx0U2VsZWN0ZWQgIT09IG51bGwpIHtcbiAgICAgIGRlZmF1bHRTZWxlY3RlZC5zZWxlY3RlZCA9IHRydWU7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEltcGxlbWVudHMgYSA8c2VsZWN0PiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBvcHRpb25hbGx5IHNldHRpbmcgdGhlXG4gKiBwcm9wcyBgdmFsdWVgIGFuZCBgZGVmYXVsdFZhbHVlYC4gSWYgYG11bHRpcGxlYCBpcyBmYWxzZSwgdGhlIHByb3AgbXVzdCBiZSBhXG4gKiBzdHJpbmdhYmxlLiBJZiBgbXVsdGlwbGVgIGlzIHRydWUsIHRoZSBwcm9wIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5nYWJsZXMuXG4gKlxuICogSWYgYHZhbHVlYCBpcyBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zIHRoYXQgY2hhbmdlIHRoZVxuICogc2VsZWN0ZWQgb3B0aW9uIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSByZW5kZXJlZCBvcHRpb25zLlxuICpcbiAqIElmIGl0IGlzIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIG9wdGlvbnMgd2lsbCBub3RcbiAqIHVwZGF0ZSBpbiByZXNwb25zZSB0byB1c2VyIGFjdGlvbnMuIEluc3RlYWQsIHRoZSBgdmFsdWVgIHByb3AgbXVzdCBjaGFuZ2UgaW5cbiAqIG9yZGVyIGZvciB0aGUgcmVuZGVyZWQgb3B0aW9ucyB0byB1cGRhdGUuXG4gKlxuICogSWYgYGRlZmF1bHRWYWx1ZWAgaXMgcHJvdmlkZWQsIGFueSBvcHRpb25zIHdpdGggdGhlIHN1cHBsaWVkIHZhbHVlcyB3aWxsIGJlXG4gKiBzZWxlY3RlZC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHJldHVybiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZFxuICB9KTtcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUkMShlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAge1xuICAgIGNoZWNrU2VsZWN0UHJvcFR5cGVzKHByb3BzKTtcbiAgfVxuXG4gIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICB3YXNNdWx0aXBsZTogISFwcm9wcy5tdWx0aXBsZVxuICB9O1xuXG4gIHtcbiAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEpIHtcbiAgICAgIGVycm9yKCdTZWxlY3QgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIHNlbGVjdCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJyk7XG5cbiAgICAgIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIkMihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIG5vZGUubXVsdGlwbGUgPSAhIXByb3BzLm11bHRpcGxlO1xuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgdmFsdWUsIGZhbHNlKTtcbiAgfSBlbHNlIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgcHJvcHMuZGVmYXVsdFZhbHVlLCB0cnVlKTtcbiAgfVxufVxuZnVuY3Rpb24gcG9zdFVwZGF0ZVdyYXBwZXIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgd2FzTXVsdGlwbGUgPSBub2RlLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU7XG4gIG5vZGUuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZSA9ICEhcHJvcHMubXVsdGlwbGU7XG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCB2YWx1ZSwgZmFsc2UpO1xuICB9IGVsc2UgaWYgKHdhc011bHRpcGxlICE9PSAhIXByb3BzLm11bHRpcGxlKSB7XG4gICAgLy8gRm9yIHNpbXBsaWNpdHksIHJlYXBwbHkgYGRlZmF1bHRWYWx1ZWAgaWYgYG11bHRpcGxlYCBpcyB0b2dnbGVkLlxuICAgIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5kZWZhdWx0VmFsdWUsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXZlcnQgdGhlIHNlbGVjdCBiYWNrIHRvIGl0cyBkZWZhdWx0IHVuc2VsZWN0ZWQgc3RhdGUuXG4gICAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHByb3BzLm11bHRpcGxlID8gW10gOiAnJywgZmFsc2UpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHZhbHVlLCBmYWxzZSk7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5WYWxEZWZhdWx0VmFsID0gZmFsc2U7XG5cbi8qKlxuICogSW1wbGVtZW50cyBhIDx0ZXh0YXJlYT4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgc2V0dGluZyBgdmFsdWVgLCBhbmRcbiAqIGBkZWZhdWx0VmFsdWVgLiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgdHJhZGl0aW9uYWwgRE9NIEFQSSBiZWNhdXNlIHZhbHVlIGlzXG4gKiB1c3VhbGx5IHNldCBhcyBQQ0RBVEEgY2hpbGRyZW4uXG4gKlxuICogSWYgYHZhbHVlYCBpcyBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zIHRoYXQgYWZmZWN0IHRoZVxuICogdmFsdWUgd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogSWYgYHZhbHVlYCBpcyBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGxcbiAqIG5vdCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuIEluc3RlYWQsIHRoZSBgdmFsdWVgIHByb3AgbXVzdCBjaGFuZ2UgaW5cbiAqIG9yZGVyIGZvciB0aGUgcmVuZGVyZWQgZWxlbWVudCB0byBiZSB1cGRhdGVkLlxuICpcbiAqIFRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhbiBlbXB0eSB2YWx1ZSwgdGhlIHByb3BcbiAqIGBkZWZhdWx0VmFsdWVgIGlmIHNwZWNpZmllZCwgb3IgdGhlIGNoaWxkcmVuIGNvbnRlbnQgKGRlcHJlY2F0ZWQpLlxuICovXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMkMihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAgaWYgKHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2BkYW5nZXJvdXNseVNldElubmVySFRNTGAgZG9lcyBub3QgbWFrZSBzZW5zZSBvbiA8dGV4dGFyZWE+LicpO1xuICB9IC8vIEFsd2F5cyBzZXQgY2hpbGRyZW4gdG8gdGhlIHNhbWUgdGhpbmcuIEluIElFOSwgdGhlIHNlbGVjdGlvbiByYW5nZSB3aWxsXG4gIC8vIGdldCByZXNldCBpZiBgdGV4dENvbnRlbnRgIGlzIG11dGF0ZWQuICBXZSBjb3VsZCBhZGQgYSBjaGVjayBpbiBzZXRUZXh0Q29udGVudFxuICAvLyB0byBvbmx5IHNldCB0aGUgdmFsdWUgaWYvd2hlbiB0aGUgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBub2RlIHZhbHVlICh3aGljaCB3b3VsZFxuICAvLyBjb21wbGV0ZWx5IHNvbHZlIHRoaXMgSUU5IGJ1ZyksIGJ1dCBTZWJhc3RpYW4rU29waGllIHNlZW1lZCB0byBsaWtlIHRoaXNcbiAgLy8gc29sdXRpb24uIFRoZSB2YWx1ZSBjYW4gYmUgYSBib29sZWFuIG9yIG9iamVjdCBzbyB0aGF0J3Mgd2h5IGl0J3MgZm9yY2VkXG4gIC8vIHRvIGJlIGEgc3RyaW5nLlxuXG5cbiAgdmFyIGhvc3RQcm9wcyA9IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRWYWx1ZTogdW5kZWZpbmVkLFxuICAgIGNoaWxkcmVuOiB0b1N0cmluZyhub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKVxuICB9KTtcblxuICByZXR1cm4gaG9zdFByb3BzO1xufVxuZnVuY3Rpb24gaW5pdFdyYXBwZXJTdGF0ZSQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICB7XG4gICAgY2hlY2tDb250cm9sbGVkVmFsdWVQcm9wcygndGV4dGFyZWEnLCBwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbERlZmF1bHRWYWwpIHtcbiAgICAgIGVycm9yKCclcyBjb250YWlucyBhIHRleHRhcmVhIHdpdGggYm90aCB2YWx1ZSBhbmQgZGVmYXVsdFZhbHVlIHByb3BzLiAnICsgJ1RleHRhcmVhIGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCB0ZXh0YXJlYSAnICsgJ2FuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycsIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkgfHwgJ0EgY29tcG9uZW50Jyk7XG5cbiAgICAgIGRpZFdhcm5WYWxEZWZhdWx0VmFsID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgaW5pdGlhbFZhbHVlID0gcHJvcHMudmFsdWU7IC8vIE9ubHkgYm90aGVyIGZldGNoaW5nIGRlZmF1bHQgdmFsdWUgaWYgd2UncmUgZ29pbmcgdG8gdXNlIGl0XG5cbiAgaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZTtcblxuICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIGVycm9yKCdVc2UgdGhlIGBkZWZhdWx0VmFsdWVgIG9yIGB2YWx1ZWAgcHJvcHMgaW5zdGVhZCBvZiBzZXR0aW5nICcgKyAnY2hpbGRyZW4gb24gPHRleHRhcmVhPi4nKTtcbiAgICAgIH1cblxuICAgICAge1xuICAgICAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lmIHlvdSBzdXBwbHkgYGRlZmF1bHRWYWx1ZWAgb24gYSA8dGV4dGFyZWE+LCBkbyBub3QgcGFzcyBjaGlsZHJlbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJzx0ZXh0YXJlYT4gY2FuIG9ubHkgaGF2ZSBhdCBtb3N0IG9uZSBjaGlsZC4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdFZhbHVlID0gY2hpbGRyZW47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRlZmF1bHRWYWx1ZSA9PSBudWxsKSB7XG4gICAgICBkZWZhdWx0VmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICBpbml0aWFsVmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gIH1cblxuICBub2RlLl93cmFwcGVyU3RhdGUgPSB7XG4gICAgaW5pdGlhbFZhbHVlOiBnZXRUb1N0cmluZ1ZhbHVlKGluaXRpYWxWYWx1ZSlcbiAgfTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZVdyYXBwZXIkMShlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciB2YWx1ZSA9IGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUpO1xuICB2YXIgZGVmYXVsdFZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy5kZWZhdWx0VmFsdWUpO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgLy8gQ2FzdCBgdmFsdWVgIHRvIGEgc3RyaW5nIHRvIGVuc3VyZSB0aGUgdmFsdWUgaXMgc2V0IGNvcnJlY3RseS4gV2hpbGVcbiAgICAvLyBicm93c2VycyB0eXBpY2FsbHkgZG8gdGhpcyBhcyBuZWNlc3NhcnksIGpzZG9tIGRvZXNuJ3QuXG4gICAgdmFyIG5ld1ZhbHVlID0gdG9TdHJpbmcodmFsdWUpOyAvLyBUbyBhdm9pZCBzaWRlIGVmZmVjdHMgKHN1Y2ggYXMgbG9zaW5nIHRleHQgc2VsZWN0aW9uKSwgb25seSBzZXQgdmFsdWUgaWYgY2hhbmdlZFxuXG4gICAgaWYgKG5ld1ZhbHVlICE9PSBub2RlLnZhbHVlKSB7XG4gICAgICBub2RlLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSA9PSBudWxsICYmIG5vZGUuZGVmYXVsdFZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IHRvU3RyaW5nKGRlZmF1bHRWYWx1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIkMyhlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7IC8vIFRoaXMgaXMgaW4gcG9zdE1vdW50IGJlY2F1c2Ugd2UgbmVlZCBhY2Nlc3MgdG8gdGhlIERPTSBub2RlLCB3aGljaCBpcyBub3RcbiAgLy8gYXZhaWxhYmxlIHVudGlsIGFmdGVyIHRoZSBjb21wb25lbnQgaGFzIG1vdW50ZWQuXG5cbiAgdmFyIHRleHRDb250ZW50ID0gbm9kZS50ZXh0Q29udGVudDsgLy8gT25seSBzZXQgbm9kZS52YWx1ZSBpZiB0ZXh0Q29udGVudCBpcyBlcXVhbCB0byB0aGUgZXhwZWN0ZWRcbiAgLy8gaW5pdGlhbCB2YWx1ZS4gSW4gSUUxMC9JRTExIHRoZXJlIGlzIGEgYnVnIHdoZXJlIHRoZSBwbGFjZWhvbGRlciBhdHRyaWJ1dGVcbiAgLy8gd2lsbCBwb3B1bGF0ZSB0ZXh0Q29udGVudCBhcyB3ZWxsLlxuICAvLyBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL2lzc3Vlcy8xMDE1MjUvXG5cbiAgaWYgKHRleHRDb250ZW50ID09PSBub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKSB7XG4gICAgaWYgKHRleHRDb250ZW50ICE9PSAnJyAmJiB0ZXh0Q29udGVudCAhPT0gbnVsbCkge1xuICAgICAgbm9kZS52YWx1ZSA9IHRleHRDb250ZW50O1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIC8vIERPTSBjb21wb25lbnQgaXMgc3RpbGwgbW91bnRlZDsgdXBkYXRlXG4gIHVwZGF0ZVdyYXBwZXIkMShlbGVtZW50LCBwcm9wcyk7XG59XG5cbnZhciBIVE1MX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbnZhciBNQVRIX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MJztcbnZhciBTVkdfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJzsgLy8gQXNzdW1lcyB0aGVyZSBpcyBubyBwYXJlbnQgbmFtZXNwYWNlLlxuXG5mdW5jdGlvbiBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodHlwZSkge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdzdmcnOlxuICAgICAgcmV0dXJuIFNWR19OQU1FU1BBQ0U7XG5cbiAgICBjYXNlICdtYXRoJzpcbiAgICAgIHJldHVybiBNQVRIX05BTUVTUEFDRTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gSFRNTF9OQU1FU1BBQ0U7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldENoaWxkTmFtZXNwYWNlKHBhcmVudE5hbWVzcGFjZSwgdHlwZSkge1xuICBpZiAocGFyZW50TmFtZXNwYWNlID09IG51bGwgfHwgcGFyZW50TmFtZXNwYWNlID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgIC8vIE5vIChvciBkZWZhdWx0KSBwYXJlbnQgbmFtZXNwYWNlOiBwb3RlbnRpYWwgZW50cnkgcG9pbnQuXG4gICAgcmV0dXJuIGdldEludHJpbnNpY05hbWVzcGFjZSh0eXBlKTtcbiAgfVxuXG4gIGlmIChwYXJlbnROYW1lc3BhY2UgPT09IFNWR19OQU1FU1BBQ0UgJiYgdHlwZSA9PT0gJ2ZvcmVpZ25PYmplY3QnKSB7XG4gICAgLy8gV2UncmUgbGVhdmluZyBTVkcuXG4gICAgcmV0dXJuIEhUTUxfTkFNRVNQQUNFO1xuICB9IC8vIEJ5IGRlZmF1bHQsIHBhc3MgbmFtZXNwYWNlIGJlbG93LlxuXG5cbiAgcmV0dXJuIHBhcmVudE5hbWVzcGFjZTtcbn1cblxuLyogZ2xvYmFscyBNU0FwcCAqL1xuXG4vKipcbiAqIENyZWF0ZSBhIGZ1bmN0aW9uIHdoaWNoIGhhcyAndW5zYWZlJyBwcml2aWxlZ2VzIChyZXF1aXJlZCBieSB3aW5kb3dzOCBhcHBzKVxuICovXG52YXIgY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbiA9IGZ1bmN0aW9uIChmdW5jKSB7XG4gIGlmICh0eXBlb2YgTVNBcHAgIT09ICd1bmRlZmluZWQnICYmIE1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgICBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmdW5jKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZnVuYztcbiAgfVxufTtcblxudmFyIHJldXNhYmxlU1ZHQ29udGFpbmVyO1xuLyoqXG4gKiBTZXQgdGhlIGlubmVySFRNTCBwcm9wZXJ0eSBvZiBhIG5vZGVcbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBodG1sXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG52YXIgc2V0SW5uZXJIVE1MID0gY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbiAobm9kZSwgaHRtbCkge1xuICBpZiAobm9kZS5uYW1lc3BhY2VVUkkgPT09IFNWR19OQU1FU1BBQ0UpIHtcblxuICAgIGlmICghKCdpbm5lckhUTUwnIGluIG5vZGUpKSB7XG4gICAgICAvLyBJRSBkb2VzIG5vdCBoYXZlIGlubmVySFRNTCBmb3IgU1ZHIG5vZGVzLCBzbyBpbnN0ZWFkIHdlIGluamVjdCB0aGVcbiAgICAgIC8vIG5ldyBtYXJrdXAgaW4gYSB0ZW1wIG5vZGUgYW5kIHRoZW4gbW92ZSB0aGUgY2hpbGQgbm9kZXMgYWNyb3NzIGludG9cbiAgICAgIC8vIHRoZSB0YXJnZXQgbm9kZVxuICAgICAgcmV1c2FibGVTVkdDb250YWluZXIgPSByZXVzYWJsZVNWR0NvbnRhaW5lciB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHJldXNhYmxlU1ZHQ29udGFpbmVyLmlubmVySFRNTCA9ICc8c3ZnPicgKyBodG1sLnZhbHVlT2YoKS50b1N0cmluZygpICsgJzwvc3ZnPic7XG4gICAgICB2YXIgc3ZnTm9kZSA9IHJldXNhYmxlU1ZHQ29udGFpbmVyLmZpcnN0Q2hpbGQ7XG5cbiAgICAgIHdoaWxlIChub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbm9kZS5yZW1vdmVDaGlsZChub2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAoc3ZnTm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoc3ZnTm9kZS5maXJzdENoaWxkKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIG5vZGUuaW5uZXJIVE1MID0gaHRtbDtcbn0pO1xuXG4vKipcbiAqIEhUTUwgbm9kZVR5cGUgdmFsdWVzIHRoYXQgcmVwcmVzZW50IHRoZSB0eXBlIG9mIHRoZSBub2RlXG4gKi9cbnZhciBFTEVNRU5UX05PREUgPSAxO1xudmFyIFRFWFRfTk9ERSA9IDM7XG52YXIgQ09NTUVOVF9OT0RFID0gODtcbnZhciBET0NVTUVOVF9OT0RFID0gOTtcbnZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFID0gMTE7XG5cbi8qKlxuICogU2V0IHRoZSB0ZXh0Q29udGVudCBwcm9wZXJ0eSBvZiBhIG5vZGUuIEZvciB0ZXh0IHVwZGF0ZXMsIGl0J3MgZmFzdGVyXG4gKiB0byBzZXQgdGhlIGBub2RlVmFsdWVgIG9mIHRoZSBUZXh0IG5vZGUgZGlyZWN0bHkgaW5zdGVhZCBvZiB1c2luZ1xuICogYC50ZXh0Q29udGVudGAgd2hpY2ggd2lsbCByZW1vdmUgdGhlIGV4aXN0aW5nIG5vZGUgYW5kIGNyZWF0ZSBhIG5ldyBvbmUuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICogQGludGVybmFsXG4gKi9cblxudmFyIHNldFRleHRDb250ZW50ID0gZnVuY3Rpb24gKG5vZGUsIHRleHQpIHtcbiAgaWYgKHRleHQpIHtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcblxuICAgIGlmIChmaXJzdENoaWxkICYmIGZpcnN0Q2hpbGQgPT09IG5vZGUubGFzdENoaWxkICYmIGZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSB0ZXh0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIG5vZGUudGV4dENvbnRlbnQgPSB0ZXh0O1xufTtcblxuLy8gTGlzdCBkZXJpdmVkIGZyb20gR2Vja28gc291cmNlIGNvZGU6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9nZWNrby1kZXYvYmxvYi80ZTYzOGVmYzcxL2xheW91dC9zdHlsZS90ZXN0L3Byb3BlcnR5X2RhdGFiYXNlLmpzXG52YXIgc2hvcnRoYW5kVG9Mb25naGFuZCA9IHtcbiAgYW5pbWF0aW9uOiBbJ2FuaW1hdGlvbkRlbGF5JywgJ2FuaW1hdGlvbkRpcmVjdGlvbicsICdhbmltYXRpb25EdXJhdGlvbicsICdhbmltYXRpb25GaWxsTW9kZScsICdhbmltYXRpb25JdGVyYXRpb25Db3VudCcsICdhbmltYXRpb25OYW1lJywgJ2FuaW1hdGlvblBsYXlTdGF0ZScsICdhbmltYXRpb25UaW1pbmdGdW5jdGlvbiddLFxuICBiYWNrZ3JvdW5kOiBbJ2JhY2tncm91bmRBdHRhY2htZW50JywgJ2JhY2tncm91bmRDbGlwJywgJ2JhY2tncm91bmRDb2xvcicsICdiYWNrZ3JvdW5kSW1hZ2UnLCAnYmFja2dyb3VuZE9yaWdpbicsICdiYWNrZ3JvdW5kUG9zaXRpb25YJywgJ2JhY2tncm91bmRQb3NpdGlvblknLCAnYmFja2dyb3VuZFJlcGVhdCcsICdiYWNrZ3JvdW5kU2l6ZSddLFxuICBiYWNrZ3JvdW5kUG9zaXRpb246IFsnYmFja2dyb3VuZFBvc2l0aW9uWCcsICdiYWNrZ3JvdW5kUG9zaXRpb25ZJ10sXG4gIGJvcmRlcjogWydib3JkZXJCb3R0b21Db2xvcicsICdib3JkZXJCb3R0b21TdHlsZScsICdib3JkZXJCb3R0b21XaWR0aCcsICdib3JkZXJJbWFnZU91dHNldCcsICdib3JkZXJJbWFnZVJlcGVhdCcsICdib3JkZXJJbWFnZVNsaWNlJywgJ2JvcmRlckltYWdlU291cmNlJywgJ2JvcmRlckltYWdlV2lkdGgnLCAnYm9yZGVyTGVmdENvbG9yJywgJ2JvcmRlckxlZnRTdHlsZScsICdib3JkZXJMZWZ0V2lkdGgnLCAnYm9yZGVyUmlnaHRDb2xvcicsICdib3JkZXJSaWdodFN0eWxlJywgJ2JvcmRlclJpZ2h0V2lkdGgnLCAnYm9yZGVyVG9wQ29sb3InLCAnYm9yZGVyVG9wU3R5bGUnLCAnYm9yZGVyVG9wV2lkdGgnXSxcbiAgYm9yZGVyQmxvY2tFbmQ6IFsnYm9yZGVyQmxvY2tFbmRDb2xvcicsICdib3JkZXJCbG9ja0VuZFN0eWxlJywgJ2JvcmRlckJsb2NrRW5kV2lkdGgnXSxcbiAgYm9yZGVyQmxvY2tTdGFydDogWydib3JkZXJCbG9ja1N0YXJ0Q29sb3InLCAnYm9yZGVyQmxvY2tTdGFydFN0eWxlJywgJ2JvcmRlckJsb2NrU3RhcnRXaWR0aCddLFxuICBib3JkZXJCb3R0b206IFsnYm9yZGVyQm90dG9tQ29sb3InLCAnYm9yZGVyQm90dG9tU3R5bGUnLCAnYm9yZGVyQm90dG9tV2lkdGgnXSxcbiAgYm9yZGVyQ29sb3I6IFsnYm9yZGVyQm90dG9tQ29sb3InLCAnYm9yZGVyTGVmdENvbG9yJywgJ2JvcmRlclJpZ2h0Q29sb3InLCAnYm9yZGVyVG9wQ29sb3InXSxcbiAgYm9yZGVySW1hZ2U6IFsnYm9yZGVySW1hZ2VPdXRzZXQnLCAnYm9yZGVySW1hZ2VSZXBlYXQnLCAnYm9yZGVySW1hZ2VTbGljZScsICdib3JkZXJJbWFnZVNvdXJjZScsICdib3JkZXJJbWFnZVdpZHRoJ10sXG4gIGJvcmRlcklubGluZUVuZDogWydib3JkZXJJbmxpbmVFbmRDb2xvcicsICdib3JkZXJJbmxpbmVFbmRTdHlsZScsICdib3JkZXJJbmxpbmVFbmRXaWR0aCddLFxuICBib3JkZXJJbmxpbmVTdGFydDogWydib3JkZXJJbmxpbmVTdGFydENvbG9yJywgJ2JvcmRlcklubGluZVN0YXJ0U3R5bGUnLCAnYm9yZGVySW5saW5lU3RhcnRXaWR0aCddLFxuICBib3JkZXJMZWZ0OiBbJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyTGVmdFdpZHRoJ10sXG4gIGJvcmRlclJhZGl1czogWydib3JkZXJCb3R0b21MZWZ0UmFkaXVzJywgJ2JvcmRlckJvdHRvbVJpZ2h0UmFkaXVzJywgJ2JvcmRlclRvcExlZnRSYWRpdXMnLCAnYm9yZGVyVG9wUmlnaHRSYWRpdXMnXSxcbiAgYm9yZGVyUmlnaHQ6IFsnYm9yZGVyUmlnaHRDb2xvcicsICdib3JkZXJSaWdodFN0eWxlJywgJ2JvcmRlclJpZ2h0V2lkdGgnXSxcbiAgYm9yZGVyU3R5bGU6IFsnYm9yZGVyQm90dG9tU3R5bGUnLCAnYm9yZGVyTGVmdFN0eWxlJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyVG9wU3R5bGUnXSxcbiAgYm9yZGVyVG9wOiBbJ2JvcmRlclRvcENvbG9yJywgJ2JvcmRlclRvcFN0eWxlJywgJ2JvcmRlclRvcFdpZHRoJ10sXG4gIGJvcmRlcldpZHRoOiBbJ2JvcmRlckJvdHRvbVdpZHRoJywgJ2JvcmRlckxlZnRXaWR0aCcsICdib3JkZXJSaWdodFdpZHRoJywgJ2JvcmRlclRvcFdpZHRoJ10sXG4gIGNvbHVtblJ1bGU6IFsnY29sdW1uUnVsZUNvbG9yJywgJ2NvbHVtblJ1bGVTdHlsZScsICdjb2x1bW5SdWxlV2lkdGgnXSxcbiAgY29sdW1uczogWydjb2x1bW5Db3VudCcsICdjb2x1bW5XaWR0aCddLFxuICBmbGV4OiBbJ2ZsZXhCYXNpcycsICdmbGV4R3JvdycsICdmbGV4U2hyaW5rJ10sXG4gIGZsZXhGbG93OiBbJ2ZsZXhEaXJlY3Rpb24nLCAnZmxleFdyYXAnXSxcbiAgZm9udDogWydmb250RmFtaWx5JywgJ2ZvbnRGZWF0dXJlU2V0dGluZ3MnLCAnZm9udEtlcm5pbmcnLCAnZm9udExhbmd1YWdlT3ZlcnJpZGUnLCAnZm9udFNpemUnLCAnZm9udFNpemVBZGp1c3QnLCAnZm9udFN0cmV0Y2gnLCAnZm9udFN0eWxlJywgJ2ZvbnRWYXJpYW50JywgJ2ZvbnRWYXJpYW50QWx0ZXJuYXRlcycsICdmb250VmFyaWFudENhcHMnLCAnZm9udFZhcmlhbnRFYXN0QXNpYW4nLCAnZm9udFZhcmlhbnRMaWdhdHVyZXMnLCAnZm9udFZhcmlhbnROdW1lcmljJywgJ2ZvbnRWYXJpYW50UG9zaXRpb24nLCAnZm9udFdlaWdodCcsICdsaW5lSGVpZ2h0J10sXG4gIGZvbnRWYXJpYW50OiBbJ2ZvbnRWYXJpYW50QWx0ZXJuYXRlcycsICdmb250VmFyaWFudENhcHMnLCAnZm9udFZhcmlhbnRFYXN0QXNpYW4nLCAnZm9udFZhcmlhbnRMaWdhdHVyZXMnLCAnZm9udFZhcmlhbnROdW1lcmljJywgJ2ZvbnRWYXJpYW50UG9zaXRpb24nXSxcbiAgZ2FwOiBbJ2NvbHVtbkdhcCcsICdyb3dHYXAnXSxcbiAgZ3JpZDogWydncmlkQXV0b0NvbHVtbnMnLCAnZ3JpZEF1dG9GbG93JywgJ2dyaWRBdXRvUm93cycsICdncmlkVGVtcGxhdGVBcmVhcycsICdncmlkVGVtcGxhdGVDb2x1bW5zJywgJ2dyaWRUZW1wbGF0ZVJvd3MnXSxcbiAgZ3JpZEFyZWE6IFsnZ3JpZENvbHVtbkVuZCcsICdncmlkQ29sdW1uU3RhcnQnLCAnZ3JpZFJvd0VuZCcsICdncmlkUm93U3RhcnQnXSxcbiAgZ3JpZENvbHVtbjogWydncmlkQ29sdW1uRW5kJywgJ2dyaWRDb2x1bW5TdGFydCddLFxuICBncmlkQ29sdW1uR2FwOiBbJ2NvbHVtbkdhcCddLFxuICBncmlkR2FwOiBbJ2NvbHVtbkdhcCcsICdyb3dHYXAnXSxcbiAgZ3JpZFJvdzogWydncmlkUm93RW5kJywgJ2dyaWRSb3dTdGFydCddLFxuICBncmlkUm93R2FwOiBbJ3Jvd0dhcCddLFxuICBncmlkVGVtcGxhdGU6IFsnZ3JpZFRlbXBsYXRlQXJlYXMnLCAnZ3JpZFRlbXBsYXRlQ29sdW1ucycsICdncmlkVGVtcGxhdGVSb3dzJ10sXG4gIGxpc3RTdHlsZTogWydsaXN0U3R5bGVJbWFnZScsICdsaXN0U3R5bGVQb3NpdGlvbicsICdsaXN0U3R5bGVUeXBlJ10sXG4gIG1hcmdpbjogWydtYXJnaW5Cb3R0b20nLCAnbWFyZ2luTGVmdCcsICdtYXJnaW5SaWdodCcsICdtYXJnaW5Ub3AnXSxcbiAgbWFya2VyOiBbJ21hcmtlckVuZCcsICdtYXJrZXJNaWQnLCAnbWFya2VyU3RhcnQnXSxcbiAgbWFzazogWydtYXNrQ2xpcCcsICdtYXNrQ29tcG9zaXRlJywgJ21hc2tJbWFnZScsICdtYXNrTW9kZScsICdtYXNrT3JpZ2luJywgJ21hc2tQb3NpdGlvblgnLCAnbWFza1Bvc2l0aW9uWScsICdtYXNrUmVwZWF0JywgJ21hc2tTaXplJ10sXG4gIG1hc2tQb3NpdGlvbjogWydtYXNrUG9zaXRpb25YJywgJ21hc2tQb3NpdGlvblknXSxcbiAgb3V0bGluZTogWydvdXRsaW5lQ29sb3InLCAnb3V0bGluZVN0eWxlJywgJ291dGxpbmVXaWR0aCddLFxuICBvdmVyZmxvdzogWydvdmVyZmxvd1gnLCAnb3ZlcmZsb3dZJ10sXG4gIHBhZGRpbmc6IFsncGFkZGluZ0JvdHRvbScsICdwYWRkaW5nTGVmdCcsICdwYWRkaW5nUmlnaHQnLCAncGFkZGluZ1RvcCddLFxuICBwbGFjZUNvbnRlbnQ6IFsnYWxpZ25Db250ZW50JywgJ2p1c3RpZnlDb250ZW50J10sXG4gIHBsYWNlSXRlbXM6IFsnYWxpZ25JdGVtcycsICdqdXN0aWZ5SXRlbXMnXSxcbiAgcGxhY2VTZWxmOiBbJ2FsaWduU2VsZicsICdqdXN0aWZ5U2VsZiddLFxuICB0ZXh0RGVjb3JhdGlvbjogWyd0ZXh0RGVjb3JhdGlvbkNvbG9yJywgJ3RleHREZWNvcmF0aW9uTGluZScsICd0ZXh0RGVjb3JhdGlvblN0eWxlJ10sXG4gIHRleHRFbXBoYXNpczogWyd0ZXh0RW1waGFzaXNDb2xvcicsICd0ZXh0RW1waGFzaXNTdHlsZSddLFxuICB0cmFuc2l0aW9uOiBbJ3RyYW5zaXRpb25EZWxheScsICd0cmFuc2l0aW9uRHVyYXRpb24nLCAndHJhbnNpdGlvblByb3BlcnR5JywgJ3RyYW5zaXRpb25UaW1pbmdGdW5jdGlvbiddLFxuICB3b3JkV3JhcDogWydvdmVyZmxvd1dyYXAnXVxufTtcblxuLyoqXG4gKiBDU1MgcHJvcGVydGllcyB3aGljaCBhY2NlcHQgbnVtYmVycyBidXQgYXJlIG5vdCBpbiB1bml0cyBvZiBcInB4XCIuXG4gKi9cbnZhciBpc1VuaXRsZXNzTnVtYmVyID0ge1xuICBhbmltYXRpb25JdGVyYXRpb25Db3VudDogdHJ1ZSxcbiAgYXNwZWN0UmF0aW86IHRydWUsXG4gIGJvcmRlckltYWdlT3V0c2V0OiB0cnVlLFxuICBib3JkZXJJbWFnZVNsaWNlOiB0cnVlLFxuICBib3JkZXJJbWFnZVdpZHRoOiB0cnVlLFxuICBib3hGbGV4OiB0cnVlLFxuICBib3hGbGV4R3JvdXA6IHRydWUsXG4gIGJveE9yZGluYWxHcm91cDogdHJ1ZSxcbiAgY29sdW1uQ291bnQ6IHRydWUsXG4gIGNvbHVtbnM6IHRydWUsXG4gIGZsZXg6IHRydWUsXG4gIGZsZXhHcm93OiB0cnVlLFxuICBmbGV4UG9zaXRpdmU6IHRydWUsXG4gIGZsZXhTaHJpbms6IHRydWUsXG4gIGZsZXhOZWdhdGl2ZTogdHJ1ZSxcbiAgZmxleE9yZGVyOiB0cnVlLFxuICBncmlkQXJlYTogdHJ1ZSxcbiAgZ3JpZFJvdzogdHJ1ZSxcbiAgZ3JpZFJvd0VuZDogdHJ1ZSxcbiAgZ3JpZFJvd1NwYW46IHRydWUsXG4gIGdyaWRSb3dTdGFydDogdHJ1ZSxcbiAgZ3JpZENvbHVtbjogdHJ1ZSxcbiAgZ3JpZENvbHVtbkVuZDogdHJ1ZSxcbiAgZ3JpZENvbHVtblNwYW46IHRydWUsXG4gIGdyaWRDb2x1bW5TdGFydDogdHJ1ZSxcbiAgZm9udFdlaWdodDogdHJ1ZSxcbiAgbGluZUNsYW1wOiB0cnVlLFxuICBsaW5lSGVpZ2h0OiB0cnVlLFxuICBvcGFjaXR5OiB0cnVlLFxuICBvcmRlcjogdHJ1ZSxcbiAgb3JwaGFuczogdHJ1ZSxcbiAgdGFiU2l6ZTogdHJ1ZSxcbiAgd2lkb3dzOiB0cnVlLFxuICB6SW5kZXg6IHRydWUsXG4gIHpvb206IHRydWUsXG4gIC8vIFNWRy1yZWxhdGVkIHByb3BlcnRpZXNcbiAgZmlsbE9wYWNpdHk6IHRydWUsXG4gIGZsb29kT3BhY2l0eTogdHJ1ZSxcbiAgc3RvcE9wYWNpdHk6IHRydWUsXG4gIHN0cm9rZURhc2hhcnJheTogdHJ1ZSxcbiAgc3Ryb2tlRGFzaG9mZnNldDogdHJ1ZSxcbiAgc3Ryb2tlTWl0ZXJsaW1pdDogdHJ1ZSxcbiAgc3Ryb2tlT3BhY2l0eTogdHJ1ZSxcbiAgc3Ryb2tlV2lkdGg6IHRydWVcbn07XG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXggdmVuZG9yLXNwZWNpZmljIHByZWZpeCwgZWc6IFdlYmtpdFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBzdHlsZSBuYW1lLCBlZzogdHJhbnNpdGlvbkR1cmF0aW9uXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHN0eWxlIG5hbWUgcHJlZml4ZWQgd2l0aCBgcHJlZml4YCwgcHJvcGVybHkgY2FtZWxDYXNlZCwgZWc6XG4gKiBXZWJraXRUcmFuc2l0aW9uRHVyYXRpb25cbiAqL1xuXG5mdW5jdGlvbiBwcmVmaXhLZXkocHJlZml4LCBrZXkpIHtcbiAgcmV0dXJuIHByZWZpeCArIGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zdWJzdHJpbmcoMSk7XG59XG4vKipcbiAqIFN1cHBvcnQgc3R5bGUgbmFtZXMgdGhhdCBtYXkgY29tZSBwYXNzZWQgaW4gcHJlZml4ZWQgYnkgYWRkaW5nIHBlcm11dGF0aW9uc1xuICogb2YgdmVuZG9yIHByZWZpeGVzLlxuICovXG5cblxudmFyIHByZWZpeGVzID0gWydXZWJraXQnLCAnbXMnLCAnTW96JywgJ08nXTsgLy8gVXNpbmcgT2JqZWN0LmtleXMgaGVyZSwgb3IgZWxzZSB0aGUgdmFuaWxsYSBmb3ItaW4gbG9vcCBtYWtlcyBJRTggZ28gaW50byBhblxuLy8gaW5maW5pdGUgbG9vcCwgYmVjYXVzZSBpdCBpdGVyYXRlcyBvdmVyIHRoZSBuZXdseSBhZGRlZCBwcm9wcyB0b28uXG5cbk9iamVjdC5rZXlzKGlzVW5pdGxlc3NOdW1iZXIpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgcHJlZml4ZXMuZm9yRWFjaChmdW5jdGlvbiAocHJlZml4KSB7XG4gICAgaXNVbml0bGVzc051bWJlcltwcmVmaXhLZXkocHJlZml4LCBwcm9wKV0gPSBpc1VuaXRsZXNzTnVtYmVyW3Byb3BdO1xuICB9KTtcbn0pO1xuXG4vKipcbiAqIENvbnZlcnQgYSB2YWx1ZSBpbnRvIHRoZSBwcm9wZXIgY3NzIHdyaXRhYmxlIHZhbHVlLiBUaGUgc3R5bGUgbmFtZSBgbmFtZWBcbiAqIHNob3VsZCBiZSBsb2dpY2FsIChubyBoeXBoZW5zKSwgYXMgc3BlY2lmaWVkXG4gKiBpbiBgQ1NTUHJvcGVydHkuaXNVbml0bGVzc051bWJlcmAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgQ1NTIHByb3BlcnR5IG5hbWUgc3VjaCBhcyBgdG9wTWFyZ2luYC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQ1NTIHByb3BlcnR5IHZhbHVlIHN1Y2ggYXMgYDEwcHhgLlxuICogQHJldHVybiB7c3RyaW5nfSBOb3JtYWxpemVkIHN0eWxlIHZhbHVlIHdpdGggZGltZW5zaW9ucyBhcHBsaWVkLlxuICovXG5cbmZ1bmN0aW9uIGRhbmdlcm91c1N0eWxlVmFsdWUobmFtZSwgdmFsdWUsIGlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgLy8gTm90ZSB0aGF0IHdlJ3ZlIHJlbW92ZWQgZXNjYXBlVGV4dEZvckJyb3dzZXIoKSBjYWxscyBoZXJlIHNpbmNlIHRoZVxuICAvLyB3aG9sZSBzdHJpbmcgd2lsbCBiZSBlc2NhcGVkIHdoZW4gdGhlIGF0dHJpYnV0ZSBpcyBpbmplY3RlZCBpbnRvXG4gIC8vIHRoZSBtYXJrdXAuIElmIHlvdSBwcm92aWRlIHVuc2FmZSB1c2VyIGRhdGEgaGVyZSB0aGV5IGNhbiBpbmplY3RcbiAgLy8gYXJiaXRyYXJ5IENTUyB3aGljaCBtYXkgYmUgcHJvYmxlbWF0aWMgKEkgY291bGRuJ3QgcmVwcm8gdGhpcyk6XG4gIC8vIGh0dHBzOi8vd3d3Lm93YXNwLm9yZy9pbmRleC5waHAvWFNTX0ZpbHRlcl9FdmFzaW9uX0NoZWF0X1NoZWV0XG4gIC8vIGh0dHA6Ly93d3cudGhlc3Bhbm5lci5jby51ay8yMDA3LzExLzI2L3VsdGltYXRlLXhzcy1jc3MtaW5qZWN0aW9uL1xuICAvLyBUaGlzIGlzIG5vdCBhbiBYU1MgaG9sZSBidXQgaW5zdGVhZCBhIHBvdGVudGlhbCBDU1MgaW5qZWN0aW9uIGlzc3VlXG4gIC8vIHdoaWNoIGhhcyBsZWFkIHRvIGEgZ3JlYXRlciBkaXNjdXNzaW9uIGFib3V0IGhvdyB3ZSdyZSBnb2luZyB0b1xuICAvLyB0cnVzdCBVUkxzIG1vdmluZyBmb3J3YXJkLiBTZWUgIzIxMTU5MDFcbiAgdmFyIGlzRW1wdHkgPSB2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHZhbHVlID09PSAnJztcblxuICBpZiAoaXNFbXB0eSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmICghaXNDdXN0b21Qcm9wZXJ0eSAmJiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHZhbHVlICE9PSAwICYmICEoaXNVbml0bGVzc051bWJlci5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiBpc1VuaXRsZXNzTnVtYmVyW25hbWVdKSkge1xuICAgIHJldHVybiB2YWx1ZSArICdweCc7IC8vIFByZXN1bWVzIGltcGxpY2l0ICdweCcgc3VmZml4IGZvciB1bml0bGVzcyBudW1iZXJzXG4gIH1cblxuICB7XG4gICAgY2hlY2tDU1NQcm9wZXJ0eVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBuYW1lKTtcbiAgfVxuXG4gIHJldHVybiAoJycgKyB2YWx1ZSkudHJpbSgpO1xufVxuXG52YXIgdXBwZXJjYXNlUGF0dGVybiA9IC8oW0EtWl0pL2c7XG52YXIgbXNQYXR0ZXJuID0gL15tcy0vO1xuLyoqXG4gKiBIeXBoZW5hdGVzIGEgY2FtZWxjYXNlZCBDU1MgcHJvcGVydHkgbmFtZSwgZm9yIGV4YW1wbGU6XG4gKlxuICogICA+IGh5cGhlbmF0ZVN0eWxlTmFtZSgnYmFja2dyb3VuZENvbG9yJylcbiAqICAgPCBcImJhY2tncm91bmQtY29sb3JcIlxuICogICA+IGh5cGhlbmF0ZVN0eWxlTmFtZSgnTW96VHJhbnNpdGlvbicpXG4gKiAgIDwgXCItbW96LXRyYW5zaXRpb25cIlxuICogICA+IGh5cGhlbmF0ZVN0eWxlTmFtZSgnbXNUcmFuc2l0aW9uJylcbiAqICAgPCBcIi1tcy10cmFuc2l0aW9uXCJcbiAqXG4gKiBBcyBNb2Rlcm5penIgc3VnZ2VzdHMgKGh0dHA6Ly9tb2Rlcm5penIuY29tL2RvY3MvI3ByZWZpeGVkKSwgYW4gYG1zYCBwcmVmaXhcbiAqIGlzIGNvbnZlcnRlZCB0byBgLW1zLWAuXG4gKi9cblxuZnVuY3Rpb24gaHlwaGVuYXRlU3R5bGVOYW1lKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWUucmVwbGFjZSh1cHBlcmNhc2VQYXR0ZXJuLCAnLSQxJykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKG1zUGF0dGVybiwgJy1tcy0nKTtcbn1cblxudmFyIHdhcm5WYWxpZFN0eWxlID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgLy8gJ21zVHJhbnNmb3JtJyBpcyBjb3JyZWN0LCBidXQgdGhlIG90aGVyIHByZWZpeGVzIHNob3VsZCBiZSBjYXBpdGFsaXplZFxuICB2YXIgYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuID0gL14oPzp3ZWJraXR8bW96fG8pW0EtWl0vO1xuICB2YXIgbXNQYXR0ZXJuJDEgPSAvXi1tcy0vO1xuICB2YXIgaHlwaGVuUGF0dGVybiA9IC8tKC4pL2c7IC8vIHN0eWxlIHZhbHVlcyBzaG91bGRuJ3QgY29udGFpbiBhIHNlbWljb2xvblxuXG4gIHZhciBiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4gPSAvO1xccyokLztcbiAgdmFyIHdhcm5lZFN0eWxlTmFtZXMgPSB7fTtcbiAgdmFyIHdhcm5lZFN0eWxlVmFsdWVzID0ge307XG4gIHZhciB3YXJuZWRGb3JOYU5WYWx1ZSA9IGZhbHNlO1xuICB2YXIgd2FybmVkRm9ySW5maW5pdHlWYWx1ZSA9IGZhbHNlO1xuXG4gIHZhciBjYW1lbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoaHlwaGVuUGF0dGVybiwgZnVuY3Rpb24gKF8sIGNoYXJhY3Rlcikge1xuICAgICAgcmV0dXJuIGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpO1xuICAgIH0pO1xuICB9O1xuXG4gIHZhciB3YXJuSHlwaGVuYXRlZFN0eWxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlTmFtZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ1Vuc3VwcG9ydGVkIHN0eWxlIHByb3BlcnR5ICVzLiBEaWQgeW91IG1lYW4gJXM/JywgbmFtZSwgLy8gQXMgQW5kaSBTbWl0aCBzdWdnZXN0c1xuICAgIC8vIChodHRwOi8vd3d3LmFuZGlzbWl0aC5jb20vYmxvZy8yMDEyLzAyL21vZGVybml6ci1wcmVmaXhlZC8pLCBhbiBgLW1zYCBwcmVmaXhcbiAgICAvLyBpcyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGBtc2AuXG4gICAgY2FtZWxpemUobmFtZS5yZXBsYWNlKG1zUGF0dGVybiQxLCAnbXMtJykpKTtcbiAgfTtcblxuICB2YXIgd2FybkJhZFZlbmRvcmVkU3R5bGVOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRTdHlsZU5hbWVzW25hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignVW5zdXBwb3J0ZWQgdmVuZG9yLXByZWZpeGVkIHN0eWxlIHByb3BlcnR5ICVzLiBEaWQgeW91IG1lYW4gJXM/JywgbmFtZSwgbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSkpO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZVdpdGhTZW1pY29sb24gPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAod2FybmVkU3R5bGVWYWx1ZXMuaGFzT3duUHJvcGVydHkodmFsdWUpICYmIHdhcm5lZFN0eWxlVmFsdWVzW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZFN0eWxlVmFsdWVzW3ZhbHVlXSA9IHRydWU7XG5cbiAgICBlcnJvcihcIlN0eWxlIHByb3BlcnR5IHZhbHVlcyBzaG91bGRuJ3QgY29udGFpbiBhIHNlbWljb2xvbi4gXCIgKyAnVHJ5IFwiJXM6ICVzXCIgaW5zdGVhZC4nLCBuYW1lLCB2YWx1ZS5yZXBsYWNlKGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybiwgJycpKTtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVJc05hTiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmICh3YXJuZWRGb3JOYU5WYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZEZvck5hTlZhbHVlID0gdHJ1ZTtcblxuICAgIGVycm9yKCdgTmFOYCBpcyBhbiBpbnZhbGlkIHZhbHVlIGZvciB0aGUgYCVzYCBjc3Mgc3R5bGUgcHJvcGVydHkuJywgbmFtZSk7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlSXNJbmZpbml0eSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmICh3YXJuZWRGb3JJbmZpbml0eVZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkRm9ySW5maW5pdHlWYWx1ZSA9IHRydWU7XG5cbiAgICBlcnJvcignYEluZmluaXR5YCBpcyBhbiBpbnZhbGlkIHZhbHVlIGZvciB0aGUgYCVzYCBjc3Mgc3R5bGUgcHJvcGVydHkuJywgbmFtZSk7XG4gIH07XG5cbiAgd2FyblZhbGlkU3R5bGUgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAobmFtZS5pbmRleE9mKCctJykgPiAtMSkge1xuICAgICAgd2Fybkh5cGhlbmF0ZWRTdHlsZU5hbWUobmFtZSk7XG4gICAgfSBlbHNlIGlmIChiYWRWZW5kb3JlZFN0eWxlTmFtZVBhdHRlcm4udGVzdChuYW1lKSkge1xuICAgICAgd2FybkJhZFZlbmRvcmVkU3R5bGVOYW1lKG5hbWUpO1xuICAgIH0gZWxzZSBpZiAoYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICB3YXJuU3R5bGVWYWx1ZVdpdGhTZW1pY29sb24obmFtZSwgdmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICAgIHdhcm5TdHlsZVZhbHVlSXNOYU4obmFtZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmICghaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgIHdhcm5TdHlsZVZhbHVlSXNJbmZpbml0eShuYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG52YXIgd2FyblZhbGlkU3R5bGUkMSA9IHdhcm5WYWxpZFN0eWxlO1xuXG4vKipcbiAqIE9wZXJhdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCBDU1MgcHJvcGVydGllcy5cbiAqL1xuXG4vKipcbiAqIFRoaXMgY3JlYXRlcyBhIHN0cmluZyB0aGF0IGlzIGV4cGVjdGVkIHRvIGJlIGVxdWl2YWxlbnQgdG8gdGhlIHN0eWxlXG4gKiBhdHRyaWJ1dGUgZ2VuZXJhdGVkIGJ5IHNlcnZlci1zaWRlIHJlbmRlcmluZy4gSXQgYnktcGFzc2VzIHdhcm5pbmdzIGFuZFxuICogc2VjdXJpdHkgY2hlY2tzIHNvIGl0J3Mgbm90IHNhZmUgdG8gdXNlIHRoaXMgdmFsdWUgZm9yIGFueXRoaW5nIG90aGVyIHRoYW5cbiAqIGNvbXBhcmlzb24uIEl0IGlzIG9ubHkgdXNlZCBpbiBERVYgZm9yIFNTUiB2YWxpZGF0aW9uLlxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZURhbmdlcm91c1N0cmluZ0ZvclN0eWxlcyhzdHlsZXMpIHtcbiAge1xuICAgIHZhciBzZXJpYWxpemVkID0gJyc7XG4gICAgdmFyIGRlbGltaXRlciA9ICcnO1xuXG4gICAgZm9yICh2YXIgc3R5bGVOYW1lIGluIHN0eWxlcykge1xuICAgICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0eWxlVmFsdWUgPSBzdHlsZXNbc3R5bGVOYW1lXTtcblxuICAgICAgaWYgKHN0eWxlVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICB2YXIgaXNDdXN0b21Qcm9wZXJ0eSA9IHN0eWxlTmFtZS5pbmRleE9mKCctLScpID09PSAwO1xuICAgICAgICBzZXJpYWxpemVkICs9IGRlbGltaXRlciArIChpc0N1c3RvbVByb3BlcnR5ID8gc3R5bGVOYW1lIDogaHlwaGVuYXRlU3R5bGVOYW1lKHN0eWxlTmFtZSkpICsgJzonO1xuICAgICAgICBzZXJpYWxpemVkICs9IGRhbmdlcm91c1N0eWxlVmFsdWUoc3R5bGVOYW1lLCBzdHlsZVZhbHVlLCBpc0N1c3RvbVByb3BlcnR5KTtcbiAgICAgICAgZGVsaW1pdGVyID0gJzsnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZXJpYWxpemVkIHx8IG51bGw7XG4gIH1cbn1cbi8qKlxuICogU2V0cyB0aGUgdmFsdWUgZm9yIG11bHRpcGxlIHN0eWxlcyBvbiBhIG5vZGUuICBJZiBhIHZhbHVlIGlzIHNwZWNpZmllZCBhc1xuICogJycgKGVtcHR5IHN0cmluZyksIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlIHByb3BlcnR5IHdpbGwgYmUgdW5zZXQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge29iamVjdH0gc3R5bGVzXG4gKi9cblxuZnVuY3Rpb24gc2V0VmFsdWVGb3JTdHlsZXMobm9kZSwgc3R5bGVzKSB7XG4gIHZhciBzdHlsZSA9IG5vZGUuc3R5bGU7XG5cbiAgZm9yICh2YXIgc3R5bGVOYW1lIGluIHN0eWxlcykge1xuICAgIGlmICghc3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBpc0N1c3RvbVByb3BlcnR5ID0gc3R5bGVOYW1lLmluZGV4T2YoJy0tJykgPT09IDA7XG5cbiAgICB7XG4gICAgICBpZiAoIWlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgICAgICAgd2FyblZhbGlkU3R5bGUkMShzdHlsZU5hbWUsIHN0eWxlc1tzdHlsZU5hbWVdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc3R5bGVWYWx1ZSA9IGRhbmdlcm91c1N0eWxlVmFsdWUoc3R5bGVOYW1lLCBzdHlsZXNbc3R5bGVOYW1lXSwgaXNDdXN0b21Qcm9wZXJ0eSk7XG5cbiAgICBpZiAoc3R5bGVOYW1lID09PSAnZmxvYXQnKSB7XG4gICAgICBzdHlsZU5hbWUgPSAnY3NzRmxvYXQnO1xuICAgIH1cblxuICAgIGlmIChpc0N1c3RvbVByb3BlcnR5KSB7XG4gICAgICBzdHlsZS5zZXRQcm9wZXJ0eShzdHlsZU5hbWUsIHN0eWxlVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHlsZVtzdHlsZU5hbWVdID0gc3R5bGVWYWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNWYWx1ZUVtcHR5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHZhbHVlID09PSAnJztcbn1cbi8qKlxuICogR2l2ZW4ge2NvbG9yOiAncmVkJywgb3ZlcmZsb3c6ICdoaWRkZW4nfSByZXR1cm5zIHtcbiAqICAgY29sb3I6ICdjb2xvcicsXG4gKiAgIG92ZXJmbG93WDogJ292ZXJmbG93JyxcbiAqICAgb3ZlcmZsb3dZOiAnb3ZlcmZsb3cnLFxuICogfS4gVGhpcyBjYW4gYmUgcmVhZCBhcyBcInRoZSBvdmVyZmxvd1kgcHJvcGVydHkgd2FzIHNldCBieSB0aGUgb3ZlcmZsb3dcbiAqIHNob3J0aGFuZFwiLiBUaGF0IGlzLCB0aGUgdmFsdWVzIGFyZSB0aGUgcHJvcGVydHkgdGhhdCBlYWNoIHdhcyBkZXJpdmVkIGZyb20uXG4gKi9cblxuXG5mdW5jdGlvbiBleHBhbmRTaG9ydGhhbmRNYXAoc3R5bGVzKSB7XG4gIHZhciBleHBhbmRlZCA9IHt9O1xuXG4gIGZvciAodmFyIGtleSBpbiBzdHlsZXMpIHtcbiAgICB2YXIgbG9uZ2hhbmRzID0gc2hvcnRoYW5kVG9Mb25naGFuZFtrZXldIHx8IFtrZXldO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb25naGFuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGV4cGFuZGVkW2xvbmdoYW5kc1tpXV0gPSBrZXk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4cGFuZGVkO1xufVxuLyoqXG4gKiBXaGVuIG1peGluZyBzaG9ydGhhbmQgYW5kIGxvbmdoYW5kIHByb3BlcnR5IG5hbWVzLCB3ZSB3YXJuIGR1cmluZyB1cGRhdGVzIGlmXG4gKiB3ZSBleHBlY3QgYW4gaW5jb3JyZWN0IHJlc3VsdCB0byBvY2N1ci4gSW4gcGFydGljdWxhciwgd2Ugd2FybiBmb3I6XG4gKlxuICogVXBkYXRpbmcgYSBzaG9ydGhhbmQgcHJvcGVydHkgKGxvbmdoYW5kIGdldHMgb3ZlcndyaXR0ZW4pOlxuICogICB7Zm9udDogJ2ZvbycsIGZvbnRWYXJpYW50OiAnYmFyJ30gLT4ge2ZvbnQ6ICdiYXonLCBmb250VmFyaWFudDogJ2Jhcid9XG4gKiAgIGJlY29tZXMgLnN0eWxlLmZvbnQgPSAnYmF6J1xuICogUmVtb3ZpbmcgYSBzaG9ydGhhbmQgcHJvcGVydHkgKGxvbmdoYW5kIGdldHMgbG9zdCB0b28pOlxuICogICB7Zm9udDogJ2ZvbycsIGZvbnRWYXJpYW50OiAnYmFyJ30gLT4ge2ZvbnRWYXJpYW50OiAnYmFyJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udCA9ICcnXG4gKiBSZW1vdmluZyBhIGxvbmdoYW5kIHByb3BlcnR5IChzaG91bGQgcmV2ZXJ0IHRvIHNob3J0aGFuZDsgZG9lc24ndCk6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udDogJ2Zvbyd9XG4gKiAgIGJlY29tZXMgLnN0eWxlLmZvbnRWYXJpYW50ID0gJydcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlU2hvcnRoYW5kUHJvcGVydHlDb2xsaXNpb25JbkRldihzdHlsZVVwZGF0ZXMsIG5leHRTdHlsZXMpIHtcbiAge1xuICAgIGlmICghbmV4dFN0eWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBleHBhbmRlZFVwZGF0ZXMgPSBleHBhbmRTaG9ydGhhbmRNYXAoc3R5bGVVcGRhdGVzKTtcbiAgICB2YXIgZXhwYW5kZWRTdHlsZXMgPSBleHBhbmRTaG9ydGhhbmRNYXAobmV4dFN0eWxlcyk7XG4gICAgdmFyIHdhcm5lZEFib3V0ID0ge307XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gZXhwYW5kZWRVcGRhdGVzKSB7XG4gICAgICB2YXIgb3JpZ2luYWxLZXkgPSBleHBhbmRlZFVwZGF0ZXNba2V5XTtcbiAgICAgIHZhciBjb3JyZWN0T3JpZ2luYWxLZXkgPSBleHBhbmRlZFN0eWxlc1trZXldO1xuXG4gICAgICBpZiAoY29ycmVjdE9yaWdpbmFsS2V5ICYmIG9yaWdpbmFsS2V5ICE9PSBjb3JyZWN0T3JpZ2luYWxLZXkpIHtcbiAgICAgICAgdmFyIHdhcm5pbmdLZXkgPSBvcmlnaW5hbEtleSArICcsJyArIGNvcnJlY3RPcmlnaW5hbEtleTtcblxuICAgICAgICBpZiAod2FybmVkQWJvdXRbd2FybmluZ0tleV0pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdhcm5lZEFib3V0W3dhcm5pbmdLZXldID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXMgYSBzdHlsZSBwcm9wZXJ0eSBkdXJpbmcgcmVyZW5kZXIgKCVzKSB3aGVuIGEgJyArICdjb25mbGljdGluZyBwcm9wZXJ0eSBpcyBzZXQgKCVzKSBjYW4gbGVhZCB0byBzdHlsaW5nIGJ1Z3MuIFRvICcgKyBcImF2b2lkIHRoaXMsIGRvbid0IG1peCBzaG9ydGhhbmQgYW5kIG5vbi1zaG9ydGhhbmQgcHJvcGVydGllcyBcIiArICdmb3IgdGhlIHNhbWUgdmFsdWU7IGluc3RlYWQsIHJlcGxhY2UgdGhlIHNob3J0aGFuZCB3aXRoICcgKyAnc2VwYXJhdGUgdmFsdWVzLicsIGlzVmFsdWVFbXB0eShzdHlsZVVwZGF0ZXNbb3JpZ2luYWxLZXldKSA/ICdSZW1vdmluZycgOiAnVXBkYXRpbmcnLCBvcmlnaW5hbEtleSwgY29ycmVjdE9yaWdpbmFsS2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gRm9yIEhUTUwsIGNlcnRhaW4gdGFncyBzaG91bGQgb21pdCB0aGVpciBjbG9zZSB0YWcuIFdlIGtlZXAgYSBsaXN0IGZvclxuLy8gdGhvc2Ugc3BlY2lhbC1jYXNlIHRhZ3MuXG52YXIgb21pdHRlZENsb3NlVGFncyA9IHtcbiAgYXJlYTogdHJ1ZSxcbiAgYmFzZTogdHJ1ZSxcbiAgYnI6IHRydWUsXG4gIGNvbDogdHJ1ZSxcbiAgZW1iZWQ6IHRydWUsXG4gIGhyOiB0cnVlLFxuICBpbWc6IHRydWUsXG4gIGlucHV0OiB0cnVlLFxuICBrZXlnZW46IHRydWUsXG4gIGxpbms6IHRydWUsXG4gIG1ldGE6IHRydWUsXG4gIHBhcmFtOiB0cnVlLFxuICBzb3VyY2U6IHRydWUsXG4gIHRyYWNrOiB0cnVlLFxuICB3YnI6IHRydWUgLy8gTk9URTogbWVudWl0ZW0ncyBjbG9zZSB0YWcgc2hvdWxkIGJlIG9taXR0ZWQsIGJ1dCB0aGF0IGNhdXNlcyBwcm9ibGVtcy5cblxufTtcblxuLy8gYG9taXR0ZWRDbG9zZVRhZ3NgIGV4Y2VwdCB0aGF0IGBtZW51aXRlbWAgc2hvdWxkIHN0aWxsIGhhdmUgaXRzIGNsb3NpbmcgdGFnLlxuXG52YXIgdm9pZEVsZW1lbnRUYWdzID0gYXNzaWduKHtcbiAgbWVudWl0ZW06IHRydWVcbn0sIG9taXR0ZWRDbG9zZVRhZ3MpO1xuXG52YXIgSFRNTCA9ICdfX2h0bWwnO1xuXG5mdW5jdGlvbiBhc3NlcnRWYWxpZFByb3BzKHRhZywgcHJvcHMpIHtcbiAgaWYgKCFwcm9wcykge1xuICAgIHJldHVybjtcbiAgfSAvLyBOb3RlIHRoZSB1c2Ugb2YgYD09YCB3aGljaCBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkLlxuXG5cbiAgaWYgKHZvaWRFbGVtZW50VGFnc1t0YWddKSB7XG4gICAgaWYgKHByb3BzLmNoaWxkcmVuICE9IG51bGwgfHwgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHRhZyArIFwiIGlzIGEgdm9pZCBlbGVtZW50IHRhZyBhbmQgbXVzdCBuZWl0aGVyIGhhdmUgYGNoaWxkcmVuYCBub3IgXCIgKyAndXNlIGBkYW5nZXJvdXNseVNldElubmVySFRNTGAuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICBpZiAocHJvcHMuY2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSBzZXQgb25lIG9mIGBjaGlsZHJlbmAgb3IgYHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9PSAnb2JqZWN0JyB8fCAhKEhUTUwgaW4gcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Bwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAgbXVzdCBiZSBpbiB0aGUgZm9ybSBge19faHRtbDogLi4ufWAuICcgKyAnUGxlYXNlIHZpc2l0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9kYW5nZXJvdXNseS1zZXQtaW5uZXItaHRtbCAnICsgJ2ZvciBtb3JlIGluZm9ybWF0aW9uLicpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoIXByb3BzLnN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyAmJiBwcm9wcy5jb250ZW50RWRpdGFibGUgJiYgcHJvcHMuY2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0EgY29tcG9uZW50IGlzIGBjb250ZW50RWRpdGFibGVgIGFuZCBjb250YWlucyBgY2hpbGRyZW5gIG1hbmFnZWQgYnkgJyArICdSZWFjdC4gSXQgaXMgbm93IHlvdXIgcmVzcG9uc2liaWxpdHkgdG8gZ3VhcmFudGVlIHRoYXQgbm9uZSBvZiAnICsgJ3Rob3NlIG5vZGVzIGFyZSB1bmV4cGVjdGVkbHkgbW9kaWZpZWQgb3IgZHVwbGljYXRlZC4gVGhpcyBpcyAnICsgJ3Byb2JhYmx5IG5vdCBpbnRlbnRpb25hbC4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJvcHMuc3R5bGUgIT0gbnVsbCAmJiB0eXBlb2YgcHJvcHMuc3R5bGUgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYHN0eWxlYCBwcm9wIGV4cGVjdHMgYSBtYXBwaW5nIGZyb20gc3R5bGUgcHJvcGVydGllcyB0byB2YWx1ZXMsICcgKyBcIm5vdCBhIHN0cmluZy4gRm9yIGV4YW1wbGUsIHN0eWxlPXt7bWFyZ2luUmlnaHQ6IHNwYWNpbmcgKyAnZW0nfX0gd2hlbiBcIiArICd1c2luZyBKU1guJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDdXN0b21Db21wb25lbnQodGFnTmFtZSwgcHJvcHMpIHtcbiAgaWYgKHRhZ05hbWUuaW5kZXhPZignLScpID09PSAtMSkge1xuICAgIHJldHVybiB0eXBlb2YgcHJvcHMuaXMgPT09ICdzdHJpbmcnO1xuICB9XG5cbiAgc3dpdGNoICh0YWdOYW1lKSB7XG4gICAgLy8gVGhlc2UgYXJlIHJlc2VydmVkIFNWRyBhbmQgTWF0aE1MIGVsZW1lbnRzLlxuICAgIC8vIFdlIGRvbid0IG1pbmQgdGhpcyBsaXN0IHRvbyBtdWNoIGJlY2F1c2Ugd2UgZXhwZWN0IGl0IHRvIG5ldmVyIGdyb3cuXG4gICAgLy8gVGhlIGFsdGVybmF0aXZlIGlzIHRvIHRyYWNrIHRoZSBuYW1lc3BhY2UgaW4gYSBmZXcgcGxhY2VzIHdoaWNoIGlzIGNvbnZvbHV0ZWQuXG4gICAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmNvbXBvbmVudHMvc3BlYy9jdXN0b20vI2N1c3RvbS1lbGVtZW50cy1jb3JlLWNvbmNlcHRzXG4gICAgY2FzZSAnYW5ub3RhdGlvbi14bWwnOlxuICAgIGNhc2UgJ2NvbG9yLXByb2ZpbGUnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZSc6XG4gICAgY2FzZSAnZm9udC1mYWNlLXNyYyc6XG4gICAgY2FzZSAnZm9udC1mYWNlLXVyaSc6XG4gICAgY2FzZSAnZm9udC1mYWNlLWZvcm1hdCc6XG4gICAgY2FzZSAnZm9udC1mYWNlLW5hbWUnOlxuICAgIGNhc2UgJ21pc3NpbmctZ2x5cGgnOlxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8vIFdoZW4gYWRkaW5nIGF0dHJpYnV0ZXMgdG8gdGhlIEhUTUwgb3IgU1ZHIGFsbG93ZWQgYXR0cmlidXRlIGxpc3QsIGJlIHN1cmUgdG9cbi8vIGFsc28gYWRkIHRoZW0gdG8gdGhpcyBtb2R1bGUgdG8gZW5zdXJlIGNhc2luZyBhbmQgaW5jb3JyZWN0IG5hbWVcbi8vIHdhcm5pbmdzLlxudmFyIHBvc3NpYmxlU3RhbmRhcmROYW1lcyA9IHtcbiAgLy8gSFRNTFxuICBhY2NlcHQ6ICdhY2NlcHQnLFxuICBhY2NlcHRjaGFyc2V0OiAnYWNjZXB0Q2hhcnNldCcsXG4gICdhY2NlcHQtY2hhcnNldCc6ICdhY2NlcHRDaGFyc2V0JyxcbiAgYWNjZXNza2V5OiAnYWNjZXNzS2V5JyxcbiAgYWN0aW9uOiAnYWN0aW9uJyxcbiAgYWxsb3dmdWxsc2NyZWVuOiAnYWxsb3dGdWxsU2NyZWVuJyxcbiAgYWx0OiAnYWx0JyxcbiAgYXM6ICdhcycsXG4gIGFzeW5jOiAnYXN5bmMnLFxuICBhdXRvY2FwaXRhbGl6ZTogJ2F1dG9DYXBpdGFsaXplJyxcbiAgYXV0b2NvbXBsZXRlOiAnYXV0b0NvbXBsZXRlJyxcbiAgYXV0b2NvcnJlY3Q6ICdhdXRvQ29ycmVjdCcsXG4gIGF1dG9mb2N1czogJ2F1dG9Gb2N1cycsXG4gIGF1dG9wbGF5OiAnYXV0b1BsYXknLFxuICBhdXRvc2F2ZTogJ2F1dG9TYXZlJyxcbiAgY2FwdHVyZTogJ2NhcHR1cmUnLFxuICBjZWxscGFkZGluZzogJ2NlbGxQYWRkaW5nJyxcbiAgY2VsbHNwYWNpbmc6ICdjZWxsU3BhY2luZycsXG4gIGNoYWxsZW5nZTogJ2NoYWxsZW5nZScsXG4gIGNoYXJzZXQ6ICdjaGFyU2V0JyxcbiAgY2hlY2tlZDogJ2NoZWNrZWQnLFxuICBjaGlsZHJlbjogJ2NoaWxkcmVuJyxcbiAgY2l0ZTogJ2NpdGUnLFxuICBjbGFzczogJ2NsYXNzTmFtZScsXG4gIGNsYXNzaWQ6ICdjbGFzc0lEJyxcbiAgY2xhc3NuYW1lOiAnY2xhc3NOYW1lJyxcbiAgY29sczogJ2NvbHMnLFxuICBjb2xzcGFuOiAnY29sU3BhbicsXG4gIGNvbnRlbnQ6ICdjb250ZW50JyxcbiAgY29udGVudGVkaXRhYmxlOiAnY29udGVudEVkaXRhYmxlJyxcbiAgY29udGV4dG1lbnU6ICdjb250ZXh0TWVudScsXG4gIGNvbnRyb2xzOiAnY29udHJvbHMnLFxuICBjb250cm9sc2xpc3Q6ICdjb250cm9sc0xpc3QnLFxuICBjb29yZHM6ICdjb29yZHMnLFxuICBjcm9zc29yaWdpbjogJ2Nyb3NzT3JpZ2luJyxcbiAgZGFuZ2Vyb3VzbHlzZXRpbm5lcmh0bWw6ICdkYW5nZXJvdXNseVNldElubmVySFRNTCcsXG4gIGRhdGE6ICdkYXRhJyxcbiAgZGF0ZXRpbWU6ICdkYXRlVGltZScsXG4gIGRlZmF1bHQ6ICdkZWZhdWx0JyxcbiAgZGVmYXVsdGNoZWNrZWQ6ICdkZWZhdWx0Q2hlY2tlZCcsXG4gIGRlZmF1bHR2YWx1ZTogJ2RlZmF1bHRWYWx1ZScsXG4gIGRlZmVyOiAnZGVmZXInLFxuICBkaXI6ICdkaXInLFxuICBkaXNhYmxlZDogJ2Rpc2FibGVkJyxcbiAgZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmU6ICdkaXNhYmxlUGljdHVyZUluUGljdHVyZScsXG4gIGRpc2FibGVyZW1vdGVwbGF5YmFjazogJ2Rpc2FibGVSZW1vdGVQbGF5YmFjaycsXG4gIGRvd25sb2FkOiAnZG93bmxvYWQnLFxuICBkcmFnZ2FibGU6ICdkcmFnZ2FibGUnLFxuICBlbmN0eXBlOiAnZW5jVHlwZScsXG4gIGVudGVya2V5aGludDogJ2VudGVyS2V5SGludCcsXG4gIGZvcjogJ2h0bWxGb3InLFxuICBmb3JtOiAnZm9ybScsXG4gIGZvcm1tZXRob2Q6ICdmb3JtTWV0aG9kJyxcbiAgZm9ybWFjdGlvbjogJ2Zvcm1BY3Rpb24nLFxuICBmb3JtZW5jdHlwZTogJ2Zvcm1FbmNUeXBlJyxcbiAgZm9ybW5vdmFsaWRhdGU6ICdmb3JtTm9WYWxpZGF0ZScsXG4gIGZvcm10YXJnZXQ6ICdmb3JtVGFyZ2V0JyxcbiAgZnJhbWVib3JkZXI6ICdmcmFtZUJvcmRlcicsXG4gIGhlYWRlcnM6ICdoZWFkZXJzJyxcbiAgaGVpZ2h0OiAnaGVpZ2h0JyxcbiAgaGlkZGVuOiAnaGlkZGVuJyxcbiAgaGlnaDogJ2hpZ2gnLFxuICBocmVmOiAnaHJlZicsXG4gIGhyZWZsYW5nOiAnaHJlZkxhbmcnLFxuICBodG1sZm9yOiAnaHRtbEZvcicsXG4gIGh0dHBlcXVpdjogJ2h0dHBFcXVpdicsXG4gICdodHRwLWVxdWl2JzogJ2h0dHBFcXVpdicsXG4gIGljb246ICdpY29uJyxcbiAgaWQ6ICdpZCcsXG4gIGltYWdlc2l6ZXM6ICdpbWFnZVNpemVzJyxcbiAgaW1hZ2VzcmNzZXQ6ICdpbWFnZVNyY1NldCcsXG4gIGlubmVyaHRtbDogJ2lubmVySFRNTCcsXG4gIGlucHV0bW9kZTogJ2lucHV0TW9kZScsXG4gIGludGVncml0eTogJ2ludGVncml0eScsXG4gIGlzOiAnaXMnLFxuICBpdGVtaWQ6ICdpdGVtSUQnLFxuICBpdGVtcHJvcDogJ2l0ZW1Qcm9wJyxcbiAgaXRlbXJlZjogJ2l0ZW1SZWYnLFxuICBpdGVtc2NvcGU6ICdpdGVtU2NvcGUnLFxuICBpdGVtdHlwZTogJ2l0ZW1UeXBlJyxcbiAga2V5cGFyYW1zOiAna2V5UGFyYW1zJyxcbiAga2V5dHlwZTogJ2tleVR5cGUnLFxuICBraW5kOiAna2luZCcsXG4gIGxhYmVsOiAnbGFiZWwnLFxuICBsYW5nOiAnbGFuZycsXG4gIGxpc3Q6ICdsaXN0JyxcbiAgbG9vcDogJ2xvb3AnLFxuICBsb3c6ICdsb3cnLFxuICBtYW5pZmVzdDogJ21hbmlmZXN0JyxcbiAgbWFyZ2lud2lkdGg6ICdtYXJnaW5XaWR0aCcsXG4gIG1hcmdpbmhlaWdodDogJ21hcmdpbkhlaWdodCcsXG4gIG1heDogJ21heCcsXG4gIG1heGxlbmd0aDogJ21heExlbmd0aCcsXG4gIG1lZGlhOiAnbWVkaWEnLFxuICBtZWRpYWdyb3VwOiAnbWVkaWFHcm91cCcsXG4gIG1ldGhvZDogJ21ldGhvZCcsXG4gIG1pbjogJ21pbicsXG4gIG1pbmxlbmd0aDogJ21pbkxlbmd0aCcsXG4gIG11bHRpcGxlOiAnbXVsdGlwbGUnLFxuICBtdXRlZDogJ211dGVkJyxcbiAgbmFtZTogJ25hbWUnLFxuICBub21vZHVsZTogJ25vTW9kdWxlJyxcbiAgbm9uY2U6ICdub25jZScsXG4gIG5vdmFsaWRhdGU6ICdub1ZhbGlkYXRlJyxcbiAgb3BlbjogJ29wZW4nLFxuICBvcHRpbXVtOiAnb3B0aW11bScsXG4gIHBhdHRlcm46ICdwYXR0ZXJuJyxcbiAgcGxhY2Vob2xkZXI6ICdwbGFjZWhvbGRlcicsXG4gIHBsYXlzaW5saW5lOiAncGxheXNJbmxpbmUnLFxuICBwb3N0ZXI6ICdwb3N0ZXInLFxuICBwcmVsb2FkOiAncHJlbG9hZCcsXG4gIHByb2ZpbGU6ICdwcm9maWxlJyxcbiAgcmFkaW9ncm91cDogJ3JhZGlvR3JvdXAnLFxuICByZWFkb25seTogJ3JlYWRPbmx5JyxcbiAgcmVmZXJyZXJwb2xpY3k6ICdyZWZlcnJlclBvbGljeScsXG4gIHJlbDogJ3JlbCcsXG4gIHJlcXVpcmVkOiAncmVxdWlyZWQnLFxuICByZXZlcnNlZDogJ3JldmVyc2VkJyxcbiAgcm9sZTogJ3JvbGUnLFxuICByb3dzOiAncm93cycsXG4gIHJvd3NwYW46ICdyb3dTcGFuJyxcbiAgc2FuZGJveDogJ3NhbmRib3gnLFxuICBzY29wZTogJ3Njb3BlJyxcbiAgc2NvcGVkOiAnc2NvcGVkJyxcbiAgc2Nyb2xsaW5nOiAnc2Nyb2xsaW5nJyxcbiAgc2VhbWxlc3M6ICdzZWFtbGVzcycsXG4gIHNlbGVjdGVkOiAnc2VsZWN0ZWQnLFxuICBzaGFwZTogJ3NoYXBlJyxcbiAgc2l6ZTogJ3NpemUnLFxuICBzaXplczogJ3NpemVzJyxcbiAgc3BhbjogJ3NwYW4nLFxuICBzcGVsbGNoZWNrOiAnc3BlbGxDaGVjaycsXG4gIHNyYzogJ3NyYycsXG4gIHNyY2RvYzogJ3NyY0RvYycsXG4gIHNyY2xhbmc6ICdzcmNMYW5nJyxcbiAgc3Jjc2V0OiAnc3JjU2V0JyxcbiAgc3RhcnQ6ICdzdGFydCcsXG4gIHN0ZXA6ICdzdGVwJyxcbiAgc3R5bGU6ICdzdHlsZScsXG4gIHN1bW1hcnk6ICdzdW1tYXJ5JyxcbiAgdGFiaW5kZXg6ICd0YWJJbmRleCcsXG4gIHRhcmdldDogJ3RhcmdldCcsXG4gIHRpdGxlOiAndGl0bGUnLFxuICB0eXBlOiAndHlwZScsXG4gIHVzZW1hcDogJ3VzZU1hcCcsXG4gIHZhbHVlOiAndmFsdWUnLFxuICB3aWR0aDogJ3dpZHRoJyxcbiAgd21vZGU6ICd3bW9kZScsXG4gIHdyYXA6ICd3cmFwJyxcbiAgLy8gU1ZHXG4gIGFib3V0OiAnYWJvdXQnLFxuICBhY2NlbnRoZWlnaHQ6ICdhY2NlbnRIZWlnaHQnLFxuICAnYWNjZW50LWhlaWdodCc6ICdhY2NlbnRIZWlnaHQnLFxuICBhY2N1bXVsYXRlOiAnYWNjdW11bGF0ZScsXG4gIGFkZGl0aXZlOiAnYWRkaXRpdmUnLFxuICBhbGlnbm1lbnRiYXNlbGluZTogJ2FsaWdubWVudEJhc2VsaW5lJyxcbiAgJ2FsaWdubWVudC1iYXNlbGluZSc6ICdhbGlnbm1lbnRCYXNlbGluZScsXG4gIGFsbG93cmVvcmRlcjogJ2FsbG93UmVvcmRlcicsXG4gIGFscGhhYmV0aWM6ICdhbHBoYWJldGljJyxcbiAgYW1wbGl0dWRlOiAnYW1wbGl0dWRlJyxcbiAgYXJhYmljZm9ybTogJ2FyYWJpY0Zvcm0nLFxuICAnYXJhYmljLWZvcm0nOiAnYXJhYmljRm9ybScsXG4gIGFzY2VudDogJ2FzY2VudCcsXG4gIGF0dHJpYnV0ZW5hbWU6ICdhdHRyaWJ1dGVOYW1lJyxcbiAgYXR0cmlidXRldHlwZTogJ2F0dHJpYnV0ZVR5cGUnLFxuICBhdXRvcmV2ZXJzZTogJ2F1dG9SZXZlcnNlJyxcbiAgYXppbXV0aDogJ2F6aW11dGgnLFxuICBiYXNlZnJlcXVlbmN5OiAnYmFzZUZyZXF1ZW5jeScsXG4gIGJhc2VsaW5lc2hpZnQ6ICdiYXNlbGluZVNoaWZ0JyxcbiAgJ2Jhc2VsaW5lLXNoaWZ0JzogJ2Jhc2VsaW5lU2hpZnQnLFxuICBiYXNlcHJvZmlsZTogJ2Jhc2VQcm9maWxlJyxcbiAgYmJveDogJ2Jib3gnLFxuICBiZWdpbjogJ2JlZ2luJyxcbiAgYmlhczogJ2JpYXMnLFxuICBieTogJ2J5JyxcbiAgY2FsY21vZGU6ICdjYWxjTW9kZScsXG4gIGNhcGhlaWdodDogJ2NhcEhlaWdodCcsXG4gICdjYXAtaGVpZ2h0JzogJ2NhcEhlaWdodCcsXG4gIGNsaXA6ICdjbGlwJyxcbiAgY2xpcHBhdGg6ICdjbGlwUGF0aCcsXG4gICdjbGlwLXBhdGgnOiAnY2xpcFBhdGgnLFxuICBjbGlwcGF0aHVuaXRzOiAnY2xpcFBhdGhVbml0cycsXG4gIGNsaXBydWxlOiAnY2xpcFJ1bGUnLFxuICAnY2xpcC1ydWxlJzogJ2NsaXBSdWxlJyxcbiAgY29sb3I6ICdjb2xvcicsXG4gIGNvbG9yaW50ZXJwb2xhdGlvbjogJ2NvbG9ySW50ZXJwb2xhdGlvbicsXG4gICdjb2xvci1pbnRlcnBvbGF0aW9uJzogJ2NvbG9ySW50ZXJwb2xhdGlvbicsXG4gIGNvbG9yaW50ZXJwb2xhdGlvbmZpbHRlcnM6ICdjb2xvckludGVycG9sYXRpb25GaWx0ZXJzJyxcbiAgJ2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyc6ICdjb2xvckludGVycG9sYXRpb25GaWx0ZXJzJyxcbiAgY29sb3Jwcm9maWxlOiAnY29sb3JQcm9maWxlJyxcbiAgJ2NvbG9yLXByb2ZpbGUnOiAnY29sb3JQcm9maWxlJyxcbiAgY29sb3JyZW5kZXJpbmc6ICdjb2xvclJlbmRlcmluZycsXG4gICdjb2xvci1yZW5kZXJpbmcnOiAnY29sb3JSZW5kZXJpbmcnLFxuICBjb250ZW50c2NyaXB0dHlwZTogJ2NvbnRlbnRTY3JpcHRUeXBlJyxcbiAgY29udGVudHN0eWxldHlwZTogJ2NvbnRlbnRTdHlsZVR5cGUnLFxuICBjdXJzb3I6ICdjdXJzb3InLFxuICBjeDogJ2N4JyxcbiAgY3k6ICdjeScsXG4gIGQ6ICdkJyxcbiAgZGF0YXR5cGU6ICdkYXRhdHlwZScsXG4gIGRlY2VsZXJhdGU6ICdkZWNlbGVyYXRlJyxcbiAgZGVzY2VudDogJ2Rlc2NlbnQnLFxuICBkaWZmdXNlY29uc3RhbnQ6ICdkaWZmdXNlQ29uc3RhbnQnLFxuICBkaXJlY3Rpb246ICdkaXJlY3Rpb24nLFxuICBkaXNwbGF5OiAnZGlzcGxheScsXG4gIGRpdmlzb3I6ICdkaXZpc29yJyxcbiAgZG9taW5hbnRiYXNlbGluZTogJ2RvbWluYW50QmFzZWxpbmUnLFxuICAnZG9taW5hbnQtYmFzZWxpbmUnOiAnZG9taW5hbnRCYXNlbGluZScsXG4gIGR1cjogJ2R1cicsXG4gIGR4OiAnZHgnLFxuICBkeTogJ2R5JyxcbiAgZWRnZW1vZGU6ICdlZGdlTW9kZScsXG4gIGVsZXZhdGlvbjogJ2VsZXZhdGlvbicsXG4gIGVuYWJsZWJhY2tncm91bmQ6ICdlbmFibGVCYWNrZ3JvdW5kJyxcbiAgJ2VuYWJsZS1iYWNrZ3JvdW5kJzogJ2VuYWJsZUJhY2tncm91bmQnLFxuICBlbmQ6ICdlbmQnLFxuICBleHBvbmVudDogJ2V4cG9uZW50JyxcbiAgZXh0ZXJuYWxyZXNvdXJjZXNyZXF1aXJlZDogJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLFxuICBmaWxsOiAnZmlsbCcsXG4gIGZpbGxvcGFjaXR5OiAnZmlsbE9wYWNpdHknLFxuICAnZmlsbC1vcGFjaXR5JzogJ2ZpbGxPcGFjaXR5JyxcbiAgZmlsbHJ1bGU6ICdmaWxsUnVsZScsXG4gICdmaWxsLXJ1bGUnOiAnZmlsbFJ1bGUnLFxuICBmaWx0ZXI6ICdmaWx0ZXInLFxuICBmaWx0ZXJyZXM6ICdmaWx0ZXJSZXMnLFxuICBmaWx0ZXJ1bml0czogJ2ZpbHRlclVuaXRzJyxcbiAgZmxvb2RvcGFjaXR5OiAnZmxvb2RPcGFjaXR5JyxcbiAgJ2Zsb29kLW9wYWNpdHknOiAnZmxvb2RPcGFjaXR5JyxcbiAgZmxvb2Rjb2xvcjogJ2Zsb29kQ29sb3InLFxuICAnZmxvb2QtY29sb3InOiAnZmxvb2RDb2xvcicsXG4gIGZvY3VzYWJsZTogJ2ZvY3VzYWJsZScsXG4gIGZvbnRmYW1pbHk6ICdmb250RmFtaWx5JyxcbiAgJ2ZvbnQtZmFtaWx5JzogJ2ZvbnRGYW1pbHknLFxuICBmb250c2l6ZTogJ2ZvbnRTaXplJyxcbiAgJ2ZvbnQtc2l6ZSc6ICdmb250U2l6ZScsXG4gIGZvbnRzaXplYWRqdXN0OiAnZm9udFNpemVBZGp1c3QnLFxuICAnZm9udC1zaXplLWFkanVzdCc6ICdmb250U2l6ZUFkanVzdCcsXG4gIGZvbnRzdHJldGNoOiAnZm9udFN0cmV0Y2gnLFxuICAnZm9udC1zdHJldGNoJzogJ2ZvbnRTdHJldGNoJyxcbiAgZm9udHN0eWxlOiAnZm9udFN0eWxlJyxcbiAgJ2ZvbnQtc3R5bGUnOiAnZm9udFN0eWxlJyxcbiAgZm9udHZhcmlhbnQ6ICdmb250VmFyaWFudCcsXG4gICdmb250LXZhcmlhbnQnOiAnZm9udFZhcmlhbnQnLFxuICBmb250d2VpZ2h0OiAnZm9udFdlaWdodCcsXG4gICdmb250LXdlaWdodCc6ICdmb250V2VpZ2h0JyxcbiAgZm9ybWF0OiAnZm9ybWF0JyxcbiAgZnJvbTogJ2Zyb20nLFxuICBmeDogJ2Z4JyxcbiAgZnk6ICdmeScsXG4gIGcxOiAnZzEnLFxuICBnMjogJ2cyJyxcbiAgZ2x5cGhuYW1lOiAnZ2x5cGhOYW1lJyxcbiAgJ2dseXBoLW5hbWUnOiAnZ2x5cGhOYW1lJyxcbiAgZ2x5cGhvcmllbnRhdGlvbmhvcml6b250YWw6ICdnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbCcsXG4gICdnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsJzogJ2dseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsJyxcbiAgZ2x5cGhvcmllbnRhdGlvbnZlcnRpY2FsOiAnZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsJyxcbiAgJ2dseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsJzogJ2dseXBoT3JpZW50YXRpb25WZXJ0aWNhbCcsXG4gIGdseXBocmVmOiAnZ2x5cGhSZWYnLFxuICBncmFkaWVudHRyYW5zZm9ybTogJ2dyYWRpZW50VHJhbnNmb3JtJyxcbiAgZ3JhZGllbnR1bml0czogJ2dyYWRpZW50VW5pdHMnLFxuICBoYW5naW5nOiAnaGFuZ2luZycsXG4gIGhvcml6YWR2eDogJ2hvcml6QWR2WCcsXG4gICdob3Jpei1hZHYteCc6ICdob3JpekFkdlgnLFxuICBob3Jpem9yaWdpbng6ICdob3Jpek9yaWdpblgnLFxuICAnaG9yaXotb3JpZ2luLXgnOiAnaG9yaXpPcmlnaW5YJyxcbiAgaWRlb2dyYXBoaWM6ICdpZGVvZ3JhcGhpYycsXG4gIGltYWdlcmVuZGVyaW5nOiAnaW1hZ2VSZW5kZXJpbmcnLFxuICAnaW1hZ2UtcmVuZGVyaW5nJzogJ2ltYWdlUmVuZGVyaW5nJyxcbiAgaW4yOiAnaW4yJyxcbiAgaW46ICdpbicsXG4gIGlubGlzdDogJ2lubGlzdCcsXG4gIGludGVyY2VwdDogJ2ludGVyY2VwdCcsXG4gIGsxOiAnazEnLFxuICBrMjogJ2syJyxcbiAgazM6ICdrMycsXG4gIGs0OiAnazQnLFxuICBrOiAnaycsXG4gIGtlcm5lbG1hdHJpeDogJ2tlcm5lbE1hdHJpeCcsXG4gIGtlcm5lbHVuaXRsZW5ndGg6ICdrZXJuZWxVbml0TGVuZ3RoJyxcbiAga2VybmluZzogJ2tlcm5pbmcnLFxuICBrZXlwb2ludHM6ICdrZXlQb2ludHMnLFxuICBrZXlzcGxpbmVzOiAna2V5U3BsaW5lcycsXG4gIGtleXRpbWVzOiAna2V5VGltZXMnLFxuICBsZW5ndGhhZGp1c3Q6ICdsZW5ndGhBZGp1c3QnLFxuICBsZXR0ZXJzcGFjaW5nOiAnbGV0dGVyU3BhY2luZycsXG4gICdsZXR0ZXItc3BhY2luZyc6ICdsZXR0ZXJTcGFjaW5nJyxcbiAgbGlnaHRpbmdjb2xvcjogJ2xpZ2h0aW5nQ29sb3InLFxuICAnbGlnaHRpbmctY29sb3InOiAnbGlnaHRpbmdDb2xvcicsXG4gIGxpbWl0aW5nY29uZWFuZ2xlOiAnbGltaXRpbmdDb25lQW5nbGUnLFxuICBsb2NhbDogJ2xvY2FsJyxcbiAgbWFya2VyZW5kOiAnbWFya2VyRW5kJyxcbiAgJ21hcmtlci1lbmQnOiAnbWFya2VyRW5kJyxcbiAgbWFya2VyaGVpZ2h0OiAnbWFya2VySGVpZ2h0JyxcbiAgbWFya2VybWlkOiAnbWFya2VyTWlkJyxcbiAgJ21hcmtlci1taWQnOiAnbWFya2VyTWlkJyxcbiAgbWFya2Vyc3RhcnQ6ICdtYXJrZXJTdGFydCcsXG4gICdtYXJrZXItc3RhcnQnOiAnbWFya2VyU3RhcnQnLFxuICBtYXJrZXJ1bml0czogJ21hcmtlclVuaXRzJyxcbiAgbWFya2Vyd2lkdGg6ICdtYXJrZXJXaWR0aCcsXG4gIG1hc2s6ICdtYXNrJyxcbiAgbWFza2NvbnRlbnR1bml0czogJ21hc2tDb250ZW50VW5pdHMnLFxuICBtYXNrdW5pdHM6ICdtYXNrVW5pdHMnLFxuICBtYXRoZW1hdGljYWw6ICdtYXRoZW1hdGljYWwnLFxuICBtb2RlOiAnbW9kZScsXG4gIG51bW9jdGF2ZXM6ICdudW1PY3RhdmVzJyxcbiAgb2Zmc2V0OiAnb2Zmc2V0JyxcbiAgb3BhY2l0eTogJ29wYWNpdHknLFxuICBvcGVyYXRvcjogJ29wZXJhdG9yJyxcbiAgb3JkZXI6ICdvcmRlcicsXG4gIG9yaWVudDogJ29yaWVudCcsXG4gIG9yaWVudGF0aW9uOiAnb3JpZW50YXRpb24nLFxuICBvcmlnaW46ICdvcmlnaW4nLFxuICBvdmVyZmxvdzogJ292ZXJmbG93JyxcbiAgb3ZlcmxpbmVwb3NpdGlvbjogJ292ZXJsaW5lUG9zaXRpb24nLFxuICAnb3ZlcmxpbmUtcG9zaXRpb24nOiAnb3ZlcmxpbmVQb3NpdGlvbicsXG4gIG92ZXJsaW5ldGhpY2tuZXNzOiAnb3ZlcmxpbmVUaGlja25lc3MnLFxuICAnb3ZlcmxpbmUtdGhpY2tuZXNzJzogJ292ZXJsaW5lVGhpY2tuZXNzJyxcbiAgcGFpbnRvcmRlcjogJ3BhaW50T3JkZXInLFxuICAncGFpbnQtb3JkZXInOiAncGFpbnRPcmRlcicsXG4gIHBhbm9zZTE6ICdwYW5vc2UxJyxcbiAgJ3Bhbm9zZS0xJzogJ3Bhbm9zZTEnLFxuICBwYXRobGVuZ3RoOiAncGF0aExlbmd0aCcsXG4gIHBhdHRlcm5jb250ZW50dW5pdHM6ICdwYXR0ZXJuQ29udGVudFVuaXRzJyxcbiAgcGF0dGVybnRyYW5zZm9ybTogJ3BhdHRlcm5UcmFuc2Zvcm0nLFxuICBwYXR0ZXJudW5pdHM6ICdwYXR0ZXJuVW5pdHMnLFxuICBwb2ludGVyZXZlbnRzOiAncG9pbnRlckV2ZW50cycsXG4gICdwb2ludGVyLWV2ZW50cyc6ICdwb2ludGVyRXZlbnRzJyxcbiAgcG9pbnRzOiAncG9pbnRzJyxcbiAgcG9pbnRzYXR4OiAncG9pbnRzQXRYJyxcbiAgcG9pbnRzYXR5OiAncG9pbnRzQXRZJyxcbiAgcG9pbnRzYXR6OiAncG9pbnRzQXRaJyxcbiAgcHJlZml4OiAncHJlZml4JyxcbiAgcHJlc2VydmVhbHBoYTogJ3ByZXNlcnZlQWxwaGEnLFxuICBwcmVzZXJ2ZWFzcGVjdHJhdGlvOiAncHJlc2VydmVBc3BlY3RSYXRpbycsXG4gIHByaW1pdGl2ZXVuaXRzOiAncHJpbWl0aXZlVW5pdHMnLFxuICBwcm9wZXJ0eTogJ3Byb3BlcnR5JyxcbiAgcjogJ3InLFxuICByYWRpdXM6ICdyYWRpdXMnLFxuICByZWZ4OiAncmVmWCcsXG4gIHJlZnk6ICdyZWZZJyxcbiAgcmVuZGVyaW5naW50ZW50OiAncmVuZGVyaW5nSW50ZW50JyxcbiAgJ3JlbmRlcmluZy1pbnRlbnQnOiAncmVuZGVyaW5nSW50ZW50JyxcbiAgcmVwZWF0Y291bnQ6ICdyZXBlYXRDb3VudCcsXG4gIHJlcGVhdGR1cjogJ3JlcGVhdER1cicsXG4gIHJlcXVpcmVkZXh0ZW5zaW9uczogJ3JlcXVpcmVkRXh0ZW5zaW9ucycsXG4gIHJlcXVpcmVkZmVhdHVyZXM6ICdyZXF1aXJlZEZlYXR1cmVzJyxcbiAgcmVzb3VyY2U6ICdyZXNvdXJjZScsXG4gIHJlc3RhcnQ6ICdyZXN0YXJ0JyxcbiAgcmVzdWx0OiAncmVzdWx0JyxcbiAgcmVzdWx0czogJ3Jlc3VsdHMnLFxuICByb3RhdGU6ICdyb3RhdGUnLFxuICByeDogJ3J4JyxcbiAgcnk6ICdyeScsXG4gIHNjYWxlOiAnc2NhbGUnLFxuICBzZWN1cml0eTogJ3NlY3VyaXR5JyxcbiAgc2VlZDogJ3NlZWQnLFxuICBzaGFwZXJlbmRlcmluZzogJ3NoYXBlUmVuZGVyaW5nJyxcbiAgJ3NoYXBlLXJlbmRlcmluZyc6ICdzaGFwZVJlbmRlcmluZycsXG4gIHNsb3BlOiAnc2xvcGUnLFxuICBzcGFjaW5nOiAnc3BhY2luZycsXG4gIHNwZWN1bGFyY29uc3RhbnQ6ICdzcGVjdWxhckNvbnN0YW50JyxcbiAgc3BlY3VsYXJleHBvbmVudDogJ3NwZWN1bGFyRXhwb25lbnQnLFxuICBzcGVlZDogJ3NwZWVkJyxcbiAgc3ByZWFkbWV0aG9kOiAnc3ByZWFkTWV0aG9kJyxcbiAgc3RhcnRvZmZzZXQ6ICdzdGFydE9mZnNldCcsXG4gIHN0ZGRldmlhdGlvbjogJ3N0ZERldmlhdGlvbicsXG4gIHN0ZW1oOiAnc3RlbWgnLFxuICBzdGVtdjogJ3N0ZW12JyxcbiAgc3RpdGNodGlsZXM6ICdzdGl0Y2hUaWxlcycsXG4gIHN0b3Bjb2xvcjogJ3N0b3BDb2xvcicsXG4gICdzdG9wLWNvbG9yJzogJ3N0b3BDb2xvcicsXG4gIHN0b3BvcGFjaXR5OiAnc3RvcE9wYWNpdHknLFxuICAnc3RvcC1vcGFjaXR5JzogJ3N0b3BPcGFjaXR5JyxcbiAgc3RyaWtldGhyb3VnaHBvc2l0aW9uOiAnc3RyaWtldGhyb3VnaFBvc2l0aW9uJyxcbiAgJ3N0cmlrZXRocm91Z2gtcG9zaXRpb24nOiAnc3RyaWtldGhyb3VnaFBvc2l0aW9uJyxcbiAgc3RyaWtldGhyb3VnaHRoaWNrbmVzczogJ3N0cmlrZXRocm91Z2hUaGlja25lc3MnLFxuICAnc3RyaWtldGhyb3VnaC10aGlja25lc3MnOiAnc3RyaWtldGhyb3VnaFRoaWNrbmVzcycsXG4gIHN0cmluZzogJ3N0cmluZycsXG4gIHN0cm9rZTogJ3N0cm9rZScsXG4gIHN0cm9rZWRhc2hhcnJheTogJ3N0cm9rZURhc2hhcnJheScsXG4gICdzdHJva2UtZGFzaGFycmF5JzogJ3N0cm9rZURhc2hhcnJheScsXG4gIHN0cm9rZWRhc2hvZmZzZXQ6ICdzdHJva2VEYXNob2Zmc2V0JyxcbiAgJ3N0cm9rZS1kYXNob2Zmc2V0JzogJ3N0cm9rZURhc2hvZmZzZXQnLFxuICBzdHJva2VsaW5lY2FwOiAnc3Ryb2tlTGluZWNhcCcsXG4gICdzdHJva2UtbGluZWNhcCc6ICdzdHJva2VMaW5lY2FwJyxcbiAgc3Ryb2tlbGluZWpvaW46ICdzdHJva2VMaW5lam9pbicsXG4gICdzdHJva2UtbGluZWpvaW4nOiAnc3Ryb2tlTGluZWpvaW4nLFxuICBzdHJva2VtaXRlcmxpbWl0OiAnc3Ryb2tlTWl0ZXJsaW1pdCcsXG4gICdzdHJva2UtbWl0ZXJsaW1pdCc6ICdzdHJva2VNaXRlcmxpbWl0JyxcbiAgc3Ryb2tld2lkdGg6ICdzdHJva2VXaWR0aCcsXG4gICdzdHJva2Utd2lkdGgnOiAnc3Ryb2tlV2lkdGgnLFxuICBzdHJva2VvcGFjaXR5OiAnc3Ryb2tlT3BhY2l0eScsXG4gICdzdHJva2Utb3BhY2l0eSc6ICdzdHJva2VPcGFjaXR5JyxcbiAgc3VwcHJlc3Njb250ZW50ZWRpdGFibGV3YXJuaW5nOiAnc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nJyxcbiAgc3VwcHJlc3NoeWRyYXRpb253YXJuaW5nOiAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJyxcbiAgc3VyZmFjZXNjYWxlOiAnc3VyZmFjZVNjYWxlJyxcbiAgc3lzdGVtbGFuZ3VhZ2U6ICdzeXN0ZW1MYW5ndWFnZScsXG4gIHRhYmxldmFsdWVzOiAndGFibGVWYWx1ZXMnLFxuICB0YXJnZXR4OiAndGFyZ2V0WCcsXG4gIHRhcmdldHk6ICd0YXJnZXRZJyxcbiAgdGV4dGFuY2hvcjogJ3RleHRBbmNob3InLFxuICAndGV4dC1hbmNob3InOiAndGV4dEFuY2hvcicsXG4gIHRleHRkZWNvcmF0aW9uOiAndGV4dERlY29yYXRpb24nLFxuICAndGV4dC1kZWNvcmF0aW9uJzogJ3RleHREZWNvcmF0aW9uJyxcbiAgdGV4dGxlbmd0aDogJ3RleHRMZW5ndGgnLFxuICB0ZXh0cmVuZGVyaW5nOiAndGV4dFJlbmRlcmluZycsXG4gICd0ZXh0LXJlbmRlcmluZyc6ICd0ZXh0UmVuZGVyaW5nJyxcbiAgdG86ICd0bycsXG4gIHRyYW5zZm9ybTogJ3RyYW5zZm9ybScsXG4gIHR5cGVvZjogJ3R5cGVvZicsXG4gIHUxOiAndTEnLFxuICB1MjogJ3UyJyxcbiAgdW5kZXJsaW5lcG9zaXRpb246ICd1bmRlcmxpbmVQb3NpdGlvbicsXG4gICd1bmRlcmxpbmUtcG9zaXRpb24nOiAndW5kZXJsaW5lUG9zaXRpb24nLFxuICB1bmRlcmxpbmV0aGlja25lc3M6ICd1bmRlcmxpbmVUaGlja25lc3MnLFxuICAndW5kZXJsaW5lLXRoaWNrbmVzcyc6ICd1bmRlcmxpbmVUaGlja25lc3MnLFxuICB1bmljb2RlOiAndW5pY29kZScsXG4gIHVuaWNvZGViaWRpOiAndW5pY29kZUJpZGknLFxuICAndW5pY29kZS1iaWRpJzogJ3VuaWNvZGVCaWRpJyxcbiAgdW5pY29kZXJhbmdlOiAndW5pY29kZVJhbmdlJyxcbiAgJ3VuaWNvZGUtcmFuZ2UnOiAndW5pY29kZVJhbmdlJyxcbiAgdW5pdHNwZXJlbTogJ3VuaXRzUGVyRW0nLFxuICAndW5pdHMtcGVyLWVtJzogJ3VuaXRzUGVyRW0nLFxuICB1bnNlbGVjdGFibGU6ICd1bnNlbGVjdGFibGUnLFxuICB2YWxwaGFiZXRpYzogJ3ZBbHBoYWJldGljJyxcbiAgJ3YtYWxwaGFiZXRpYyc6ICd2QWxwaGFiZXRpYycsXG4gIHZhbHVlczogJ3ZhbHVlcycsXG4gIHZlY3RvcmVmZmVjdDogJ3ZlY3RvckVmZmVjdCcsXG4gICd2ZWN0b3ItZWZmZWN0JzogJ3ZlY3RvckVmZmVjdCcsXG4gIHZlcnNpb246ICd2ZXJzaW9uJyxcbiAgdmVydGFkdnk6ICd2ZXJ0QWR2WScsXG4gICd2ZXJ0LWFkdi15JzogJ3ZlcnRBZHZZJyxcbiAgdmVydG9yaWdpbng6ICd2ZXJ0T3JpZ2luWCcsXG4gICd2ZXJ0LW9yaWdpbi14JzogJ3ZlcnRPcmlnaW5YJyxcbiAgdmVydG9yaWdpbnk6ICd2ZXJ0T3JpZ2luWScsXG4gICd2ZXJ0LW9yaWdpbi15JzogJ3ZlcnRPcmlnaW5ZJyxcbiAgdmhhbmdpbmc6ICd2SGFuZ2luZycsXG4gICd2LWhhbmdpbmcnOiAndkhhbmdpbmcnLFxuICB2aWRlb2dyYXBoaWM6ICd2SWRlb2dyYXBoaWMnLFxuICAndi1pZGVvZ3JhcGhpYyc6ICd2SWRlb2dyYXBoaWMnLFxuICB2aWV3Ym94OiAndmlld0JveCcsXG4gIHZpZXd0YXJnZXQ6ICd2aWV3VGFyZ2V0JyxcbiAgdmlzaWJpbGl0eTogJ3Zpc2liaWxpdHknLFxuICB2bWF0aGVtYXRpY2FsOiAndk1hdGhlbWF0aWNhbCcsXG4gICd2LW1hdGhlbWF0aWNhbCc6ICd2TWF0aGVtYXRpY2FsJyxcbiAgdm9jYWI6ICd2b2NhYicsXG4gIHdpZHRoczogJ3dpZHRocycsXG4gIHdvcmRzcGFjaW5nOiAnd29yZFNwYWNpbmcnLFxuICAnd29yZC1zcGFjaW5nJzogJ3dvcmRTcGFjaW5nJyxcbiAgd3JpdGluZ21vZGU6ICd3cml0aW5nTW9kZScsXG4gICd3cml0aW5nLW1vZGUnOiAnd3JpdGluZ01vZGUnLFxuICB4MTogJ3gxJyxcbiAgeDI6ICd4MicsXG4gIHg6ICd4JyxcbiAgeGNoYW5uZWxzZWxlY3RvcjogJ3hDaGFubmVsU2VsZWN0b3InLFxuICB4aGVpZ2h0OiAneEhlaWdodCcsXG4gICd4LWhlaWdodCc6ICd4SGVpZ2h0JyxcbiAgeGxpbmthY3R1YXRlOiAneGxpbmtBY3R1YXRlJyxcbiAgJ3hsaW5rOmFjdHVhdGUnOiAneGxpbmtBY3R1YXRlJyxcbiAgeGxpbmthcmNyb2xlOiAneGxpbmtBcmNyb2xlJyxcbiAgJ3hsaW5rOmFyY3JvbGUnOiAneGxpbmtBcmNyb2xlJyxcbiAgeGxpbmtocmVmOiAneGxpbmtIcmVmJyxcbiAgJ3hsaW5rOmhyZWYnOiAneGxpbmtIcmVmJyxcbiAgeGxpbmtyb2xlOiAneGxpbmtSb2xlJyxcbiAgJ3hsaW5rOnJvbGUnOiAneGxpbmtSb2xlJyxcbiAgeGxpbmtzaG93OiAneGxpbmtTaG93JyxcbiAgJ3hsaW5rOnNob3cnOiAneGxpbmtTaG93JyxcbiAgeGxpbmt0aXRsZTogJ3hsaW5rVGl0bGUnLFxuICAneGxpbms6dGl0bGUnOiAneGxpbmtUaXRsZScsXG4gIHhsaW5rdHlwZTogJ3hsaW5rVHlwZScsXG4gICd4bGluazp0eXBlJzogJ3hsaW5rVHlwZScsXG4gIHhtbGJhc2U6ICd4bWxCYXNlJyxcbiAgJ3htbDpiYXNlJzogJ3htbEJhc2UnLFxuICB4bWxsYW5nOiAneG1sTGFuZycsXG4gICd4bWw6bGFuZyc6ICd4bWxMYW5nJyxcbiAgeG1sbnM6ICd4bWxucycsXG4gICd4bWw6c3BhY2UnOiAneG1sU3BhY2UnLFxuICB4bWxuc3hsaW5rOiAneG1sbnNYbGluaycsXG4gICd4bWxuczp4bGluayc6ICd4bWxuc1hsaW5rJyxcbiAgeG1sc3BhY2U6ICd4bWxTcGFjZScsXG4gIHkxOiAneTEnLFxuICB5MjogJ3kyJyxcbiAgeTogJ3knLFxuICB5Y2hhbm5lbHNlbGVjdG9yOiAneUNoYW5uZWxTZWxlY3RvcicsXG4gIHo6ICd6JyxcbiAgem9vbWFuZHBhbjogJ3pvb21BbmRQYW4nXG59O1xuXG52YXIgYXJpYVByb3BlcnRpZXMgPSB7XG4gICdhcmlhLWN1cnJlbnQnOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1kZXNjcmlwdGlvbic6IDAsXG4gICdhcmlhLWRldGFpbHMnOiAwLFxuICAnYXJpYS1kaXNhYmxlZCc6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWhpZGRlbic6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWludmFsaWQnOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1rZXlzaG9ydGN1dHMnOiAwLFxuICAnYXJpYS1sYWJlbCc6IDAsXG4gICdhcmlhLXJvbGVkZXNjcmlwdGlvbic6IDAsXG4gIC8vIFdpZGdldCBBdHRyaWJ1dGVzXG4gICdhcmlhLWF1dG9jb21wbGV0ZSc6IDAsXG4gICdhcmlhLWNoZWNrZWQnOiAwLFxuICAnYXJpYS1leHBhbmRlZCc6IDAsXG4gICdhcmlhLWhhc3BvcHVwJzogMCxcbiAgJ2FyaWEtbGV2ZWwnOiAwLFxuICAnYXJpYS1tb2RhbCc6IDAsXG4gICdhcmlhLW11bHRpbGluZSc6IDAsXG4gICdhcmlhLW11bHRpc2VsZWN0YWJsZSc6IDAsXG4gICdhcmlhLW9yaWVudGF0aW9uJzogMCxcbiAgJ2FyaWEtcGxhY2Vob2xkZXInOiAwLFxuICAnYXJpYS1wcmVzc2VkJzogMCxcbiAgJ2FyaWEtcmVhZG9ubHknOiAwLFxuICAnYXJpYS1yZXF1aXJlZCc6IDAsXG4gICdhcmlhLXNlbGVjdGVkJzogMCxcbiAgJ2FyaWEtc29ydCc6IDAsXG4gICdhcmlhLXZhbHVlbWF4JzogMCxcbiAgJ2FyaWEtdmFsdWVtaW4nOiAwLFxuICAnYXJpYS12YWx1ZW5vdyc6IDAsXG4gICdhcmlhLXZhbHVldGV4dCc6IDAsXG4gIC8vIExpdmUgUmVnaW9uIEF0dHJpYnV0ZXNcbiAgJ2FyaWEtYXRvbWljJzogMCxcbiAgJ2FyaWEtYnVzeSc6IDAsXG4gICdhcmlhLWxpdmUnOiAwLFxuICAnYXJpYS1yZWxldmFudCc6IDAsXG4gIC8vIERyYWctYW5kLURyb3AgQXR0cmlidXRlc1xuICAnYXJpYS1kcm9wZWZmZWN0JzogMCxcbiAgJ2FyaWEtZ3JhYmJlZCc6IDAsXG4gIC8vIFJlbGF0aW9uc2hpcCBBdHRyaWJ1dGVzXG4gICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnOiAwLFxuICAnYXJpYS1jb2xjb3VudCc6IDAsXG4gICdhcmlhLWNvbGluZGV4JzogMCxcbiAgJ2FyaWEtY29sc3Bhbic6IDAsXG4gICdhcmlhLWNvbnRyb2xzJzogMCxcbiAgJ2FyaWEtZGVzY3JpYmVkYnknOiAwLFxuICAnYXJpYS1lcnJvcm1lc3NhZ2UnOiAwLFxuICAnYXJpYS1mbG93dG8nOiAwLFxuICAnYXJpYS1sYWJlbGxlZGJ5JzogMCxcbiAgJ2FyaWEtb3ducyc6IDAsXG4gICdhcmlhLXBvc2luc2V0JzogMCxcbiAgJ2FyaWEtcm93Y291bnQnOiAwLFxuICAnYXJpYS1yb3dpbmRleCc6IDAsXG4gICdhcmlhLXJvd3NwYW4nOiAwLFxuICAnYXJpYS1zZXRzaXplJzogMFxufTtcblxudmFyIHdhcm5lZFByb3BlcnRpZXMgPSB7fTtcbnZhciByQVJJQSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xudmFyIHJBUklBQ2FtZWwgPSBuZXcgUmVnRXhwKCdeKGFyaWEpW0EtWl1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHkodGFnTmFtZSwgbmFtZSkge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwod2FybmVkUHJvcGVydGllcywgbmFtZSkgJiYgd2FybmVkUHJvcGVydGllc1tuYW1lXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHJBUklBQ2FtZWwudGVzdChuYW1lKSkge1xuICAgICAgdmFyIGFyaWFOYW1lID0gJ2FyaWEtJyArIG5hbWUuc2xpY2UoNCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBjb3JyZWN0TmFtZSA9IGFyaWFQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGFyaWFOYW1lKSA/IGFyaWFOYW1lIDogbnVsbDsgLy8gSWYgdGhpcyBpcyBhbiBhcmlhLSogYXR0cmlidXRlLCBidXQgaXMgbm90IGxpc3RlZCBpbiB0aGUga25vd24gRE9NXG4gICAgICAvLyBET00gcHJvcGVydGllcywgdGhlbiBpdCBpcyBhbiBpbnZhbGlkIGFyaWEtKiBhdHRyaWJ1dGUuXG5cbiAgICAgIGlmIChjb3JyZWN0TmFtZSA9PSBudWxsKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIEFSSUEgYXR0cmlidXRlIGAlc2AuIEFSSUEgYXR0cmlidXRlcyBmb2xsb3cgdGhlIHBhdHRlcm4gYXJpYS0qIGFuZCBtdXN0IGJlIGxvd2VyY2FzZS4nLCBuYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IC8vIGFyaWEtKiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBsb3dlcmNhc2U7IHN1Z2dlc3QgdGhlIGxvd2VyY2FzZSB2ZXJzaW9uLlxuXG5cbiAgICAgIGlmIChuYW1lICE9PSBjb3JyZWN0TmFtZSkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBBUklBIGF0dHJpYnV0ZSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBjb3JyZWN0TmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyQVJJQS50ZXN0KG5hbWUpKSB7XG4gICAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgc3RhbmRhcmROYW1lID0gYXJpYVByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpID8gbG93ZXJDYXNlZE5hbWUgOiBudWxsOyAvLyBJZiB0aGlzIGlzIGFuIGFyaWEtKiBhdHRyaWJ1dGUsIGJ1dCBpcyBub3QgbGlzdGVkIGluIHRoZSBrbm93biBET01cbiAgICAgIC8vIERPTSBwcm9wZXJ0aWVzLCB0aGVuIGl0IGlzIGFuIGludmFsaWQgYXJpYS0qIGF0dHJpYnV0ZS5cblxuICAgICAgaWYgKHN0YW5kYXJkTmFtZSA9PSBudWxsKSB7XG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IC8vIGFyaWEtKiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBsb3dlcmNhc2U7IHN1Z2dlc3QgdGhlIGxvd2VyY2FzZSB2ZXJzaW9uLlxuXG5cbiAgICAgIGlmIChuYW1lICE9PSBzdGFuZGFyZE5hbWUpIHtcbiAgICAgICAgZXJyb3IoJ1Vua25vd24gQVJJQSBhdHRyaWJ1dGUgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgc3RhbmRhcmROYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHdhcm5JbnZhbGlkQVJJQVByb3BzKHR5cGUsIHByb3BzKSB7XG4gIHtcbiAgICB2YXIgaW52YWxpZFByb3BzID0gW107XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHtcbiAgICAgIHZhciBpc1ZhbGlkID0gdmFsaWRhdGVQcm9wZXJ0eSh0eXBlLCBrZXkpO1xuXG4gICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgaW52YWxpZFByb3BzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdW5rbm93blByb3BTdHJpbmcgPSBpbnZhbGlkUHJvcHMubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICByZXR1cm4gJ2AnICsgcHJvcCArICdgJztcbiAgICB9KS5qb2luKCcsICcpO1xuXG4gICAgaWYgKGludmFsaWRQcm9wcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIGFyaWEgcHJvcCAlcyBvbiA8JXM+IHRhZy4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWFyaWEtcHJvcHMnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gICAgfSBlbHNlIGlmIChpbnZhbGlkUHJvcHMubGVuZ3RoID4gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgYXJpYSBwcm9wcyAlcyBvbiA8JXM+IHRhZy4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWFyaWEtcHJvcHMnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyh0eXBlLCBwcm9wcykge1xuICBpZiAoaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgd2FybkludmFsaWRBUklBUHJvcHModHlwZSwgcHJvcHMpO1xufVxuXG52YXIgZGlkV2FyblZhbHVlTnVsbCA9IGZhbHNlO1xuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzJDEodHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIGlmICh0eXBlICE9PSAnaW5wdXQnICYmIHR5cGUgIT09ICd0ZXh0YXJlYScgJiYgdHlwZSAhPT0gJ3NlbGVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMgIT0gbnVsbCAmJiBwcm9wcy52YWx1ZSA9PT0gbnVsbCAmJiAhZGlkV2FyblZhbHVlTnVsbCkge1xuICAgICAgZGlkV2FyblZhbHVlTnVsbCA9IHRydWU7XG5cbiAgICAgIGlmICh0eXBlID09PSAnc2VsZWN0JyAmJiBwcm9wcy5tdWx0aXBsZSkge1xuICAgICAgICBlcnJvcignYHZhbHVlYCBwcm9wIG9uIGAlc2Agc2hvdWxkIG5vdCBiZSBudWxsLiAnICsgJ0NvbnNpZGVyIHVzaW5nIGFuIGVtcHR5IGFycmF5IHdoZW4gYG11bHRpcGxlYCBpcyBzZXQgdG8gYHRydWVgICcgKyAndG8gY2xlYXIgdGhlIGNvbXBvbmVudCBvciBgdW5kZWZpbmVkYCBmb3IgdW5jb250cm9sbGVkIGNvbXBvbmVudHMuJywgdHlwZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcignYHZhbHVlYCBwcm9wIG9uIGAlc2Agc2hvdWxkIG5vdCBiZSBudWxsLiAnICsgJ0NvbnNpZGVyIHVzaW5nIGFuIGVtcHR5IHN0cmluZyB0byBjbGVhciB0aGUgY29tcG9uZW50IG9yIGB1bmRlZmluZWRgICcgKyAnZm9yIHVuY29udHJvbGxlZCBjb21wb25lbnRzLicsIHR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgdmFsaWRhdGVQcm9wZXJ0eSQxID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgdmFyIHdhcm5lZFByb3BlcnRpZXMkMSA9IHt9O1xuICB2YXIgRVZFTlRfTkFNRV9SRUdFWCA9IC9eb24uLztcbiAgdmFyIElOVkFMSURfRVZFTlRfTkFNRV9SRUdFWCA9IC9eb25bXkEtWl0vO1xuICB2YXIgckFSSUEkMSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuICB2YXIgckFSSUFDYW1lbCQxID0gbmV3IFJlZ0V4cCgnXihhcmlhKVtBLVpdWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuXG4gIHZhbGlkYXRlUHJvcGVydHkkMSA9IGZ1bmN0aW9uICh0YWdOYW1lLCBuYW1lLCB2YWx1ZSwgZXZlbnRSZWdpc3RyeSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHdhcm5lZFByb3BlcnRpZXMkMSwgbmFtZSkgJiYgd2FybmVkUHJvcGVydGllcyQxW25hbWVdKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdvbmZvY3VzaW4nIHx8IGxvd2VyQ2FzZWROYW1lID09PSAnb25mb2N1c291dCcpIHtcbiAgICAgIGVycm9yKCdSZWFjdCB1c2VzIG9uRm9jdXMgYW5kIG9uQmx1ciBpbnN0ZWFkIG9mIG9uRm9jdXNJbiBhbmQgb25Gb2N1c091dC4gJyArICdBbGwgUmVhY3QgZXZlbnRzIGFyZSBub3JtYWxpemVkIHRvIGJ1YmJsZSwgc28gb25Gb2N1c0luIGFuZCBvbkZvY3VzT3V0ICcgKyAnYXJlIG5vdCBuZWVkZWQvc3VwcG9ydGVkIGJ5IFJlYWN0LicpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBXZSBjYW4ndCByZWx5IG9uIHRoZSBldmVudCBzeXN0ZW0gYmVpbmcgaW5qZWN0ZWQgb24gdGhlIHNlcnZlci5cblxuXG4gICAgaWYgKGV2ZW50UmVnaXN0cnkgIT0gbnVsbCkge1xuICAgICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMgPSBldmVudFJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMsXG4gICAgICAgICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyA9IGV2ZW50UmVnaXN0cnkucG9zc2libGVSZWdpc3RyYXRpb25OYW1lcztcblxuICAgICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWdpc3RyYXRpb25OYW1lID0gcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkgPyBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzW2xvd2VyQ2FzZWROYW1lXSA6IG51bGw7XG5cbiAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCByZWdpc3RyYXRpb25OYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKEVWRU5UX05BTUVfUkVHRVgudGVzdChuYW1lKSkge1xuICAgICAgICBlcnJvcignVW5rbm93biBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuIEl0IHdpbGwgYmUgaWdub3JlZC4nLCBuYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEVWRU5UX05BTUVfUkVHRVgudGVzdChuYW1lKSkge1xuICAgICAgLy8gSWYgbm8gZXZlbnQgcGx1Z2lucyBoYXZlIGJlZW4gaW5qZWN0ZWQsIHdlIGFyZSBpbiBhIHNlcnZlciBlbnZpcm9ubWVudC5cbiAgICAgIC8vIFNvIHdlIGNhbid0IHRlbGwgaWYgdGhlIGV2ZW50IG5hbWUgaXMgY29ycmVjdCBmb3Igc3VyZSwgYnV0IHdlIGNhbiBmaWx0ZXJcbiAgICAgIC8vIG91dCBrbm93biBiYWQgb25lcyBsaWtlIGBvbmNsaWNrYC4gV2UgY2FuJ3Qgc3VnZ2VzdCBhIHNwZWNpZmljIHJlcGxhY2VtZW50IHRob3VnaC5cbiAgICAgIGlmIChJTlZBTElEX0VWRU5UX05BTUVfUkVHRVgudGVzdChuYW1lKSkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuICcgKyAnUmVhY3QgZXZlbnRzIHVzZSB0aGUgY2FtZWxDYXNlIG5hbWluZyBjb252ZW50aW9uLCBmb3IgZXhhbXBsZSBgb25DbGlja2AuJywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIExldCB0aGUgQVJJQSBhdHRyaWJ1dGUgaG9vayB2YWxpZGF0ZSBBUklBIGF0dHJpYnV0ZXNcblxuXG4gICAgaWYgKHJBUklBJDEudGVzdChuYW1lKSB8fCByQVJJQUNhbWVsJDEudGVzdChuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnaW5uZXJodG1sJykge1xuICAgICAgZXJyb3IoJ0RpcmVjdGx5IHNldHRpbmcgcHJvcGVydHkgYGlubmVySFRNTGAgaXMgbm90IHBlcm1pdHRlZC4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgbG9va3VwIGRvY3VtZW50YXRpb24gb24gYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2FyaWEnKSB7XG4gICAgICBlcnJvcignVGhlIGBhcmlhYCBhdHRyaWJ1dGUgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgaW4gUmVhY3QuICcgKyAnUGFzcyBpbmRpdmlkdWFsIGBhcmlhLWAgYXR0cmlidXRlcyBpbnN0ZWFkLicpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnaXMnICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIGEgYCVzYCBmb3IgYSBzdHJpbmcgYXR0cmlidXRlIGBpc2AuIElmIHRoaXMgaXMgZXhwZWN0ZWQsIGNhc3QgJyArICd0aGUgdmFsdWUgdG8gYSBzdHJpbmcuJywgdHlwZW9mIHZhbHVlKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlzTmFOKHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIE5hTiBmb3IgdGhlIGAlc2AgYXR0cmlidXRlLiBJZiB0aGlzIGlzIGV4cGVjdGVkLCBjYXN0ICcgKyAndGhlIHZhbHVlIHRvIGEgc3RyaW5nLicsIG5hbWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIHByb3BlcnR5SW5mbyA9IGdldFByb3BlcnR5SW5mbyhuYW1lKTtcbiAgICB2YXIgaXNSZXNlcnZlZCA9IHByb3BlcnR5SW5mbyAhPT0gbnVsbCAmJiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gUkVTRVJWRUQ7IC8vIEtub3duIGF0dHJpYnV0ZXMgc2hvdWxkIG1hdGNoIHRoZSBjYXNpbmcgc3BlY2lmaWVkIGluIHRoZSBwcm9wZXJ0eSBjb25maWcuXG5cbiAgICBpZiAocG9zc2libGVTdGFuZGFyZE5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSkge1xuICAgICAgdmFyIHN0YW5kYXJkTmFtZSA9IHBvc3NpYmxlU3RhbmRhcmROYW1lc1tsb3dlckNhc2VkTmFtZV07XG5cbiAgICAgIGlmIChzdGFuZGFyZE5hbWUgIT09IG5hbWUpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgRE9NIHByb3BlcnR5IGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIHN0YW5kYXJkTmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghaXNSZXNlcnZlZCAmJiBuYW1lICE9PSBsb3dlckNhc2VkTmFtZSkge1xuICAgICAgLy8gVW5rbm93biBhdHRyaWJ1dGVzIHNob3VsZCBoYXZlIGxvd2VyY2FzZSBjYXNpbmcgc2luY2UgdGhhdCdzIGhvdyB0aGV5XG4gICAgICAvLyB3aWxsIGJlIGNhc2VkIGFueXdheSB3aXRoIHNlcnZlciByZW5kZXJpbmcuXG4gICAgICBlcnJvcignUmVhY3QgZG9lcyBub3QgcmVjb2duaXplIHRoZSBgJXNgIHByb3Agb24gYSBET00gZWxlbWVudC4gSWYgeW91ICcgKyAnaW50ZW50aW9uYWxseSB3YW50IGl0IHRvIGFwcGVhciBpbiB0aGUgRE9NIGFzIGEgY3VzdG9tICcgKyAnYXR0cmlidXRlLCBzcGVsbCBpdCBhcyBsb3dlcmNhc2UgYCVzYCBpbnN0ZWFkLiAnICsgJ0lmIHlvdSBhY2NpZGVudGFsbHkgcGFzc2VkIGl0IGZyb20gYSBwYXJlbnQgY29tcG9uZW50LCByZW1vdmUgJyArICdpdCBmcm9tIHRoZSBET00gZWxlbWVudC4nLCBuYW1lLCBsb3dlckNhc2VkTmFtZSk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgJiYgc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZXJyb3IoJ1JlY2VpdmVkIGAlc2AgZm9yIGEgbm9uLWJvb2xlYW4gYXR0cmlidXRlIGAlc2AuXFxuXFxuJyArICdJZiB5b3Ugd2FudCB0byB3cml0ZSBpdCB0byB0aGUgRE9NLCBwYXNzIGEgc3RyaW5nIGluc3RlYWQ6ICcgKyAnJXM9XCIlc1wiIG9yICVzPXt2YWx1ZS50b1N0cmluZygpfS4nLCB2YWx1ZSwgbmFtZSwgbmFtZSwgdmFsdWUsIG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJ1JlY2VpdmVkIGAlc2AgZm9yIGEgbm9uLWJvb2xlYW4gYXR0cmlidXRlIGAlc2AuXFxuXFxuJyArICdJZiB5b3Ugd2FudCB0byB3cml0ZSBpdCB0byB0aGUgRE9NLCBwYXNzIGEgc3RyaW5nIGluc3RlYWQ6ICcgKyAnJXM9XCIlc1wiIG9yICVzPXt2YWx1ZS50b1N0cmluZygpfS5cXG5cXG4nICsgJ0lmIHlvdSB1c2VkIHRvIGNvbmRpdGlvbmFsbHkgb21pdCBpdCB3aXRoICVzPXtjb25kaXRpb24gJiYgdmFsdWV9LCAnICsgJ3Bhc3MgJXM9e2NvbmRpdGlvbiA/IHZhbHVlIDogdW5kZWZpbmVkfSBpbnN0ZWFkLicsIHZhbHVlLCBuYW1lLCBuYW1lLCB2YWx1ZSwgbmFtZSwgbmFtZSwgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIE5vdyB0aGF0IHdlJ3ZlIHZhbGlkYXRlZCBjYXNpbmcsIGRvIG5vdCB2YWxpZGF0ZVxuICAgIC8vIGRhdGEgdHlwZXMgZm9yIHJlc2VydmVkIHByb3BzXG5cblxuICAgIGlmIChpc1Jlc2VydmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIFdhcm4gd2hlbiBhIGtub3duIGF0dHJpYnV0ZSBpcyBhIGJhZCB0eXBlXG5cblxuICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBXYXJuIHdoZW4gcGFzc2luZyB0aGUgc3RyaW5ncyAnZmFsc2UnIG9yICd0cnVlJyBpbnRvIGEgYm9vbGVhbiBwcm9wXG5cblxuICAgIGlmICgodmFsdWUgPT09ICdmYWxzZScgfHwgdmFsdWUgPT09ICd0cnVlJykgJiYgcHJvcGVydHlJbmZvICE9PSBudWxsICYmIHByb3BlcnR5SW5mby50eXBlID09PSBCT09MRUFOKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgdGhlIHN0cmluZyBgJXNgIGZvciB0aGUgYm9vbGVhbiBhdHRyaWJ1dGUgYCVzYC4gJyArICclcyAnICsgJ0RpZCB5b3UgbWVhbiAlcz17JXN9PycsIHZhbHVlLCBuYW1lLCB2YWx1ZSA9PT0gJ2ZhbHNlJyA/ICdUaGUgYnJvd3NlciB3aWxsIGludGVycHJldCBpdCBhcyBhIHRydXRoeSB2YWx1ZS4nIDogJ0FsdGhvdWdoIHRoaXMgd29ya3MsIGl0IHdpbGwgbm90IHdvcmsgYXMgZXhwZWN0ZWQgaWYgeW91IHBhc3MgdGhlIHN0cmluZyBcImZhbHNlXCIuJywgbmFtZSwgdmFsdWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59XG5cbnZhciB3YXJuVW5rbm93blByb3BlcnRpZXMgPSBmdW5jdGlvbiAodHlwZSwgcHJvcHMsIGV2ZW50UmVnaXN0cnkpIHtcbiAge1xuICAgIHZhciB1bmtub3duUHJvcHMgPSBbXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgICAgdmFyIGlzVmFsaWQgPSB2YWxpZGF0ZVByb3BlcnR5JDEodHlwZSwga2V5LCBwcm9wc1trZXldLCBldmVudFJlZ2lzdHJ5KTtcblxuICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgIHVua25vd25Qcm9wcy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHVua25vd25Qcm9wU3RyaW5nID0gdW5rbm93blByb3BzLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgcmV0dXJuICdgJyArIHByb3AgKyAnYCc7XG4gICAgfSkuam9pbignLCAnKTtcblxuICAgIGlmICh1bmtub3duUHJvcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCB2YWx1ZSBmb3IgcHJvcCAlcyBvbiA8JXM+IHRhZy4gRWl0aGVyIHJlbW92ZSBpdCBmcm9tIHRoZSBlbGVtZW50LCAnICsgJ29yIHBhc3MgYSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlIHRvIGtlZXAgaXQgaW4gdGhlIERPTS4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9hdHRyaWJ1dGUtYmVoYXZpb3IgJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH0gZWxzZSBpZiAodW5rbm93blByb3BzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIHZhbHVlcyBmb3IgcHJvcHMgJXMgb24gPCVzPiB0YWcuIEVpdGhlciByZW1vdmUgdGhlbSBmcm9tIHRoZSBlbGVtZW50LCAnICsgJ29yIHBhc3MgYSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlIHRvIGtlZXAgdGhlbSBpbiB0aGUgRE9NLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2F0dHJpYnV0ZS1iZWhhdmlvciAnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXMkMih0eXBlLCBwcm9wcywgZXZlbnRSZWdpc3RyeSkge1xuICBpZiAoaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgd2FyblVua25vd25Qcm9wZXJ0aWVzKHR5cGUsIHByb3BzLCBldmVudFJlZ2lzdHJ5KTtcbn1cblxudmFyIElTX0VWRU5UX0hBTkRMRV9OT05fTUFOQUdFRF9OT0RFID0gMTtcbnZhciBJU19OT05fREVMRUdBVEVEID0gMSA8PCAxO1xudmFyIElTX0NBUFRVUkVfUEhBU0UgPSAxIDw8IDI7XG4vLyBzZXQgdG8gTEVHQUNZX0ZCX1NVUFBPUlQuIExFR0FDWV9GQl9TVVBQT1JUIG9ubHkgZ2V0cyBzZXQgd2hlblxuLy8gd2UgY2FsbCB3aWxsRGVmZXJMYXRlckZvckxlZ2FjeUZCU3VwcG9ydCwgdGh1cyBub3QgYmFpbGluZyBvdXRcbi8vIHdpbGwgcmVzdWx0IGluIGVuZGxlc3MgY3ljbGVzIGxpa2UgYW4gaW5maW5pdGUgbG9vcC5cbi8vIFdlIGFsc28gZG9uJ3Qgd2FudCB0byBkZWZlciBkdXJpbmcgZXZlbnQgcmVwbGF5aW5nLlxuXG52YXIgU0hPVUxEX05PVF9QUk9DRVNTX1BPTFlGSUxMX0VWRU5UX1BMVUdJTlMgPSBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSB8IElTX05PTl9ERUxFR0FURUQgfCBJU19DQVBUVVJFX1BIQVNFO1xuXG4vLyBUaGlzIGV4aXN0cyB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5IGJldHdlZW4gUmVhY3RET01FdmVudFJlcGxheWluZ1xuLy8gYW5kIERPTVBsdWdpbkV2ZW50U3lzdGVtLlxudmFyIGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9IG51bGw7XG5mdW5jdGlvbiBzZXRSZXBsYXlpbmdFdmVudChldmVudCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnRSZXBsYXlpbmdFdmVudCAhPT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGN1cnJlbnRseSByZXBsYXlpbmcgZXZlbnQgdG8gYmUgbnVsbC4gVGhpcyBlcnJvciAnICsgJ2lzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9IGV2ZW50O1xufVxuZnVuY3Rpb24gcmVzZXRSZXBsYXlpbmdFdmVudCgpIHtcbiAge1xuICAgIGlmIChjdXJyZW50UmVwbGF5aW5nRXZlbnQgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCBjdXJyZW50bHkgcmVwbGF5aW5nIGV2ZW50IHRvIG5vdCBiZSBudWxsLiBUaGlzIGVycm9yICcgKyAnaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgY3VycmVudFJlcGxheWluZ0V2ZW50ID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGlzUmVwbGF5aW5nRXZlbnQoZXZlbnQpIHtcbiAgcmV0dXJuIGV2ZW50ID09PSBjdXJyZW50UmVwbGF5aW5nRXZlbnQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgdGFyZ2V0IG5vZGUgZnJvbSBhIG5hdGl2ZSBicm93c2VyIGV2ZW50IGJ5IGFjY291bnRpbmcgZm9yXG4gKiBpbmNvbnNpc3RlbmNpZXMgaW4gYnJvd3NlciBET00gQVBJcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtET01FdmVudFRhcmdldH0gVGFyZ2V0IG5vZGUuXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpIHtcbiAgLy8gRmFsbGJhY2sgdG8gbmF0aXZlRXZlbnQuc3JjRWxlbWVudCBmb3IgSUU5XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTI1MDZcbiAgdmFyIHRhcmdldCA9IG5hdGl2ZUV2ZW50LnRhcmdldCB8fCBuYXRpdmVFdmVudC5zcmNFbGVtZW50IHx8IHdpbmRvdzsgLy8gTm9ybWFsaXplIFNWRyA8dXNlPiBlbGVtZW50IGV2ZW50cyAjNDk2M1xuXG4gIGlmICh0YXJnZXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpIHtcbiAgICB0YXJnZXQgPSB0YXJnZXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQ7XG4gIH0gLy8gU2FmYXJpIG1heSBmaXJlIGV2ZW50cyBvbiB0ZXh0IG5vZGVzIChOb2RlLlRFWFRfTk9ERSBpcyAzKS5cbiAgLy8gQHNlZSBodHRwOi8vd3d3LnF1aXJrc21vZGUub3JnL2pzL2V2ZW50c19wcm9wZXJ0aWVzLmh0bWxcblxuXG4gIHJldHVybiB0YXJnZXQubm9kZVR5cGUgPT09IFRFWFRfTk9ERSA/IHRhcmdldC5wYXJlbnROb2RlIDogdGFyZ2V0O1xufVxuXG52YXIgcmVzdG9yZUltcGwgPSBudWxsO1xudmFyIHJlc3RvcmVUYXJnZXQgPSBudWxsO1xudmFyIHJlc3RvcmVRdWV1ZSA9IG51bGw7XG5cbmZ1bmN0aW9uIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHRhcmdldCkge1xuICAvLyBXZSBwZXJmb3JtIHRoaXMgdHJhbnNsYXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgZXZlbnQgbG9vcCBzbyB0aGF0IHdlXG4gIC8vIGFsd2F5cyByZWNlaXZlIHRoZSBjb3JyZWN0IGZpYmVyIGhlcmVcbiAgdmFyIGludGVybmFsSW5zdGFuY2UgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKHRhcmdldCk7XG5cbiAgaWYgKCFpbnRlcm5hbEluc3RhbmNlKSB7XG4gICAgLy8gVW5tb3VudGVkXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZXN0b3JlSW1wbCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0UmVzdG9yZUltcGxlbWVudGF0aW9uKCkgbmVlZHMgdG8gYmUgY2FsbGVkIHRvIGhhbmRsZSBhIHRhcmdldCBmb3IgY29udHJvbGxlZCAnICsgJ2V2ZW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHZhciBzdGF0ZU5vZGUgPSBpbnRlcm5hbEluc3RhbmNlLnN0YXRlTm9kZTsgLy8gR3VhcmQgYWdhaW5zdCBGaWJlciBiZWluZyB1bm1vdW50ZWQuXG5cbiAgaWYgKHN0YXRlTm9kZSkge1xuICAgIHZhciBfcHJvcHMgPSBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlKHN0YXRlTm9kZSk7XG5cbiAgICByZXN0b3JlSW1wbChpbnRlcm5hbEluc3RhbmNlLnN0YXRlTm9kZSwgaW50ZXJuYWxJbnN0YW5jZS50eXBlLCBfcHJvcHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldFJlc3RvcmVJbXBsZW1lbnRhdGlvbihpbXBsKSB7XG4gIHJlc3RvcmVJbXBsID0gaW1wbDtcbn1cbmZ1bmN0aW9uIGVucXVldWVTdGF0ZVJlc3RvcmUodGFyZ2V0KSB7XG4gIGlmIChyZXN0b3JlVGFyZ2V0KSB7XG4gICAgaWYgKHJlc3RvcmVRdWV1ZSkge1xuICAgICAgcmVzdG9yZVF1ZXVlLnB1c2godGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdG9yZVF1ZXVlID0gW3RhcmdldF07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlc3RvcmVUYXJnZXQgPSB0YXJnZXQ7XG4gIH1cbn1cbmZ1bmN0aW9uIG5lZWRzU3RhdGVSZXN0b3JlKCkge1xuICByZXR1cm4gcmVzdG9yZVRhcmdldCAhPT0gbnVsbCB8fCByZXN0b3JlUXVldWUgIT09IG51bGw7XG59XG5mdW5jdGlvbiByZXN0b3JlU3RhdGVJZk5lZWRlZCgpIHtcbiAgaWYgKCFyZXN0b3JlVGFyZ2V0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHRhcmdldCA9IHJlc3RvcmVUYXJnZXQ7XG4gIHZhciBxdWV1ZWRUYXJnZXRzID0gcmVzdG9yZVF1ZXVlO1xuICByZXN0b3JlVGFyZ2V0ID0gbnVsbDtcbiAgcmVzdG9yZVF1ZXVlID0gbnVsbDtcbiAgcmVzdG9yZVN0YXRlT2ZUYXJnZXQodGFyZ2V0KTtcblxuICBpZiAocXVldWVkVGFyZ2V0cykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWVkVGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdG9yZVN0YXRlT2ZUYXJnZXQocXVldWVkVGFyZ2V0c1tpXSk7XG4gICAgfVxuICB9XG59XG5cbi8vIHRoZSByZW5kZXJlci4gU3VjaCBhcyB3aGVuIHdlJ3JlIGRpc3BhdGNoaW5nIGV2ZW50cyBvciBpZiB0aGlyZCBwYXJ0eVxuLy8gbGlicmFyaWVzIG5lZWQgdG8gY2FsbCBiYXRjaGVkVXBkYXRlcy4gRXZlbnR1YWxseSwgdGhpcyBBUEkgd2lsbCBnbyBhd2F5IHdoZW5cbi8vIGV2ZXJ5dGhpbmcgaXMgYmF0Y2hlZCBieSBkZWZhdWx0LiBXZSdsbCB0aGVuIGhhdmUgYSBzaW1pbGFyIEFQSSB0byBvcHQtb3V0IG9mXG4vLyBzY2hlZHVsZWQgd29yayBhbmQgaW5zdGVhZCBkbyBzeW5jaHJvbm91cyB3b3JrLlxuLy8gRGVmYXVsdHNcblxudmFyIGJhdGNoZWRVcGRhdGVzSW1wbCA9IGZ1bmN0aW9uIChmbiwgYm9va2tlZXBpbmcpIHtcbiAgcmV0dXJuIGZuKGJvb2trZWVwaW5nKTtcbn07XG5cbnZhciBmbHVzaFN5bmNJbXBsID0gZnVuY3Rpb24gKCkge307XG5cbnZhciBpc0luc2lkZUV2ZW50SGFuZGxlciA9IGZhbHNlO1xuXG5mdW5jdGlvbiBmaW5pc2hFdmVudEhhbmRsZXIoKSB7XG4gIC8vIEhlcmUgd2Ugd2FpdCB1bnRpbCBhbGwgdXBkYXRlcyBoYXZlIHByb3BhZ2F0ZWQsIHdoaWNoIGlzIGltcG9ydGFudFxuICAvLyB3aGVuIHVzaW5nIGNvbnRyb2xsZWQgY29tcG9uZW50cyB3aXRoaW4gbGF5ZXJzOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE2OThcbiAgLy8gVGhlbiB3ZSByZXN0b3JlIHN0YXRlIG9mIGFueSBjb250cm9sbGVkIGNvbXBvbmVudC5cbiAgdmFyIGNvbnRyb2xsZWRDb21wb25lbnRzSGF2ZVBlbmRpbmdVcGRhdGVzID0gbmVlZHNTdGF0ZVJlc3RvcmUoKTtcblxuICBpZiAoY29udHJvbGxlZENvbXBvbmVudHNIYXZlUGVuZGluZ1VwZGF0ZXMpIHtcbiAgICAvLyBJZiBhIGNvbnRyb2xsZWQgZXZlbnQgd2FzIGZpcmVkLCB3ZSBtYXkgbmVlZCB0byByZXN0b3JlIHRoZSBzdGF0ZSBvZlxuICAgIC8vIHRoZSBET00gbm9kZSBiYWNrIHRvIHRoZSBjb250cm9sbGVkIHZhbHVlLiBUaGlzIGlzIG5lY2Vzc2FyeSB3aGVuIFJlYWN0XG4gICAgLy8gYmFpbHMgb3V0IG9mIHRoZSB1cGRhdGUgd2l0aG91dCB0b3VjaGluZyB0aGUgRE9NLlxuICAgIC8vIFRPRE86IFJlc3RvcmUgc3RhdGUgaW4gdGhlIG1pY3JvdGFzaywgYWZ0ZXIgdGhlIGRpc2NyZXRlIHVwZGF0ZXMgZmx1c2gsXG4gICAgLy8gaW5zdGVhZCBvZiBlYXJseSBmbHVzaGluZyB0aGVtIGhlcmUuXG4gICAgZmx1c2hTeW5jSW1wbCgpO1xuICAgIHJlc3RvcmVTdGF0ZUlmTmVlZGVkKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYmF0Y2hlZFVwZGF0ZXMoZm4sIGEsIGIpIHtcbiAgaWYgKGlzSW5zaWRlRXZlbnRIYW5kbGVyKSB7XG4gICAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBpbnNpZGUgYW5vdGhlciBiYXRjaCwgd2UgbmVlZCB0byB3YWl0IHVudGlsIGl0XG4gICAgLy8gZnVsbHkgY29tcGxldGVzIGJlZm9yZSByZXN0b3Jpbmcgc3RhdGUuXG4gICAgcmV0dXJuIGZuKGEsIGIpO1xuICB9XG5cbiAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGJhdGNoZWRVcGRhdGVzSW1wbChmbiwgYSwgYik7XG4gIH0gZmluYWxseSB7XG4gICAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSBmYWxzZTtcbiAgICBmaW5pc2hFdmVudEhhbmRsZXIoKTtcbiAgfVxufSAvLyBUT0RPOiBSZXBsYWNlIHdpdGggZmx1c2hTeW5jXG5mdW5jdGlvbiBzZXRCYXRjaGluZ0ltcGxlbWVudGF0aW9uKF9iYXRjaGVkVXBkYXRlc0ltcGwsIF9kaXNjcmV0ZVVwZGF0ZXNJbXBsLCBfZmx1c2hTeW5jSW1wbCkge1xuICBiYXRjaGVkVXBkYXRlc0ltcGwgPSBfYmF0Y2hlZFVwZGF0ZXNJbXBsO1xuICBmbHVzaFN5bmNJbXBsID0gX2ZsdXNoU3luY0ltcGw7XG59XG5cbmZ1bmN0aW9uIGlzSW50ZXJhY3RpdmUodGFnKSB7XG4gIHJldHVybiB0YWcgPT09ICdidXR0b24nIHx8IHRhZyA9PT0gJ2lucHV0JyB8fCB0YWcgPT09ICdzZWxlY3QnIHx8IHRhZyA9PT0gJ3RleHRhcmVhJztcbn1cblxuZnVuY3Rpb24gc2hvdWxkUHJldmVudE1vdXNlRXZlbnQobmFtZSwgdHlwZSwgcHJvcHMpIHtcbiAgc3dpdGNoIChuYW1lKSB7XG4gICAgY2FzZSAnb25DbGljayc6XG4gICAgY2FzZSAnb25DbGlja0NhcHR1cmUnOlxuICAgIGNhc2UgJ29uRG91YmxlQ2xpY2snOlxuICAgIGNhc2UgJ29uRG91YmxlQ2xpY2tDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlRG93bic6XG4gICAgY2FzZSAnb25Nb3VzZURvd25DYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlTW92ZSc6XG4gICAgY2FzZSAnb25Nb3VzZU1vdmVDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlVXAnOlxuICAgIGNhc2UgJ29uTW91c2VVcENhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VFbnRlcic6XG4gICAgICByZXR1cm4gISEocHJvcHMuZGlzYWJsZWQgJiYgaXNJbnRlcmFjdGl2ZSh0eXBlKSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBpbnN0IFRoZSBpbnN0YW5jZSwgd2hpY2ggaXMgdGhlIHNvdXJjZSBvZiBldmVudHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBOYW1lIG9mIGxpc3RlbmVyIChlLmcuIGBvbkNsaWNrYCkuXG4gKiBAcmV0dXJuIHs/ZnVuY3Rpb259IFRoZSBzdG9yZWQgY2FsbGJhY2suXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRMaXN0ZW5lcihpbnN0LCByZWdpc3RyYXRpb25OYW1lKSB7XG4gIHZhciBzdGF0ZU5vZGUgPSBpbnN0LnN0YXRlTm9kZTtcblxuICBpZiAoc3RhdGVOb2RlID09PSBudWxsKSB7XG4gICAgLy8gV29yayBpbiBwcm9ncmVzcyAoZXg6IG9ubG9hZCBldmVudHMgaW4gaW5jcmVtZW50YWwgbW9kZSkuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgcHJvcHMgPSBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlKHN0YXRlTm9kZSk7XG5cbiAgaWYgKHByb3BzID09PSBudWxsKSB7XG4gICAgLy8gV29yayBpbiBwcm9ncmVzcy5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lciA9IHByb3BzW3JlZ2lzdHJhdGlvbk5hbWVdO1xuXG4gIGlmIChzaG91bGRQcmV2ZW50TW91c2VFdmVudChyZWdpc3RyYXRpb25OYW1lLCBpbnN0LnR5cGUsIHByb3BzKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGxpc3RlbmVyICYmIHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGBcIiArIHJlZ2lzdHJhdGlvbk5hbWUgKyBcImAgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYSB2YWx1ZSBvZiBgXCIgKyB0eXBlb2YgbGlzdGVuZXIgKyBcImAgdHlwZS5cIik7XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXI7XG59XG5cbnZhciBwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCA9IGZhbHNlOyAvLyBDaGVjayBpZiBicm93c2VyIHN1cHBvcnQgZXZlbnRzIHdpdGggcGFzc2l2ZSBsaXN0ZW5lcnNcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FdmVudFRhcmdldC9hZGRFdmVudExpc3RlbmVyI1NhZmVseV9kZXRlY3Rpbmdfb3B0aW9uX3N1cHBvcnRcblxuaWYgKGNhblVzZURPTSkge1xuICB0cnkge1xuICAgIHZhciBvcHRpb25zID0ge307IC8vICRGbG93Rml4TWU6IElnbm9yZSBGbG93IGNvbXBsYWluaW5nIGFib3V0IG5lZWRpbmcgYSB2YWx1ZVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9wdGlvbnMsICdwYXNzaXZlJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0Jywgb3B0aW9ucywgb3B0aW9ucyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFja1Byb2QobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICB2YXIgZnVuY0FyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpO1xuXG4gIHRyeSB7XG4gICAgZnVuYy5hcHBseShjb250ZXh0LCBmdW5jQXJncyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgfVxufVxuXG52YXIgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCA9IGludm9rZUd1YXJkZWRDYWxsYmFja1Byb2Q7XG5cbntcbiAgLy8gSW4gREVWIG1vZGUsIHdlIHN3YXAgb3V0IGludm9rZUd1YXJkZWRDYWxsYmFjayBmb3IgYSBzcGVjaWFsIHZlcnNpb25cbiAgLy8gdGhhdCBwbGF5cyBtb3JlIG5pY2VseSB3aXRoIHRoZSBicm93c2VyJ3MgRGV2VG9vbHMuIFRoZSBpZGVhIGlzIHRvIHByZXNlcnZlXG4gIC8vIFwiUGF1c2Ugb24gZXhjZXB0aW9uc1wiIGJlaGF2aW9yLiBCZWNhdXNlIFJlYWN0IHdyYXBzIGFsbCB1c2VyLXByb3ZpZGVkXG4gIC8vIGZ1bmN0aW9ucyBpbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2ssIGFuZCB0aGUgcHJvZHVjdGlvbiB2ZXJzaW9uIG9mXG4gIC8vIGludm9rZUd1YXJkZWRDYWxsYmFjayB1c2VzIGEgdHJ5LWNhdGNoLCBhbGwgdXNlciBleGNlcHRpb25zIGFyZSB0cmVhdGVkXG4gIC8vIGxpa2UgY2F1Z2h0IGV4Y2VwdGlvbnMsIGFuZCB0aGUgRGV2VG9vbHMgd29uJ3QgcGF1c2UgdW5sZXNzIHRoZSBkZXZlbG9wZXJcbiAgLy8gdGFrZXMgdGhlIGV4dHJhIHN0ZXAgb2YgZW5hYmxpbmcgcGF1c2Ugb24gY2F1Z2h0IGV4Y2VwdGlvbnMuIFRoaXMgaXNcbiAgLy8gdW5pbnR1aXRpdmUsIHRob3VnaCwgYmVjYXVzZSBldmVuIHRob3VnaCBSZWFjdCBoYXMgY2F1Z2h0IHRoZSBlcnJvciwgZnJvbVxuICAvLyB0aGUgZGV2ZWxvcGVyJ3MgcGVyc3BlY3RpdmUsIHRoZSBlcnJvciBpcyB1bmNhdWdodC5cbiAgLy9cbiAgLy8gVG8gcHJlc2VydmUgdGhlIGV4cGVjdGVkIFwiUGF1c2Ugb24gZXhjZXB0aW9uc1wiIGJlaGF2aW9yLCB3ZSBkb24ndCB1c2UgYVxuICAvLyB0cnktY2F0Y2ggaW4gREVWLiBJbnN0ZWFkLCB3ZSBzeW5jaHJvbm91c2x5IGRpc3BhdGNoIGEgZmFrZSBldmVudCB0byBhIGZha2VcbiAgLy8gRE9NIG5vZGUsIGFuZCBjYWxsIHRoZSB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrIGZyb20gaW5zaWRlIGFuIGV2ZW50IGhhbmRsZXJcbiAgLy8gZm9yIHRoYXQgZmFrZSBldmVudC4gSWYgdGhlIGNhbGxiYWNrIHRocm93cywgdGhlIGVycm9yIGlzIFwiY2FwdHVyZWRcIiB1c2luZ1xuICAvLyBhIGdsb2JhbCBldmVudCBoYW5kbGVyLiBCdXQgYmVjYXVzZSB0aGUgZXJyb3IgaGFwcGVucyBpbiBhIGRpZmZlcmVudFxuICAvLyBldmVudCBsb29wIGNvbnRleHQsIGl0IGRvZXMgbm90IGludGVycnVwdCB0aGUgbm9ybWFsIHByb2dyYW0gZmxvdy5cbiAgLy8gRWZmZWN0aXZlbHksIHRoaXMgZ2l2ZXMgdXMgdHJ5LWNhdGNoIGJlaGF2aW9yIHdpdGhvdXQgYWN0dWFsbHkgdXNpbmdcbiAgLy8gdHJ5LWNhdGNoLiBOZWF0IVxuICAvLyBDaGVjayB0aGF0IHRoZSBicm93c2VyIHN1cHBvcnRzIHRoZSBBUElzIHdlIG5lZWQgdG8gaW1wbGVtZW50IG91ciBzcGVjaWFsXG4gIC8vIERFViB2ZXJzaW9uIG9mIGludm9rZUd1YXJkZWRDYWxsYmFja1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kaXNwYXRjaEV2ZW50ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGZha2VOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncmVhY3QnKTtcblxuICAgIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwgPSBmdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tEZXYobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICAgICAgLy8gSWYgZG9jdW1lbnQgZG9lc24ndCBleGlzdCB3ZSBrbm93IGZvciBzdXJlIHdlIHdpbGwgY3Jhc2ggaW4gdGhpcyBtZXRob2RcbiAgICAgIC8vIHdoZW4gd2UgY2FsbCBkb2N1bWVudC5jcmVhdGVFdmVudCgpLiBIb3dldmVyIHRoaXMgY2FuIGNhdXNlIGNvbmZ1c2luZ1xuICAgICAgLy8gZXJyb3JzOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svY3JlYXRlLXJlYWN0LWFwcC9pc3N1ZXMvMzQ4MlxuICAgICAgLy8gU28gd2UgcHJlZW1wdGl2ZWx5IHRocm93IHdpdGggYSBiZXR0ZXIgbWVzc2FnZSBpbnN0ZWFkLlxuICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgZG9jdW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYGRvY3VtZW50YCBnbG9iYWwgd2FzIGRlZmluZWQgd2hlbiBSZWFjdCB3YXMgaW5pdGlhbGl6ZWQsIGJ1dCBpcyBub3QgJyArICdkZWZpbmVkIGFueW1vcmUuIFRoaXMgY2FuIGhhcHBlbiBpbiBhIHRlc3QgZW52aXJvbm1lbnQgaWYgYSBjb21wb25lbnQgJyArICdzY2hlZHVsZXMgYW4gdXBkYXRlIGZyb20gYW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrLCBidXQgdGhlIHRlc3QgaGFzIGFscmVhZHkgJyArICdmaW5pc2hlZCBydW5uaW5nLiBUbyBzb2x2ZSB0aGlzLCB5b3UgY2FuIGVpdGhlciB1bm1vdW50IHRoZSBjb21wb25lbnQgYXQgJyArICd0aGUgZW5kIG9mIHlvdXIgdGVzdCAoYW5kIGVuc3VyZSB0aGF0IGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBnZXQgJyArICdjYW5jZWxlZCBpbiBgY29tcG9uZW50V2lsbFVubW91bnRgKSwgb3IgeW91IGNhbiBjaGFuZ2UgdGhlIHRlc3QgaXRzZWxmICcgKyAndG8gYmUgYXN5bmNocm9ub3VzLicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgICB2YXIgZGlkQ2FsbCA9IGZhbHNlOyAvLyBLZWVwcyB0cmFjayBvZiB3aGV0aGVyIHRoZSB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrIHRocmV3IGFuIGVycm9yLiBXZVxuICAgICAgLy8gc2V0IHRoaXMgdG8gdHJ1ZSBhdCB0aGUgYmVnaW5uaW5nLCB0aGVuIHNldCBpdCB0byBmYWxzZSByaWdodCBhZnRlclxuICAgICAgLy8gY2FsbGluZyB0aGUgZnVuY3Rpb24uIElmIHRoZSBmdW5jdGlvbiBlcnJvcnMsIGBkaWRFcnJvcmAgd2lsbCBuZXZlciBiZVxuICAgICAgLy8gc2V0IHRvIGZhbHNlLiBUaGlzIHN0cmF0ZWd5IHdvcmtzIGV2ZW4gaWYgdGhlIGJyb3dzZXIgaXMgZmxha3kgYW5kXG4gICAgICAvLyBmYWlscyB0byBjYWxsIG91ciBnbG9iYWwgZXJyb3IgaGFuZGxlciwgYmVjYXVzZSBpdCBkb2Vzbid0IHJlbHkgb25cbiAgICAgIC8vIHRoZSBlcnJvciBldmVudCBhdCBhbGwuXG5cbiAgICAgIHZhciBkaWRFcnJvciA9IHRydWU7IC8vIEtlZXBzIHRyYWNrIG9mIHRoZSB2YWx1ZSBvZiB3aW5kb3cuZXZlbnQgc28gdGhhdCB3ZSBjYW4gcmVzZXQgaXRcbiAgICAgIC8vIGR1cmluZyB0aGUgY2FsbGJhY2sgdG8gbGV0IHVzZXIgY29kZSBhY2Nlc3Mgd2luZG93LmV2ZW50IGluIHRoZVxuICAgICAgLy8gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IGl0LlxuXG4gICAgICB2YXIgd2luZG93RXZlbnQgPSB3aW5kb3cuZXZlbnQ7IC8vIEtlZXBzIHRyYWNrIG9mIHRoZSBkZXNjcmlwdG9yIG9mIHdpbmRvdy5ldmVudCB0byByZXN0b3JlIGl0IGFmdGVyIGV2ZW50XG4gICAgICAvLyBkaXNwYXRjaGluZzogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzY4OFxuXG4gICAgICB2YXIgd2luZG93RXZlbnREZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdldmVudCcpO1xuXG4gICAgICBmdW5jdGlvbiByZXN0b3JlQWZ0ZXJEaXNwYXRjaCgpIHtcbiAgICAgICAgLy8gV2UgaW1tZWRpYXRlbHkgcmVtb3ZlIHRoZSBjYWxsYmFjayBmcm9tIGV2ZW50IGxpc3RlbmVycyBzbyB0aGF0XG4gICAgICAgIC8vIG5lc3RlZCBgaW52b2tlR3VhcmRlZENhbGxiYWNrYCBjYWxscyBkbyBub3QgY2xhc2guIE90aGVyd2lzZSwgYVxuICAgICAgICAvLyBuZXN0ZWQgY2FsbCB3b3VsZCB0cmlnZ2VyIHRoZSBmYWtlIGV2ZW50IGhhbmRsZXJzIG9mIGFueSBjYWxsIGhpZ2hlclxuICAgICAgICAvLyBpbiB0aGUgc3RhY2suXG4gICAgICAgIGZha2VOb2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZ0VHlwZSwgY2FsbENhbGxiYWNrLCBmYWxzZSk7IC8vIFdlIGNoZWNrIGZvciB3aW5kb3cuaGFzT3duUHJvcGVydHkoJ2V2ZW50JykgdG8gcHJldmVudCB0aGVcbiAgICAgICAgLy8gd2luZG93LmV2ZW50IGFzc2lnbm1lbnQgaW4gYm90aCBJRSA8PSAxMCBhcyB0aGV5IHRocm93IGFuIGVycm9yXG4gICAgICAgIC8vIFwiTWVtYmVyIG5vdCBmb3VuZFwiIGluIHN0cmljdCBtb2RlLCBhbmQgaW4gRmlyZWZveCB3aGljaCBkb2VzIG5vdFxuICAgICAgICAvLyBzdXBwb3J0IHdpbmRvdy5ldmVudC5cblxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5ldmVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lmhhc093blByb3BlcnR5KCdldmVudCcpKSB7XG4gICAgICAgICAgd2luZG93LmV2ZW50ID0gd2luZG93RXZlbnQ7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gQ3JlYXRlIGFuIGV2ZW50IGhhbmRsZXIgZm9yIG91ciBmYWtlIGV2ZW50LiBXZSB3aWxsIHN5bmNocm9ub3VzbHlcbiAgICAgIC8vIGRpc3BhdGNoIG91ciBmYWtlIGV2ZW50IHVzaW5nIGBkaXNwYXRjaEV2ZW50YC4gSW5zaWRlIHRoZSBoYW5kbGVyLCB3ZVxuICAgICAgLy8gY2FsbCB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjay5cblxuXG4gICAgICB2YXIgZnVuY0FyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpO1xuXG4gICAgICBmdW5jdGlvbiBjYWxsQ2FsbGJhY2soKSB7XG4gICAgICAgIGRpZENhbGwgPSB0cnVlO1xuICAgICAgICByZXN0b3JlQWZ0ZXJEaXNwYXRjaCgpO1xuICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGZ1bmNBcmdzKTtcbiAgICAgICAgZGlkRXJyb3IgPSBmYWxzZTtcbiAgICAgIH0gLy8gQ3JlYXRlIGEgZ2xvYmFsIGVycm9yIGV2ZW50IGhhbmRsZXIuIFdlIHVzZSB0aGlzIHRvIGNhcHR1cmUgdGhlIHZhbHVlXG4gICAgICAvLyB0aGF0IHdhcyB0aHJvd24uIEl0J3MgcG9zc2libGUgdGhhdCB0aGlzIGVycm9yIGhhbmRsZXIgd2lsbCBmaXJlIG1vcmVcbiAgICAgIC8vIHRoYW4gb25jZTsgZm9yIGV4YW1wbGUsIGlmIG5vbi1SZWFjdCBjb2RlIGFsc28gY2FsbHMgYGRpc3BhdGNoRXZlbnRgXG4gICAgICAvLyBhbmQgYSBoYW5kbGVyIGZvciB0aGF0IGV2ZW50IHRocm93cy4gV2Ugc2hvdWxkIGJlIHJlc2lsaWVudCB0byBtb3N0IG9mXG4gICAgICAvLyB0aG9zZSBjYXNlcy4gRXZlbiBpZiBvdXIgZXJyb3IgZXZlbnQgaGFuZGxlciBmaXJlcyBtb3JlIHRoYW4gb25jZSwgdGhlXG4gICAgICAvLyBsYXN0IGVycm9yIGV2ZW50IGlzIGFsd2F5cyB1c2VkLiBJZiB0aGUgY2FsbGJhY2sgYWN0dWFsbHkgZG9lcyBlcnJvcixcbiAgICAgIC8vIHdlIGtub3cgdGhhdCB0aGUgbGFzdCBlcnJvciBldmVudCBpcyB0aGUgY29ycmVjdCBvbmUsIGJlY2F1c2UgaXQncyBub3RcbiAgICAgIC8vIHBvc3NpYmxlIGZvciBhbnl0aGluZyBlbHNlIHRvIGhhdmUgaGFwcGVuZWQgaW4gYmV0d2VlbiBvdXIgY2FsbGJhY2tcbiAgICAgIC8vIGVycm9yaW5nIGFuZCB0aGUgY29kZSB0aGF0IGZvbGxvd3MgdGhlIGBkaXNwYXRjaEV2ZW50YCBjYWxsIGJlbG93LiBJZlxuICAgICAgLy8gdGhlIGNhbGxiYWNrIGRvZXNuJ3QgZXJyb3IsIGJ1dCB0aGUgZXJyb3IgZXZlbnQgd2FzIGZpcmVkLCB3ZSBrbm93IHRvXG4gICAgICAvLyBpZ25vcmUgaXQgYmVjYXVzZSBgZGlkRXJyb3JgIHdpbGwgYmUgZmFsc2UsIGFzIGRlc2NyaWJlZCBhYm92ZS5cblxuXG4gICAgICB2YXIgZXJyb3I7IC8vIFVzZSB0aGlzIHRvIHRyYWNrIHdoZXRoZXIgdGhlIGVycm9yIGV2ZW50IGlzIGV2ZXIgY2FsbGVkLlxuXG4gICAgICB2YXIgZGlkU2V0RXJyb3IgPSBmYWxzZTtcbiAgICAgIHZhciBpc0Nyb3NzT3JpZ2luRXJyb3IgPSBmYWxzZTtcblxuICAgICAgZnVuY3Rpb24gaGFuZGxlV2luZG93RXJyb3IoZXZlbnQpIHtcbiAgICAgICAgZXJyb3IgPSBldmVudC5lcnJvcjtcbiAgICAgICAgZGlkU2V0RXJyb3IgPSB0cnVlO1xuXG4gICAgICAgIGlmIChlcnJvciA9PT0gbnVsbCAmJiBldmVudC5jb2xubyA9PT0gMCAmJiBldmVudC5saW5lbm8gPT09IDApIHtcbiAgICAgICAgICBpc0Nyb3NzT3JpZ2luRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAvLyBTb21lIG90aGVyIGVycm9yIGhhbmRsZXIgaGFzIHByZXZlbnRlZCBkZWZhdWx0LlxuICAgICAgICAgIC8vIEJyb3dzZXJzIHNpbGVuY2UgdGhlIGVycm9yIHJlcG9ydCBpZiB0aGlzIGhhcHBlbnMuXG4gICAgICAgICAgLy8gV2UnbGwgcmVtZW1iZXIgdGhpcyB0byBsYXRlciBkZWNpZGUgd2hldGhlciB0byBsb2cgaXQgb3Igbm90LlxuICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGVycm9yLl9zdXBwcmVzc0xvZ2dpbmcgPSB0cnVlO1xuICAgICAgICAgICAgfSBjYXRjaCAoaW5uZXIpIHsvLyBJZ25vcmUuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vIENyZWF0ZSBhIGZha2UgZXZlbnQgdHlwZS5cblxuXG4gICAgICB2YXIgZXZ0VHlwZSA9IFwicmVhY3QtXCIgKyAobmFtZSA/IG5hbWUgOiAnaW52b2tlZ3VhcmRlZGNhbGxiYWNrJyk7IC8vIEF0dGFjaCBvdXIgZXZlbnQgaGFuZGxlcnNcblxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgaGFuZGxlV2luZG93RXJyb3IpO1xuICAgICAgZmFrZU5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldnRUeXBlLCBjYWxsQ2FsbGJhY2ssIGZhbHNlKTsgLy8gU3luY2hyb25vdXNseSBkaXNwYXRjaCBvdXIgZmFrZSBldmVudC4gSWYgdGhlIHVzZXItcHJvdmlkZWQgZnVuY3Rpb25cbiAgICAgIC8vIGVycm9ycywgaXQgd2lsbCB0cmlnZ2VyIG91ciBnbG9iYWwgZXJyb3IgaGFuZGxlci5cblxuICAgICAgZXZ0LmluaXRFdmVudChldnRUeXBlLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgZmFrZU5vZGUuZGlzcGF0Y2hFdmVudChldnQpO1xuXG4gICAgICBpZiAod2luZG93RXZlbnREZXNjcmlwdG9yKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdldmVudCcsIHdpbmRvd0V2ZW50RGVzY3JpcHRvcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaWRDYWxsICYmIGRpZEVycm9yKSB7XG4gICAgICAgIGlmICghZGlkU2V0RXJyb3IpIHtcbiAgICAgICAgICAvLyBUaGUgY2FsbGJhY2sgZXJyb3JlZCwgYnV0IHRoZSBlcnJvciBldmVudCBuZXZlciBmaXJlZC5cbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKCdBbiBlcnJvciB3YXMgdGhyb3duIGluc2lkZSBvbmUgb2YgeW91ciBjb21wb25lbnRzLCBidXQgUmVhY3QgJyArIFwiZG9lc24ndCBrbm93IHdoYXQgaXQgd2FzLiBUaGlzIGlzIGxpa2VseSBkdWUgdG8gYnJvd3NlciBcIiArICdmbGFraW5lc3MuIFJlYWN0IGRvZXMgaXRzIGJlc3QgdG8gcHJlc2VydmUgdGhlIFwiUGF1c2Ugb24gJyArICdleGNlcHRpb25zXCIgYmVoYXZpb3Igb2YgdGhlIERldlRvb2xzLCB3aGljaCByZXF1aXJlcyBzb21lICcgKyBcIkRFVi1tb2RlIG9ubHkgdHJpY2tzLiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlc2UgZG9uJ3Qgd29yayBpbiBcIiArICd5b3VyIGJyb3dzZXIuIFRyeSB0cmlnZ2VyaW5nIHRoZSBlcnJvciBpbiBwcm9kdWN0aW9uIG1vZGUsICcgKyAnb3Igc3dpdGNoaW5nIHRvIGEgbW9kZXJuIGJyb3dzZXIuIElmIHlvdSBzdXNwZWN0IHRoYXQgdGhpcyBpcyAnICsgJ2FjdHVhbGx5IGFuIGlzc3VlIHdpdGggUmVhY3QsIHBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQ3Jvc3NPcmlnaW5FcnJvcikge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXCJBIGNyb3NzLW9yaWdpbiBlcnJvciB3YXMgdGhyb3duLiBSZWFjdCBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIFwiICsgJ3RoZSBhY3R1YWwgZXJyb3Igb2JqZWN0IGluIGRldmVsb3BtZW50LiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY3Jvc3NvcmlnaW4tZXJyb3IgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgfSAvLyBSZW1vdmUgb3VyIGV2ZW50IGxpc3RlbmVyc1xuXG5cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGhhbmRsZVdpbmRvd0Vycm9yKTtcblxuICAgICAgaWYgKCFkaWRDYWxsKSB7XG4gICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHJlYWxseSB3cm9uZywgYW5kIG91ciBldmVudCB3YXMgbm90IGRpc3BhdGNoZWQuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY3MzRcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjU4NVxuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIHByb2R1Y3Rpb24gaW1wbGVtZW50YXRpb24uXG4gICAgICAgIHJlc3RvcmVBZnRlckRpc3BhdGNoKCk7XG4gICAgICAgIHJldHVybiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG52YXIgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxID0gaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbDtcblxudmFyIGhhc0Vycm9yID0gZmFsc2U7XG52YXIgY2F1Z2h0RXJyb3IgPSBudWxsOyAvLyBVc2VkIGJ5IGV2ZW50IHN5c3RlbSB0byBjYXB0dXJlL3JldGhyb3cgdGhlIGZpcnN0IGVycm9yLlxuXG52YXIgaGFzUmV0aHJvd0Vycm9yID0gZmFsc2U7XG52YXIgcmV0aHJvd0Vycm9yID0gbnVsbDtcbnZhciByZXBvcnRlciA9IHtcbiAgb25FcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gIH1cbn07XG4vKipcbiAqIENhbGwgYSBmdW5jdGlvbiB3aGlsZSBndWFyZGluZyBhZ2FpbnN0IGVycm9ycyB0aGF0IGhhcHBlbnMgd2l0aGluIGl0LlxuICogUmV0dXJucyBhbiBlcnJvciBpZiBpdCB0aHJvd3MsIG90aGVyd2lzZSBudWxsLlxuICpcbiAqIEluIHByb2R1Y3Rpb24sIHRoaXMgaXMgaW1wbGVtZW50ZWQgdXNpbmcgYSB0cnktY2F0Y2guIFRoZSByZWFzb24gd2UgZG9uJ3RcbiAqIHVzZSBhIHRyeS1jYXRjaCBkaXJlY3RseSBpcyBzbyB0aGF0IHdlIGNhbiBzd2FwIG91dCBhIGRpZmZlcmVudFxuICogaW1wbGVtZW50YXRpb24gaW4gREVWIG1vZGUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgdGhlIGd1YXJkIHRvIHVzZSBmb3IgbG9nZ2luZyBvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZVxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIHVzZSB3aGVuIGNhbGxpbmcgdGhlIGZ1bmN0aW9uXG4gKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJndW1lbnRzIGZvciBmdW5jdGlvblxuICovXG5cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFjayhuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGhhc0Vycm9yID0gZmFsc2U7XG4gIGNhdWdodEVycm9yID0gbnVsbDtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxLmFwcGx5KHJlcG9ydGVyLCBhcmd1bWVudHMpO1xufVxuLyoqXG4gKiBTYW1lIGFzIGludm9rZUd1YXJkZWRDYWxsYmFjaywgYnV0IGluc3RlYWQgb2YgcmV0dXJuaW5nIGFuIGVycm9yLCBpdCBzdG9yZXNcbiAqIGl0IGluIGEgZ2xvYmFsIHNvIGl0IGNhbiBiZSByZXRocm93biBieSBgcmV0aHJvd0NhdWdodEVycm9yYCBsYXRlci5cbiAqIFRPRE86IFNlZSBpZiBjYXVnaHRFcnJvciBhbmQgcmV0aHJvd0Vycm9yIGNhbiBiZSB1bmlmaWVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9mIHRoZSBndWFyZCB0byB1c2UgZm9yIGxvZ2dpbmcgb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2VcbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byB1c2Ugd2hlbiBjYWxsaW5nIHRoZSBmdW5jdGlvblxuICogQHBhcmFtIHsuLi4qfSBhcmdzIEFyZ3VtZW50cyBmb3IgZnVuY3Rpb25cbiAqL1xuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tBbmRDYXRjaEZpcnN0RXJyb3IobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICBpZiAoaGFzRXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG5cbiAgICBpZiAoIWhhc1JldGhyb3dFcnJvcikge1xuICAgICAgaGFzUmV0aHJvd0Vycm9yID0gdHJ1ZTtcbiAgICAgIHJldGhyb3dFcnJvciA9IGVycm9yO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBEdXJpbmcgZXhlY3V0aW9uIG9mIGd1YXJkZWQgZnVuY3Rpb25zIHdlIHdpbGwgY2FwdHVyZSB0aGUgZmlyc3QgZXJyb3Igd2hpY2hcbiAqIHdlIHdpbGwgcmV0aHJvdyB0byBiZSBoYW5kbGVkIGJ5IHRoZSB0b3AgbGV2ZWwgZXJyb3IgaGFuZGxlci5cbiAqL1xuXG5mdW5jdGlvbiByZXRocm93Q2F1Z2h0RXJyb3IoKSB7XG4gIGlmIChoYXNSZXRocm93RXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSByZXRocm93RXJyb3I7XG4gICAgaGFzUmV0aHJvd0Vycm9yID0gZmFsc2U7XG4gICAgcmV0aHJvd0Vycm9yID0gbnVsbDtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuZnVuY3Rpb24gaGFzQ2F1Z2h0RXJyb3IoKSB7XG4gIHJldHVybiBoYXNFcnJvcjtcbn1cbmZ1bmN0aW9uIGNsZWFyQ2F1Z2h0RXJyb3IoKSB7XG4gIGlmIChoYXNFcnJvcikge1xuICAgIHZhciBlcnJvciA9IGNhdWdodEVycm9yO1xuICAgIGhhc0Vycm9yID0gZmFsc2U7XG4gICAgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICAgIHJldHVybiBlcnJvcjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyQ2F1Z2h0RXJyb3Igd2FzIGNhbGxlZCBidXQgbm8gZXJyb3Igd2FzIGNhcHR1cmVkLiBUaGlzIGVycm9yICcgKyAnaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBgUmVhY3RJbnN0YW5jZU1hcGAgbWFpbnRhaW5zIGEgbWFwcGluZyBmcm9tIGEgcHVibGljIGZhY2luZyBzdGF0ZWZ1bFxuICogaW5zdGFuY2UgKGtleSkgYW5kIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAodmFsdWUpLiBUaGlzIGFsbG93cyBwdWJsaWNcbiAqIG1ldGhvZHMgdG8gYWNjZXB0IHRoZSB1c2VyIGZhY2luZyBpbnN0YW5jZSBhcyBhbiBhcmd1bWVudCBhbmQgbWFwIHRoZW0gYmFja1xuICogdG8gaW50ZXJuYWwgbWV0aG9kcy5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBtb2R1bGUgaXMgY3VycmVudGx5IHNoYXJlZCBhbmQgYXNzdW1lZCB0byBiZSBzdGF0ZWxlc3MuXG4gKiBJZiB0aGlzIGJlY29tZXMgYW4gYWN0dWFsIE1hcCwgdGhhdCB3aWxsIGJyZWFrLlxuICovXG5mdW5jdGlvbiBnZXQoa2V5KSB7XG4gIHJldHVybiBrZXkuX3JlYWN0SW50ZXJuYWxzO1xufVxuZnVuY3Rpb24gaGFzKGtleSkge1xuICByZXR1cm4ga2V5Ll9yZWFjdEludGVybmFscyAhPT0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAga2V5Ll9yZWFjdEludGVybmFscyA9IHZhbHVlO1xufVxuXG4vLyBEb24ndCBjaGFuZ2UgdGhlc2UgdHdvIHZhbHVlcy4gVGhleSdyZSB1c2VkIGJ5IFJlYWN0IERldiBUb29scy5cbnZhciBOb0ZsYWdzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG4wO1xudmFyIFBlcmZvcm1lZFdvcmsgPVxuLyogICAgICAgICAgICAgICAgKi9cbjE7IC8vIFlvdSBjYW4gY2hhbmdlIHRoZSByZXN0IChhbmQgYWRkIG1vcmUpLlxuXG52YXIgUGxhY2VtZW50ID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuMjtcbnZhciBVcGRhdGUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG40O1xudmFyIENoaWxkRGVsZXRpb24gPVxuLyogICAgICAgICAgICAgICAgKi9cbjE2O1xudmFyIENvbnRlbnRSZXNldCA9XG4vKiAgICAgICAgICAgICAgICAgKi9cbjMyO1xudmFyIENhbGxiYWNrID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjY0O1xudmFyIERpZENhcHR1cmUgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjEyODtcbnZhciBGb3JjZUNsaWVudFJlbmRlciA9XG4vKiAgICAgICAgICAgICovXG4yNTY7XG52YXIgUmVmID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuNTEyO1xudmFyIFNuYXBzaG90ID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjEwMjQ7XG52YXIgUGFzc2l2ZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuMjA0ODtcbnZhciBIeWRyYXRpbmcgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG40MDk2O1xudmFyIFZpc2liaWxpdHkgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjgxOTI7XG52YXIgU3RvcmVDb25zaXN0ZW5jeSA9XG4vKiAgICAgICAgICAgICAqL1xuMTYzODQ7XG52YXIgTGlmZWN5Y2xlRWZmZWN0TWFzayA9IFBhc3NpdmUgfCBVcGRhdGUgfCBDYWxsYmFjayB8IFJlZiB8IFNuYXBzaG90IHwgU3RvcmVDb25zaXN0ZW5jeTsgLy8gVW5pb24gb2YgYWxsIGNvbW1pdCBmbGFncyAoZmxhZ3Mgd2l0aCB0aGUgbGlmZXRpbWUgb2YgYSBwYXJ0aWN1bGFyIGNvbW1pdClcblxudmFyIEhvc3RFZmZlY3RNYXNrID1cbi8qICAgICAgICAgICAgICAgKi9cbjMyNzY3OyAvLyBUaGVzZSBhcmUgbm90IHJlYWxseSBzaWRlIGVmZmVjdHMsIGJ1dCB3ZSBzdGlsbCByZXVzZSB0aGlzIGZpZWxkLlxuXG52YXIgSW5jb21wbGV0ZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuMzI3Njg7XG52YXIgU2hvdWxkQ2FwdHVyZSA9XG4vKiAgICAgICAgICAgICAgICAqL1xuNjU1MzY7XG52YXIgRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZSA9XG4vKiAqL1xuMTMxMDcyO1xudmFyIEZvcmtlZCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEwNDg1NzY7IC8vIFN0YXRpYyB0YWdzIGRlc2NyaWJlIGFzcGVjdHMgb2YgYSBmaWJlciB0aGF0IGFyZSBub3Qgc3BlY2lmaWMgdG8gYSByZW5kZXIsXG4vLyBlLmcuIGEgZmliZXIgdXNlcyBhIHBhc3NpdmUgZWZmZWN0IChldmVuIGlmIHRoZXJlIGFyZSBubyB1cGRhdGVzIG9uIHRoaXMgcGFydGljdWxhciByZW5kZXIpLlxuLy8gVGhpcyBlbmFibGVzIHVzIHRvIGRlZmVyIG1vcmUgd29yayBpbiB0aGUgdW5tb3VudCBjYXNlLFxuLy8gc2luY2Ugd2UgY2FuIGRlZmVyIHRyYXZlcnNpbmcgdGhlIHRyZWUgZHVyaW5nIGxheW91dCB0byBsb29rIGZvciBQYXNzaXZlIGVmZmVjdHMsXG4vLyBhbmQgaW5zdGVhZCByZWx5IG9uIHRoZSBzdGF0aWMgZmxhZyBhcyBhIHNpZ25hbCB0aGF0IHRoZXJlIG1heSBiZSBjbGVhbnVwIHdvcmsuXG5cbnZhciBSZWZTdGF0aWMgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG4yMDk3MTUyO1xudmFyIExheW91dFN0YXRpYyA9XG4vKiAgICAgICAgICAgICAgICAgKi9cbjQxOTQzMDQ7XG52YXIgUGFzc2l2ZVN0YXRpYyA9XG4vKiAgICAgICAgICAgICAgICAqL1xuODM4ODYwODsgLy8gVGhlc2UgZmxhZ3MgYWxsb3cgdXMgdG8gdHJhdmVyc2UgdG8gZmliZXJzIHRoYXQgaGF2ZSBlZmZlY3RzIG9uIG1vdW50XG4vLyB3aXRob3V0IHRyYXZlcnNpbmcgdGhlIGVudGlyZSB0cmVlIGFmdGVyIGV2ZXJ5IGNvbW1pdCBmb3Jcbi8vIGRvdWJsZSBpbnZva2luZ1xuXG52YXIgTW91bnRMYXlvdXREZXYgPVxuLyogICAgICAgICAgICAgICAqL1xuMTY3NzcyMTY7XG52YXIgTW91bnRQYXNzaXZlRGV2ID1cbi8qICAgICAgICAgICAgICAqL1xuMzM1NTQ0MzI7IC8vIEdyb3VwcyBvZiBmbGFncyB0aGF0IGFyZSB1c2VkIGluIHRoZSBjb21taXQgcGhhc2UgdG8gc2tpcCBvdmVyIHRyZWVzIHRoYXRcbi8vIGRvbid0IGNvbnRhaW4gZWZmZWN0cywgYnkgY2hlY2tpbmcgc3VidHJlZUZsYWdzLlxuXG52YXIgQmVmb3JlTXV0YXRpb25NYXNrID0gLy8gVE9ETzogUmVtb3ZlIFVwZGF0ZSBmbGFnIGZyb20gYmVmb3JlIG11dGF0aW9uIHBoYXNlIGJ5IHJlLWxhbmRpbmcgVmlzaWJpbGl0eVxuLy8gZmxhZyBsb2dpYyAoc2VlICMyMDA0MylcblVwZGF0ZSB8IFNuYXBzaG90IHwgKCAwKTtcbnZhciBNdXRhdGlvbk1hc2sgPSBQbGFjZW1lbnQgfCBVcGRhdGUgfCBDaGlsZERlbGV0aW9uIHwgQ29udGVudFJlc2V0IHwgUmVmIHwgSHlkcmF0aW5nIHwgVmlzaWJpbGl0eTtcbnZhciBMYXlvdXRNYXNrID0gVXBkYXRlIHwgQ2FsbGJhY2sgfCBSZWYgfCBWaXNpYmlsaXR5OyAvLyBUT0RPOiBTcGxpdCBpbnRvIFBhc3NpdmVNb3VudE1hc2sgYW5kIFBhc3NpdmVVbm1vdW50TWFza1xuXG52YXIgUGFzc2l2ZU1hc2sgPSBQYXNzaXZlIHwgQ2hpbGREZWxldGlvbjsgLy8gVW5pb24gb2YgdGFncyB0aGF0IGRvbid0IGdldCByZXNldCBvbiBjbG9uZXMuXG4vLyBUaGlzIGFsbG93cyBjZXJ0YWluIGNvbmNlcHRzIHRvIHBlcnNpc3Qgd2l0aG91dCByZWNhbGN1bGF0aW5nIHRoZW0sXG4vLyBlLmcuIHdoZXRoZXIgYSBzdWJ0cmVlIGNvbnRhaW5zIHBhc3NpdmUgZWZmZWN0cyBvciBwb3J0YWxzLlxuXG52YXIgU3RhdGljTWFzayA9IExheW91dFN0YXRpYyB8IFBhc3NpdmVTdGF0aWMgfCBSZWZTdGF0aWM7XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xuZnVuY3Rpb24gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikge1xuICB2YXIgbm9kZSA9IGZpYmVyO1xuICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBmaWJlcjtcblxuICBpZiAoIWZpYmVyLmFsdGVybmF0ZSkge1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIGFsdGVybmF0ZSwgdGhpcyBtaWdodCBiZSBhIG5ldyB0cmVlIHRoYXQgaXNuJ3QgaW5zZXJ0ZWRcbiAgICAvLyB5ZXQuIElmIGl0IGlzLCB0aGVuIGl0IHdpbGwgaGF2ZSBhIHBlbmRpbmcgaW5zZXJ0aW9uIGVmZmVjdCBvbiBpdC5cbiAgICB2YXIgbmV4dE5vZGUgPSBub2RlO1xuXG4gICAgZG8ge1xuICAgICAgbm9kZSA9IG5leHROb2RlO1xuXG4gICAgICBpZiAoKG5vZGUuZmxhZ3MgJiAoUGxhY2VtZW50IHwgSHlkcmF0aW5nKSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhbiBpbnNlcnRpb24gb3IgaW4tcHJvZ3Jlc3MgaHlkcmF0aW9uLiBUaGUgbmVhcmVzdCBwb3NzaWJsZVxuICAgICAgICAvLyBtb3VudGVkIGZpYmVyIGlzIHRoZSBwYXJlbnQgYnV0IHdlIG5lZWQgdG8gY29udGludWUgdG8gZmlndXJlIG91dFxuICAgICAgICAvLyBpZiB0aGF0IG9uZSBpcyBzdGlsbCBtb3VudGVkLlxuICAgICAgICBuZWFyZXN0TW91bnRlZCA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBuZXh0Tm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH0gd2hpbGUgKG5leHROb2RlKTtcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAobm9kZS5yZXR1cm4pIHtcbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAobm9kZS50YWcgPT09IEhvc3RSb290KSB7XG4gICAgLy8gVE9ETzogQ2hlY2sgaWYgdGhpcyB3YXMgYSBuZXN0ZWQgSG9zdFJvb3Qgd2hlbiB1c2VkIHdpdGhcbiAgICAvLyByZW5kZXJDb250YWluZXJJbnRvU3VidHJlZS5cbiAgICByZXR1cm4gbmVhcmVzdE1vdW50ZWQ7XG4gIH0gLy8gSWYgd2UgZGlkbid0IGhpdCB0aGUgcm9vdCwgdGhhdCBtZWFucyB0aGF0IHdlJ3JlIGluIGFuIGRpc2Nvbm5lY3RlZCB0cmVlXG4gIC8vIHRoYXQgaGFzIGJlZW4gdW5tb3VudGVkLlxuXG5cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKGZpYmVyKSB7XG4gIGlmIChmaWJlci50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHN1c3BlbnNlU3RhdGUgPT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICBzdXNwZW5zZVN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ2V0Q29udGFpbmVyRnJvbUZpYmVyKGZpYmVyKSB7XG4gIHJldHVybiBmaWJlci50YWcgPT09IEhvc3RSb290ID8gZmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8gOiBudWxsO1xufVxuZnVuY3Rpb24gaXNGaWJlck1vdW50ZWQoZmliZXIpIHtcbiAgcmV0dXJuIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpID09PSBmaWJlcjtcbn1cbmZ1bmN0aW9uIGlzTW91bnRlZChjb21wb25lbnQpIHtcbiAge1xuICAgIHZhciBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ7XG5cbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgb3duZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgdmFyIG93bmVyRmliZXIgPSBvd25lcjtcbiAgICAgIHZhciBpbnN0YW5jZSA9IG93bmVyRmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICBpZiAoIWluc3RhbmNlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlcikge1xuICAgICAgICBlcnJvcignJXMgaXMgYWNjZXNzaW5nIGlzTW91bnRlZCBpbnNpZGUgaXRzIHJlbmRlcigpIGZ1bmN0aW9uLiAnICsgJ3JlbmRlcigpIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLiBJdCBzaG91bGQgJyArICduZXZlciBhY2Nlc3Mgc29tZXRoaW5nIHRoYXQgcmVxdWlyZXMgc3RhbGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyAnICsgJ3JlbmRlciwgc3VjaCBhcyByZWZzLiBNb3ZlIHRoaXMgbG9naWMgdG8gY29tcG9uZW50RGlkTW91bnQgYW5kICcgKyAnY29tcG9uZW50RGlkVXBkYXRlIGluc3RlYWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihvd25lckZpYmVyKSB8fCAnQSBjb21wb25lbnQnKTtcbiAgICAgIH1cblxuICAgICAgaW5zdGFuY2UuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQoY29tcG9uZW50KTtcblxuICBpZiAoIWZpYmVyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpID09PSBmaWJlcjtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0SXNNb3VudGVkKGZpYmVyKSB7XG4gIGlmIChnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSAhPT0gZmliZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChmaWJlcikge1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmICghYWx0ZXJuYXRlKSB7XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gYWx0ZXJuYXRlLCB0aGVuIHdlIG9ubHkgbmVlZCB0byBjaGVjayBpZiBpdCBpcyBtb3VudGVkLlxuICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgICB9XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgIT09IGZpYmVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmliZXI7XG4gIH0gLy8gSWYgd2UgaGF2ZSB0d28gcG9zc2libGUgYnJhbmNoZXMsIHdlJ2xsIHdhbGsgYmFja3dhcmRzIHVwIHRvIHRoZSByb290XG4gIC8vIHRvIHNlZSB3aGF0IHBhdGggdGhlIHJvb3QgcG9pbnRzIHRvLiBPbiB0aGUgd2F5IHdlIG1heSBoaXQgb25lIG9mIHRoZVxuICAvLyBzcGVjaWFsIGNhc2VzIGFuZCB3ZSdsbCBkZWFsIHdpdGggdGhlbS5cblxuXG4gIHZhciBhID0gZmliZXI7XG4gIHZhciBiID0gYWx0ZXJuYXRlO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIHBhcmVudEEgPSBhLnJldHVybjtcblxuICAgIGlmIChwYXJlbnRBID09PSBudWxsKSB7XG4gICAgICAvLyBXZSdyZSBhdCB0aGUgcm9vdC5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBwYXJlbnRCID0gcGFyZW50QS5hbHRlcm5hdGU7XG5cbiAgICBpZiAocGFyZW50QiA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhlcmUgaXMgbm8gYWx0ZXJuYXRlLiBUaGlzIGlzIGFuIHVudXN1YWwgY2FzZS4gQ3VycmVudGx5LCBpdCBvbmx5XG4gICAgICAvLyBoYXBwZW5zIHdoZW4gYSBTdXNwZW5zZSBjb21wb25lbnQgaXMgaGlkZGVuLiBBbiBleHRyYSBmcmFnbWVudCBmaWJlclxuICAgICAgLy8gaXMgaW5zZXJ0ZWQgaW4gYmV0d2VlbiB0aGUgU3VzcGVuc2UgZmliZXIgYW5kIGl0cyBjaGlsZHJlbi4gU2tpcFxuICAgICAgLy8gb3ZlciB0aGlzIGV4dHJhIGZyYWdtZW50IGZpYmVyIGFuZCBwcm9jZWVkIHRvIHRoZSBuZXh0IHBhcmVudC5cbiAgICAgIHZhciBuZXh0UGFyZW50ID0gcGFyZW50QS5yZXR1cm47XG5cbiAgICAgIGlmIChuZXh0UGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIGEgPSBiID0gbmV4dFBhcmVudDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIElmIHRoZXJlJ3Mgbm8gcGFyZW50LCB3ZSdyZSBhdCB0aGUgcm9vdC5cblxuXG4gICAgICBicmVhaztcbiAgICB9IC8vIElmIGJvdGggY29waWVzIG9mIHRoZSBwYXJlbnQgZmliZXIgcG9pbnQgdG8gdGhlIHNhbWUgY2hpbGQsIHdlIGNhblxuICAgIC8vIGFzc3VtZSB0aGF0IHRoZSBjaGlsZCBpcyBjdXJyZW50LiBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBiYWlsb3V0IG9uIGxvd1xuICAgIC8vIHByaW9yaXR5OiB0aGUgYmFpbGVkIG91dCBmaWJlcidzIGNoaWxkIHJldXNlcyB0aGUgY3VycmVudCBjaGlsZC5cblxuXG4gICAgaWYgKHBhcmVudEEuY2hpbGQgPT09IHBhcmVudEIuY2hpbGQpIHtcbiAgICAgIHZhciBjaGlsZCA9IHBhcmVudEEuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgICBpZiAoY2hpbGQgPT09IGEpIHtcbiAgICAgICAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQSBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgICAgICAgYXNzZXJ0SXNNb3VudGVkKHBhcmVudEEpO1xuICAgICAgICAgIHJldHVybiBmaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGlsZCA9PT0gYikge1xuICAgICAgICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBCIGlzIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgICAgICAgICBhc3NlcnRJc01vdW50ZWQocGFyZW50QSk7XG4gICAgICAgICAgcmV0dXJuIGFsdGVybmF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgIH0gLy8gV2Ugc2hvdWxkIG5ldmVyIGhhdmUgYW4gYWx0ZXJuYXRlIGZvciBhbnkgbW91bnRpbmcgbm9kZS4gU28gdGhlIG9ubHlcbiAgICAgIC8vIHdheSB0aGlzIGNvdWxkIHBvc3NpYmx5IGhhcHBlbiBpcyBpZiB0aGlzIHdhcyB1bm1vdW50ZWQsIGlmIGF0IGFsbC5cblxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgICB9XG5cbiAgICBpZiAoYS5yZXR1cm4gIT09IGIucmV0dXJuKSB7XG4gICAgICAvLyBUaGUgcmV0dXJuIHBvaW50ZXIgb2YgQSBhbmQgdGhlIHJldHVybiBwb2ludGVyIG9mIEIgcG9pbnQgdG8gZGlmZmVyZW50XG4gICAgICAvLyBmaWJlcnMuIFdlIGFzc3VtZSB0aGF0IHJldHVybiBwb2ludGVycyBuZXZlciBjcmlzcy1jcm9zcywgc28gQSBtdXN0XG4gICAgICAvLyBiZWxvbmcgdG8gdGhlIGNoaWxkIHNldCBvZiBBLnJldHVybiwgYW5kIEIgbXVzdCBiZWxvbmcgdG8gdGhlIGNoaWxkXG4gICAgICAvLyBzZXQgb2YgQi5yZXR1cm4uXG4gICAgICBhID0gcGFyZW50QTtcbiAgICAgIGIgPSBwYXJlbnRCO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgcmV0dXJuIHBvaW50ZXJzIHBvaW50IHRvIHRoZSBzYW1lIGZpYmVyLiBXZSdsbCBoYXZlIHRvIHVzZSB0aGVcbiAgICAgIC8vIGRlZmF1bHQsIHNsb3cgcGF0aDogc2NhbiB0aGUgY2hpbGQgc2V0cyBvZiBlYWNoIHBhcmVudCBhbHRlcm5hdGUgdG8gc2VlXG4gICAgICAvLyB3aGljaCBjaGlsZCBiZWxvbmdzIHRvIHdoaWNoIHNldC5cbiAgICAgIC8vXG4gICAgICAvLyBTZWFyY2ggcGFyZW50IEEncyBjaGlsZCBzZXRcbiAgICAgIHZhciBkaWRGaW5kQ2hpbGQgPSBmYWxzZTtcbiAgICAgIHZhciBfY2hpbGQgPSBwYXJlbnRBLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoX2NoaWxkKSB7XG4gICAgICAgIGlmIChfY2hpbGQgPT09IGEpIHtcbiAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgIGEgPSBwYXJlbnRBO1xuICAgICAgICAgIGIgPSBwYXJlbnRCO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF9jaGlsZCA9PT0gYikge1xuICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgYiA9IHBhcmVudEE7XG4gICAgICAgICAgYSA9IHBhcmVudEI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBfY2hpbGQgPSBfY2hpbGQuc2libGluZztcbiAgICAgIH1cblxuICAgICAgaWYgKCFkaWRGaW5kQ2hpbGQpIHtcbiAgICAgICAgLy8gU2VhcmNoIHBhcmVudCBCJ3MgY2hpbGQgc2V0XG4gICAgICAgIF9jaGlsZCA9IHBhcmVudEIuY2hpbGQ7XG5cbiAgICAgICAgd2hpbGUgKF9jaGlsZCkge1xuICAgICAgICAgIGlmIChfY2hpbGQgPT09IGEpIHtcbiAgICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgICBhID0gcGFyZW50QjtcbiAgICAgICAgICAgIGIgPSBwYXJlbnRBO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF9jaGlsZCA9PT0gYikge1xuICAgICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICAgIGIgPSBwYXJlbnRCO1xuICAgICAgICAgICAgYSA9IHBhcmVudEE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfY2hpbGQgPSBfY2hpbGQuc2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGlkRmluZENoaWxkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaGlsZCB3YXMgbm90IGZvdW5kIGluIGVpdGhlciBwYXJlbnQgc2V0LiBUaGlzIGluZGljYXRlcyBhIGJ1ZyAnICsgJ2luIFJlYWN0IHJlbGF0ZWQgdG8gdGhlIHJldHVybiBwb2ludGVyLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhLmFsdGVybmF0ZSAhPT0gYikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmV0dXJuIGZpYmVycyBzaG91bGQgYWx3YXlzIGJlIGVhY2ggb3RoZXJzJyBhbHRlcm5hdGVzLiBcIiArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfSAvLyBJZiB0aGUgcm9vdCBpcyBub3QgYSBob3N0IGNvbnRhaW5lciwgd2UncmUgaW4gYSBkaXNjb25uZWN0ZWQgdHJlZS4gSS5lLlxuICAvLyB1bm1vdW50ZWQuXG5cblxuICBpZiAoYS50YWcgIT09IEhvc3RSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gIH1cblxuICBpZiAoYS5zdGF0ZU5vZGUuY3VycmVudCA9PT0gYSkge1xuICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBBIGlzIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgICByZXR1cm4gZmliZXI7XG4gIH0gLy8gT3RoZXJ3aXNlIEIgaGFzIHRvIGJlIGN1cnJlbnQgYnJhbmNoLlxuXG5cbiAgcmV0dXJuIGFsdGVybmF0ZTtcbn1cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyKHBhcmVudCkge1xuICB2YXIgY3VycmVudFBhcmVudCA9IGZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoKHBhcmVudCk7XG4gIHJldHVybiBjdXJyZW50UGFyZW50ICE9PSBudWxsID8gZmluZEN1cnJlbnRIb3N0RmliZXJJbXBsKGN1cnJlbnRQYXJlbnQpIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRIb3N0RmliZXJJbXBsKG5vZGUpIHtcbiAgLy8gTmV4dCB3ZSdsbCBkcmlsbCBkb3duIHRoaXMgY29tcG9uZW50IHRvIGZpbmQgdGhlIGZpcnN0IEhvc3RDb21wb25lbnQvVGV4dC5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICB2YXIgbWF0Y2ggPSBmaW5kQ3VycmVudEhvc3RGaWJlckltcGwoY2hpbGQpO1xuXG4gICAgaWYgKG1hdGNoICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfVxuXG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFscyhwYXJlbnQpIHtcbiAgdmFyIGN1cnJlbnRQYXJlbnQgPSBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChwYXJlbnQpO1xuICByZXR1cm4gY3VycmVudFBhcmVudCAhPT0gbnVsbCA/IGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFsc0ltcGwoY3VycmVudFBhcmVudCkgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHNJbXBsKG5vZGUpIHtcbiAgLy8gTmV4dCB3ZSdsbCBkcmlsbCBkb3duIHRoaXMgY29tcG9uZW50IHRvIGZpbmQgdGhlIGZpcnN0IEhvc3RDb21wb25lbnQvVGV4dC5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICBpZiAoY2hpbGQudGFnICE9PSBIb3N0UG9ydGFsKSB7XG4gICAgICB2YXIgbWF0Y2ggPSBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHNJbXBsKGNoaWxkKTtcblxuICAgICAgaWYgKG1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gVGhpcyBtb2R1bGUgb25seSBleGlzdHMgYXMgYW4gRVNNIHdyYXBwZXIgYXJvdW5kIHRoZSBleHRlcm5hbCBDb21tb25KU1xudmFyIHNjaGVkdWxlQ2FsbGJhY2sgPSBTY2hlZHVsZXIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaztcbnZhciBjYW5jZWxDYWxsYmFjayA9IFNjaGVkdWxlci51bnN0YWJsZV9jYW5jZWxDYWxsYmFjaztcbnZhciBzaG91bGRZaWVsZCA9IFNjaGVkdWxlci51bnN0YWJsZV9zaG91bGRZaWVsZDtcbnZhciByZXF1ZXN0UGFpbnQgPSBTY2hlZHVsZXIudW5zdGFibGVfcmVxdWVzdFBhaW50O1xudmFyIG5vdyA9IFNjaGVkdWxlci51bnN0YWJsZV9ub3c7XG52YXIgZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSBTY2hlZHVsZXIudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWw7XG52YXIgSW1tZWRpYXRlUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHk7XG52YXIgVXNlckJsb2NraW5nUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHk7XG52YXIgTm9ybWFsUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHk7XG52YXIgTG93UHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfTG93UHJpb3JpdHk7XG52YXIgSWRsZVByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0lkbGVQcmlvcml0eTtcbi8vIHRoaXMgZG9lc24ndCBhY3R1YWxseSBleGlzdCBvbiB0aGUgc2NoZWR1bGVyLCBidXQgaXQgKmRvZXMqXG4vLyBvbiBzY2hlZHVsZXIvdW5zdGFibGVfbW9jaywgd2hpY2ggd2UnbGwgbmVlZCBmb3IgaW50ZXJuYWwgdGVzdGluZ1xudmFyIHVuc3RhYmxlX3lpZWxkVmFsdWUgPSBTY2hlZHVsZXIudW5zdGFibGVfeWllbGRWYWx1ZTtcbnZhciB1bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZSA9IFNjaGVkdWxlci51bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZTtcblxudmFyIHJlbmRlcmVySUQgPSBudWxsO1xudmFyIGluamVjdGVkSG9vayA9IG51bGw7XG52YXIgaW5qZWN0ZWRQcm9maWxpbmdIb29rcyA9IG51bGw7XG52YXIgaGFzTG9nZ2VkRXJyb3IgPSBmYWxzZTtcbnZhciBpc0RldlRvb2xzUHJlc2VudCA9IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnO1xuZnVuY3Rpb24gaW5qZWN0SW50ZXJuYWxzKGludGVybmFscykge1xuICBpZiAodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBObyBEZXZUb29sc1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBob29rID0gX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fO1xuXG4gIGlmIChob29rLmlzRGlzYWJsZWQpIHtcbiAgICAvLyBUaGlzIGlzbid0IGEgcmVhbCBwcm9wZXJ0eSBvbiB0aGUgaG9vaywgYnV0IGl0IGNhbiBiZSBzZXQgdG8gb3B0IG91dFxuICAgIC8vIG9mIERldlRvb2xzIGludGVncmF0aW9uIGFuZCBhc3NvY2lhdGVkIHdhcm5pbmdzIGFuZCBsb2dzLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMzg3N1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCFob29rLnN1cHBvcnRzRmliZXIpIHtcbiAgICB7XG4gICAgICBlcnJvcignVGhlIGluc3RhbGxlZCB2ZXJzaW9uIG9mIFJlYWN0IERldlRvb2xzIGlzIHRvbyBvbGQgYW5kIHdpbGwgbm90IHdvcmsgJyArICd3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgUmVhY3QuIFBsZWFzZSB1cGRhdGUgUmVhY3QgRGV2VG9vbHMuICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LWRldnRvb2xzJyk7XG4gICAgfSAvLyBEZXZUb29scyBleGlzdHMsIGV2ZW4gdGhvdWdoIGl0IGRvZXNuJ3Qgc3VwcG9ydCBGaWJlci5cblxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB0cnkge1xuICAgIGlmIChlbmFibGVTY2hlZHVsaW5nUHJvZmlsZXIpIHtcbiAgICAgIC8vIENvbmRpdGlvbmFsbHkgaW5qZWN0IHRoZXNlIGhvb2tzIG9ubHkgaWYgVGltZWxpbmUgcHJvZmlsZXIgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgYnVpbGQuXG4gICAgICAvLyBUaGlzIGdpdmVzIERldlRvb2xzIGEgd2F5IHRvIGZlYXR1cmUgZGV0ZWN0IHRoYXQgaXNuJ3QgdGllZCB0byB2ZXJzaW9uIG51bWJlclxuICAgICAgLy8gKHNpbmNlIHByb2ZpbGluZyBhbmQgdGltZWxpbmUgYXJlIGNvbnRyb2xsZWQgYnkgZGlmZmVyZW50IGZlYXR1cmUgZmxhZ3MpLlxuICAgICAgaW50ZXJuYWxzID0gYXNzaWduKHt9LCBpbnRlcm5hbHMsIHtcbiAgICAgICAgZ2V0TGFuZUxhYmVsTWFwOiBnZXRMYW5lTGFiZWxNYXAsXG4gICAgICAgIGluamVjdFByb2ZpbGluZ0hvb2tzOiBpbmplY3RQcm9maWxpbmdIb29rc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVuZGVyZXJJRCA9IGhvb2suaW5qZWN0KGludGVybmFscyk7IC8vIFdlIGhhdmUgc3VjY2Vzc2Z1bGx5IGluamVjdGVkLCBzbyBub3cgaXQgaXMgc2FmZSB0byBzZXQgdXAgaG9va3MuXG5cbiAgICBpbmplY3RlZEhvb2sgPSBob29rO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBDYXRjaCBhbGwgZXJyb3JzIGJlY2F1c2UgaXQgaXMgdW5zYWZlIHRvIHRocm93IGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiAgICB7XG4gICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcy4nLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChob29rLmNoZWNrRENFKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgcmVhbCBEZXZUb29scy5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGxpa2VseSBhIGhvb2sgaW5zdGFsbGVkIGJ5IEZhc3QgUmVmcmVzaCBydW50aW1lLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gb25TY2hlZHVsZVJvb3Qocm9vdCwgY2hpbGRyZW4pIHtcbiAge1xuICAgIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vblNjaGVkdWxlRmliZXJSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbmplY3RlZEhvb2sub25TY2hlZHVsZUZpYmVyUm9vdChyZW5kZXJlcklELCByb290LCBjaGlsZHJlbik7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCAhaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG9uQ29tbWl0Um9vdChyb290LCBldmVudFByaW9yaXR5KSB7XG4gIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyUm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICB2YXIgZGlkRXJyb3IgPSAocm9vdC5jdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IERpZENhcHR1cmU7XG5cbiAgICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyKSB7XG4gICAgICAgIHZhciBzY2hlZHVsZXJQcmlvcml0eTtcblxuICAgICAgICBzd2l0Y2ggKGV2ZW50UHJpb3JpdHkpIHtcbiAgICAgICAgICBjYXNlIERpc2NyZXRlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gSW1tZWRpYXRlUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgQ29udGludW91c0V2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IFVzZXJCbG9ja2luZ1ByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIERlZmF1bHRFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBJZGxlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gSWRsZVByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIHNjaGVkdWxlclByaW9yaXR5LCBkaWRFcnJvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCwgdW5kZWZpbmVkLCBkaWRFcnJvcik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB7XG4gICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG9uUG9zdENvbW1pdFJvb3Qocm9vdCkge1xuICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2sub25Qb3N0Q29tbWl0RmliZXJSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGluamVjdGVkSG9vay5vblBvc3RDb21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB7XG4gICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG9uQ29tbWl0VW5tb3VudChmaWJlcikge1xuICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJVbm1vdW50KHJlbmRlcmVySUQsIGZpYmVyKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMobmV3SXNTdHJpY3RNb2RlKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIHVuc3RhYmxlX3lpZWxkVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFdlJ3JlIGluIGEgdGVzdCBiZWNhdXNlIFNjaGVkdWxlci51bnN0YWJsZV95aWVsZFZhbHVlIG9ubHkgZXhpc3RzXG4gICAgICAvLyBpbiBTY2hlZHVsZXJNb2NrLiBUbyByZWR1Y2UgdGhlIG5vaXNlIGluIHN0cmljdCBtb2RlIHRlc3RzLFxuICAgICAgLy8gc3VwcHJlc3Mgd2FybmluZ3MgYW5kIGRpc2FibGUgc2NoZWR1bGVyIHlpZWxkaW5nIGR1cmluZyB0aGUgZG91YmxlIHJlbmRlclxuICAgICAgdW5zdGFibGVfc2V0RGlzYWJsZVlpZWxkVmFsdWUobmV3SXNTdHJpY3RNb2RlKTtcbiAgICAgIHNldFN1cHByZXNzV2FybmluZyhuZXdJc1N0cmljdE1vZGUpO1xuICAgIH1cblxuICAgIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5zZXRTdHJpY3RNb2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbmplY3RlZEhvb2suc2V0U3RyaWN0TW9kZShyZW5kZXJlcklELCBuZXdJc1N0cmljdE1vZGUpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0gLy8gUHJvZmlsZXIgQVBJIGhvb2tzXG5cbmZ1bmN0aW9uIGluamVjdFByb2ZpbGluZ0hvb2tzKHByb2ZpbGluZ0hvb2tzKSB7XG4gIGluamVjdGVkUHJvZmlsaW5nSG9va3MgPSBwcm9maWxpbmdIb29rcztcbn1cblxuZnVuY3Rpb24gZ2V0TGFuZUxhYmVsTWFwKCkge1xuICB7XG4gICAgdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAgICB2YXIgbGFuZSA9IDE7XG5cbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgVG90YWxMYW5lczsgaW5kZXgrKykge1xuICAgICAgdmFyIGxhYmVsID0gZ2V0TGFiZWxGb3JMYW5lKGxhbmUpO1xuICAgICAgbWFwLnNldChsYW5lLCBsYWJlbCk7XG4gICAgICBsYW5lICo9IDI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrQ29tbWl0U3RhcnRlZChsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0YXJ0ZWQobGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbW1pdFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tbWl0U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tbWl0U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50RXJyb3JlZChmaWJlciwgdGhyb3duVmFsdWUsIGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50RXJyb3JlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50RXJyb3JlZChmaWJlciwgdGhyb3duVmFsdWUsIGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRTdXNwZW5kZWQoZmliZXIsIHdha2VhYmxlLCBsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFN1c3BlbmRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50U3VzcGVuZGVkKGZpYmVyLCB3YWtlYWJsZSwgbGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0xheW91dEVmZmVjdHNTdGFydGVkKGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrTGF5b3V0RWZmZWN0c1N0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0xheW91dEVmZmVjdHNTdGFydGVkKGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtQYXNzaXZlRWZmZWN0c1N0YXJ0ZWQobGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtQYXNzaXZlRWZmZWN0c1N0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1Bhc3NpdmVFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1Bhc3NpdmVFZmZlY3RzU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUmVuZGVyU3RhcnRlZChsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0YXJ0ZWQobGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlcllpZWxkZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyWWllbGRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyWWllbGRlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlclN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlclNjaGVkdWxlZChsYW5lKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU2NoZWR1bGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTY2hlZHVsZWQobGFuZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrRm9yY2VVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrRm9yY2VVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIE5vTW9kZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMDsgLy8gVE9ETzogUmVtb3ZlIENvbmN1cnJlbnRNb2RlIGJ5IHJlYWRpbmcgZnJvbSB0aGUgcm9vdCB0YWcgaW5zdGVhZFxuXG52YXIgQ29uY3VycmVudE1vZGUgPVxuLyogICAgICAgICAgICAgICAgICovXG4xO1xudmFyIFByb2ZpbGVNb2RlID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuMjtcbnZhciBTdHJpY3RMZWdhY3lNb2RlID1cbi8qICAgICAgICAgICAgICAgKi9cbjg7XG52YXIgU3RyaWN0RWZmZWN0c01vZGUgPVxuLyogICAgICAgICAgICAgICovXG4xNjtcblxuLy8gVE9ETzogVGhpcyBpcyBwcmV0dHkgd2VsbCBzdXBwb3J0ZWQgYnkgYnJvd3NlcnMuIE1heWJlIHdlIGNhbiBkcm9wIGl0LlxudmFyIGNsejMyID0gTWF0aC5jbHozMiA/IE1hdGguY2x6MzIgOiBjbHozMkZhbGxiYWNrOyAvLyBDb3VudCBsZWFkaW5nIHplcm9zLlxuLy8gQmFzZWQgb246XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9NYXRoL2NsejMyXG5cbnZhciBsb2cgPSBNYXRoLmxvZztcbnZhciBMTjIgPSBNYXRoLkxOMjtcblxuZnVuY3Rpb24gY2x6MzJGYWxsYmFjayh4KSB7XG4gIHZhciBhc1VpbnQgPSB4ID4+PiAwO1xuXG4gIGlmIChhc1VpbnQgPT09IDApIHtcbiAgICByZXR1cm4gMzI7XG4gIH1cblxuICByZXR1cm4gMzEgLSAobG9nKGFzVWludCkgLyBMTjIgfCAwKSB8IDA7XG59XG5cbi8vIElmIHRob3NlIHZhbHVlcyBhcmUgY2hhbmdlZCB0aGF0IHBhY2thZ2Ugc2hvdWxkIGJlIHJlYnVpbHQgYW5kIHJlZGVwbG95ZWQuXG5cbnZhciBUb3RhbExhbmVzID0gMzE7XG52YXIgTm9MYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4wO1xudmFyIE5vTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjA7XG52YXIgU3luY0xhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTtcbnZhciBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lID1cbi8qICAgICovXG4yO1xudmFyIElucHV0Q29udGludW91c0xhbmUgPVxuLyogICAgICAgICAgICAgKi9cbjQ7XG52YXIgRGVmYXVsdEh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAqL1xuODtcbnZhciBEZWZhdWx0TGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICovXG4xNjtcbnZhciBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMzI7XG52YXIgVHJhbnNpdGlvbkxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDE5NDI0MDtcbnZhciBUcmFuc2l0aW9uTGFuZTEgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuNjQ7XG52YXIgVHJhbnNpdGlvbkxhbmUyID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEyODtcbnZhciBUcmFuc2l0aW9uTGFuZTMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjU2O1xudmFyIFRyYW5zaXRpb25MYW5lNCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG41MTI7XG52YXIgVHJhbnNpdGlvbkxhbmU1ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEwMjQ7XG52YXIgVHJhbnNpdGlvbkxhbmU2ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjIwNDg7XG52YXIgVHJhbnNpdGlvbkxhbmU3ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjQwOTY7XG52YXIgVHJhbnNpdGlvbkxhbmU4ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjgxOTI7XG52YXIgVHJhbnNpdGlvbkxhbmU5ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjE2Mzg0O1xudmFyIFRyYW5zaXRpb25MYW5lMTAgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4zMjc2ODtcbnZhciBUcmFuc2l0aW9uTGFuZTExID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNjU1MzY7XG52YXIgVHJhbnNpdGlvbkxhbmUxMiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEzMTA3MjtcbnZhciBUcmFuc2l0aW9uTGFuZTEzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjYyMTQ0O1xudmFyIFRyYW5zaXRpb25MYW5lMTQgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG41MjQyODg7XG52YXIgVHJhbnNpdGlvbkxhbmUxNSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEwNDg1NzY7XG52YXIgVHJhbnNpdGlvbkxhbmUxNiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjIwOTcxNTI7XG52YXIgUmV0cnlMYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTMwMDIzNDI0O1xudmFyIFJldHJ5TGFuZTEgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG40MTk0MzA0O1xudmFyIFJldHJ5TGFuZTIgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG44Mzg4NjA4O1xudmFyIFJldHJ5TGFuZTMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4xNjc3NzIxNjtcbnZhciBSZXRyeUxhbmU0ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMzM1NTQ0MzI7XG52YXIgUmV0cnlMYW5lNSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjY3MTA4ODY0O1xudmFyIFNvbWVSZXRyeUxhbmUgPSBSZXRyeUxhbmUxO1xudmFyIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgKi9cbjEzNDIxNzcyODtcbnZhciBOb25JZGxlTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4yNjg0MzU0NTU7XG52YXIgSWRsZUh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAgICAqL1xuMjY4NDM1NDU2O1xudmFyIElkbGVMYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjUzNjg3MDkxMjtcbnZhciBPZmZzY3JlZW5MYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICovXG4xMDczNzQxODI0OyAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHRoZSBleHBlcmltZW50YWwgdGltZWxpbmUgKHJlYWN0LWRldnRvb2xzLXRpbWVsaW5lKVxuLy8gSXQgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBMYW5lcyB2YWx1ZXMgYWJvdmUuXG5cbmZ1bmN0aW9uIGdldExhYmVsRm9yTGFuZShsYW5lKSB7XG4gIHtcbiAgICBpZiAobGFuZSAmIFN5bmNMYW5lKSB7XG4gICAgICByZXR1cm4gJ1N5bmMnO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdJbnB1dENvbnRpbnVvdXNIeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgSW5wdXRDb250aW51b3VzTGFuZSkge1xuICAgICAgcmV0dXJuICdJbnB1dENvbnRpbnVvdXMnO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgRGVmYXVsdEh5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnRGVmYXVsdEh5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBEZWZhdWx0TGFuZSkge1xuICAgICAgcmV0dXJuICdEZWZhdWx0JztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ1RyYW5zaXRpb25IeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgVHJhbnNpdGlvbkxhbmVzKSB7XG4gICAgICByZXR1cm4gJ1RyYW5zaXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgUmV0cnlMYW5lcykge1xuICAgICAgcmV0dXJuICdSZXRyeSc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBTZWxlY3RpdmVIeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ1NlbGVjdGl2ZUh5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBJZGxlSHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdJZGxlSHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIElkbGVMYW5lKSB7XG4gICAgICByZXR1cm4gJ0lkbGUnO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgT2Zmc2NyZWVuTGFuZSkge1xuICAgICAgcmV0dXJuICdPZmZzY3JlZW4nO1xuICAgIH1cbiAgfVxufVxudmFyIE5vVGltZXN0YW1wID0gLTE7XG52YXIgbmV4dFRyYW5zaXRpb25MYW5lID0gVHJhbnNpdGlvbkxhbmUxO1xudmFyIG5leHRSZXRyeUxhbmUgPSBSZXRyeUxhbmUxO1xuXG5mdW5jdGlvbiBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhsYW5lcykge1xuICBzd2l0Y2ggKGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpKSB7XG4gICAgY2FzZSBTeW5jTGFuZTpcbiAgICAgIHJldHVybiBTeW5jTGFuZTtcblxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNMYW5lOlxuICAgICAgcmV0dXJuIElucHV0Q29udGludW91c0xhbmU7XG5cbiAgICBjYXNlIERlZmF1bHRIeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIERlZmF1bHRIeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBEZWZhdWx0TGFuZTpcbiAgICAgIHJldHVybiBEZWZhdWx0TGFuZTtcblxuICAgIGNhc2UgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lODpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lOTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTA6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTExOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTY6XG4gICAgICByZXR1cm4gbGFuZXMgJiBUcmFuc2l0aW9uTGFuZXM7XG5cbiAgICBjYXNlIFJldHJ5TGFuZTE6XG4gICAgY2FzZSBSZXRyeUxhbmUyOlxuICAgIGNhc2UgUmV0cnlMYW5lMzpcbiAgICBjYXNlIFJldHJ5TGFuZTQ6XG4gICAgY2FzZSBSZXRyeUxhbmU1OlxuICAgICAgcmV0dXJuIGxhbmVzICYgUmV0cnlMYW5lcztcblxuICAgIGNhc2UgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBTZWxlY3RpdmVIeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBJZGxlSHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBJZGxlSHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgSWRsZUxhbmU6XG4gICAgICByZXR1cm4gSWRsZUxhbmU7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkxhbmU6XG4gICAgICByZXR1cm4gT2Zmc2NyZWVuTGFuZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIGVycm9yKCdTaG91bGQgaGF2ZSBmb3VuZCBtYXRjaGluZyBsYW5lcy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH0gLy8gVGhpcyBzaG91bGRuJ3QgYmUgcmVhY2hhYmxlLCBidXQgYXMgYSBmYWxsYmFjaywgcmV0dXJuIHRoZSBlbnRpcmUgYml0bWFzay5cblxuXG4gICAgICByZXR1cm4gbGFuZXM7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TmV4dExhbmVzKHJvb3QsIHdpcExhbmVzKSB7XG4gIC8vIEVhcmx5IGJhaWxvdXQgaWYgdGhlcmUncyBubyBwZW5kaW5nIHdvcmsgbGVmdC5cbiAgdmFyIHBlbmRpbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzO1xuXG4gIGlmIChwZW5kaW5nTGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm4gTm9MYW5lcztcbiAgfVxuXG4gIHZhciBuZXh0TGFuZXMgPSBOb0xhbmVzO1xuICB2YXIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzO1xuICB2YXIgcGluZ2VkTGFuZXMgPSByb290LnBpbmdlZExhbmVzOyAvLyBEbyBub3Qgd29yayBvbiBhbnkgaWRsZSB3b3JrIHVudGlsIGFsbCB0aGUgbm9uLWlkbGUgd29yayBoYXMgZmluaXNoZWQsXG4gIC8vIGV2ZW4gaWYgdGhlIHdvcmsgaXMgc3VzcGVuZGVkLlxuXG4gIHZhciBub25JZGxlUGVuZGluZ0xhbmVzID0gcGVuZGluZ0xhbmVzICYgTm9uSWRsZUxhbmVzO1xuXG4gIGlmIChub25JZGxlUGVuZGluZ0xhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgdmFyIG5vbklkbGVVbmJsb2NrZWRMYW5lcyA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiB+c3VzcGVuZGVkTGFuZXM7XG5cbiAgICBpZiAobm9uSWRsZVVuYmxvY2tlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICBuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhub25JZGxlVW5ibG9ja2VkTGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbm9uSWRsZVBpbmdlZExhbmVzID0gbm9uSWRsZVBlbmRpbmdMYW5lcyAmIHBpbmdlZExhbmVzO1xuXG4gICAgICBpZiAobm9uSWRsZVBpbmdlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKG5vbklkbGVQaW5nZWRMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoZSBvbmx5IHJlbWFpbmluZyB3b3JrIGlzIElkbGUuXG4gICAgdmFyIHVuYmxvY2tlZExhbmVzID0gcGVuZGluZ0xhbmVzICYgfnN1c3BlbmRlZExhbmVzO1xuXG4gICAgaWYgKHVuYmxvY2tlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICBuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyh1bmJsb2NrZWRMYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwaW5nZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICBuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhwaW5nZWRMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKG5leHRMYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgcmVhY2hhYmxlIGlmIHdlJ3JlIHN1c3BlbmRlZFxuICAgIC8vIFRPRE86IENvbnNpZGVyIHdhcm5pbmcgaW4gdGhpcyBwYXRoIGlmIGEgZmFsbGJhY2sgdGltZXIgaXMgbm90IHNjaGVkdWxlZC5cbiAgICByZXR1cm4gTm9MYW5lcztcbiAgfSAvLyBJZiB3ZSdyZSBhbHJlYWR5IGluIHRoZSBtaWRkbGUgb2YgYSByZW5kZXIsIHN3aXRjaGluZyBsYW5lcyB3aWxsIGludGVycnVwdFxuICAvLyBpdCBhbmQgd2UnbGwgbG9zZSBvdXIgcHJvZ3Jlc3MuIFdlIHNob3VsZCBvbmx5IGRvIHRoaXMgaWYgdGhlIG5ldyBsYW5lcyBhcmVcbiAgLy8gaGlnaGVyIHByaW9yaXR5LlxuXG5cbiAgaWYgKHdpcExhbmVzICE9PSBOb0xhbmVzICYmIHdpcExhbmVzICE9PSBuZXh0TGFuZXMgJiYgLy8gSWYgd2UgYWxyZWFkeSBzdXNwZW5kZWQgd2l0aCBhIGRlbGF5LCB0aGVuIGludGVycnVwdGluZyBpcyBmaW5lLiBEb24ndFxuICAvLyBib3RoZXIgd2FpdGluZyB1bnRpbCB0aGUgcm9vdCBpcyBjb21wbGV0ZS5cbiAgKHdpcExhbmVzICYgc3VzcGVuZGVkTGFuZXMpID09PSBOb0xhbmVzKSB7XG4gICAgdmFyIG5leHRMYW5lID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShuZXh0TGFuZXMpO1xuICAgIHZhciB3aXBMYW5lID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZSh3aXBMYW5lcyk7XG5cbiAgICBpZiAoIC8vIFRlc3RzIHdoZXRoZXIgdGhlIG5leHQgbGFuZSBpcyBlcXVhbCBvciBsb3dlciBwcmlvcml0eSB0aGFuIHRoZSB3aXBcbiAgICAvLyBvbmUuIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgYml0cyBkZWNyZWFzZSBpbiBwcmlvcml0eSBhcyB5b3UgZ28gbGVmdC5cbiAgICBuZXh0TGFuZSA+PSB3aXBMYW5lIHx8IC8vIERlZmF1bHQgcHJpb3JpdHkgdXBkYXRlcyBzaG91bGQgbm90IGludGVycnVwdCB0cmFuc2l0aW9uIHVwZGF0ZXMuIFRoZVxuICAgIC8vIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIGRlZmF1bHQgdXBkYXRlcyBhbmQgdHJhbnNpdGlvbiB1cGRhdGVzIGlzIHRoYXRcbiAgICAvLyBkZWZhdWx0IHVwZGF0ZXMgZG8gbm90IHN1cHBvcnQgcmVmcmVzaCB0cmFuc2l0aW9ucy5cbiAgICBuZXh0TGFuZSA9PT0gRGVmYXVsdExhbmUgJiYgKHdpcExhbmUgJiBUcmFuc2l0aW9uTGFuZXMpICE9PSBOb0xhbmVzKSB7XG4gICAgICAvLyBLZWVwIHdvcmtpbmcgb24gdGhlIGV4aXN0aW5nIGluLXByb2dyZXNzIHRyZWUuIERvIG5vdCBpbnRlcnJ1cHQuXG4gICAgICByZXR1cm4gd2lwTGFuZXM7XG4gICAgfVxuICB9XG5cbiAgaWYgKChuZXh0TGFuZXMgJiBJbnB1dENvbnRpbnVvdXNMYW5lKSAhPT0gTm9MYW5lcykge1xuICAgIC8vIFdoZW4gdXBkYXRlcyBhcmUgc3luYyBieSBkZWZhdWx0LCB3ZSBlbnRhbmdsZSBjb250aW51b3VzIHByaW9yaXR5IHVwZGF0ZXNcbiAgICAvLyBhbmQgZGVmYXVsdCB1cGRhdGVzLCBzbyB0aGV5IHJlbmRlciBpbiB0aGUgc2FtZSBiYXRjaC4gVGhlIG9ubHkgcmVhc29uXG4gICAgLy8gdGhleSB1c2Ugc2VwYXJhdGUgbGFuZXMgaXMgYmVjYXVzZSBjb250aW51b3VzIHVwZGF0ZXMgc2hvdWxkIGludGVycnVwdFxuICAgIC8vIHRyYW5zaXRpb25zLCBidXQgZGVmYXVsdCB1cGRhdGVzIHNob3VsZCBub3QuXG4gICAgbmV4dExhbmVzIHw9IHBlbmRpbmdMYW5lcyAmIERlZmF1bHRMYW5lO1xuICB9IC8vIENoZWNrIGZvciBlbnRhbmdsZWQgbGFuZXMgYW5kIGFkZCB0aGVtIHRvIHRoZSBiYXRjaC5cbiAgLy9cbiAgLy8gQSBsYW5lIGlzIHNhaWQgdG8gYmUgZW50YW5nbGVkIHdpdGggYW5vdGhlciB3aGVuIGl0J3Mgbm90IGFsbG93ZWQgdG8gcmVuZGVyXG4gIC8vIGluIGEgYmF0Y2ggdGhhdCBkb2VzIG5vdCBhbHNvIGluY2x1ZGUgdGhlIG90aGVyIGxhbmUuIFR5cGljYWxseSB3ZSBkbyB0aGlzXG4gIC8vIHdoZW4gbXVsdGlwbGUgdXBkYXRlcyBoYXZlIHRoZSBzYW1lIHNvdXJjZSwgYW5kIHdlIG9ubHkgd2FudCB0byByZXNwb25kIHRvXG4gIC8vIHRoZSBtb3N0IHJlY2VudCBldmVudCBmcm9tIHRoYXQgc291cmNlLlxuICAvL1xuICAvLyBOb3RlIHRoYXQgd2UgYXBwbHkgZW50YW5nbGVtZW50cyAqYWZ0ZXIqIGNoZWNraW5nIGZvciBwYXJ0aWFsIHdvcmsgYWJvdmUuXG4gIC8vIFRoaXMgbWVhbnMgdGhhdCBpZiBhIGxhbmUgaXMgZW50YW5nbGVkIGR1cmluZyBhbiBpbnRlcmxlYXZlZCBldmVudCB3aGlsZVxuICAvLyBpdCdzIGFscmVhZHkgcmVuZGVyaW5nLCB3ZSB3b24ndCBpbnRlcnJ1cHQgaXQuIFRoaXMgaXMgaW50ZW50aW9uYWwsIHNpbmNlXG4gIC8vIGVudGFuZ2xlbWVudCBpcyB1c3VhbGx5IFwiYmVzdCBlZmZvcnRcIjogd2UnbGwgdHJ5IG91ciBiZXN0IHRvIHJlbmRlciB0aGVcbiAgLy8gbGFuZXMgaW4gdGhlIHNhbWUgYmF0Y2gsIGJ1dCBpdCdzIG5vdCB3b3J0aCB0aHJvd2luZyBvdXQgcGFydGlhbGx5XG4gIC8vIGNvbXBsZXRlZCB3b3JrIGluIG9yZGVyIHRvIGRvIGl0LlxuICAvLyBUT0RPOiBSZWNvbnNpZGVyIHRoaXMuIFRoZSBjb3VudGVyLWFyZ3VtZW50IGlzIHRoYXQgdGhlIHBhcnRpYWwgd29ya1xuICAvLyByZXByZXNlbnRzIGFuIGludGVybWVkaWF0ZSBzdGF0ZSwgd2hpY2ggd2UgZG9uJ3Qgd2FudCB0byBzaG93IHRvIHRoZSB1c2VyLlxuICAvLyBBbmQgYnkgc3BlbmRpbmcgZXh0cmEgdGltZSBmaW5pc2hpbmcgaXQsIHdlJ3JlIGluY3JlYXNpbmcgdGhlIGFtb3VudCBvZlxuICAvLyB0aW1lIGl0IHRha2VzIHRvIHNob3cgdGhlIGZpbmFsIHN0YXRlLCB3aGljaCBpcyB3aGF0IHRoZXkgYXJlIGFjdHVhbGx5XG4gIC8vIHdhaXRpbmcgZm9yLlxuICAvL1xuICAvLyBGb3IgdGhvc2UgZXhjZXB0aW9ucyB3aGVyZSBlbnRhbmdsZW1lbnQgaXMgc2VtYW50aWNhbGx5IGltcG9ydGFudCwgbGlrZVxuICAvLyB1c2VNdXRhYmxlU291cmNlLCB3ZSBzaG91bGQgZW5zdXJlIHRoYXQgdGhlcmUgaXMgbm8gcGFydGlhbCB3b3JrIGF0IHRoZVxuICAvLyB0aW1lIHdlIGFwcGx5IHRoZSBlbnRhbmdsZW1lbnQuXG5cblxuICB2YXIgZW50YW5nbGVkTGFuZXMgPSByb290LmVudGFuZ2xlZExhbmVzO1xuXG4gIGlmIChlbnRhbmdsZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIHZhciBlbnRhbmdsZW1lbnRzID0gcm9vdC5lbnRhbmdsZW1lbnRzO1xuICAgIHZhciBsYW5lcyA9IG5leHRMYW5lcyAmIGVudGFuZ2xlZExhbmVzO1xuXG4gICAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgICBuZXh0TGFuZXMgfD0gZW50YW5nbGVtZW50c1tpbmRleF07XG4gICAgICBsYW5lcyAmPSB+bGFuZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dExhbmVzO1xufVxuZnVuY3Rpb24gZ2V0TW9zdFJlY2VudEV2ZW50VGltZShyb290LCBsYW5lcykge1xuICB2YXIgZXZlbnRUaW1lcyA9IHJvb3QuZXZlbnRUaW1lcztcbiAgdmFyIG1vc3RSZWNlbnRFdmVudFRpbWUgPSBOb1RpbWVzdGFtcDtcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIHZhciBldmVudFRpbWUgPSBldmVudFRpbWVzW2luZGV4XTtcblxuICAgIGlmIChldmVudFRpbWUgPiBtb3N0UmVjZW50RXZlbnRUaW1lKSB7XG4gICAgICBtb3N0UmVjZW50RXZlbnRUaW1lID0gZXZlbnRUaW1lO1xuICAgIH1cblxuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG5cbiAgcmV0dXJuIG1vc3RSZWNlbnRFdmVudFRpbWU7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVFeHBpcmF0aW9uVGltZShsYW5lLCBjdXJyZW50VGltZSkge1xuICBzd2l0Y2ggKGxhbmUpIHtcbiAgICBjYXNlIFN5bmNMYW5lOlxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIElucHV0Q29udGludW91c0xhbmU6XG4gICAgICAvLyBVc2VyIGludGVyYWN0aW9ucyBzaG91bGQgZXhwaXJlIHNsaWdodGx5IG1vcmUgcXVpY2tseS5cbiAgICAgIC8vXG4gICAgICAvLyBOT1RFOiBUaGlzIGlzIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyBjb25zdGFudCBhcyBpbiBTY2hlZHVsZXIuanMuXG4gICAgICAvLyBXaGVuIHdlIG1hZGUgaXQgbGFyZ2VyLCBhIHByb2R1Y3QgbWV0cmljIGluIHd3dyByZWdyZXNzZWQsIHN1Z2dlc3RpbmdcbiAgICAgIC8vIHRoZXJlJ3MgYSB1c2VyIGludGVyYWN0aW9uIHRoYXQncyBiZWluZyBzdGFydmVkIGJ5IGEgc2VyaWVzIG9mXG4gICAgICAvLyBzeW5jaHJvbm91cyB1cGRhdGVzLiBJZiB0aGF0IHRoZW9yeSBpcyBjb3JyZWN0LCB0aGUgcHJvcGVyIHNvbHV0aW9uIGlzXG4gICAgICAvLyB0byBmaXggdGhlIHN0YXJ2YXRpb24uIEhvd2V2ZXIsIHRoaXMgc2NlbmFyaW8gc3VwcG9ydHMgdGhlIGlkZWEgdGhhdFxuICAgICAgLy8gZXhwaXJhdGlvbiB0aW1lcyBhcmUgYW4gaW1wb3J0YW50IHNhZmVndWFyZCB3aGVuIHN0YXJ2YXRpb25cbiAgICAgIC8vIGRvZXMgaGFwcGVuLlxuICAgICAgcmV0dXJuIGN1cnJlbnRUaW1lICsgMjUwO1xuXG4gICAgY2FzZSBEZWZhdWx0SHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIERlZmF1bHRMYW5lOlxuICAgIGNhc2UgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTY6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTc6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTg6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTk6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEwOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE2OlxuICAgICAgcmV0dXJuIGN1cnJlbnRUaW1lICsgNTAwMDtcblxuICAgIGNhc2UgUmV0cnlMYW5lMTpcbiAgICBjYXNlIFJldHJ5TGFuZTI6XG4gICAgY2FzZSBSZXRyeUxhbmUzOlxuICAgIGNhc2UgUmV0cnlMYW5lNDpcbiAgICBjYXNlIFJldHJ5TGFuZTU6XG4gICAgICAvLyBUT0RPOiBSZXRyaWVzIHNob3VsZCBiZSBhbGxvd2VkIHRvIGV4cGlyZSBpZiB0aGV5IGFyZSBDUFUgYm91bmQgZm9yXG4gICAgICAvLyB0b28gbG9uZywgYnV0IHdoZW4gSSBtYWRlIHRoaXMgY2hhbmdlIGl0IGNhdXNlZCBhIHNwaWtlIGluIGJyb3dzZXJcbiAgICAgIC8vIGNyYXNoZXMuIFRoZXJlIG11c3QgYmUgc29tZSBvdGhlciB1bmRlcmx5aW5nIGJ1Zzsgbm90IHN1cGVyIHVyZ2VudCBidXRcbiAgICAgIC8vIGlkZWFsbHkgc2hvdWxkIGZpZ3VyZSBvdXQgd2h5IGFuZCBmaXggaXQuIFVuZm9ydHVuYXRlbHkgd2UgZG9uJ3QgaGF2ZVxuICAgICAgLy8gYSByZXBybyBmb3IgdGhlIGNyYXNoZXMsIG9ubHkgZGV0ZWN0ZWQgdmlhIHByb2R1Y3Rpb24gbWV0cmljcy5cbiAgICAgIHJldHVybiBOb1RpbWVzdGFtcDtcblxuICAgIGNhc2UgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIElkbGVIeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgSWRsZUxhbmU6XG4gICAgY2FzZSBPZmZzY3JlZW5MYW5lOlxuICAgICAgLy8gQW55dGhpbmcgaWRsZSBwcmlvcml0eSBvciBsb3dlciBzaG91bGQgbmV2ZXIgZXhwaXJlLlxuICAgICAgcmV0dXJuIE5vVGltZXN0YW1wO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgZXJyb3IoJ1Nob3VsZCBoYXZlIGZvdW5kIG1hdGNoaW5nIGxhbmVzLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gTm9UaW1lc3RhbXA7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya1N0YXJ2ZWRMYW5lc0FzRXhwaXJlZChyb290LCBjdXJyZW50VGltZSkge1xuICAvLyBUT0RPOiBUaGlzIGdldHMgY2FsbGVkIGV2ZXJ5IHRpbWUgd2UgeWllbGQuIFdlIGNhbiBvcHRpbWl6ZSBieSBzdG9yaW5nXG4gIC8vIHRoZSBlYXJsaWVzdCBleHBpcmF0aW9uIHRpbWUgb24gdGhlIHJvb3QuIFRoZW4gdXNlIHRoYXQgdG8gcXVpY2tseSBiYWlsIG91dFxuICAvLyBvZiB0aGlzIGZ1bmN0aW9uLlxuICB2YXIgcGVuZGluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7XG4gIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXM7XG4gIHZhciBwaW5nZWRMYW5lcyA9IHJvb3QucGluZ2VkTGFuZXM7XG4gIHZhciBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lczsgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBwZW5kaW5nIGxhbmVzIGFuZCBjaGVjayBpZiB3ZSd2ZSByZWFjaGVkIHRoZWlyXG4gIC8vIGV4cGlyYXRpb24gdGltZS4gSWYgc28sIHdlJ2xsIGFzc3VtZSB0aGUgdXBkYXRlIGlzIGJlaW5nIHN0YXJ2ZWQgYW5kIG1hcmtcbiAgLy8gaXQgYXMgZXhwaXJlZCB0byBmb3JjZSBpdCB0byBmaW5pc2guXG5cbiAgdmFyIGxhbmVzID0gcGVuZGluZ0xhbmVzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIGV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWVzW2luZGV4XTtcblxuICAgIGlmIChleHBpcmF0aW9uVGltZSA9PT0gTm9UaW1lc3RhbXApIHtcbiAgICAgIC8vIEZvdW5kIGEgcGVuZGluZyBsYW5lIHdpdGggbm8gZXhwaXJhdGlvbiB0aW1lLiBJZiBpdCdzIG5vdCBzdXNwZW5kZWQsIG9yXG4gICAgICAvLyBpZiBpdCdzIHBpbmdlZCwgYXNzdW1lIGl0J3MgQ1BVLWJvdW5kLiBDb21wdXRlIGEgbmV3IGV4cGlyYXRpb24gdGltZVxuICAgICAgLy8gdXNpbmcgdGhlIGN1cnJlbnQgdGltZS5cbiAgICAgIGlmICgobGFuZSAmIHN1c3BlbmRlZExhbmVzKSA9PT0gTm9MYW5lcyB8fCAobGFuZSAmIHBpbmdlZExhbmVzKSAhPT0gTm9MYW5lcykge1xuICAgICAgICAvLyBBc3N1bWVzIHRpbWVzdGFtcHMgYXJlIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy5cbiAgICAgICAgZXhwaXJhdGlvblRpbWVzW2luZGV4XSA9IGNvbXB1dGVFeHBpcmF0aW9uVGltZShsYW5lLCBjdXJyZW50VGltZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChleHBpcmF0aW9uVGltZSA8PSBjdXJyZW50VGltZSkge1xuICAgICAgLy8gVGhpcyBsYW5lIGV4cGlyZWRcbiAgICAgIHJvb3QuZXhwaXJlZExhbmVzIHw9IGxhbmU7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn0gLy8gVGhpcyByZXR1cm5zIHRoZSBoaWdoZXN0IHByaW9yaXR5IHBlbmRpbmcgbGFuZXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXlcbi8vIGFyZSBzdXNwZW5kZWQuXG5cbmZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eVBlbmRpbmdMYW5lcyhyb290KSB7XG4gIHJldHVybiBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhyb290LnBlbmRpbmdMYW5lcyk7XG59XG5mdW5jdGlvbiBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KSB7XG4gIHZhciBldmVyeXRoaW5nQnV0T2Zmc2NyZWVuID0gcm9vdC5wZW5kaW5nTGFuZXMgJiB+T2Zmc2NyZWVuTGFuZTtcblxuICBpZiAoZXZlcnl0aGluZ0J1dE9mZnNjcmVlbiAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybiBldmVyeXRoaW5nQnV0T2Zmc2NyZWVuO1xuICB9XG5cbiAgaWYgKGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW4gJiBPZmZzY3JlZW5MYW5lKSB7XG4gICAgcmV0dXJuIE9mZnNjcmVlbkxhbmU7XG4gIH1cblxuICByZXR1cm4gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzU3luY0xhbmUobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIFN5bmNMYW5lKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzTm9uSWRsZVdvcmsobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIE5vbklkbGVMYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc09ubHlSZXRyaWVzKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBSZXRyeUxhbmVzKSA9PT0gbGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc09ubHlOb25VcmdlbnRMYW5lcyhsYW5lcykge1xuICB2YXIgVXJnZW50TGFuZXMgPSBTeW5jTGFuZSB8IElucHV0Q29udGludW91c0xhbmUgfCBEZWZhdWx0TGFuZTtcbiAgcmV0dXJuIChsYW5lcyAmIFVyZ2VudExhbmVzKSA9PT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seVRyYW5zaXRpb25zKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBUcmFuc2l0aW9uTGFuZXMpID09PSBsYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIGxhbmVzKSB7XG5cbiAgdmFyIFN5bmNEZWZhdWx0TGFuZXMgPSBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lIHwgSW5wdXRDb250aW51b3VzTGFuZSB8IERlZmF1bHRIeWRyYXRpb25MYW5lIHwgRGVmYXVsdExhbmU7XG4gIHJldHVybiAobGFuZXMgJiBTeW5jRGVmYXVsdExhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzRXhwaXJlZExhbmUocm9vdCwgbGFuZXMpIHtcbiAgLy8gVGhpcyBpcyBhIHNlcGFyYXRlIGNoZWNrIGZyb20gaW5jbHVkZXNCbG9ja2luZ0xhbmUgYmVjYXVzZSBhIGxhbmUgY2FuXG4gIC8vIGV4cGlyZSBhZnRlciBhIHJlbmRlciBoYXMgYWxyZWFkeSBzdGFydGVkLlxuICByZXR1cm4gKGxhbmVzICYgcm9vdC5leHBpcmVkTGFuZXMpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaXNUcmFuc2l0aW9uTGFuZShsYW5lKSB7XG4gIHJldHVybiAobGFuZSAmIFRyYW5zaXRpb25MYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBjbGFpbU5leHRUcmFuc2l0aW9uTGFuZSgpIHtcbiAgLy8gQ3ljbGUgdGhyb3VnaCB0aGUgbGFuZXMsIGFzc2lnbmluZyBlYWNoIG5ldyB0cmFuc2l0aW9uIHRvIHRoZSBuZXh0IGxhbmUuXG4gIC8vIEluIG1vc3QgY2FzZXMsIHRoaXMgbWVhbnMgZXZlcnkgdHJhbnNpdGlvbiBnZXRzIGl0cyBvd24gbGFuZSwgdW50aWwgd2VcbiAgLy8gcnVuIG91dCBvZiBsYW5lcyBhbmQgY3ljbGUgYmFjayB0byB0aGUgYmVnaW5uaW5nLlxuICB2YXIgbGFuZSA9IG5leHRUcmFuc2l0aW9uTGFuZTtcbiAgbmV4dFRyYW5zaXRpb25MYW5lIDw8PSAxO1xuXG4gIGlmICgobmV4dFRyYW5zaXRpb25MYW5lICYgVHJhbnNpdGlvbkxhbmVzKSA9PT0gTm9MYW5lcykge1xuICAgIG5leHRUcmFuc2l0aW9uTGFuZSA9IFRyYW5zaXRpb25MYW5lMTtcbiAgfVxuXG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gY2xhaW1OZXh0UmV0cnlMYW5lKCkge1xuICB2YXIgbGFuZSA9IG5leHRSZXRyeUxhbmU7XG4gIG5leHRSZXRyeUxhbmUgPDw9IDE7XG5cbiAgaWYgKChuZXh0UmV0cnlMYW5lICYgUmV0cnlMYW5lcykgPT09IE5vTGFuZXMpIHtcbiAgICBuZXh0UmV0cnlMYW5lID0gUmV0cnlMYW5lMTtcbiAgfVxuXG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShsYW5lcykge1xuICByZXR1cm4gbGFuZXMgJiAtbGFuZXM7XG59XG5mdW5jdGlvbiBwaWNrQXJiaXRyYXJ5TGFuZShsYW5lcykge1xuICAvLyBUaGlzIHdyYXBwZXIgZnVuY3Rpb24gZ2V0cyBpbmxpbmVkLiBPbmx5IGV4aXN0cyBzbyB0byBjb21tdW5pY2F0ZSB0aGF0IGl0XG4gIC8vIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGJpdCBpcyBzZWxlY3RlZDsgeW91IGNhbiBwaWNrIGFueSBiaXQgd2l0aG91dFxuICAvLyBhZmZlY3RpbmcgdGhlIGFsZ29yaXRobXMgd2hlcmUgaXRzIHVzZWQuIEhlcmUgSSdtIHVzaW5nXG4gIC8vIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUgYmVjYXVzZSBpdCByZXF1aXJlcyB0aGUgZmV3ZXN0IG9wZXJhdGlvbnMuXG4gIHJldHVybiBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKTtcbn1cblxuZnVuY3Rpb24gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcykge1xuICByZXR1cm4gMzEgLSBjbHozMihsYW5lcyk7XG59XG5cbmZ1bmN0aW9uIGxhbmVUb0luZGV4KGxhbmUpIHtcbiAgcmV0dXJuIHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZSk7XG59XG5cbmZ1bmN0aW9uIGluY2x1ZGVzU29tZUxhbmUoYSwgYikge1xuICByZXR1cm4gKGEgJiBiKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGlzU3Vic2V0T2ZMYW5lcyhzZXQsIHN1YnNldCkge1xuICByZXR1cm4gKHNldCAmIHN1YnNldCkgPT09IHN1YnNldDtcbn1cbmZ1bmN0aW9uIG1lcmdlTGFuZXMoYSwgYikge1xuICByZXR1cm4gYSB8IGI7XG59XG5mdW5jdGlvbiByZW1vdmVMYW5lcyhzZXQsIHN1YnNldCkge1xuICByZXR1cm4gc2V0ICYgfnN1YnNldDtcbn1cbmZ1bmN0aW9uIGludGVyc2VjdExhbmVzKGEsIGIpIHtcbiAgcmV0dXJuIGEgJiBiO1xufSAvLyBTZWVtcyByZWR1bmRhbnQsIGJ1dCBpdCBjaGFuZ2VzIHRoZSB0eXBlIGZyb20gYSBzaW5nbGUgbGFuZSAodXNlZCBmb3Jcbi8vIHVwZGF0ZXMpIHRvIGEgZ3JvdXAgb2YgbGFuZXMgKHVzZWQgZm9yIGZsdXNoaW5nIHdvcmspLlxuXG5mdW5jdGlvbiBsYW5lVG9MYW5lcyhsYW5lKSB7XG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gaGlnaGVyUHJpb3JpdHlMYW5lKGEsIGIpIHtcbiAgLy8gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBiaXQgcmFuZ2VzIGRlY3JlYXNlIGluIHByaW9yaXR5IGFzIHlvdSBnbyBsZWZ0LlxuICByZXR1cm4gYSAhPT0gTm9MYW5lICYmIGEgPCBiID8gYSA6IGI7XG59XG5mdW5jdGlvbiBjcmVhdGVMYW5lTWFwKGluaXRpYWwpIHtcbiAgLy8gSW50ZW50aW9uYWxseSBwdXNoaW5nIG9uZSBieSBvbmUuXG4gIC8vIGh0dHBzOi8vdjguZGV2L2Jsb2cvZWxlbWVudHMta2luZHMjYXZvaWQtY3JlYXRpbmctaG9sZXNcbiAgdmFyIGxhbmVNYXAgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IFRvdGFsTGFuZXM7IGkrKykge1xuICAgIGxhbmVNYXAucHVzaChpbml0aWFsKTtcbiAgfVxuXG4gIHJldHVybiBsYW5lTWFwO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RVcGRhdGVkKHJvb3QsIHVwZGF0ZUxhbmUsIGV2ZW50VGltZSkge1xuICByb290LnBlbmRpbmdMYW5lcyB8PSB1cGRhdGVMYW5lOyAvLyBJZiB0aGVyZSBhcmUgYW55IHN1c3BlbmRlZCB0cmFuc2l0aW9ucywgaXQncyBwb3NzaWJsZSB0aGlzIG5ldyB1cGRhdGVcbiAgLy8gY291bGQgdW5ibG9jayB0aGVtLiBDbGVhciB0aGUgc3VzcGVuZGVkIGxhbmVzIHNvIHRoYXQgd2UgY2FuIHRyeSByZW5kZXJpbmdcbiAgLy8gdGhlbSBhZ2Fpbi5cbiAgLy9cbiAgLy8gVE9ETzogV2UgcmVhbGx5IG9ubHkgbmVlZCB0byB1bnN1c3BlbmQgb25seSBsYW5lcyB0aGF0IGFyZSBpbiB0aGVcbiAgLy8gYHN1YnRyZWVMYW5lc2Agb2YgdGhlIHVwZGF0ZWQgZmliZXIsIG9yIHRoZSB1cGRhdGUgbGFuZXMgb2YgdGhlIHJldHVyblxuICAvLyBwYXRoLiBUaGlzIHdvdWxkIGV4Y2x1ZGUgc3VzcGVuZGVkIHVwZGF0ZXMgaW4gYW4gdW5yZWxhdGVkIHNpYmxpbmcgdHJlZSxcbiAgLy8gc2luY2UgdGhlcmUncyBubyB3YXkgZm9yIHRoaXMgdXBkYXRlIHRvIHVuYmxvY2sgaXQuXG4gIC8vXG4gIC8vIFdlIGRvbid0IGRvIHRoaXMgaWYgdGhlIGluY29taW5nIHVwZGF0ZSBpcyBpZGxlLCBiZWNhdXNlIHdlIG5ldmVyIHByb2Nlc3NcbiAgLy8gaWRsZSB1cGRhdGVzIHVudGlsIGFmdGVyIGFsbCB0aGUgcmVndWxhciB1cGRhdGVzIGhhdmUgZmluaXNoZWQ7IHRoZXJlJ3Mgbm9cbiAgLy8gd2F5IGl0IGNvdWxkIHVuYmxvY2sgYSB0cmFuc2l0aW9uLlxuXG4gIGlmICh1cGRhdGVMYW5lICE9PSBJZGxlTGFuZSkge1xuICAgIHJvb3Quc3VzcGVuZGVkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHJvb3QucGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xuICB9XG5cbiAgdmFyIGV2ZW50VGltZXMgPSByb290LmV2ZW50VGltZXM7XG4gIHZhciBpbmRleCA9IGxhbmVUb0luZGV4KHVwZGF0ZUxhbmUpOyAvLyBXZSBjYW4gYWx3YXlzIG92ZXJ3cml0ZSBhbiBleGlzdGluZyB0aW1lc3RhbXAgYmVjYXVzZSB3ZSBwcmVmZXIgdGhlIG1vc3RcbiAgLy8gcmVjZW50IGV2ZW50LCBhbmQgd2UgYXNzdW1lIHRpbWUgaXMgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLlxuXG4gIGV2ZW50VGltZXNbaW5kZXhdID0gZXZlbnRUaW1lO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RTdXNwZW5kZWQocm9vdCwgc3VzcGVuZGVkTGFuZXMpIHtcbiAgcm9vdC5zdXNwZW5kZWRMYW5lcyB8PSBzdXNwZW5kZWRMYW5lcztcbiAgcm9vdC5waW5nZWRMYW5lcyAmPSB+c3VzcGVuZGVkTGFuZXM7IC8vIFRoZSBzdXNwZW5kZWQgbGFuZXMgYXJlIG5vIGxvbmdlciBDUFUtYm91bmQuIENsZWFyIHRoZWlyIGV4cGlyYXRpb24gdGltZXMuXG5cbiAgdmFyIGV4cGlyYXRpb25UaW1lcyA9IHJvb3QuZXhwaXJhdGlvblRpbWVzO1xuICB2YXIgbGFuZXMgPSBzdXNwZW5kZWRMYW5lcztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIGV4cGlyYXRpb25UaW1lc1tpbmRleF0gPSBOb1RpbWVzdGFtcDtcbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gbWFya1Jvb3RQaW5nZWQocm9vdCwgcGluZ2VkTGFuZXMsIGV2ZW50VGltZSkge1xuICByb290LnBpbmdlZExhbmVzIHw9IHJvb3Quc3VzcGVuZGVkTGFuZXMgJiBwaW5nZWRMYW5lcztcbn1cbmZ1bmN0aW9uIG1hcmtSb290RmluaXNoZWQocm9vdCwgcmVtYWluaW5nTGFuZXMpIHtcbiAgdmFyIG5vTG9uZ2VyUGVuZGluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXMgJiB+cmVtYWluaW5nTGFuZXM7XG4gIHJvb3QucGVuZGluZ0xhbmVzID0gcmVtYWluaW5nTGFuZXM7IC8vIExldCdzIHRyeSBldmVyeXRoaW5nIGFnYWluXG5cbiAgcm9vdC5zdXNwZW5kZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHJvb3QucGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xuICByb290LmV4cGlyZWRMYW5lcyAmPSByZW1haW5pbmdMYW5lcztcbiAgcm9vdC5tdXRhYmxlUmVhZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICByb290LmVudGFuZ2xlZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICB2YXIgZW50YW5nbGVtZW50cyA9IHJvb3QuZW50YW5nbGVtZW50cztcbiAgdmFyIGV2ZW50VGltZXMgPSByb290LmV2ZW50VGltZXM7XG4gIHZhciBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lczsgLy8gQ2xlYXIgdGhlIGxhbmVzIHRoYXQgbm8gbG9uZ2VyIGhhdmUgcGVuZGluZyB3b3JrXG5cbiAgdmFyIGxhbmVzID0gbm9Mb25nZXJQZW5kaW5nTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSA9IE5vTGFuZXM7XG4gICAgZXZlbnRUaW1lc1tpbmRleF0gPSBOb1RpbWVzdGFtcDtcbiAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gTm9UaW1lc3RhbXA7XG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIGVudGFuZ2xlZExhbmVzKSB7XG4gIC8vIEluIGFkZGl0aW9uIHRvIGVudGFuZ2xpbmcgZWFjaCBvZiB0aGUgZ2l2ZW4gbGFuZXMgd2l0aCBlYWNoIG90aGVyLCB3ZSBhbHNvXG4gIC8vIGhhdmUgdG8gY29uc2lkZXIgX3RyYW5zaXRpdmVfIGVudGFuZ2xlbWVudHMuIEZvciBlYWNoIGxhbmUgdGhhdCBpcyBhbHJlYWR5XG4gIC8vIGVudGFuZ2xlZCB3aXRoICphbnkqIG9mIHRoZSBnaXZlbiBsYW5lcywgdGhhdCBsYW5lIGlzIG5vdyB0cmFuc2l0aXZlbHlcbiAgLy8gZW50YW5nbGVkIHdpdGggKmFsbCogdGhlIGdpdmVuIGxhbmVzLlxuICAvL1xuICAvLyBUcmFuc2xhdGVkOiBJZiBDIGlzIGVudGFuZ2xlZCB3aXRoIEEsIHRoZW4gZW50YW5nbGluZyBBIHdpdGggQiBhbHNvXG4gIC8vIGVudGFuZ2xlcyBDIHdpdGggQi5cbiAgLy9cbiAgLy8gSWYgdGhpcyBpcyBoYXJkIHRvIGdyYXNwLCBpdCBtaWdodCBoZWxwIHRvIGludGVudGlvbmFsbHkgYnJlYWsgdGhpc1xuICAvLyBmdW5jdGlvbiBhbmQgbG9vayBhdCB0aGUgdGVzdHMgdGhhdCBmYWlsIGluIFJlYWN0VHJhbnNpdGlvbi10ZXN0LmpzLiBUcnlcbiAgLy8gY29tbWVudGluZyBvdXQgb25lIG9mIHRoZSBjb25kaXRpb25zIGJlbG93LlxuICB2YXIgcm9vdEVudGFuZ2xlZExhbmVzID0gcm9vdC5lbnRhbmdsZWRMYW5lcyB8PSBlbnRhbmdsZWRMYW5lcztcbiAgdmFyIGVudGFuZ2xlbWVudHMgPSByb290LmVudGFuZ2xlbWVudHM7XG4gIHZhciBsYW5lcyA9IHJvb3RFbnRhbmdsZWRMYW5lcztcblxuICB3aGlsZSAobGFuZXMpIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG5cbiAgICBpZiAoIC8vIElzIHRoaXMgb25lIG9mIHRoZSBuZXdseSBlbnRhbmdsZWQgbGFuZXM/XG4gICAgbGFuZSAmIGVudGFuZ2xlZExhbmVzIHwgLy8gSXMgdGhpcyBsYW5lIHRyYW5zaXRpdmVseSBlbnRhbmdsZWQgd2l0aCB0aGUgbmV3bHkgZW50YW5nbGVkIGxhbmVzP1xuICAgIGVudGFuZ2xlbWVudHNbaW5kZXhdICYgZW50YW5nbGVkTGFuZXMpIHtcbiAgICAgIGVudGFuZ2xlbWVudHNbaW5kZXhdIHw9IGVudGFuZ2xlZExhbmVzO1xuICAgIH1cblxuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBnZXRCdW1wZWRMYW5lRm9ySHlkcmF0aW9uKHJvb3QsIHJlbmRlckxhbmVzKSB7XG4gIHZhciByZW5kZXJMYW5lID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShyZW5kZXJMYW5lcyk7XG4gIHZhciBsYW5lO1xuXG4gIHN3aXRjaCAocmVuZGVyTGFuZSkge1xuICAgIGNhc2UgSW5wdXRDb250aW51b3VzTGFuZTpcbiAgICAgIGxhbmUgPSBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIERlZmF1bHRMYW5lOlxuICAgICAgbGFuZSA9IERlZmF1bHRIeWRyYXRpb25MYW5lO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lODpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lOTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTA6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTExOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTY6XG4gICAgY2FzZSBSZXRyeUxhbmUxOlxuICAgIGNhc2UgUmV0cnlMYW5lMjpcbiAgICBjYXNlIFJldHJ5TGFuZTM6XG4gICAgY2FzZSBSZXRyeUxhbmU0OlxuICAgIGNhc2UgUmV0cnlMYW5lNTpcbiAgICAgIGxhbmUgPSBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBJZGxlTGFuZTpcbiAgICAgIGxhbmUgPSBJZGxlSHlkcmF0aW9uTGFuZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpcyBhbHJlYWR5IGVpdGhlciBhIGh5ZHJhdGlvbiBsYW5lLCBvciBzaG91bGRuJ3RcbiAgICAgIC8vIGJlIHJldHJpZWQgYXQgYSBoeWRyYXRpb24gbGFuZS5cbiAgICAgIGxhbmUgPSBOb0xhbmU7XG4gICAgICBicmVhaztcbiAgfSAvLyBDaGVjayBpZiB0aGUgbGFuZSB3ZSBjaG9zZSBpcyBzdXNwZW5kZWQuIElmIHNvLCB0aGF0IGluZGljYXRlcyB0aGF0IHdlXG4gIC8vIGFscmVhZHkgYXR0ZW1wdGVkIGFuZCBmYWlsZWQgdG8gaHlkcmF0ZSBhdCB0aGF0IGxldmVsLiBBbHNvIGNoZWNrIGlmIHdlJ3JlXG4gIC8vIGFscmVhZHkgcmVuZGVyaW5nIHRoYXQgbGFuZSwgd2hpY2ggaXMgcmFyZSBidXQgY291bGQgaGFwcGVuLlxuXG5cbiAgaWYgKChsYW5lICYgKHJvb3Quc3VzcGVuZGVkTGFuZXMgfCByZW5kZXJMYW5lcykpICE9PSBOb0xhbmUpIHtcbiAgICAvLyBHaXZlIHVwIHRyeWluZyB0byBoeWRyYXRlIGFuZCBmYWxsIGJhY2sgdG8gY2xpZW50IHJlbmRlci5cbiAgICByZXR1cm4gTm9MYW5lO1xuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBhZGRGaWJlclRvTGFuZXNNYXAocm9vdCwgZmliZXIsIGxhbmVzKSB7XG5cbiAgaWYgKCFpc0RldlRvb2xzUHJlc2VudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwID0gcm9vdC5wZW5kaW5nVXBkYXRlcnNMYW5lTWFwO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBsYW5lVG9JbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIHZhciB1cGRhdGVycyA9IHBlbmRpbmdVcGRhdGVyc0xhbmVNYXBbaW5kZXhdO1xuICAgIHVwZGF0ZXJzLmFkZChmaWJlcik7XG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIG1vdmVQZW5kaW5nRmliZXJzVG9NZW1vaXplZChyb290LCBsYW5lcykge1xuXG4gIGlmICghaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IHJvb3QucGVuZGluZ1VwZGF0ZXJzTGFuZU1hcDtcbiAgdmFyIG1lbW9pemVkVXBkYXRlcnMgPSByb290Lm1lbW9pemVkVXBkYXRlcnM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IGxhbmVUb0luZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIHVwZGF0ZXJzID0gcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcFtpbmRleF07XG5cbiAgICBpZiAodXBkYXRlcnMuc2l6ZSA+IDApIHtcbiAgICAgIHVwZGF0ZXJzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgaWYgKGFsdGVybmF0ZSA9PT0gbnVsbCB8fCAhbWVtb2l6ZWRVcGRhdGVycy5oYXMoYWx0ZXJuYXRlKSkge1xuICAgICAgICAgIG1lbW9pemVkVXBkYXRlcnMuYWRkKGZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB1cGRhdGVycy5jbGVhcigpO1xuICAgIH1cblxuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBnZXRUcmFuc2l0aW9uc0ZvckxhbmVzKHJvb3QsIGxhbmVzKSB7XG4gIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG52YXIgRGlzY3JldGVFdmVudFByaW9yaXR5ID0gU3luY0xhbmU7XG52YXIgQ29udGludW91c0V2ZW50UHJpb3JpdHkgPSBJbnB1dENvbnRpbnVvdXNMYW5lO1xudmFyIERlZmF1bHRFdmVudFByaW9yaXR5ID0gRGVmYXVsdExhbmU7XG52YXIgSWRsZUV2ZW50UHJpb3JpdHkgPSBJZGxlTGFuZTtcbnZhciBjdXJyZW50VXBkYXRlUHJpb3JpdHkgPSBOb0xhbmU7XG5mdW5jdGlvbiBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKSB7XG4gIHJldHVybiBjdXJyZW50VXBkYXRlUHJpb3JpdHk7XG59XG5mdW5jdGlvbiBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkobmV3UHJpb3JpdHkpIHtcbiAgY3VycmVudFVwZGF0ZVByaW9yaXR5ID0gbmV3UHJpb3JpdHk7XG59XG5mdW5jdGlvbiBydW5XaXRoUHJpb3JpdHkocHJpb3JpdHksIGZuKSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gY3VycmVudFVwZGF0ZVByaW9yaXR5O1xuXG4gIHRyeSB7XG4gICAgY3VycmVudFVwZGF0ZVByaW9yaXR5ID0gcHJpb3JpdHk7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFVwZGF0ZVByaW9yaXR5ID0gcHJldmlvdXNQcmlvcml0eTtcbiAgfVxufVxuZnVuY3Rpb24gaGlnaGVyRXZlbnRQcmlvcml0eShhLCBiKSB7XG4gIHJldHVybiBhICE9PSAwICYmIGEgPCBiID8gYSA6IGI7XG59XG5mdW5jdGlvbiBsb3dlckV2ZW50UHJpb3JpdHkoYSwgYikge1xuICByZXR1cm4gYSA9PT0gMCB8fCBhID4gYiA/IGEgOiBiO1xufVxuZnVuY3Rpb24gaXNIaWdoZXJFdmVudFByaW9yaXR5KGEsIGIpIHtcbiAgcmV0dXJuIGEgIT09IDAgJiYgYSA8IGI7XG59XG5mdW5jdGlvbiBsYW5lc1RvRXZlbnRQcmlvcml0eShsYW5lcykge1xuICB2YXIgbGFuZSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpO1xuXG4gIGlmICghaXNIaWdoZXJFdmVudFByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSwgbGFuZSkpIHtcbiAgICByZXR1cm4gRGlzY3JldGVFdmVudFByaW9yaXR5O1xuICB9XG5cbiAgaWYgKCFpc0hpZ2hlckV2ZW50UHJpb3JpdHkoQ29udGludW91c0V2ZW50UHJpb3JpdHksIGxhbmUpKSB7XG4gICAgcmV0dXJuIENvbnRpbnVvdXNFdmVudFByaW9yaXR5O1xuICB9XG5cbiAgaWYgKGluY2x1ZGVzTm9uSWRsZVdvcmsobGFuZSkpIHtcbiAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gIH1cblxuICByZXR1cm4gSWRsZUV2ZW50UHJpb3JpdHk7XG59XG5cbi8vIFRoaXMgaXMgaW1wb3J0ZWQgYnkgdGhlIGV2ZW50IHJlcGxheWluZyBpbXBsZW1lbnRhdGlvbiBpbiBSZWFjdCBET00uIEl0J3Ncbi8vIGluIGEgc2VwYXJhdGUgZmlsZSB0byBicmVhayBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgcmVuZGVyZXIgYW5kXG4vLyB0aGUgcmVjb25jaWxlci5cbmZ1bmN0aW9uIGlzUm9vdERlaHlkcmF0ZWQocm9vdCkge1xuICB2YXIgY3VycmVudFN0YXRlID0gcm9vdC5jdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBjdXJyZW50U3RhdGUuaXNEZWh5ZHJhdGVkO1xufVxuXG52YXIgX2F0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbjtcblxuZnVuY3Rpb24gc2V0QXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGZuKSB7XG4gIF9hdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24gPSBmbjtcbn1cbmZ1bmN0aW9uIGF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihmaWJlcikge1xuICBfYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGZpYmVyKTtcbn1cbnZhciBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbjtcbmZ1bmN0aW9uIHNldEF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKGZuKSB7XG4gIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uID0gZm47XG59XG52YXIgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5O1xuZnVuY3Rpb24gc2V0QXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5KGZuKSB7XG4gIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eSA9IGZuO1xufVxudmFyIGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSQxO1xuZnVuY3Rpb24gc2V0R2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KGZuKSB7XG4gIGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSQxID0gZm47XG59XG52YXIgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHk7XG5mdW5jdGlvbiBzZXRBdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShmbikge1xuICBhdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eSA9IGZuO1xufSAvLyBUT0RPOiBVcGdyYWRlIHRoaXMgZGVmaW5pdGlvbiBvbmNlIHdlJ3JlIG9uIGEgbmV3ZXIgdmVyc2lvbiBvZiBGbG93IHRoYXRcbi8vIGhhcyB0aGlzIGRlZmluaXRpb24gYnVpbHQtaW4uXG5cbnZhciBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0ID0gZmFsc2U7IC8vIFRoZSBxdWV1ZSBvZiBkaXNjcmV0ZSBldmVudHMgdG8gYmUgcmVwbGF5ZWQuXG5cbnZhciBxdWV1ZWREaXNjcmV0ZUV2ZW50cyA9IFtdOyAvLyBJbmRpY2F0ZXMgaWYgYW55IGNvbnRpbnVvdXMgZXZlbnQgdGFyZ2V0cyBhcmUgbm9uLW51bGwgZm9yIGVhcmx5IGJhaWxvdXQuXG4vLyBpZiB0aGUgbGFzdCB0YXJnZXQgd2FzIGRlaHlkcmF0ZWQuXG5cbnZhciBxdWV1ZWRGb2N1cyA9IG51bGw7XG52YXIgcXVldWVkRHJhZyA9IG51bGw7XG52YXIgcXVldWVkTW91c2UgPSBudWxsOyAvLyBGb3IgcG9pbnRlciBldmVudHMgdGhlcmUgY2FuIGJlIG9uZSBsYXRlc3QgZXZlbnQgcGVyIHBvaW50ZXJJZC5cblxudmFyIHF1ZXVlZFBvaW50ZXJzID0gbmV3IE1hcCgpO1xudmFyIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcyA9IG5ldyBNYXAoKTsgLy8gV2UgY291bGQgY29uc2lkZXIgcmVwbGF5aW5nIHNlbGVjdGlvbmNoYW5nZSBhbmQgdG91Y2htb3ZlcyB0b28uXG5cbnZhciBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMgPSBbXTtcbnZhciBkaXNjcmV0ZVJlcGxheWFibGVFdmVudHMgPSBbJ21vdXNlZG93bicsICdtb3VzZXVwJywgJ3RvdWNoY2FuY2VsJywgJ3RvdWNoZW5kJywgJ3RvdWNoc3RhcnQnLCAnYXV4Y2xpY2snLCAnZGJsY2xpY2snLCAncG9pbnRlcmNhbmNlbCcsICdwb2ludGVyZG93bicsICdwb2ludGVydXAnLCAnZHJhZ2VuZCcsICdkcmFnc3RhcnQnLCAnZHJvcCcsICdjb21wb3NpdGlvbmVuZCcsICdjb21wb3NpdGlvbnN0YXJ0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnaW5wdXQnLCAndGV4dElucHV0JywgLy8gSW50ZW50aW9uYWxseSBjYW1lbENhc2Vcbidjb3B5JywgJ2N1dCcsICdwYXN0ZScsICdjbGljaycsICdjaGFuZ2UnLCAnY29udGV4dG1lbnUnLCAncmVzZXQnLCAnc3VibWl0J107XG5mdW5jdGlvbiBpc0Rpc2NyZXRlRXZlbnRUaGF0UmVxdWlyZXNIeWRyYXRpb24oZXZlbnRUeXBlKSB7XG4gIHJldHVybiBkaXNjcmV0ZVJlcGxheWFibGVFdmVudHMuaW5kZXhPZihldmVudFR5cGUpID4gLTE7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVF1ZXVlZFJlcGxheWFibGVFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICByZXR1cm4ge1xuICAgIGJsb2NrZWRPbjogYmxvY2tlZE9uLFxuICAgIGRvbUV2ZW50TmFtZTogZG9tRXZlbnROYW1lLFxuICAgIGV2ZW50U3lzdGVtRmxhZ3M6IGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgbmF0aXZlRXZlbnQ6IG5hdGl2ZUV2ZW50LFxuICAgIHRhcmdldENvbnRhaW5lcnM6IFt0YXJnZXRDb250YWluZXJdXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgIHF1ZXVlZEZvY3VzID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICBjYXNlICdkcmFnbGVhdmUnOlxuICAgICAgcXVldWVkRHJhZyA9IG51bGw7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgY2FzZSAnbW91c2VvdXQnOlxuICAgICAgcXVldWVkTW91c2UgPSBudWxsO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdwb2ludGVyb3Zlcic6XG4gICAgY2FzZSAncG9pbnRlcm91dCc6XG4gICAgICB7XG4gICAgICAgIHZhciBwb2ludGVySWQgPSBuYXRpdmVFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJzLmRlbGV0ZShwb2ludGVySWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgJ2dvdHBvaW50ZXJjYXB0dXJlJzpcbiAgICBjYXNlICdsb3N0cG9pbnRlcmNhcHR1cmUnOlxuICAgICAge1xuICAgICAgICB2YXIgX3BvaW50ZXJJZCA9IG5hdGl2ZUV2ZW50LnBvaW50ZXJJZDtcbiAgICAgICAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmRlbGV0ZShfcG9pbnRlcklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChleGlzdGluZ1F1ZXVlZEV2ZW50LCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICBpZiAoZXhpc3RpbmdRdWV1ZWRFdmVudCA9PT0gbnVsbCB8fCBleGlzdGluZ1F1ZXVlZEV2ZW50Lm5hdGl2ZUV2ZW50ICE9PSBuYXRpdmVFdmVudCkge1xuICAgIHZhciBxdWV1ZWRFdmVudCA9IGNyZWF0ZVF1ZXVlZFJlcGxheWFibGVFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG5cbiAgICBpZiAoYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgICB2YXIgX2ZpYmVyMiA9IGdldEluc3RhbmNlRnJvbU5vZGUoYmxvY2tlZE9uKTtcblxuICAgICAgaWYgKF9maWJlcjIgIT09IG51bGwpIHtcbiAgICAgICAgLy8gQXR0ZW1wdCB0byBpbmNyZWFzZSB0aGUgcHJpb3JpdHkgb2YgdGhpcyB0YXJnZXQuXG4gICAgICAgIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKF9maWJlcjIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWV1ZWRFdmVudDtcbiAgfSAvLyBJZiB3ZSBoYXZlIGFscmVhZHkgcXVldWVkIHRoaXMgZXhhY3QgZXZlbnQsIHRoZW4gaXQncyBiZWNhdXNlXG4gIC8vIHRoZSBkaWZmZXJlbnQgZXZlbnQgc3lzdGVtcyBoYXZlIGRpZmZlcmVudCBET00gZXZlbnQgbGlzdGVuZXJzLlxuICAvLyBXZSBjYW4gYWNjdW11bGF0ZSB0aGUgZmxhZ3MsIGFuZCB0aGUgdGFyZ2V0Q29udGFpbmVycywgYW5kXG4gIC8vIHN0b3JlIGEgc2luZ2xlIGV2ZW50IHRvIGJlIHJlcGxheWVkLlxuXG5cbiAgZXhpc3RpbmdRdWV1ZWRFdmVudC5ldmVudFN5c3RlbUZsYWdzIHw9IGV2ZW50U3lzdGVtRmxhZ3M7XG4gIHZhciB0YXJnZXRDb250YWluZXJzID0gZXhpc3RpbmdRdWV1ZWRFdmVudC50YXJnZXRDb250YWluZXJzO1xuXG4gIGlmICh0YXJnZXRDb250YWluZXIgIT09IG51bGwgJiYgdGFyZ2V0Q29udGFpbmVycy5pbmRleE9mKHRhcmdldENvbnRhaW5lcikgPT09IC0xKSB7XG4gICAgdGFyZ2V0Q29udGFpbmVycy5wdXNoKHRhcmdldENvbnRhaW5lcik7XG4gIH1cblxuICByZXR1cm4gZXhpc3RpbmdRdWV1ZWRFdmVudDtcbn1cblxuZnVuY3Rpb24gcXVldWVJZkNvbnRpbnVvdXNFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICAvLyBUaGVzZSBzZXQgcmVsYXRlZFRhcmdldCB0byBudWxsIGJlY2F1c2UgdGhlIHJlcGxheWVkIGV2ZW50IHdpbGwgYmUgdHJlYXRlZCBhcyBpZiB3ZVxuICAvLyBtb3ZlZCBmcm9tIG91dHNpZGUgdGhlIHdpbmRvdyAobm8gdGFyZ2V0KSBvbnRvIHRoZSB0YXJnZXQgb25jZSBpdCBoeWRyYXRlcy5cbiAgLy8gSW5zdGVhZCBvZiBtdXRhdGluZyB3ZSBjb3VsZCBjbG9uZSB0aGUgZXZlbnQuXG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgICB7XG4gICAgICAgIHZhciBmb2N1c0V2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHF1ZXVlZEZvY3VzID0gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRGb2N1cywgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgZm9jdXNFdmVudCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIGRyYWdFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWREcmFnID0gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWREcmFnLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBkcmFnRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgICB7XG4gICAgICAgIHZhciBtb3VzZUV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHF1ZXVlZE1vdXNlID0gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRNb3VzZSwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbW91c2VFdmVudCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgICAge1xuICAgICAgICB2YXIgcG9pbnRlckV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHZhciBwb2ludGVySWQgPSBwb2ludGVyRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVycy5zZXQocG9pbnRlcklkLCBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZFBvaW50ZXJzLmdldChwb2ludGVySWQpIHx8IG51bGwsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIHBvaW50ZXJFdmVudCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ2dvdHBvaW50ZXJjYXB0dXJlJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wb2ludGVyRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgdmFyIF9wb2ludGVySWQyID0gX3BvaW50ZXJFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5zZXQoX3BvaW50ZXJJZDIsIGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkUG9pbnRlckNhcHR1cmVzLmdldChfcG9pbnRlcklkMikgfHwgbnVsbCwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgX3BvaW50ZXJFdmVudCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn0gLy8gQ2hlY2sgaWYgdGhpcyB0YXJnZXQgaXMgdW5ibG9ja2VkLiBSZXR1cm5zIHRydWUgaWYgaXQncyB1bmJsb2NrZWQuXG5cbmZ1bmN0aW9uIGF0dGVtcHRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldChxdWV1ZWRUYXJnZXQpIHtcbiAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBzaGFyZXMgYSBsb3Qgb2YgbG9naWMgd2l0aCBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50LlxuICAvLyBUcnkgdG8gdW5pZnkgdGhlbS4gSXQncyBhIGJpdCB0cmlja3kgc2luY2UgaXQgd291bGQgcmVxdWlyZSB0d28gcmV0dXJuXG4gIC8vIHZhbHVlcy5cbiAgdmFyIHRhcmdldEluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShxdWV1ZWRUYXJnZXQudGFyZ2V0KTtcblxuICBpZiAodGFyZ2V0SW5zdCAhPT0gbnVsbCkge1xuICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIodGFyZ2V0SW5zdCk7XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgIT09IG51bGwpIHtcbiAgICAgIHZhciB0YWcgPSBuZWFyZXN0TW91bnRlZC50YWc7XG5cbiAgICAgIGlmICh0YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFN1c3BlbnNlSW5zdGFuY2VGcm9tRmliZXIobmVhcmVzdE1vdW50ZWQpO1xuXG4gICAgICAgIGlmIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlJ3JlIGJsb2NrZWQgb24gaHlkcmF0aW5nIHRoaXMgYm91bmRhcnkuXG4gICAgICAgICAgLy8gSW5jcmVhc2UgaXRzIHByaW9yaXR5LlxuICAgICAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBpbnN0YW5jZTtcbiAgICAgICAgICBhdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShxdWV1ZWRUYXJnZXQucHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eShuZWFyZXN0TW91bnRlZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgICAgdmFyIHJvb3QgPSBuZWFyZXN0TW91bnRlZC5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHtcbiAgICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gZ2V0Q29udGFpbmVyRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTsgLy8gV2UgZG9uJ3QgY3VycmVudGx5IGhhdmUgYSB3YXkgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mXG4gICAgICAgICAgLy8gYSByb290IG90aGVyIHRoYW4gc3luYy5cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsO1xufVxuXG5mdW5jdGlvbiBxdWV1ZUV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHRhcmdldCkge1xuICAvLyBUT0RPOiBUaGlzIHdpbGwgcmVhZCB0aGUgcHJpb3JpdHkgaWYgaXQncyBkaXNwYXRjaGVkIGJ5IHRoZSBSZWFjdFxuICAvLyBldmVudCBzeXN0ZW0gYnV0IG5vdCBuYXRpdmUgZXZlbnRzLiBTaG91bGQgcmVhZCB3aW5kb3cuZXZlbnQudHlwZSwgbGlrZVxuICAvLyB3ZSBkbyBmb3IgdXBkYXRlcyAoZ2V0Q3VycmVudEV2ZW50UHJpb3JpdHkpLlxuICB2YXIgdXBkYXRlUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkkMSgpO1xuICB2YXIgcXVldWVkVGFyZ2V0ID0ge1xuICAgIGJsb2NrZWRPbjogbnVsbCxcbiAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICBwcmlvcml0eTogdXBkYXRlUHJpb3JpdHlcbiAgfTtcbiAgdmFyIGkgPSAwO1xuXG4gIGZvciAoOyBpIDwgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gU3RvcCBvbmNlIHdlIGhpdCB0aGUgZmlyc3QgdGFyZ2V0IHdpdGggbG93ZXIgcHJpb3JpdHkgdGhhblxuICAgIGlmICghaXNIaWdoZXJFdmVudFByaW9yaXR5KHVwZGF0ZVByaW9yaXR5LCBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHNbaV0ucHJpb3JpdHkpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMuc3BsaWNlKGksIDAsIHF1ZXVlZFRhcmdldCk7XG5cbiAgaWYgKGkgPT09IDApIHtcbiAgICBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQocXVldWVkVGFyZ2V0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEV2ZW50KSB7XG4gIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdGFyZ2V0Q29udGFpbmVycyA9IHF1ZXVlZEV2ZW50LnRhcmdldENvbnRhaW5lcnM7XG5cbiAgd2hpbGUgKHRhcmdldENvbnRhaW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciB0YXJnZXRDb250YWluZXIgPSB0YXJnZXRDb250YWluZXJzWzBdO1xuICAgIHZhciBuZXh0QmxvY2tlZE9uID0gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChxdWV1ZWRFdmVudC5kb21FdmVudE5hbWUsIHF1ZXVlZEV2ZW50LmV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgcXVldWVkRXZlbnQubmF0aXZlRXZlbnQpO1xuXG4gICAgaWYgKG5leHRCbG9ja2VkT24gPT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgdmFyIG5hdGl2ZUV2ZW50ID0gcXVldWVkRXZlbnQubmF0aXZlRXZlbnQ7XG4gICAgICAgIHZhciBuYXRpdmVFdmVudENsb25lID0gbmV3IG5hdGl2ZUV2ZW50LmNvbnN0cnVjdG9yKG5hdGl2ZUV2ZW50LnR5cGUsIG5hdGl2ZUV2ZW50KTtcbiAgICAgICAgc2V0UmVwbGF5aW5nRXZlbnQobmF0aXZlRXZlbnRDbG9uZSk7XG4gICAgICAgIG5hdGl2ZUV2ZW50LnRhcmdldC5kaXNwYXRjaEV2ZW50KG5hdGl2ZUV2ZW50Q2xvbmUpO1xuICAgICAgICByZXNldFJlcGxheWluZ0V2ZW50KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlJ3JlIHN0aWxsIGJsb2NrZWQuIFRyeSBhZ2FpbiBsYXRlci5cbiAgICAgIHZhciBfZmliZXIzID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShuZXh0QmxvY2tlZE9uKTtcblxuICAgICAgaWYgKF9maWJlcjMgIT09IG51bGwpIHtcbiAgICAgICAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oX2ZpYmVyMyk7XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9IG5leHRCbG9ja2VkT247XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBUaGlzIHRhcmdldCBjb250YWluZXIgd2FzIHN1Y2Nlc3NmdWxseSBkaXNwYXRjaGVkLiBUcnkgdGhlIG5leHQuXG5cblxuICAgIHRhcmdldENvbnRhaW5lcnMuc2hpZnQoKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50SW5NYXAocXVldWVkRXZlbnQsIGtleSwgbWFwKSB7XG4gIGlmIChhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEV2ZW50KSkge1xuICAgIG1hcC5kZWxldGUoa2V5KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYXlVbmJsb2NrZWRFdmVudHMoKSB7XG4gIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSBmYWxzZTtcblxuXG4gIGlmIChxdWV1ZWRGb2N1cyAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEZvY3VzKSkge1xuICAgIHF1ZXVlZEZvY3VzID0gbnVsbDtcbiAgfVxuXG4gIGlmIChxdWV1ZWREcmFnICE9PSBudWxsICYmIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRHJhZykpIHtcbiAgICBxdWV1ZWREcmFnID0gbnVsbDtcbiAgfVxuXG4gIGlmIChxdWV1ZWRNb3VzZSAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZE1vdXNlKSkge1xuICAgIHF1ZXVlZE1vdXNlID0gbnVsbDtcbiAgfVxuXG4gIHF1ZXVlZFBvaW50ZXJzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTtcbiAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZEV2ZW50LCB1bmJsb2NrZWQpIHtcbiAgaWYgKHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9PT0gdW5ibG9ja2VkKSB7XG4gICAgcXVldWVkRXZlbnQuYmxvY2tlZE9uID0gbnVsbDtcblxuICAgIGlmICghaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCkge1xuICAgICAgaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCA9IHRydWU7IC8vIFNjaGVkdWxlIGEgY2FsbGJhY2sgdG8gYXR0ZW1wdCByZXBsYXlpbmcgYXMgbWFueSBldmVudHMgYXMgYXJlXG4gICAgICAvLyBub3cgdW5ibG9ja2VkLiBUaGlzIGZpcnN0IG1pZ2h0IG5vdCBhY3R1YWxseSBiZSB1bmJsb2NrZWQgeWV0LlxuICAgICAgLy8gV2UgY291bGQgY2hlY2sgaXQgZWFybHkgdG8gYXZvaWQgc2NoZWR1bGluZyBhbiB1bm5lY2Vzc2FyeSBjYWxsYmFjay5cblxuICAgICAgU2NoZWR1bGVyLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soU2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LCByZXBsYXlVbmJsb2NrZWRFdmVudHMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXRyeUlmQmxvY2tlZE9uKHVuYmxvY2tlZCkge1xuICAvLyBNYXJrIGFueXRoaW5nIHRoYXQgd2FzIGJsb2NrZWQgb24gdGhpcyBhcyBubyBsb25nZXIgYmxvY2tlZFxuICAvLyBhbmQgZWxpZ2libGUgZm9yIGEgcmVwbGF5LlxuICBpZiAocXVldWVkRGlzY3JldGVFdmVudHMubGVuZ3RoID4gMCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWREaXNjcmV0ZUV2ZW50c1swXSwgdW5ibG9ja2VkKTsgLy8gVGhpcyBpcyBhIGV4cG9uZW50aWFsIHNlYXJjaCBmb3IgZWFjaCBib3VuZGFyeSB0aGF0IGNvbW1pdHMuIEkgdGhpbmsgaXQnc1xuICAgIC8vIHdvcnRoIGl0IGJlY2F1c2Ugd2UgZXhwZWN0IHZlcnkgZmV3IGRpc2NyZXRlIGV2ZW50cyB0byBxdWV1ZSB1cCBhbmQgb25jZVxuICAgIC8vIHdlIGFyZSBhY3R1YWxseSBmdWxseSB1bmJsb2NrZWQgaXQgd2lsbCBiZSBmYXN0IHRvIHJlcGxheSB0aGVtLlxuXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBxdWV1ZWREaXNjcmV0ZUV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXVlZEV2ZW50ID0gcXVldWVkRGlzY3JldGVFdmVudHNbaV07XG5cbiAgICAgIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gPT09IHVuYmxvY2tlZCkge1xuICAgICAgICBxdWV1ZWRFdmVudC5ibG9ja2VkT24gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChxdWV1ZWRGb2N1cyAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRGb2N1cywgdW5ibG9ja2VkKTtcbiAgfVxuXG4gIGlmIChxdWV1ZWREcmFnICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZERyYWcsIHVuYmxvY2tlZCk7XG4gIH1cblxuICBpZiAocXVldWVkTW91c2UgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkTW91c2UsIHVuYmxvY2tlZCk7XG4gIH1cblxuICB2YXIgdW5ibG9jayA9IGZ1bmN0aW9uIChxdWV1ZWRFdmVudCkge1xuICAgIHJldHVybiBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRXZlbnQsIHVuYmxvY2tlZCk7XG4gIH07XG5cbiAgcXVldWVkUG9pbnRlcnMuZm9yRWFjaCh1bmJsb2NrKTtcbiAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2godW5ibG9jayk7XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgcXVldWVkVGFyZ2V0ID0gcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzW19pXTtcblxuICAgIGlmIChxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID09PSB1bmJsb2NrZWQpIHtcbiAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHdoaWxlIChxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgIHZhciBuZXh0RXhwbGljaXRUYXJnZXQgPSBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHNbMF07XG5cbiAgICBpZiAobmV4dEV4cGxpY2l0VGFyZ2V0LmJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgc3RpbGwgYmxvY2tlZC5cbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQobmV4dEV4cGxpY2l0VGFyZ2V0KTtcblxuICAgICAgaWYgKG5leHRFeHBsaWNpdFRhcmdldC5ibG9ja2VkT24gPT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UncmUgdW5ibG9ja2VkLlxuICAgICAgICBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMuc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7IC8vIFRPRE86IGNhbiB3ZSBzdG9wIGV4cG9ydGluZyB0aGVzZT9cblxudmFyIF9lbmFibGVkID0gdHJ1ZTsgLy8gVGhpcyBpcyBleHBvcnRlZCBpbiBGQiBidWlsZHMgZm9yIHVzZSBieSBsZWdhY3kgRkIgbGF5ZXIgaW5mcmEuXG4vLyBXZSdkIGxpa2UgdG8gcmVtb3ZlIHRoaXMgYnV0IGl0J3Mgbm90IGNsZWFyIGlmIHRoaXMgaXMgc2FmZS5cblxuZnVuY3Rpb24gc2V0RW5hYmxlZChlbmFibGVkKSB7XG4gIF9lbmFibGVkID0gISFlbmFibGVkO1xufVxuZnVuY3Rpb24gaXNFbmFibGVkKCkge1xuICByZXR1cm4gX2VuYWJsZWQ7XG59XG5mdW5jdGlvbiBjcmVhdGVFdmVudExpc3RlbmVyV3JhcHBlcldpdGhQcmlvcml0eSh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncykge1xuICB2YXIgZXZlbnRQcmlvcml0eSA9IGdldEV2ZW50UHJpb3JpdHkoZG9tRXZlbnROYW1lKTtcbiAgdmFyIGxpc3RlbmVyV3JhcHBlcjtcblxuICBzd2l0Y2ggKGV2ZW50UHJpb3JpdHkpIHtcbiAgICBjYXNlIERpc2NyZXRlRXZlbnRQcmlvcml0eTpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoRGlzY3JldGVFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBDb250aW51b3VzRXZlbnRQcmlvcml0eTpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoQ29udGludW91c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIERlZmF1bHRFdmVudFByaW9yaXR5OlxuICAgIGRlZmF1bHQ6XG4gICAgICBsaXN0ZW5lcldyYXBwZXIgPSBkaXNwYXRjaEV2ZW50O1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJXcmFwcGVyLmJpbmQobnVsbCwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaERpc2NyZXRlRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBudWxsO1xuXG4gIHRyeSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgZGlzcGF0Y2hFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBudWxsO1xuXG4gIHRyeSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KENvbnRpbnVvdXNFdmVudFByaW9yaXR5KTtcbiAgICBkaXNwYXRjaEV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICBpZiAoIV9lbmFibGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIGRpc3BhdGNoRXZlbnRXaXRoRW5hYmxlQ2FwdHVyZVBoYXNlU2VsZWN0aXZlSHlkcmF0aW9uV2l0aG91dERpc2NyZXRlRXZlbnRSZXBsYXkoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50V2l0aEVuYWJsZUNhcHR1cmVQaGFzZVNlbGVjdGl2ZUh5ZHJhdGlvbldpdGhvdXREaXNjcmV0ZUV2ZW50UmVwbGF5KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB2YXIgYmxvY2tlZE9uID0gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuXG4gIGlmIChibG9ja2VkT24gPT09IG51bGwpIHtcbiAgICBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgcmV0dXJuX3RhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcik7XG4gICAgY2xlYXJJZkNvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocXVldWVJZkNvbnRpbnVvdXNFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkpIHtcbiAgICBuYXRpdmVFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICByZXR1cm47XG4gIH0gLy8gV2UgbmVlZCB0byBjbGVhciBvbmx5IGlmIHdlIGRpZG4ndCBxdWV1ZSBiZWNhdXNlXG4gIC8vIHF1ZXVlaW5nIGlzIGFjY3VtdWxhdGl2ZS5cblxuXG4gIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG5cbiAgaWYgKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19DQVBUVVJFX1BIQVNFICYmIGlzRGlzY3JldGVFdmVudFRoYXRSZXF1aXJlc0h5ZHJhdGlvbihkb21FdmVudE5hbWUpKSB7XG4gICAgd2hpbGUgKGJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgdmFyIGZpYmVyID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShibG9ja2VkT24pO1xuXG4gICAgICBpZiAoZmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGZpYmVyKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5leHRCbG9ja2VkT24gPSBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG5cbiAgICAgIGlmIChuZXh0QmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgICAgIGRpc3BhdGNoRXZlbnRGb3JQbHVnaW5FdmVudFN5c3RlbShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCByZXR1cm5fdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5leHRCbG9ja2VkT24gPT09IGJsb2NrZWRPbikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgYmxvY2tlZE9uID0gbmV4dEJsb2NrZWRPbjtcbiAgICB9XG5cbiAgICBpZiAoYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgICBuYXRpdmVFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0gLy8gVGhpcyBpcyBub3QgcmVwbGF5YWJsZSBzbyB3ZSdsbCBpbnZva2UgaXQgYnV0IHdpdGhvdXQgYSB0YXJnZXQsXG4gIC8vIGluIGNhc2UgdGhlIGV2ZW50IHN5c3RlbSBuZWVkcyB0byB0cmFjZSBpdC5cblxuXG4gIGRpc3BhdGNoRXZlbnRGb3JQbHVnaW5FdmVudFN5c3RlbShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCBudWxsLCB0YXJnZXRDb250YWluZXIpO1xufVxuXG52YXIgcmV0dXJuX3RhcmdldEluc3QgPSBudWxsOyAvLyBSZXR1cm5zIGEgU3VzcGVuc2VJbnN0YW5jZSBvciBDb250YWluZXIgaWYgaXQncyBibG9ja2VkLlxuLy8gVGhlIHJldHVybl90YXJnZXRJbnN0IGZpZWxkIGFib3ZlIGlzIGNvbmNlcHR1YWxseSBwYXJ0IG9mIHRoZSByZXR1cm4gdmFsdWUuXG5cbmZ1bmN0aW9uIGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIC8vIFRPRE86IFdhcm4gaWYgX2VuYWJsZWQgaXMgZmFsc2UuXG4gIHJldHVybl90YXJnZXRJbnN0ID0gbnVsbDtcbiAgdmFyIG5hdGl2ZUV2ZW50VGFyZ2V0ID0gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpO1xuICB2YXIgdGFyZ2V0SW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBpZiAodGFyZ2V0SW5zdCAhPT0gbnVsbCkge1xuICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIodGFyZ2V0SW5zdCk7XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgdHJlZSBoYXMgYmVlbiB1bm1vdW50ZWQgYWxyZWFkeS4gRGlzcGF0Y2ggd2l0aG91dCBhIHRhcmdldC5cbiAgICAgIHRhcmdldEluc3QgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdGFnID0gbmVhcmVzdE1vdW50ZWQudGFnO1xuXG4gICAgICBpZiAodGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBRdWV1ZSB0aGUgZXZlbnQgdG8gYmUgcmVwbGF5ZWQgbGF0ZXIuIEFib3J0IGRpc3BhdGNoaW5nIHNpbmNlIHdlXG4gICAgICAgICAgLy8gZG9uJ3Qgd2FudCB0aGlzIGV2ZW50IGRpc3BhdGNoZWQgdHdpY2UgdGhyb3VnaCB0aGUgZXZlbnQgc3lzdGVtLlxuICAgICAgICAgIC8vIFRPRE86IElmIHRoaXMgaXMgdGhlIGZpcnN0IGRpc2NyZXRlIGV2ZW50IGluIHRoZSBxdWV1ZS4gU2NoZWR1bGUgYW4gaW5jcmVhc2VkXG4gICAgICAgICAgLy8gcHJpb3JpdHkgZm9yIHRoaXMgYm91bmRhcnkuXG4gICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICB9IC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlbiwgc29tZXRoaW5nIHdlbnQgd3JvbmcgYnV0IHRvIGF2b2lkIGJsb2NraW5nXG4gICAgICAgIC8vIHRoZSB3aG9sZSBzeXN0ZW0sIGRpc3BhdGNoIHRoZSBldmVudCB3aXRob3V0IGEgdGFyZ2V0LlxuICAgICAgICAvLyBUT0RPOiBXYXJuLlxuXG5cbiAgICAgICAgdGFyZ2V0SW5zdCA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgICAgdmFyIHJvb3QgPSBuZWFyZXN0TW91bnRlZC5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIGhhcHBlbnMgZHVyaW5nIGEgcmVwbGF5IHNvbWV0aGluZyB3ZW50IHdyb25nIGFuZCBpdCBtaWdodCBibG9ja1xuICAgICAgICAgIC8vIHRoZSB3aG9sZSBzeXN0ZW0uXG4gICAgICAgICAgcmV0dXJuIGdldENvbnRhaW5lckZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAobmVhcmVzdE1vdW50ZWQgIT09IHRhcmdldEluc3QpIHtcbiAgICAgICAgLy8gSWYgd2UgZ2V0IGFuIGV2ZW50IChleDogaW1nIG9ubG9hZCkgYmVmb3JlIGNvbW1pdHRpbmcgdGhhdFxuICAgICAgICAvLyBjb21wb25lbnQncyBtb3VudCwgaWdub3JlIGl0IGZvciBub3cgKHRoYXQgaXMsIHRyZWF0IGl0IGFzIGlmIGl0IHdhcyBhblxuICAgICAgICAvLyBldmVudCBvbiBhIG5vbi1SZWFjdCB0cmVlKS4gV2UgbWlnaHQgYWxzbyBjb25zaWRlciBxdWV1ZWluZyBldmVudHMgYW5kXG4gICAgICAgIC8vIGRpc3BhdGNoaW5nIHRoZW0gYWZ0ZXIgdGhlIG1vdW50LlxuICAgICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm5fdGFyZ2V0SW5zdCA9IHRhcmdldEluc3Q7IC8vIFdlJ3JlIG5vdCBibG9ja2VkIG9uIGFueXRoaW5nLlxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ2V0RXZlbnRQcmlvcml0eShkb21FdmVudE5hbWUpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAvLyBVc2VkIGJ5IFNpbXBsZUV2ZW50UGx1Z2luOlxuICAgIGNhc2UgJ2NhbmNlbCc6XG4gICAgY2FzZSAnY2xpY2snOlxuICAgIGNhc2UgJ2Nsb3NlJzpcbiAgICBjYXNlICdjb250ZXh0bWVudSc6XG4gICAgY2FzZSAnY29weSc6XG4gICAgY2FzZSAnY3V0JzpcbiAgICBjYXNlICdhdXhjbGljayc6XG4gICAgY2FzZSAnZGJsY2xpY2snOlxuICAgIGNhc2UgJ2RyYWdlbmQnOlxuICAgIGNhc2UgJ2RyYWdzdGFydCc6XG4gICAgY2FzZSAnZHJvcCc6XG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICBjYXNlICdpbnZhbGlkJzpcbiAgICBjYXNlICdrZXlkb3duJzpcbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgY2FzZSAnbW91c2V1cCc6XG4gICAgY2FzZSAncGFzdGUnOlxuICAgIGNhc2UgJ3BhdXNlJzpcbiAgICBjYXNlICdwbGF5JzpcbiAgICBjYXNlICdwb2ludGVyY2FuY2VsJzpcbiAgICBjYXNlICdwb2ludGVyZG93bic6XG4gICAgY2FzZSAncG9pbnRlcnVwJzpcbiAgICBjYXNlICdyYXRlY2hhbmdlJzpcbiAgICBjYXNlICdyZXNldCc6XG4gICAgY2FzZSAncmVzaXplJzpcbiAgICBjYXNlICdzZWVrZWQnOlxuICAgIGNhc2UgJ3N1Ym1pdCc6XG4gICAgY2FzZSAndG91Y2hjYW5jZWwnOlxuICAgIGNhc2UgJ3RvdWNoZW5kJzpcbiAgICBjYXNlICd0b3VjaHN0YXJ0JzpcbiAgICBjYXNlICd2b2x1bWVjaGFuZ2UnOiAvLyBVc2VkIGJ5IHBvbHlmaWxsczpcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgJ2NoYW5nZSc6XG4gICAgY2FzZSAnc2VsZWN0aW9uY2hhbmdlJzpcbiAgICBjYXNlICd0ZXh0SW5wdXQnOlxuICAgIGNhc2UgJ2NvbXBvc2l0aW9uc3RhcnQnOlxuICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzpcbiAgICBjYXNlICdjb21wb3NpdGlvbnVwZGF0ZSc6IC8vIE9ubHkgZW5hYmxlQ3JlYXRlRXZlbnRIYW5kbGVBUEk6XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlICdiZWZvcmVibHVyJzpcbiAgICBjYXNlICdhZnRlcmJsdXInOiAvLyBOb3QgdXNlZCBieSBSZWFjdCBidXQgY291bGQgYmUgYnkgdXNlciBjb2RlOlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSAnYmVmb3JlaW5wdXQnOlxuICAgIGNhc2UgJ2JsdXInOlxuICAgIGNhc2UgJ2Z1bGxzY3JlZW5jaGFuZ2UnOlxuICAgIGNhc2UgJ2ZvY3VzJzpcbiAgICBjYXNlICdoYXNoY2hhbmdlJzpcbiAgICBjYXNlICdwb3BzdGF0ZSc6XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICBjYXNlICdzZWxlY3RzdGFydCc6XG4gICAgICByZXR1cm4gRGlzY3JldGVFdmVudFByaW9yaXR5O1xuXG4gICAgY2FzZSAnZHJhZyc6XG4gICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICBjYXNlICdkcmFnZXhpdCc6XG4gICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICBjYXNlICdkcmFnb3Zlcic6XG4gICAgY2FzZSAnbW91c2Vtb3ZlJzpcbiAgICBjYXNlICdtb3VzZW91dCc6XG4gICAgY2FzZSAnbW91c2VvdmVyJzpcbiAgICBjYXNlICdwb2ludGVybW92ZSc6XG4gICAgY2FzZSAncG9pbnRlcm91dCc6XG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3Njcm9sbCc6XG4gICAgY2FzZSAndG9nZ2xlJzpcbiAgICBjYXNlICd0b3VjaG1vdmUnOlxuICAgIGNhc2UgJ3doZWVsJzogLy8gTm90IHVzZWQgYnkgUmVhY3QgYnV0IGNvdWxkIGJlIGJ5IHVzZXIgY29kZTpcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgJ21vdXNlZW50ZXInOlxuICAgIGNhc2UgJ21vdXNlbGVhdmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJlbnRlcic6XG4gICAgY2FzZSAncG9pbnRlcmxlYXZlJzpcbiAgICAgIHJldHVybiBDb250aW51b3VzRXZlbnRQcmlvcml0eTtcblxuICAgIGNhc2UgJ21lc3NhZ2UnOlxuICAgICAge1xuICAgICAgICAvLyBXZSBtaWdodCBiZSBpbiB0aGUgU2NoZWR1bGVyIGNhbGxiYWNrLlxuICAgICAgICAvLyBFdmVudHVhbGx5IHRoaXMgbWVjaGFuaXNtIHdpbGwgYmUgcmVwbGFjZWQgYnkgYSBjaGVja1xuICAgICAgICAvLyBvZiB0aGUgY3VycmVudCBwcmlvcml0eSBvbiB0aGUgbmF0aXZlIHNjaGVkdWxlci5cbiAgICAgICAgdmFyIHNjaGVkdWxlclByaW9yaXR5ID0gZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKTtcblxuICAgICAgICBzd2l0Y2ggKHNjaGVkdWxlclByaW9yaXR5KSB7XG4gICAgICAgICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICAgICAgICAgIHJldHVybiBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk7XG5cbiAgICAgICAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVvdXNFdmVudFByaW9yaXR5O1xuXG4gICAgICAgICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICAgICAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgICAgICAgICAgLy8gVE9ETzogSGFuZGxlIExvd1NjaGVkdWxlclByaW9yaXR5LCBzb21laG93LiBNYXliZSB0aGUgc2FtZSBsYW5lIGFzIGh5ZHJhdGlvbi5cbiAgICAgICAgICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcblxuICAgICAgICAgIGNhc2UgSWRsZVByaW9yaXR5OlxuICAgICAgICAgICAgcmV0dXJuIElkbGVFdmVudFByaW9yaXR5O1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRFdmVudEJ1YmJsZUxpc3RlbmVyKHRhcmdldCwgZXZlbnRUeXBlLCBsaXN0ZW5lcikge1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cbmZ1bmN0aW9uIGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyKHRhcmdldCwgZXZlbnRUeXBlLCBsaXN0ZW5lcikge1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuZnVuY3Rpb24gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyLCBwYXNzaXZlKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHtcbiAgICBjYXB0dXJlOiB0cnVlLFxuICAgIHBhc3NpdmU6IHBhc3NpdmVcbiAgfSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cbmZ1bmN0aW9uIGFkZEV2ZW50QnViYmxlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyLCBwYXNzaXZlKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHtcbiAgICBwYXNzaXZlOiBwYXNzaXZlXG4gIH0pO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5cbi8qKlxuICogVGhlc2UgdmFyaWFibGVzIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHRleHQgY29udGVudCBvZiBhIHRhcmdldCBub2RlLFxuICogYWxsb3dpbmcgY29tcGFyaXNvbiBvZiBjb250ZW50IGJlZm9yZSBhbmQgYWZ0ZXIgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBJZGVudGlmeSB0aGUgbm9kZSB3aGVyZSBzZWxlY3Rpb24gY3VycmVudGx5IGJlZ2lucywgdGhlbiBvYnNlcnZlXG4gKiBib3RoIGl0cyB0ZXh0IGNvbnRlbnQgYW5kIGl0cyBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBET00uIFNpbmNlIHRoZVxuICogYnJvd3NlciBtYXkgbmF0aXZlbHkgcmVwbGFjZSB0aGUgdGFyZ2V0IG5vZGUgZHVyaW5nIGNvbXBvc2l0aW9uLCB3ZSBjYW5cbiAqIHVzZSBpdHMgcG9zaXRpb24gdG8gZmluZCBpdHMgcmVwbGFjZW1lbnQuXG4gKlxuICpcbiAqL1xudmFyIHJvb3QgPSBudWxsO1xudmFyIHN0YXJ0VGV4dCA9IG51bGw7XG52YXIgZmFsbGJhY2tUZXh0ID0gbnVsbDtcbmZ1bmN0aW9uIGluaXRpYWxpemUobmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcm9vdCA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICBzdGFydFRleHQgPSBnZXRUZXh0KCk7XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gcmVzZXQoKSB7XG4gIHJvb3QgPSBudWxsO1xuICBzdGFydFRleHQgPSBudWxsO1xuICBmYWxsYmFja1RleHQgPSBudWxsO1xufVxuZnVuY3Rpb24gZ2V0RGF0YSgpIHtcbiAgaWYgKGZhbGxiYWNrVGV4dCkge1xuICAgIHJldHVybiBmYWxsYmFja1RleHQ7XG4gIH1cblxuICB2YXIgc3RhcnQ7XG4gIHZhciBzdGFydFZhbHVlID0gc3RhcnRUZXh0O1xuICB2YXIgc3RhcnRMZW5ndGggPSBzdGFydFZhbHVlLmxlbmd0aDtcbiAgdmFyIGVuZDtcbiAgdmFyIGVuZFZhbHVlID0gZ2V0VGV4dCgpO1xuICB2YXIgZW5kTGVuZ3RoID0gZW5kVmFsdWUubGVuZ3RoO1xuXG4gIGZvciAoc3RhcnQgPSAwOyBzdGFydCA8IHN0YXJ0TGVuZ3RoOyBzdGFydCsrKSB7XG4gICAgaWYgKHN0YXJ0VmFsdWVbc3RhcnRdICE9PSBlbmRWYWx1ZVtzdGFydF0pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBtaW5FbmQgPSBzdGFydExlbmd0aCAtIHN0YXJ0O1xuXG4gIGZvciAoZW5kID0gMTsgZW5kIDw9IG1pbkVuZDsgZW5kKyspIHtcbiAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydExlbmd0aCAtIGVuZF0gIT09IGVuZFZhbHVlW2VuZExlbmd0aCAtIGVuZF0pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzbGljZVRhaWwgPSBlbmQgPiAxID8gMSAtIGVuZCA6IHVuZGVmaW5lZDtcbiAgZmFsbGJhY2tUZXh0ID0gZW5kVmFsdWUuc2xpY2Uoc3RhcnQsIHNsaWNlVGFpbCk7XG4gIHJldHVybiBmYWxsYmFja1RleHQ7XG59XG5mdW5jdGlvbiBnZXRUZXh0KCkge1xuICBpZiAoJ3ZhbHVlJyBpbiByb290KSB7XG4gICAgcmV0dXJuIHJvb3QudmFsdWU7XG4gIH1cblxuICByZXR1cm4gcm9vdC50ZXh0Q29udGVudDtcbn1cblxuLyoqXG4gKiBgY2hhckNvZGVgIHJlcHJlc2VudHMgdGhlIGFjdHVhbCBcImNoYXJhY3RlciBjb2RlXCIgYW5kIGlzIHNhZmUgdG8gdXNlIHdpdGhcbiAqIGBTdHJpbmcuZnJvbUNoYXJDb2RlYC4gQXMgc3VjaCwgb25seSBrZXlzIHRoYXQgY29ycmVzcG9uZCB0byBwcmludGFibGVcbiAqIGNoYXJhY3RlcnMgcHJvZHVjZSBhIHZhbGlkIGBjaGFyQ29kZWAsIHRoZSBvbmx5IGV4Y2VwdGlvbiB0byB0aGlzIGlzIEVudGVyLlxuICogVGhlIFRhYi1rZXkgaXMgY29uc2lkZXJlZCBub24tcHJpbnRhYmxlIGFuZCBkb2VzIG5vdCBoYXZlIGEgYGNoYXJDb2RlYCxcbiAqIHByZXN1bWFibHkgYmVjYXVzZSBpdCBkb2VzIG5vdCBwcm9kdWNlIGEgdGFiLWNoYXJhY3RlciBpbiBicm93c2Vycy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IE5vcm1hbGl6ZWQgYGNoYXJDb2RlYCBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkge1xuICB2YXIgY2hhckNvZGU7XG4gIHZhciBrZXlDb2RlID0gbmF0aXZlRXZlbnQua2V5Q29kZTtcblxuICBpZiAoJ2NoYXJDb2RlJyBpbiBuYXRpdmVFdmVudCkge1xuICAgIGNoYXJDb2RlID0gbmF0aXZlRXZlbnQuY2hhckNvZGU7IC8vIEZGIGRvZXMgbm90IHNldCBgY2hhckNvZGVgIGZvciB0aGUgRW50ZXIta2V5LCBjaGVjayBhZ2FpbnN0IGBrZXlDb2RlYC5cblxuICAgIGlmIChjaGFyQ29kZSA9PT0gMCAmJiBrZXlDb2RlID09PSAxMykge1xuICAgICAgY2hhckNvZGUgPSAxMztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSUU4IGRvZXMgbm90IGltcGxlbWVudCBgY2hhckNvZGVgLCBidXQgYGtleUNvZGVgIGhhcyB0aGUgY29ycmVjdCB2YWx1ZS5cbiAgICBjaGFyQ29kZSA9IGtleUNvZGU7XG4gIH0gLy8gSUUgYW5kIEVkZ2UgKG9uIFdpbmRvd3MpIGFuZCBDaHJvbWUgLyBTYWZhcmkgKG9uIFdpbmRvd3MgYW5kIExpbnV4KVxuICAvLyByZXBvcnQgRW50ZXIgYXMgY2hhckNvZGUgMTAgd2hlbiBjdHJsIGlzIHByZXNzZWQuXG5cblxuICBpZiAoY2hhckNvZGUgPT09IDEwKSB7XG4gICAgY2hhckNvZGUgPSAxMztcbiAgfSAvLyBTb21lIG5vbi1wcmludGFibGUga2V5cyBhcmUgcmVwb3J0ZWQgaW4gYGNoYXJDb2RlYC9ga2V5Q29kZWAsIGRpc2NhcmQgdGhlbS5cbiAgLy8gTXVzdCBub3QgZGlzY2FyZCB0aGUgKG5vbi0pcHJpbnRhYmxlIEVudGVyLWtleS5cblxuXG4gIGlmIChjaGFyQ29kZSA+PSAzMiB8fCBjaGFyQ29kZSA9PT0gMTMpIHtcbiAgICByZXR1cm4gY2hhckNvZGU7XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWUoKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2UoKSB7XG4gIHJldHVybiBmYWxzZTtcbn0gLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGEgZmFjdG9yeSBzbyB0aGF0IHdlIGhhdmUgZGlmZmVyZW50IHJldHVybmVkIGNvbnN0cnVjdG9ycy5cbi8vIElmIHdlIGhhZCBhIHNpbmdsZSBjb25zdHJ1Y3RvciwgaXQgd291bGQgYmUgbWVnYW1vcnBoaWMgYW5kIGVuZ2luZXMgd291bGQgZGVvcHQuXG5cblxuZnVuY3Rpb24gY3JlYXRlU3ludGhldGljRXZlbnQoSW50ZXJmYWNlKSB7XG4gIC8qKlxuICAgKiBTeW50aGV0aWMgZXZlbnRzIGFyZSBkaXNwYXRjaGVkIGJ5IGV2ZW50IHBsdWdpbnMsIHR5cGljYWxseSBpbiByZXNwb25zZSB0byBhXG4gICAqIHRvcC1sZXZlbCBldmVudCBkZWxlZ2F0aW9uIGhhbmRsZXIuXG4gICAqXG4gICAqIFRoZXNlIHN5c3RlbXMgc2hvdWxkIGdlbmVyYWxseSB1c2UgcG9vbGluZyB0byByZWR1Y2UgdGhlIGZyZXF1ZW5jeSBvZiBnYXJiYWdlXG4gICAqIGNvbGxlY3Rpb24uIFRoZSBzeXN0ZW0gc2hvdWxkIGNoZWNrIGBpc1BlcnNpc3RlbnRgIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZVxuICAgKiBldmVudCBzaG91bGQgYmUgcmVsZWFzZWQgaW50byB0aGUgcG9vbCBhZnRlciBiZWluZyBkaXNwYXRjaGVkLiBVc2VycyB0aGF0XG4gICAqIG5lZWQgYSBwZXJzaXN0ZWQgZXZlbnQgc2hvdWxkIGludm9rZSBgcGVyc2lzdGAuXG4gICAqXG4gICAqIFN5bnRoZXRpYyBldmVudHMgKGFuZCBzdWJjbGFzc2VzKSBpbXBsZW1lbnQgdGhlIERPTSBMZXZlbCAzIEV2ZW50cyBBUEkgYnlcbiAgICogbm9ybWFsaXppbmcgYnJvd3NlciBxdWlya3MuIFN1YmNsYXNzZXMgZG8gbm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8gaW1wbGVtZW50IGFcbiAgICogRE9NIGludGVyZmFjZTsgY3VzdG9tIGFwcGxpY2F0aW9uLXNwZWNpZmljIGV2ZW50cyBjYW4gYWxzbyBzdWJjbGFzcyB0aGlzLlxuICAgKi9cbiAgZnVuY3Rpb24gU3ludGhldGljQmFzZUV2ZW50KHJlYWN0TmFtZSwgcmVhY3RFdmVudFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIHRoaXMuX3JlYWN0TmFtZSA9IHJlYWN0TmFtZTtcbiAgICB0aGlzLl90YXJnZXRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgICB0aGlzLnR5cGUgPSByZWFjdEV2ZW50VHlwZTtcbiAgICB0aGlzLm5hdGl2ZUV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgdGhpcy50YXJnZXQgPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgICB0aGlzLmN1cnJlbnRUYXJnZXQgPSBudWxsO1xuXG4gICAgZm9yICh2YXIgX3Byb3BOYW1lIGluIEludGVyZmFjZSkge1xuICAgICAgaWYgKCFJbnRlcmZhY2UuaGFzT3duUHJvcGVydHkoX3Byb3BOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5vcm1hbGl6ZSA9IEludGVyZmFjZVtfcHJvcE5hbWVdO1xuXG4gICAgICBpZiAobm9ybWFsaXplKSB7XG4gICAgICAgIHRoaXNbX3Byb3BOYW1lXSA9IG5vcm1hbGl6ZShuYXRpdmVFdmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzW19wcm9wTmFtZV0gPSBuYXRpdmVFdmVudFtfcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkZWZhdWx0UHJldmVudGVkID0gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCAhPSBudWxsID8gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCA6IG5hdGl2ZUV2ZW50LnJldHVyblZhbHVlID09PSBmYWxzZTtcblxuICAgIGlmIChkZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYXNzaWduKFN5bnRoZXRpY0Jhc2VFdmVudC5wcm90b3R5cGUsIHtcbiAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgIHZhciBldmVudCA9IHRoaXMubmF0aXZlRXZlbnQ7XG5cbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gJEZsb3dGaXhNZSAtIGZsb3cgaXMgbm90IGF3YXJlIG9mIGB1bmtub3duYCBpbiBJRVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQucmV0dXJuVmFsdWUgIT09ICd1bmtub3duJykge1xuICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlO1xuICAgIH0sXG4gICAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuXG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8gJEZsb3dGaXhNZSAtIGZsb3cgaXMgbm90IGF3YXJlIG9mIGB1bmtub3duYCBpbiBJRVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQuY2FuY2VsQnViYmxlICE9PSAndW5rbm93bicpIHtcbiAgICAgICAgLy8gVGhlIENoYW5nZUV2ZW50UGx1Z2luIHJlZ2lzdGVycyBhIFwicHJvcGVydHljaGFuZ2VcIiBldmVudCBmb3JcbiAgICAgICAgLy8gSUUuIFRoaXMgZXZlbnQgZG9lcyBub3Qgc3VwcG9ydCBidWJibGluZyBvciBjYW5jZWxsaW5nLCBhbmRcbiAgICAgICAgLy8gYW55IHJlZmVyZW5jZXMgdG8gY2FuY2VsQnViYmxlIHRocm93IFwiTWVtYmVyIG5vdCBmb3VuZFwiLiAgQVxuICAgICAgICAvLyB0eXBlb2YgY2hlY2sgb2YgXCJ1bmtub3duXCIgY2lyY3VtdmVudHMgdGhpcyBpc3N1ZSAoYW5kIGlzIGFsc29cbiAgICAgICAgLy8gSUUgc3BlY2lmaWMpLlxuICAgICAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFdlIHJlbGVhc2UgYWxsIGRpc3BhdGNoZWQgYFN5bnRoZXRpY0V2ZW50YHMgYWZ0ZXIgZWFjaCBldmVudCBsb29wLCBhZGRpbmdcbiAgICAgKiB0aGVtIGJhY2sgaW50byB0aGUgcG9vbC4gVGhpcyBhbGxvd3MgYSB3YXkgdG8gaG9sZCBvbnRvIGEgcmVmZXJlbmNlIHRoYXRcbiAgICAgKiB3b24ndCBiZSBhZGRlZCBiYWNrIGludG8gdGhlIHBvb2wuXG4gICAgICovXG4gICAgcGVyc2lzdDogZnVuY3Rpb24gKCkgey8vIE1vZGVybiBldmVudCBzeXN0ZW0gZG9lc24ndCB1c2UgcG9vbGluZy5cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoaXMgZXZlbnQgc2hvdWxkIGJlIHJlbGVhc2VkIGJhY2sgaW50byB0aGUgcG9vbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhpcyBzaG91bGQgbm90IGJlIHJlbGVhc2VkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaXNQZXJzaXN0ZW50OiBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZVxuICB9KTtcbiAgcmV0dXJuIFN5bnRoZXRpY0Jhc2VFdmVudDtcbn1cbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxuXG52YXIgRXZlbnRJbnRlcmZhY2UgPSB7XG4gIGV2ZW50UGhhc2U6IDAsXG4gIGJ1YmJsZXM6IDAsXG4gIGNhbmNlbGFibGU6IDAsXG4gIHRpbWVTdGFtcDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIGV2ZW50LnRpbWVTdGFtcCB8fCBEYXRlLm5vdygpO1xuICB9LFxuICBkZWZhdWx0UHJldmVudGVkOiAwLFxuICBpc1RydXN0ZWQ6IDBcbn07XG52YXIgU3ludGhldGljRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChFdmVudEludGVyZmFjZSk7XG5cbnZhciBVSUV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICB2aWV3OiAwLFxuICBkZXRhaWw6IDBcbn0pO1xuXG52YXIgU3ludGhldGljVUlFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFVJRXZlbnRJbnRlcmZhY2UpO1xudmFyIGxhc3RNb3ZlbWVudFg7XG52YXIgbGFzdE1vdmVtZW50WTtcbnZhciBsYXN0TW91c2VFdmVudDtcblxuZnVuY3Rpb24gdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoZXZlbnQpIHtcbiAgaWYgKGV2ZW50ICE9PSBsYXN0TW91c2VFdmVudCkge1xuICAgIGlmIChsYXN0TW91c2VFdmVudCAmJiBldmVudC50eXBlID09PSAnbW91c2Vtb3ZlJykge1xuICAgICAgbGFzdE1vdmVtZW50WCA9IGV2ZW50LnNjcmVlblggLSBsYXN0TW91c2VFdmVudC5zY3JlZW5YO1xuICAgICAgbGFzdE1vdmVtZW50WSA9IGV2ZW50LnNjcmVlblkgLSBsYXN0TW91c2VFdmVudC5zY3JlZW5ZO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0TW92ZW1lbnRYID0gMDtcbiAgICAgIGxhc3RNb3ZlbWVudFkgPSAwO1xuICAgIH1cblxuICAgIGxhc3RNb3VzZUV2ZW50ID0gZXZlbnQ7XG4gIH1cbn1cbi8qKlxuICogQGludGVyZmFjZSBNb3VzZUV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBNb3VzZUV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIHNjcmVlblg6IDAsXG4gIHNjcmVlblk6IDAsXG4gIGNsaWVudFg6IDAsXG4gIGNsaWVudFk6IDAsXG4gIHBhZ2VYOiAwLFxuICBwYWdlWTogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlLFxuICBidXR0b246IDAsXG4gIGJ1dHRvbnM6IDAsXG4gIHJlbGF0ZWRUYXJnZXQ6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudC5yZWxhdGVkVGFyZ2V0ID09PSB1bmRlZmluZWQpIHJldHVybiBldmVudC5mcm9tRWxlbWVudCA9PT0gZXZlbnQuc3JjRWxlbWVudCA/IGV2ZW50LnRvRWxlbWVudCA6IGV2ZW50LmZyb21FbGVtZW50O1xuICAgIHJldHVybiBldmVudC5yZWxhdGVkVGFyZ2V0O1xuICB9LFxuICBtb3ZlbWVudFg6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmICgnbW92ZW1lbnRYJyBpbiBldmVudCkge1xuICAgICAgcmV0dXJuIGV2ZW50Lm1vdmVtZW50WDtcbiAgICB9XG5cbiAgICB1cGRhdGVNb3VzZU1vdmVtZW50UG9seWZpbGxTdGF0ZShldmVudCk7XG4gICAgcmV0dXJuIGxhc3RNb3ZlbWVudFg7XG4gIH0sXG4gIG1vdmVtZW50WTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKCdtb3ZlbWVudFknIGluIGV2ZW50KSB7XG4gICAgICByZXR1cm4gZXZlbnQubW92ZW1lbnRZO1xuICAgIH0gLy8gRG9uJ3QgbmVlZCB0byBjYWxsIHVwZGF0ZU1vdXNlTW92ZW1lbnRQb2x5ZmlsbFN0YXRlKCkgaGVyZVxuICAgIC8vIGJlY2F1c2UgaXQncyBndWFyYW50ZWVkIHRvIGhhdmUgYWxyZWFkeSBydW4gd2hlbiBtb3ZlbWVudFhcbiAgICAvLyB3YXMgY29waWVkLlxuXG5cbiAgICByZXR1cm4gbGFzdE1vdmVtZW50WTtcbiAgfVxufSk7XG5cbnZhciBTeW50aGV0aWNNb3VzZUV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoTW91c2VFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRHJhZ0V2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG52YXIgRHJhZ0V2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBNb3VzZUV2ZW50SW50ZXJmYWNlLCB7XG4gIGRhdGFUcmFuc2ZlcjogMFxufSk7XG5cbnZhciBTeW50aGV0aWNEcmFnRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChEcmFnRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEZvY3VzRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cbnZhciBGb2N1c0V2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIHJlbGF0ZWRUYXJnZXQ6IDBcbn0pO1xuXG52YXIgU3ludGhldGljRm9jdXNFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEZvY3VzRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtYW5pbWF0aW9ucy8jQW5pbWF0aW9uRXZlbnQtaW50ZXJmYWNlXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BbmltYXRpb25FdmVudFxuICovXG5cbnZhciBBbmltYXRpb25FdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgYW5pbWF0aW9uTmFtZTogMCxcbiAgZWxhcHNlZFRpbWU6IDAsXG4gIHBzZXVkb0VsZW1lbnQ6IDBcbn0pO1xuXG52YXIgU3ludGhldGljQW5pbWF0aW9uRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChBbmltYXRpb25FdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvY2xpcGJvYXJkLWFwaXMvXG4gKi9cblxudmFyIENsaXBib2FyZEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBjbGlwYm9hcmREYXRhOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2NsaXBib2FyZERhdGEnIGluIGV2ZW50ID8gZXZlbnQuY2xpcGJvYXJkRGF0YSA6IHdpbmRvdy5jbGlwYm9hcmREYXRhO1xuICB9XG59KTtcblxudmFyIFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQ2xpcGJvYXJkRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRzLWNvbXBvc2l0aW9uZXZlbnRzXG4gKi9cblxudmFyIENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGRhdGE6IDBcbn0pO1xuXG52YXIgU3ludGhldGljQ29tcG9zaXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1XG4gKiAgICAgIC8jZXZlbnRzLWlucHV0ZXZlbnRzXG4gKi9cbi8vIEhhcHBlbnMgdG8gc2hhcmUgdGhlIHNhbWUgbGlzdCBmb3Igbm93LlxuXG52YXIgU3ludGhldGljSW5wdXRFdmVudCA9IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQ7XG4vKipcbiAqIE5vcm1hbGl6YXRpb24gb2YgZGVwcmVjYXRlZCBIVE1MNSBga2V5YCB2YWx1ZXNcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQjS2V5X25hbWVzXG4gKi9cblxudmFyIG5vcm1hbGl6ZUtleSA9IHtcbiAgRXNjOiAnRXNjYXBlJyxcbiAgU3BhY2ViYXI6ICcgJyxcbiAgTGVmdDogJ0Fycm93TGVmdCcsXG4gIFVwOiAnQXJyb3dVcCcsXG4gIFJpZ2h0OiAnQXJyb3dSaWdodCcsXG4gIERvd246ICdBcnJvd0Rvd24nLFxuICBEZWw6ICdEZWxldGUnLFxuICBXaW46ICdPUycsXG4gIE1lbnU6ICdDb250ZXh0TWVudScsXG4gIEFwcHM6ICdDb250ZXh0TWVudScsXG4gIFNjcm9sbDogJ1Njcm9sbExvY2snLFxuICBNb3pQcmludGFibGVLZXk6ICdVbmlkZW50aWZpZWQnXG59O1xuLyoqXG4gKiBUcmFuc2xhdGlvbiBmcm9tIGxlZ2FjeSBga2V5Q29kZWAgdG8gSFRNTDUgYGtleWBcbiAqIE9ubHkgc3BlY2lhbCBrZXlzIHN1cHBvcnRlZCwgYWxsIG90aGVycyBkZXBlbmQgb24ga2V5Ym9hcmQgbGF5b3V0IG9yIGJyb3dzZXJcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQjS2V5X25hbWVzXG4gKi9cblxudmFyIHRyYW5zbGF0ZVRvS2V5ID0ge1xuICAnOCc6ICdCYWNrc3BhY2UnLFxuICAnOSc6ICdUYWInLFxuICAnMTInOiAnQ2xlYXInLFxuICAnMTMnOiAnRW50ZXInLFxuICAnMTYnOiAnU2hpZnQnLFxuICAnMTcnOiAnQ29udHJvbCcsXG4gICcxOCc6ICdBbHQnLFxuICAnMTknOiAnUGF1c2UnLFxuICAnMjAnOiAnQ2Fwc0xvY2snLFxuICAnMjcnOiAnRXNjYXBlJyxcbiAgJzMyJzogJyAnLFxuICAnMzMnOiAnUGFnZVVwJyxcbiAgJzM0JzogJ1BhZ2VEb3duJyxcbiAgJzM1JzogJ0VuZCcsXG4gICczNic6ICdIb21lJyxcbiAgJzM3JzogJ0Fycm93TGVmdCcsXG4gICczOCc6ICdBcnJvd1VwJyxcbiAgJzM5JzogJ0Fycm93UmlnaHQnLFxuICAnNDAnOiAnQXJyb3dEb3duJyxcbiAgJzQ1JzogJ0luc2VydCcsXG4gICc0Nic6ICdEZWxldGUnLFxuICAnMTEyJzogJ0YxJyxcbiAgJzExMyc6ICdGMicsXG4gICcxMTQnOiAnRjMnLFxuICAnMTE1JzogJ0Y0JyxcbiAgJzExNic6ICdGNScsXG4gICcxMTcnOiAnRjYnLFxuICAnMTE4JzogJ0Y3JyxcbiAgJzExOSc6ICdGOCcsXG4gICcxMjAnOiAnRjknLFxuICAnMTIxJzogJ0YxMCcsXG4gICcxMjInOiAnRjExJyxcbiAgJzEyMyc6ICdGMTInLFxuICAnMTQ0JzogJ051bUxvY2snLFxuICAnMTQ1JzogJ1Njcm9sbExvY2snLFxuICAnMjI0JzogJ01ldGEnXG59O1xuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IE5vcm1hbGl6ZWQgYGtleWAgcHJvcGVydHkuXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXZlbnRLZXkobmF0aXZlRXZlbnQpIHtcbiAgaWYgKG5hdGl2ZUV2ZW50LmtleSkge1xuICAgIC8vIE5vcm1hbGl6ZSBpbmNvbnNpc3RlbnQgdmFsdWVzIHJlcG9ydGVkIGJ5IGJyb3dzZXJzIGR1ZSB0b1xuICAgIC8vIGltcGxlbWVudGF0aW9ucyBvZiBhIHdvcmtpbmcgZHJhZnQgc3BlY2lmaWNhdGlvbi5cbiAgICAvLyBGaXJlRm94IGltcGxlbWVudHMgYGtleWAgYnV0IHJldHVybnMgYE1velByaW50YWJsZUtleWAgZm9yIGFsbFxuICAgIC8vIHByaW50YWJsZSBjaGFyYWN0ZXJzIChub3JtYWxpemVkIHRvIGBVbmlkZW50aWZpZWRgKSwgaWdub3JlIGl0LlxuICAgIHZhciBrZXkgPSBub3JtYWxpemVLZXlbbmF0aXZlRXZlbnQua2V5XSB8fCBuYXRpdmVFdmVudC5rZXk7XG5cbiAgICBpZiAoa2V5ICE9PSAnVW5pZGVudGlmaWVkJykge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH0gLy8gQnJvd3NlciBkb2VzIG5vdCBpbXBsZW1lbnQgYGtleWAsIHBvbHlmaWxsIGFzIG11Y2ggb2YgaXQgYXMgd2UgY2FuLlxuXG5cbiAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICB2YXIgY2hhckNvZGUgPSBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KTsgLy8gVGhlIGVudGVyLWtleSBpcyB0ZWNobmljYWxseSBib3RoIHByaW50YWJsZSBhbmQgbm9uLXByaW50YWJsZSBhbmQgY2FuXG4gICAgLy8gdGh1cyBiZSBjYXB0dXJlZCBieSBga2V5cHJlc3NgLCBubyBvdGhlciBub24tcHJpbnRhYmxlIGtleSBzaG91bGQuXG5cbiAgICByZXR1cm4gY2hhckNvZGUgPT09IDEzID8gJ0VudGVyJyA6IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICB9XG5cbiAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBuYXRpdmVFdmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgLy8gV2hpbGUgdXNlciBrZXlib2FyZCBsYXlvdXQgZGV0ZXJtaW5lcyB0aGUgYWN0dWFsIG1lYW5pbmcgb2YgZWFjaFxuICAgIC8vIGBrZXlDb2RlYCB2YWx1ZSwgYWxtb3N0IGFsbCBmdW5jdGlvbiBrZXlzIGhhdmUgYSB1bml2ZXJzYWwgdmFsdWUuXG4gICAgcmV0dXJuIHRyYW5zbGF0ZVRvS2V5W25hdGl2ZUV2ZW50LmtleUNvZGVdIHx8ICdVbmlkZW50aWZpZWQnO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuLyoqXG4gKiBUcmFuc2xhdGlvbiBmcm9tIG1vZGlmaWVyIGtleSB0byB0aGUgYXNzb2NpYXRlZCBwcm9wZXJ0eSBpbiB0aGUgZXZlbnQuXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8ja2V5cy1Nb2RpZmllcnNcbiAqL1xuXG5cbnZhciBtb2RpZmllcktleVRvUHJvcCA9IHtcbiAgQWx0OiAnYWx0S2V5JyxcbiAgQ29udHJvbDogJ2N0cmxLZXknLFxuICBNZXRhOiAnbWV0YUtleScsXG4gIFNoaWZ0OiAnc2hpZnRLZXknXG59OyAvLyBPbGRlciBicm93c2VycyAoU2FmYXJpIDw9IDEwLCBpT1MgU2FmYXJpIDw9IDEwLjIpIGRvIG5vdCBzdXBwb3J0XG4vLyBnZXRNb2RpZmllclN0YXRlLiBJZiBnZXRNb2RpZmllclN0YXRlIGlzIG5vdCBzdXBwb3J0ZWQsIHdlIG1hcCBpdCB0byBhIHNldCBvZlxuLy8gbW9kaWZpZXIga2V5cyBleHBvc2VkIGJ5IHRoZSBldmVudC4gSW4gdGhpcyBjYXNlLCBMb2NrLWtleXMgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cbmZ1bmN0aW9uIG1vZGlmaWVyU3RhdGVHZXR0ZXIoa2V5QXJnKSB7XG4gIHZhciBzeW50aGV0aWNFdmVudCA9IHRoaXM7XG4gIHZhciBuYXRpdmVFdmVudCA9IHN5bnRoZXRpY0V2ZW50Lm5hdGl2ZUV2ZW50O1xuXG4gIGlmIChuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0YXRlKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUoa2V5QXJnKTtcbiAgfVxuXG4gIHZhciBrZXlQcm9wID0gbW9kaWZpZXJLZXlUb1Byb3Bba2V5QXJnXTtcbiAgcmV0dXJuIGtleVByb3AgPyAhIW5hdGl2ZUV2ZW50W2tleVByb3BdIDogZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEV2ZW50TW9kaWZpZXJTdGF0ZShuYXRpdmVFdmVudCkge1xuICByZXR1cm4gbW9kaWZpZXJTdGF0ZUdldHRlcjtcbn1cbi8qKlxuICogQGludGVyZmFjZSBLZXlib2FyZEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBLZXlib2FyZEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIGtleTogZ2V0RXZlbnRLZXksXG4gIGNvZGU6IDAsXG4gIGxvY2F0aW9uOiAwLFxuICBjdHJsS2V5OiAwLFxuICBzaGlmdEtleTogMCxcbiAgYWx0S2V5OiAwLFxuICBtZXRhS2V5OiAwLFxuICByZXBlYXQ6IDAsXG4gIGxvY2FsZTogMCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlLFxuICAvLyBMZWdhY3kgSW50ZXJmYWNlXG4gIGNoYXJDb2RlOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBgY2hhckNvZGVgIGlzIHRoZSByZXN1bHQgb2YgYSBLZXlQcmVzcyBldmVudCBhbmQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2ZcbiAgICAvLyB0aGUgYWN0dWFsIHByaW50YWJsZSBjaGFyYWN0ZXIuXG4gICAgLy8gS2V5UHJlc3MgaXMgZGVwcmVjYXRlZCwgYnV0IGl0cyByZXBsYWNlbWVudCBpcyBub3QgeWV0IGZpbmFsIGFuZCBub3RcbiAgICAvLyBpbXBsZW1lbnRlZCBpbiBhbnkgbWFqb3IgYnJvd3Nlci4gT25seSBLZXlQcmVzcyBoYXMgY2hhckNvZGUuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgIHJldHVybiBnZXRFdmVudENoYXJDb2RlKGV2ZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAga2V5Q29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYGtleUNvZGVgIGlzIHRoZSByZXN1bHQgb2YgYSBLZXlEb3duL1VwIGV2ZW50IGFuZCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZlxuICAgIC8vIHBoeXNpY2FsIGtleWJvYXJkIGtleS5cbiAgICAvLyBUaGUgYWN0dWFsIG1lYW5pbmcgb2YgdGhlIHZhbHVlIGRlcGVuZHMgb24gdGhlIHVzZXJzJyBrZXlib2FyZCBsYXlvdXRcbiAgICAvLyB3aGljaCBjYW5ub3QgYmUgZGV0ZWN0ZWQuIEFzc3VtaW5nIHRoYXQgaXQgaXMgYSBVUyBrZXlib2FyZCBsYXlvdXRcbiAgICAvLyBwcm92aWRlcyBhIHN1cnByaXNpbmdseSBhY2N1cmF0ZSBtYXBwaW5nIGZvciBVUyBhbmQgRXVyb3BlYW4gdXNlcnMuXG4gICAgLy8gRHVlIHRvIHRoaXMsIGl0IGlzIGxlZnQgdG8gdGhlIHVzZXIgdG8gaW1wbGVtZW50IGF0IHRoaXMgdGltZS5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgIHJldHVybiBldmVudC5rZXlDb2RlO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9LFxuICB3aGljaDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYHdoaWNoYCBpcyBhbiBhbGlhcyBmb3IgZWl0aGVyIGBrZXlDb2RlYCBvciBgY2hhckNvZGVgIGRlcGVuZGluZyBvbiB0aGVcbiAgICAvLyB0eXBlIG9mIHRoZSBldmVudC5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgcmV0dXJuIGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpO1xuICAgIH1cblxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5ZG93bicgfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgICAgcmV0dXJuIGV2ZW50LmtleUNvZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cbn0pO1xuXG52YXIgU3ludGhldGljS2V5Ym9hcmRFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEtleWJvYXJkRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIFBvaW50ZXJFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9wb2ludGVyZXZlbnRzL1xuICovXG5cbnZhciBQb2ludGVyRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIE1vdXNlRXZlbnRJbnRlcmZhY2UsIHtcbiAgcG9pbnRlcklkOiAwLFxuICB3aWR0aDogMCxcbiAgaGVpZ2h0OiAwLFxuICBwcmVzc3VyZTogMCxcbiAgdGFuZ2VudGlhbFByZXNzdXJlOiAwLFxuICB0aWx0WDogMCxcbiAgdGlsdFk6IDAsXG4gIHR3aXN0OiAwLFxuICBwb2ludGVyVHlwZTogMCxcbiAgaXNQcmltYXJ5OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1BvaW50ZXJFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFBvaW50ZXJFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgVG91Y2hFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi90b3VjaC1ldmVudHMvXG4gKi9cblxudmFyIFRvdWNoRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgdG91Y2hlczogMCxcbiAgdGFyZ2V0VG91Y2hlczogMCxcbiAgY2hhbmdlZFRvdWNoZXM6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZVxufSk7XG5cbnZhciBTeW50aGV0aWNUb3VjaEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVG91Y2hFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwOS9XRC1jc3MzLXRyYW5zaXRpb25zLTIwMDkwMzIwLyN0cmFuc2l0aW9uLWV2ZW50cy1cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RyYW5zaXRpb25FdmVudFxuICovXG5cbnZhciBUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIHByb3BlcnR5TmFtZTogMCxcbiAgZWxhcHNlZFRpbWU6IDAsXG4gIHBzZXVkb0VsZW1lbnQ6IDBcbn0pO1xuXG52YXIgU3ludGhldGljVHJhbnNpdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVHJhbnNpdGlvbkV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBXaGVlbEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG52YXIgV2hlZWxFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgTW91c2VFdmVudEludGVyZmFjZSwge1xuICBkZWx0YVg6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnZGVsdGFYJyBpbiBldmVudCA/IGV2ZW50LmRlbHRhWCA6IC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhWGAgZm9yIFdlYmtpdCBhbmQgbm9ybWFsaXplIChyaWdodCBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGFYJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhWCA6IDA7XG4gIH0sXG4gIGRlbHRhWTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdkZWx0YVknIGluIGV2ZW50ID8gZXZlbnQuZGVsdGFZIDogLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFZYCBmb3IgV2Via2l0IGFuZCBub3JtYWxpemUgKGRvd24gaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhWScgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YVkgOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YWAgZm9yIElFPDkgYW5kIG5vcm1hbGl6ZSAoZG93biBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGEnIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGEgOiAwO1xuICB9LFxuICBkZWx0YVo6IDAsXG4gIC8vIEJyb3dzZXJzIHdpdGhvdXQgXCJkZWx0YU1vZGVcIiBpcyByZXBvcnRpbmcgaW4gcmF3IHdoZWVsIGRlbHRhIHdoZXJlIG9uZVxuICAvLyBub3RjaCBvbiB0aGUgc2Nyb2xsIGlzIGFsd2F5cyArLy0gMTIwLCByb3VnaGx5IGVxdWl2YWxlbnQgdG8gcGl4ZWxzLlxuICAvLyBBIGdvb2QgYXBwcm94aW1hdGlvbiBvZiBET01fREVMVEFfTElORSAoMSkgaXMgNSUgb2Ygdmlld3BvcnQgc2l6ZSBvclxuICAvLyB+NDAgcGl4ZWxzLCBmb3IgRE9NX0RFTFRBX1NDUkVFTiAoMikgaXQgaXMgODcuNSUgb2Ygdmlld3BvcnQgc2l6ZS5cbiAgZGVsdGFNb2RlOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1doZWVsRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChXaGVlbEV2ZW50SW50ZXJmYWNlKTtcblxudmFyIEVORF9LRVlDT0RFUyA9IFs5LCAxMywgMjcsIDMyXTsgLy8gVGFiLCBSZXR1cm4sIEVzYywgU3BhY2VcblxudmFyIFNUQVJUX0tFWUNPREUgPSAyMjk7XG52YXIgY2FuVXNlQ29tcG9zaXRpb25FdmVudCA9IGNhblVzZURPTSAmJiAnQ29tcG9zaXRpb25FdmVudCcgaW4gd2luZG93O1xudmFyIGRvY3VtZW50TW9kZSA9IG51bGw7XG5cbmlmIChjYW5Vc2VET00gJiYgJ2RvY3VtZW50TW9kZScgaW4gZG9jdW1lbnQpIHtcbiAgZG9jdW1lbnRNb2RlID0gZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xufSAvLyBXZWJraXQgb2ZmZXJzIGEgdmVyeSB1c2VmdWwgYHRleHRJbnB1dGAgZXZlbnQgdGhhdCBjYW4gYmUgdXNlZCB0b1xuLy8gZGlyZWN0bHkgcmVwcmVzZW50IGBiZWZvcmVJbnB1dGAuIFRoZSBJRSBgdGV4dGlucHV0YCBldmVudCBpcyBub3QgYXNcbi8vIHVzZWZ1bCwgc28gd2UgZG9uJ3QgdXNlIGl0LlxuXG5cbnZhciBjYW5Vc2VUZXh0SW5wdXRFdmVudCA9IGNhblVzZURPTSAmJiAnVGV4dEV2ZW50JyBpbiB3aW5kb3cgJiYgIWRvY3VtZW50TW9kZTsgLy8gSW4gSUU5Kywgd2UgaGF2ZSBhY2Nlc3MgdG8gY29tcG9zaXRpb24gZXZlbnRzLCBidXQgdGhlIGRhdGEgc3VwcGxpZWRcbi8vIGJ5IHRoZSBuYXRpdmUgY29tcG9zaXRpb25lbmQgZXZlbnQgbWF5IGJlIGluY29ycmVjdC4gSmFwYW5lc2UgaWRlb2dyYXBoaWNcbi8vIHNwYWNlcywgZm9yIGluc3RhbmNlIChcXHUzMDAwKSBhcmUgbm90IHJlY29yZGVkIGNvcnJlY3RseS5cblxudmFyIHVzZUZhbGxiYWNrQ29tcG9zaXRpb25EYXRhID0gY2FuVXNlRE9NICYmICghY2FuVXNlQ29tcG9zaXRpb25FdmVudCB8fCBkb2N1bWVudE1vZGUgJiYgZG9jdW1lbnRNb2RlID4gOCAmJiBkb2N1bWVudE1vZGUgPD0gMTEpO1xudmFyIFNQQUNFQkFSX0NPREUgPSAzMjtcbnZhciBTUEFDRUJBUl9DSEFSID0gU3RyaW5nLmZyb21DaGFyQ29kZShTUEFDRUJBUl9DT0RFKTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMoKSB7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25CZWZvcmVJbnB1dCcsIFsnY29tcG9zaXRpb25lbmQnLCAna2V5cHJlc3MnLCAndGV4dElucHV0JywgJ3Bhc3RlJ10pO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ29tcG9zaXRpb25FbmQnLCBbJ2NvbXBvc2l0aW9uZW5kJywgJ2ZvY3Vzb3V0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnbW91c2Vkb3duJ10pO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ29tcG9zaXRpb25TdGFydCcsIFsnY29tcG9zaXRpb25zdGFydCcsICdmb2N1c291dCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ21vdXNlZG93biddKTtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkNvbXBvc2l0aW9uVXBkYXRlJywgWydjb21wb3NpdGlvbnVwZGF0ZScsICdmb2N1c291dCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ21vdXNlZG93biddKTtcbn0gLy8gVHJhY2sgd2hldGhlciB3ZSd2ZSBldmVyIGhhbmRsZWQgYSBrZXlwcmVzcyBvbiB0aGUgc3BhY2Uga2V5LlxuXG5cbnZhciBoYXNTcGFjZUtleXByZXNzID0gZmFsc2U7XG4vKipcbiAqIFJldHVybiB3aGV0aGVyIGEgbmF0aXZlIGtleXByZXNzIGV2ZW50IGlzIGFzc3VtZWQgdG8gYmUgYSBjb21tYW5kLlxuICogVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIEZpcmVmb3ggZmlyZXMgYGtleXByZXNzYCBldmVudHMgZm9yIGtleSBjb21tYW5kc1xuICogKGN1dCwgY29weSwgc2VsZWN0LWFsbCwgZXRjLikgZXZlbiB0aG91Z2ggbm8gY2hhcmFjdGVyIGlzIGluc2VydGVkLlxuICovXG5cbmZ1bmN0aW9uIGlzS2V5cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiAobmF0aXZlRXZlbnQuY3RybEtleSB8fCBuYXRpdmVFdmVudC5hbHRLZXkgfHwgbmF0aXZlRXZlbnQubWV0YUtleSkgJiYgLy8gY3RybEtleSAmJiBhbHRLZXkgaXMgZXF1aXZhbGVudCB0byBBbHRHciwgYW5kIGlzIG5vdCBhIGNvbW1hbmQuXG4gICEobmF0aXZlRXZlbnQuY3RybEtleSAmJiBuYXRpdmVFdmVudC5hbHRLZXkpO1xufVxuLyoqXG4gKiBUcmFuc2xhdGUgbmF0aXZlIHRvcCBsZXZlbCBldmVudHMgaW50byBldmVudCB0eXBlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldENvbXBvc2l0aW9uRXZlbnRUeXBlKGRvbUV2ZW50TmFtZSkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2NvbXBvc2l0aW9uc3RhcnQnOlxuICAgICAgcmV0dXJuICdvbkNvbXBvc2l0aW9uU3RhcnQnO1xuXG4gICAgY2FzZSAnY29tcG9zaXRpb25lbmQnOlxuICAgICAgcmV0dXJuICdvbkNvbXBvc2l0aW9uRW5kJztcblxuICAgIGNhc2UgJ2NvbXBvc2l0aW9udXBkYXRlJzpcbiAgICAgIHJldHVybiAnb25Db21wb3NpdGlvblVwZGF0ZSc7XG4gIH1cbn1cbi8qKlxuICogRG9lcyBvdXIgZmFsbGJhY2sgYmVzdC1ndWVzcyBtb2RlbCB0aGluayB0aGlzIGV2ZW50IHNpZ25pZmllcyB0aGF0XG4gKiBjb21wb3NpdGlvbiBoYXMgYmVndW4/XG4gKi9cblxuXG5mdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25TdGFydChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBkb21FdmVudE5hbWUgPT09ICdrZXlkb3duJyAmJiBuYXRpdmVFdmVudC5rZXlDb2RlID09PSBTVEFSVF9LRVlDT0RFO1xufVxuLyoqXG4gKiBEb2VzIG91ciBmYWxsYmFjayBtb2RlIHRoaW5rIHRoYXQgdGhpcyBldmVudCBpcyB0aGUgZW5kIG9mIGNvbXBvc2l0aW9uP1xuICovXG5cblxuZnVuY3Rpb24gaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdrZXl1cCc6XG4gICAgICAvLyBDb21tYW5kIGtleXMgaW5zZXJ0IG9yIGNsZWFyIElNRSBpbnB1dC5cbiAgICAgIHJldHVybiBFTkRfS0VZQ09ERVMuaW5kZXhPZihuYXRpdmVFdmVudC5rZXlDb2RlKSAhPT0gLTE7XG5cbiAgICBjYXNlICdrZXlkb3duJzpcbiAgICAgIC8vIEV4cGVjdCBJTUUga2V5Q29kZSBvbiBlYWNoIGtleWRvd24uIElmIHdlIGdldCBhbnkgb3RoZXJcbiAgICAgIC8vIGNvZGUgd2UgbXVzdCBoYXZlIGV4aXRlZCBlYXJsaWVyLlxuICAgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmtleUNvZGUgIT09IFNUQVJUX0tFWUNPREU7XG5cbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICAvLyBFdmVudHMgYXJlIG5vdCBwb3NzaWJsZSB3aXRob3V0IGNhbmNlbGxpbmcgSU1FLlxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4vKipcbiAqIEdvb2dsZSBJbnB1dCBUb29scyBwcm92aWRlcyBjb21wb3NpdGlvbiBkYXRhIHZpYSBhIEN1c3RvbUV2ZW50LFxuICogd2l0aCB0aGUgYGRhdGFgIHByb3BlcnR5IHBvcHVsYXRlZCBpbiB0aGUgYGRldGFpbGAgb2JqZWN0LiBJZiB0aGlzXG4gKiBpcyBhdmFpbGFibGUgb24gdGhlIGV2ZW50IG9iamVjdCwgdXNlIGl0LiBJZiBub3QsIHRoaXMgaXMgYSBwbGFpblxuICogY29tcG9zaXRpb24gZXZlbnQgYW5kIHdlIGhhdmUgbm90aGluZyBzcGVjaWFsIHRvIGV4dHJhY3QuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHs/c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCkge1xuICB2YXIgZGV0YWlsID0gbmF0aXZlRXZlbnQuZGV0YWlsO1xuXG4gIGlmICh0eXBlb2YgZGV0YWlsID09PSAnb2JqZWN0JyAmJiAnZGF0YScgaW4gZGV0YWlsKSB7XG4gICAgcmV0dXJuIGRldGFpbC5kYXRhO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIENoZWNrIGlmIGEgY29tcG9zaXRpb24gZXZlbnQgd2FzIHRyaWdnZXJlZCBieSBLb3JlYW4gSU1FLlxuICogT3VyIGZhbGxiYWNrIG1vZGUgZG9lcyBub3Qgd29yayB3ZWxsIHdpdGggSUUncyBLb3JlYW4gSU1FLFxuICogc28ganVzdCB1c2UgbmF0aXZlIGNvbXBvc2l0aW9uIGV2ZW50cyB3aGVuIEtvcmVhbiBJTUUgaXMgdXNlZC5cbiAqIEFsdGhvdWdoIENvbXBvc2l0aW9uRXZlbnQubG9jYWxlIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQsXG4gKiBpdCBpcyBhdmFpbGFibGUgaW4gSUUsIHdoZXJlIG91ciBmYWxsYmFjayBtb2RlIGlzIGVuYWJsZWQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5cblxuZnVuY3Rpb24gaXNVc2luZ0tvcmVhbklNRShuYXRpdmVFdmVudCkge1xuICByZXR1cm4gbmF0aXZlRXZlbnQubG9jYWxlID09PSAna28nO1xufSAvLyBUcmFjayB0aGUgY3VycmVudCBJTUUgY29tcG9zaXRpb24gc3RhdHVzLCBpZiBhbnkuXG5cblxudmFyIGlzQ29tcG9zaW5nID0gZmFsc2U7XG4vKipcbiAqIEByZXR1cm4gez9vYmplY3R9IEEgU3ludGhldGljQ29tcG9zaXRpb25FdmVudC5cbiAqL1xuXG5mdW5jdGlvbiBleHRyYWN0Q29tcG9zaXRpb25FdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICB2YXIgZXZlbnRUeXBlO1xuICB2YXIgZmFsbGJhY2tEYXRhO1xuXG4gIGlmIChjYW5Vc2VDb21wb3NpdGlvbkV2ZW50KSB7XG4gICAgZXZlbnRUeXBlID0gZ2V0Q29tcG9zaXRpb25FdmVudFR5cGUoZG9tRXZlbnROYW1lKTtcbiAgfSBlbHNlIGlmICghaXNDb21wb3NpbmcpIHtcbiAgICBpZiAoaXNGYWxsYmFja0NvbXBvc2l0aW9uU3RhcnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkpIHtcbiAgICAgIGV2ZW50VHlwZSA9ICdvbkNvbXBvc2l0aW9uU3RhcnQnO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkpIHtcbiAgICBldmVudFR5cGUgPSAnb25Db21wb3NpdGlvbkVuZCc7XG4gIH1cblxuICBpZiAoIWV2ZW50VHlwZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKHVzZUZhbGxiYWNrQ29tcG9zaXRpb25EYXRhICYmICFpc1VzaW5nS29yZWFuSU1FKG5hdGl2ZUV2ZW50KSkge1xuICAgIC8vIFRoZSBjdXJyZW50IGNvbXBvc2l0aW9uIGlzIHN0b3JlZCBzdGF0aWNhbGx5IGFuZCBtdXN0IG5vdCBiZVxuICAgIC8vIG92ZXJ3cml0dGVuIHdoaWxlIGNvbXBvc2l0aW9uIGNvbnRpbnVlcy5cbiAgICBpZiAoIWlzQ29tcG9zaW5nICYmIGV2ZW50VHlwZSA9PT0gJ29uQ29tcG9zaXRpb25TdGFydCcpIHtcbiAgICAgIGlzQ29tcG9zaW5nID0gaW5pdGlhbGl6ZShuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdvbkNvbXBvc2l0aW9uRW5kJykge1xuICAgICAgaWYgKGlzQ29tcG9zaW5nKSB7XG4gICAgICAgIGZhbGxiYWNrRGF0YSA9IGdldERhdGEoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgbGlzdGVuZXJzID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKHRhcmdldEluc3QsIGV2ZW50VHlwZSk7XG5cbiAgaWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQoZXZlbnRUeXBlLCBkb21FdmVudE5hbWUsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG5cbiAgICBpZiAoZmFsbGJhY2tEYXRhKSB7XG4gICAgICAvLyBJbmplY3QgZGF0YSBnZW5lcmF0ZWQgZnJvbSBmYWxsYmFjayBwYXRoIGludG8gdGhlIHN5bnRoZXRpYyBldmVudC5cbiAgICAgIC8vIFRoaXMgbWF0Y2hlcyB0aGUgcHJvcGVydHkgb2YgbmF0aXZlIENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UuXG4gICAgICBldmVudC5kYXRhID0gZmFsbGJhY2tEYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgY3VzdG9tRGF0YSA9IGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpO1xuXG4gICAgICBpZiAoY3VzdG9tRGF0YSAhPT0gbnVsbCkge1xuICAgICAgICBldmVudC5kYXRhID0gY3VzdG9tRGF0YTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TmF0aXZlQmVmb3JlSW5wdXRDaGFycyhkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAnY29tcG9zaXRpb25lbmQnOlxuICAgICAgcmV0dXJuIGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpO1xuXG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgICAgLyoqXG4gICAgICAgKiBJZiBuYXRpdmUgYHRleHRJbnB1dGAgZXZlbnRzIGFyZSBhdmFpbGFibGUsIG91ciBnb2FsIGlzIHRvIG1ha2VcbiAgICAgICAqIHVzZSBvZiB0aGVtLiBIb3dldmVyLCB0aGVyZSBpcyBhIHNwZWNpYWwgY2FzZTogdGhlIHNwYWNlYmFyIGtleS5cbiAgICAgICAqIEluIFdlYmtpdCwgcHJldmVudGluZyBkZWZhdWx0IG9uIGEgc3BhY2ViYXIgYHRleHRJbnB1dGAgZXZlbnRcbiAgICAgICAqIGNhbmNlbHMgY2hhcmFjdGVyIGluc2VydGlvbiwgYnV0IGl0ICphbHNvKiBjYXVzZXMgdGhlIGJyb3dzZXJcbiAgICAgICAqIHRvIGZhbGwgYmFjayB0byBpdHMgZGVmYXVsdCBzcGFjZWJhciBiZWhhdmlvciBvZiBzY3JvbGxpbmcgdGhlXG4gICAgICAgKiBwYWdlLlxuICAgICAgICpcbiAgICAgICAqIFRyYWNraW5nIGF0OlxuICAgICAgICogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTM1NTEwM1xuICAgICAgICpcbiAgICAgICAqIFRvIGF2b2lkIHRoaXMgaXNzdWUsIHVzZSB0aGUga2V5cHJlc3MgZXZlbnQgYXMgaWYgbm8gYHRleHRJbnB1dGBcbiAgICAgICAqIGV2ZW50IGlzIGF2YWlsYWJsZS5cbiAgICAgICAqL1xuICAgICAgdmFyIHdoaWNoID0gbmF0aXZlRXZlbnQud2hpY2g7XG5cbiAgICAgIGlmICh3aGljaCAhPT0gU1BBQ0VCQVJfQ09ERSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaGFzU3BhY2VLZXlwcmVzcyA9IHRydWU7XG4gICAgICByZXR1cm4gU1BBQ0VCQVJfQ0hBUjtcblxuICAgIGNhc2UgJ3RleHRJbnB1dCc6XG4gICAgICAvLyBSZWNvcmQgdGhlIGNoYXJhY3RlcnMgdG8gYmUgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgIHZhciBjaGFycyA9IG5hdGl2ZUV2ZW50LmRhdGE7IC8vIElmIGl0J3MgYSBzcGFjZWJhciBjaGFyYWN0ZXIsIGFzc3VtZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkXG4gICAgICAvLyBpdCBhdCB0aGUga2V5cHJlc3MgbGV2ZWwgYW5kIGJhaWwgaW1tZWRpYXRlbHkuIEFuZHJvaWQgQ2hyb21lXG4gICAgICAvLyBkb2Vzbid0IGdpdmUgdXMga2V5Y29kZXMsIHNvIHdlIG5lZWQgdG8gaWdub3JlIGl0LlxuXG4gICAgICBpZiAoY2hhcnMgPT09IFNQQUNFQkFSX0NIQVIgJiYgaGFzU3BhY2VLZXlwcmVzcykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNoYXJzO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIEZvciBvdGhlciBuYXRpdmUgZXZlbnQgdHlwZXMsIGRvIG5vdGhpbmcuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuLyoqXG4gKiBGb3IgYnJvd3NlcnMgdGhhdCBkbyBub3QgcHJvdmlkZSB0aGUgYHRleHRJbnB1dGAgZXZlbnQsIGV4dHJhY3QgdGhlXG4gKiBhcHByb3ByaWF0ZSBzdHJpbmcgdG8gdXNlIGZvciBTeW50aGV0aWNJbnB1dEV2ZW50LlxuICovXG5cblxuZnVuY3Rpb24gZ2V0RmFsbGJhY2tCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBjb21wb3NpbmcgKElNRSkgYW5kIHVzaW5nIGEgZmFsbGJhY2sgdG8gZG8gc28sXG4gIC8vIHRyeSB0byBleHRyYWN0IHRoZSBjb21wb3NlZCBjaGFyYWN0ZXJzIGZyb20gdGhlIGZhbGxiYWNrIG9iamVjdC5cbiAgLy8gSWYgY29tcG9zaXRpb24gZXZlbnQgaXMgYXZhaWxhYmxlLCB3ZSBleHRyYWN0IGEgc3RyaW5nIG9ubHkgYXRcbiAgLy8gY29tcG9zaXRpb25ldmVudCwgb3RoZXJ3aXNlIGV4dHJhY3QgaXQgYXQgZmFsbGJhY2sgZXZlbnRzLlxuICBpZiAoaXNDb21wb3NpbmcpIHtcbiAgICBpZiAoZG9tRXZlbnROYW1lID09PSAnY29tcG9zaXRpb25lbmQnIHx8ICFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ICYmIGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSkge1xuICAgICAgdmFyIGNoYXJzID0gZ2V0RGF0YSgpO1xuICAgICAgcmVzZXQoKTtcbiAgICAgIGlzQ29tcG9zaW5nID0gZmFsc2U7XG4gICAgICByZXR1cm4gY2hhcnM7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ3Bhc3RlJzpcbiAgICAgIC8vIElmIGEgcGFzdGUgZXZlbnQgb2NjdXJzIGFmdGVyIGEga2V5cHJlc3MsIHRocm93IG91dCB0aGUgaW5wdXRcbiAgICAgIC8vIGNoYXJzLiBQYXN0ZSBldmVudHMgc2hvdWxkIG5vdCBsZWFkIHRvIEJlZm9yZUlucHV0IGV2ZW50cy5cbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgICAgLyoqXG4gICAgICAgKiBBcyBvZiB2MjcsIEZpcmVmb3ggbWF5IGZpcmUga2V5cHJlc3MgZXZlbnRzIGV2ZW4gd2hlbiBubyBjaGFyYWN0ZXJcbiAgICAgICAqIHdpbGwgYmUgaW5zZXJ0ZWQuIEEgZmV3IHBvc3NpYmlsaXRpZXM6XG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIGAwYC4gQXJyb3cga2V5cywgRXNjIGtleSwgZXRjLlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyB0aGUgcHJlc3NlZCBrZXkgY29kZSwgYnV0IG5vIGNoYXIgaXMgYXZhaWxhYmxlLlxuICAgICAgICogICBFeDogJ0FsdEdyICsgZGAgaW4gUG9saXNoLiBUaGVyZSBpcyBubyBtb2RpZmllZCBjaGFyYWN0ZXIgZm9yXG4gICAgICAgKiAgIHRoaXMga2V5IGNvbWJpbmF0aW9uIGFuZCBubyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQgaW50byB0aGVcbiAgICAgICAqICAgZG9jdW1lbnQsIGJ1dCBGRiBmaXJlcyB0aGUga2V5cHJlc3MgZm9yIGNoYXIgY29kZSBgMTAwYCBhbnl3YXkuXG4gICAgICAgKiAgIE5vIGBpbnB1dGAgZXZlbnQgd2lsbCBvY2N1ci5cbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgdGhlIHByZXNzZWQga2V5IGNvZGUsIGJ1dCBhIGNvbW1hbmQgY29tYmluYXRpb24gaXNcbiAgICAgICAqICAgYmVpbmcgdXNlZC4gRXg6IGBDbWQrQ2AuIE5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZCwgYW5kIG5vXG4gICAgICAgKiAgIGBpbnB1dGAgZXZlbnQgd2lsbCBvY2N1ci5cbiAgICAgICAqL1xuICAgICAgaWYgKCFpc0tleXByZXNzQ29tbWFuZChuYXRpdmVFdmVudCkpIHtcbiAgICAgICAgLy8gSUUgZmlyZXMgdGhlIGBrZXlwcmVzc2AgZXZlbnQgd2hlbiBhIHVzZXIgdHlwZXMgYW4gZW1vamkgdmlhXG4gICAgICAgIC8vIFRvdWNoIGtleWJvYXJkIG9mIFdpbmRvd3MuICBJbiBzdWNoIGEgY2FzZSwgdGhlIGBjaGFyYCBwcm9wZXJ0eVxuICAgICAgICAvLyBob2xkcyBhbiBlbW9qaSBjaGFyYWN0ZXIgbGlrZSBgXFx1RDgzRFxcdURFMEFgLiAgQmVjYXVzZSBpdHMgbGVuZ3RoXG4gICAgICAgIC8vIGlzIDIsIHRoZSBwcm9wZXJ0eSBgd2hpY2hgIGRvZXMgbm90IHJlcHJlc2VudCBhbiBlbW9qaSBjb3JyZWN0bHkuXG4gICAgICAgIC8vIEluIHN1Y2ggYSBjYXNlLCB3ZSBkaXJlY3RseSByZXR1cm4gdGhlIGBjaGFyYCBwcm9wZXJ0eSBpbnN0ZWFkIG9mXG4gICAgICAgIC8vIHVzaW5nIGB3aGljaGAuXG4gICAgICAgIGlmIChuYXRpdmVFdmVudC5jaGFyICYmIG5hdGl2ZUV2ZW50LmNoYXIubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHJldHVybiBuYXRpdmVFdmVudC5jaGFyO1xuICAgICAgICB9IGVsc2UgaWYgKG5hdGl2ZUV2ZW50LndoaWNoKSB7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUobmF0aXZlRXZlbnQud2hpY2gpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSAnY29tcG9zaXRpb25lbmQnOlxuICAgICAgcmV0dXJuIHVzZUZhbGxiYWNrQ29tcG9zaXRpb25EYXRhICYmICFpc1VzaW5nS29yZWFuSU1FKG5hdGl2ZUV2ZW50KSA/IG51bGwgOiBuYXRpdmVFdmVudC5kYXRhO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG4vKipcbiAqIEV4dHJhY3QgYSBTeW50aGV0aWNJbnB1dEV2ZW50IGZvciBgYmVmb3JlSW5wdXRgLCBiYXNlZCBvbiBlaXRoZXIgbmF0aXZlXG4gKiBgdGV4dElucHV0YCBvciBmYWxsYmFjayBiZWhhdmlvci5cbiAqXG4gKiBAcmV0dXJuIHs/b2JqZWN0fSBBIFN5bnRoZXRpY0lucHV0RXZlbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0QmVmb3JlSW5wdXRFdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICB2YXIgY2hhcnM7XG5cbiAgaWYgKGNhblVzZVRleHRJbnB1dEV2ZW50KSB7XG4gICAgY2hhcnMgPSBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpO1xuICB9IGVsc2Uge1xuICAgIGNoYXJzID0gZ2V0RmFsbGJhY2tCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpO1xuICB9IC8vIElmIG5vIGNoYXJhY3RlcnMgYXJlIGJlaW5nIGluc2VydGVkLCBubyBCZWZvcmVJbnB1dCBldmVudCBzaG91bGRcbiAgLy8gYmUgZmlyZWQuXG5cblxuICBpZiAoIWNoYXJzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbGlzdGVuZXJzID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKHRhcmdldEluc3QsICdvbkJlZm9yZUlucHV0Jyk7XG5cbiAgaWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0lucHV0RXZlbnQoJ29uQmVmb3JlSW5wdXQnLCAnYmVmb3JlaW5wdXQnLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuICAgIGV2ZW50LmRhdGEgPSBjaGFycztcbiAgfVxufVxuLyoqXG4gKiBDcmVhdGUgYW4gYG9uQmVmb3JlSW5wdXRgIGV2ZW50IHRvIG1hdGNoXG4gKiBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDEzMTEwNS8jZXZlbnRzLWlucHV0ZXZlbnRzLlxuICpcbiAqIFRoaXMgZXZlbnQgcGx1Z2luIGlzIGJhc2VkIG9uIHRoZSBuYXRpdmUgYHRleHRJbnB1dGAgZXZlbnRcbiAqIGF2YWlsYWJsZSBpbiBDaHJvbWUsIFNhZmFyaSwgT3BlcmEsIGFuZCBJRS4gVGhpcyBldmVudCBmaXJlcyBhZnRlclxuICogYG9uS2V5UHJlc3NgIGFuZCBgb25Db21wb3NpdGlvbkVuZGAsIGJ1dCBiZWZvcmUgYG9uSW5wdXRgLlxuICpcbiAqIGBiZWZvcmVJbnB1dGAgaXMgc3BlYydkIGJ1dCBub3QgaW1wbGVtZW50ZWQgaW4gYW55IGJyb3dzZXJzLCBhbmRcbiAqIHRoZSBgaW5wdXRgIGV2ZW50IGRvZXMgbm90IHByb3ZpZGUgYW55IHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGhhc1xuICogYWN0dWFsbHkgYmVlbiBhZGRlZCwgY29udHJhcnkgdG8gdGhlIHNwZWMuIFRodXMsIGB0ZXh0SW5wdXRgIGlzIHRoZSBiZXN0XG4gKiBhdmFpbGFibGUgZXZlbnQgdG8gaWRlbnRpZnkgdGhlIGNoYXJhY3RlcnMgdGhhdCBoYXZlIGFjdHVhbGx5IGJlZW4gaW5zZXJ0ZWRcbiAqIGludG8gdGhlIHRhcmdldCBub2RlLlxuICpcbiAqIFRoaXMgcGx1Z2luIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGVtaXR0aW5nIGBjb21wb3NpdGlvbmAgZXZlbnRzLCB0aHVzXG4gKiBhbGxvd2luZyB1cyB0byBzaGFyZSBjb21wb3NpdGlvbiBmYWxsYmFjayBjb2RlIGZvciBib3RoIGBiZWZvcmVJbnB1dGAgYW5kXG4gKiBgY29tcG9zaXRpb25gIGV2ZW50IHR5cGVzLlxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyhkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIGV4dHJhY3RDb21wb3NpdGlvbkV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgZXh0cmFjdEJlZm9yZUlucHV0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG4vKipcbiAqIEBzZWUgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvdGhlLWlucHV0LWVsZW1lbnQuaHRtbCNpbnB1dC10eXBlLWF0dHItc3VtbWFyeVxuICovXG52YXIgc3VwcG9ydGVkSW5wdXRUeXBlcyA9IHtcbiAgY29sb3I6IHRydWUsXG4gIGRhdGU6IHRydWUsXG4gIGRhdGV0aW1lOiB0cnVlLFxuICAnZGF0ZXRpbWUtbG9jYWwnOiB0cnVlLFxuICBlbWFpbDogdHJ1ZSxcbiAgbW9udGg6IHRydWUsXG4gIG51bWJlcjogdHJ1ZSxcbiAgcGFzc3dvcmQ6IHRydWUsXG4gIHJhbmdlOiB0cnVlLFxuICBzZWFyY2g6IHRydWUsXG4gIHRlbDogdHJ1ZSxcbiAgdGV4dDogdHJ1ZSxcbiAgdGltZTogdHJ1ZSxcbiAgdXJsOiB0cnVlLFxuICB3ZWVrOiB0cnVlXG59O1xuXG5mdW5jdGlvbiBpc1RleHRJbnB1dEVsZW1lbnQoZWxlbSkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtICYmIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmIChub2RlTmFtZSA9PT0gJ2lucHV0Jykge1xuICAgIHJldHVybiAhIXN1cHBvcnRlZElucHV0VHlwZXNbZWxlbS50eXBlXTtcbiAgfVxuXG4gIGlmIChub2RlTmFtZSA9PT0gJ3RleHRhcmVhJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBldmVudCBpcyBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuICpcbiAqIE5PVEU6IFRoaXMgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkgZm9yIG5vbi1nZW5lcmljIGV2ZW50cyBzdWNoIGFzIGBjaGFuZ2VgLFxuICogYHJlc2V0YCwgYGxvYWRgLCBgZXJyb3JgLCBhbmQgYHNlbGVjdGAuXG4gKlxuICogQm9ycm93cyBmcm9tIE1vZGVybml6ci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lU3VmZml4IEV2ZW50IG5hbWUsIGUuZy4gXCJjbGlja1wiLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZXZlbnQgaXMgc3VwcG9ydGVkLlxuICogQGludGVybmFsXG4gKiBAbGljZW5zZSBNb2Rlcm5penIgMy4wLjBwcmUgKEN1c3RvbSBCdWlsZCkgfCBNSVRcbiAqL1xuXG5mdW5jdGlvbiBpc0V2ZW50U3VwcG9ydGVkKGV2ZW50TmFtZVN1ZmZpeCkge1xuICBpZiAoIWNhblVzZURPTSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBldmVudE5hbWUgPSAnb24nICsgZXZlbnROYW1lU3VmZml4O1xuICB2YXIgaXNTdXBwb3J0ZWQgPSAoZXZlbnROYW1lIGluIGRvY3VtZW50KTtcblxuICBpZiAoIWlzU3VwcG9ydGVkKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShldmVudE5hbWUsICdyZXR1cm47Jyk7XG4gICAgaXNTdXBwb3J0ZWQgPSB0eXBlb2YgZWxlbWVudFtldmVudE5hbWVdID09PSAnZnVuY3Rpb24nO1xuICB9XG5cbiAgcmV0dXJuIGlzU3VwcG9ydGVkO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyQxKCkge1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ2hhbmdlJywgWydjaGFuZ2UnLCAnY2xpY2snLCAnZm9jdXNpbicsICdmb2N1c291dCcsICdpbnB1dCcsICdrZXlkb3duJywgJ2tleXVwJywgJ3NlbGVjdGlvbmNoYW5nZSddKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGRpc3BhdGNoUXVldWUsIGluc3QsIG5hdGl2ZUV2ZW50LCB0YXJnZXQpIHtcbiAgLy8gRmxhZyB0aGlzIGV2ZW50IGxvb3AgYXMgbmVlZGluZyBzdGF0ZSByZXN0b3JlLlxuICBlbnF1ZXVlU3RhdGVSZXN0b3JlKHRhcmdldCk7XG4gIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnMoaW5zdCwgJ29uQ2hhbmdlJyk7XG5cbiAgaWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50KCdvbkNoYW5nZScsICdjaGFuZ2UnLCBudWxsLCBuYXRpdmVFdmVudCwgdGFyZ2V0KTtcbiAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9KTtcbiAgfVxufVxuLyoqXG4gKiBGb3IgSUUgc2hpbXNcbiAqL1xuXG5cbnZhciBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgY2hhbmdlYCBldmVudFxuICovXG5cbmZ1bmN0aW9uIHNob3VsZFVzZUNoYW5nZUV2ZW50KGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBub2RlTmFtZSA9PT0gJ3NlbGVjdCcgfHwgbm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgZWxlbS50eXBlID09PSAnZmlsZSc7XG59XG5cbmZ1bmN0aW9uIG1hbnVhbERpc3BhdGNoQ2hhbmdlRXZlbnQobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGRpc3BhdGNoUXVldWUgPSBbXTtcbiAgY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGRpc3BhdGNoUXVldWUsIGFjdGl2ZUVsZW1lbnRJbnN0LCBuYXRpdmVFdmVudCwgZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpKTsgLy8gSWYgY2hhbmdlIGFuZCBwcm9wZXJ0eWNoYW5nZSBidWJibGVkLCB3ZSdkIGp1c3QgYmluZCB0byBpdCBsaWtlIGFsbCB0aGVcbiAgLy8gb3RoZXIgZXZlbnRzIGFuZCBoYXZlIGl0IGdvIHRocm91Z2ggUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLiBTaW5jZSBpdFxuICAvLyBkb2Vzbid0LCB3ZSBtYW51YWxseSBsaXN0ZW4gZm9yIHRoZSBldmVudHMgYW5kIHNvIHdlIGhhdmUgdG8gZW5xdWV1ZSBhbmRcbiAgLy8gcHJvY2VzcyB0aGUgYWJzdHJhY3QgZXZlbnQgbWFudWFsbHkuXG4gIC8vXG4gIC8vIEJhdGNoaW5nIGlzIG5lY2Vzc2FyeSBoZXJlIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IGFsbCBldmVudCBoYW5kbGVycyBydW5cbiAgLy8gYmVmb3JlIHRoZSBuZXh0IHJlcmVuZGVyIChpbmNsdWRpbmcgZXZlbnQgaGFuZGxlcnMgYXR0YWNoZWQgdG8gYW5jZXN0b3JcbiAgLy8gZWxlbWVudHMgaW5zdGVhZCBvZiBkaXJlY3RseSBvbiB0aGUgaW5wdXQpLiBXaXRob3V0IHRoaXMsIGNvbnRyb2xsZWRcbiAgLy8gY29tcG9uZW50cyBkb24ndCB3b3JrIHByb3Blcmx5IGluIGNvbmp1bmN0aW9uIHdpdGggZXZlbnQgYnViYmxpbmcgYmVjYXVzZVxuICAvLyB0aGUgY29tcG9uZW50IGlzIHJlcmVuZGVyZWQgYW5kIHRoZSB2YWx1ZSByZXZlcnRlZCBiZWZvcmUgYWxsIHRoZSBldmVudFxuICAvLyBoYW5kbGVycyBjYW4gcnVuLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy83MDguXG5cbiAgYmF0Y2hlZFVwZGF0ZXMocnVuRXZlbnRJbkJhdGNoLCBkaXNwYXRjaFF1ZXVlKTtcbn1cblxuZnVuY3Rpb24gcnVuRXZlbnRJbkJhdGNoKGRpc3BhdGNoUXVldWUpIHtcbiAgcHJvY2Vzc0Rpc3BhdGNoUXVldWUoZGlzcGF0Y2hRdWV1ZSwgMCk7XG59XG5cbmZ1bmN0aW9uIGdldEluc3RJZlZhbHVlQ2hhbmdlZCh0YXJnZXRJbnN0KSB7XG4gIHZhciB0YXJnZXROb2RlID0gZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KTtcblxuICBpZiAodXBkYXRlVmFsdWVJZkNoYW5nZWQodGFyZ2V0Tm9kZSkpIHtcbiAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9yQ2hhbmdlRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdjaGFuZ2UnKSB7XG4gICAgcmV0dXJuIHRhcmdldEluc3Q7XG4gIH1cbn1cbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBpbnB1dGAgZXZlbnRcbiAqL1xuXG5cbnZhciBpc0lucHV0RXZlbnRTdXBwb3J0ZWQgPSBmYWxzZTtcblxuaWYgKGNhblVzZURPTSkge1xuICAvLyBJRTkgY2xhaW1zIHRvIHN1cHBvcnQgdGhlIGlucHV0IGV2ZW50IGJ1dCBmYWlscyB0byB0cmlnZ2VyIGl0IHdoZW5cbiAgLy8gZGVsZXRpbmcgdGV4dCwgc28gd2UgaWdub3JlIGl0cyBpbnB1dCBldmVudHMuXG4gIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGlzRXZlbnRTdXBwb3J0ZWQoJ2lucHV0JykgJiYgKCFkb2N1bWVudC5kb2N1bWVudE1vZGUgfHwgZG9jdW1lbnQuZG9jdW1lbnRNb2RlID4gOSk7XG59XG4vKipcbiAqIChGb3IgSUUgPD05KSBTdGFydHMgdHJhY2tpbmcgcHJvcGVydHljaGFuZ2UgZXZlbnRzIG9uIHRoZSBwYXNzZWQtaW4gZWxlbWVudFxuICogYW5kIG92ZXJyaWRlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBzbyB0aGF0IHdlIGNhbiBkaXN0aW5ndWlzaCB1c2VyIGV2ZW50cyBmcm9tXG4gKiB2YWx1ZSBjaGFuZ2VzIGluIEpTLlxuICovXG5cblxuZnVuY3Rpb24gc3RhcnRXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKHRhcmdldCwgdGFyZ2V0SW5zdCkge1xuICBhY3RpdmVFbGVtZW50ID0gdGFyZ2V0O1xuICBhY3RpdmVFbGVtZW50SW5zdCA9IHRhcmdldEluc3Q7XG4gIGFjdGl2ZUVsZW1lbnQuYXR0YWNoRXZlbnQoJ29ucHJvcGVydHljaGFuZ2UnLCBoYW5kbGVQcm9wZXJ0eUNoYW5nZSk7XG59XG4vKipcbiAqIChGb3IgSUUgPD05KSBSZW1vdmVzIHRoZSBldmVudCBsaXN0ZW5lcnMgZnJvbSB0aGUgY3VycmVudGx5LXRyYWNrZWQgZWxlbWVudCxcbiAqIGlmIGFueSBleGlzdHMuXG4gKi9cblxuXG5mdW5jdGlvbiBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpIHtcbiAgaWYgKCFhY3RpdmVFbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYWN0aXZlRWxlbWVudC5kZXRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTtcbiAgYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbn1cbi8qKlxuICogKEZvciBJRSA8PTkpIEhhbmRsZXMgYSBwcm9wZXJ0eWNoYW5nZSBldmVudCwgc2VuZGluZyBhIGBjaGFuZ2VgIGV2ZW50IGlmXG4gKiB0aGUgdmFsdWUgb2YgdGhlIGFjdGl2ZSBlbGVtZW50IGhhcyBjaGFuZ2VkLlxuICovXG5cblxuZnVuY3Rpb24gaGFuZGxlUHJvcGVydHlDaGFuZ2UobmF0aXZlRXZlbnQpIHtcbiAgaWYgKG5hdGl2ZUV2ZW50LnByb3BlcnR5TmFtZSAhPT0gJ3ZhbHVlJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChnZXRJbnN0SWZWYWx1ZUNoYW5nZWQoYWN0aXZlRWxlbWVudEluc3QpKSB7XG4gICAgbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudChuYXRpdmVFdmVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlRXZlbnRzRm9ySW5wdXRFdmVudFBvbHlmaWxsKGRvbUV2ZW50TmFtZSwgdGFyZ2V0LCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdmb2N1c2luJykge1xuICAgIC8vIEluIElFOSwgcHJvcGVydHljaGFuZ2UgZmlyZXMgZm9yIG1vc3QgaW5wdXQgZXZlbnRzIGJ1dCBpcyBidWdneSBhbmRcbiAgICAvLyBkb2Vzbid0IGZpcmUgd2hlbiB0ZXh0IGlzIGRlbGV0ZWQsIGJ1dCBjb252ZW5pZW50bHksIHNlbGVjdGlvbmNoYW5nZVxuICAgIC8vIGFwcGVhcnMgdG8gZmlyZSBpbiBhbGwgb2YgdGhlIHJlbWFpbmluZyBjYXNlcyBzbyB3ZSBjYXRjaCB0aG9zZSBhbmRcbiAgICAvLyBmb3J3YXJkIHRoZSBldmVudCBpZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWRcbiAgICAvLyBJbiBlaXRoZXIgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byBjYWxsIHRoZSBldmVudCBoYW5kbGVyIGlmIHRoZSB2YWx1ZVxuICAgIC8vIGlzIGNoYW5nZWQgZnJvbSBKUyBzbyB3ZSByZWRlZmluZSBhIHNldHRlciBmb3IgYC52YWx1ZWAgdGhhdCB1cGRhdGVzXG4gICAgLy8gb3VyIGFjdGl2ZUVsZW1lbnRWYWx1ZSB2YXJpYWJsZSwgYWxsb3dpbmcgdXMgdG8gaWdub3JlIHRob3NlIGNoYW5nZXNcbiAgICAvL1xuICAgIC8vIHN0b3BXYXRjaGluZygpIHNob3VsZCBiZSBhIG5vb3AgaGVyZSBidXQgd2UgY2FsbCBpdCBqdXN0IGluIGNhc2Ugd2VcbiAgICAvLyBtaXNzZWQgYSBibHVyIGV2ZW50IHNvbWVob3cuXG4gICAgc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKTtcbiAgICBzdGFydFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KTtcbiAgfSBlbHNlIGlmIChkb21FdmVudE5hbWUgPT09ICdmb2N1c291dCcpIHtcbiAgICBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpO1xuICB9XG59IC8vIEZvciBJRTggYW5kIElFOS5cblxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudFBvbHlmaWxsKGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnc2VsZWN0aW9uY2hhbmdlJyB8fCBkb21FdmVudE5hbWUgPT09ICdrZXl1cCcgfHwgZG9tRXZlbnROYW1lID09PSAna2V5ZG93bicpIHtcbiAgICAvLyBPbiB0aGUgc2VsZWN0aW9uY2hhbmdlIGV2ZW50LCB0aGUgdGFyZ2V0IGlzIGp1c3QgZG9jdW1lbnQgd2hpY2ggaXNuJ3RcbiAgICAvLyBoZWxwZnVsIGZvciB1cyBzbyBqdXN0IGNoZWNrIGFjdGl2ZUVsZW1lbnQgaW5zdGVhZC5cbiAgICAvL1xuICAgIC8vIDk5JSBvZiB0aGUgdGltZSwga2V5ZG93biBhbmQga2V5dXAgYXJlbid0IG5lY2Vzc2FyeS4gSUU4IGZhaWxzIHRvIGZpcmVcbiAgICAvLyBwcm9wZXJ0eWNoYW5nZSBvbiB0aGUgZmlyc3QgaW5wdXQgZXZlbnQgYWZ0ZXIgc2V0dGluZyBgdmFsdWVgIGZyb20gYVxuICAgIC8vIHNjcmlwdCBhbmQgZmlyZXMgb25seSBrZXlkb3duLCBrZXlwcmVzcywga2V5dXAuIENhdGNoaW5nIGtleXVwIHVzdWFsbHlcbiAgICAvLyBnZXRzIGl0IGFuZCBjYXRjaGluZyBrZXlkb3duIGxldHMgdXMgZmlyZSBhbiBldmVudCBmb3IgdGhlIGZpcnN0XG4gICAgLy8ga2V5c3Ryb2tlIGlmIHVzZXIgZG9lcyBhIGtleSByZXBlYXQgKGl0J2xsIGJlIGEgbGl0dGxlIGRlbGF5ZWQ6IHJpZ2h0XG4gICAgLy8gYmVmb3JlIHRoZSBzZWNvbmQga2V5c3Ryb2tlKS4gT3RoZXIgaW5wdXQgbWV0aG9kcyAoZS5nLiwgcGFzdGUpIHNlZW0gdG9cbiAgICAvLyBmaXJlIHNlbGVjdGlvbmNoYW5nZSBub3JtYWxseS5cbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKGFjdGl2ZUVsZW1lbnRJbnN0KTtcbiAgfVxufVxuLyoqXG4gKiBTRUNUSU9OOiBoYW5kbGUgYGNsaWNrYCBldmVudFxuICovXG5cblxuZnVuY3Rpb24gc2hvdWxkVXNlQ2xpY2tFdmVudChlbGVtKSB7XG4gIC8vIFVzZSB0aGUgYGNsaWNrYCBldmVudCB0byBkZXRlY3QgY2hhbmdlcyB0byBjaGVja2JveCBhbmQgcmFkaW8gaW5wdXRzLlxuICAvLyBUaGlzIGFwcHJvYWNoIHdvcmtzIGFjcm9zcyBhbGwgYnJvd3NlcnMsIHdoZXJlYXMgYGNoYW5nZWAgZG9lcyBub3QgZmlyZVxuICAvLyB1bnRpbCBgYmx1cmAgaW4gSUU4LlxuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lO1xuICByZXR1cm4gbm9kZU5hbWUgJiYgbm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiAoZWxlbS50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW0udHlwZSA9PT0gJ3JhZGlvJyk7XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JDbGlja0V2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnY2xpY2snKSB7XG4gICAgcmV0dXJuIGdldEluc3RJZlZhbHVlQ2hhbmdlZCh0YXJnZXRJbnN0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRPckNoYW5nZUV2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnaW5wdXQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ2NoYW5nZScpIHtcbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUNvbnRyb2xsZWRJbnB1dEJsdXIobm9kZSkge1xuICB2YXIgc3RhdGUgPSBub2RlLl93cmFwcGVyU3RhdGU7XG5cbiAgaWYgKCFzdGF0ZSB8fCAhc3RhdGUuY29udHJvbGxlZCB8fCBub2RlLnR5cGUgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIC8vIElmIGNvbnRyb2xsZWQsIGFzc2lnbiB0aGUgdmFsdWUgYXR0cmlidXRlIHRvIHRoZSBjdXJyZW50IHZhbHVlIG9uIGJsdXJcbiAgICBzZXREZWZhdWx0VmFsdWUobm9kZSwgJ251bWJlcicsIG5vZGUudmFsdWUpO1xuICB9XG59XG4vKipcbiAqIFRoaXMgcGx1Z2luIGNyZWF0ZXMgYW4gYG9uQ2hhbmdlYCBldmVudCB0aGF0IG5vcm1hbGl6ZXMgY2hhbmdlIGV2ZW50c1xuICogYWNyb3NzIGZvcm0gZWxlbWVudHMuIFRoaXMgZXZlbnQgZmlyZXMgYXQgYSB0aW1lIHdoZW4gaXQncyBwb3NzaWJsZSB0b1xuICogY2hhbmdlIHRoZSBlbGVtZW50J3MgdmFsdWUgd2l0aG91dCBzZWVpbmcgYSBmbGlja2VyLlxuICpcbiAqIFN1cHBvcnRlZCBlbGVtZW50cyBhcmU6XG4gKiAtIGlucHV0IChzZWUgYGlzVGV4dElucHV0RWxlbWVudGApXG4gKiAtIHRleHRhcmVhXG4gKiAtIHNlbGVjdFxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQxKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIHRhcmdldE5vZGUgPSB0YXJnZXRJbnN0ID8gZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KSA6IHdpbmRvdztcbiAgdmFyIGdldFRhcmdldEluc3RGdW5jLCBoYW5kbGVFdmVudEZ1bmM7XG5cbiAgaWYgKHNob3VsZFVzZUNoYW5nZUV2ZW50KHRhcmdldE5vZGUpKSB7XG4gICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9yQ2hhbmdlRXZlbnQ7XG4gIH0gZWxzZSBpZiAoaXNUZXh0SW5wdXRFbGVtZW50KHRhcmdldE5vZGUpKSB7XG4gICAgaWYgKGlzSW5wdXRFdmVudFN1cHBvcnRlZCkge1xuICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRPckNoYW5nZUV2ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50UG9seWZpbGw7XG4gICAgICBoYW5kbGVFdmVudEZ1bmMgPSBoYW5kbGVFdmVudHNGb3JJbnB1dEV2ZW50UG9seWZpbGw7XG4gICAgfVxuICB9IGVsc2UgaWYgKHNob3VsZFVzZUNsaWNrRXZlbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDbGlja0V2ZW50O1xuICB9XG5cbiAgaWYgKGdldFRhcmdldEluc3RGdW5jKSB7XG4gICAgdmFyIGluc3QgPSBnZXRUYXJnZXRJbnN0RnVuYyhkb21FdmVudE5hbWUsIHRhcmdldEluc3QpO1xuXG4gICAgaWYgKGluc3QpIHtcbiAgICAgIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChkaXNwYXRjaFF1ZXVlLCBpbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChoYW5kbGVFdmVudEZ1bmMpIHtcbiAgICBoYW5kbGVFdmVudEZ1bmMoZG9tRXZlbnROYW1lLCB0YXJnZXROb2RlLCB0YXJnZXRJbnN0KTtcbiAgfSAvLyBXaGVuIGJsdXJyaW5nLCBzZXQgdGhlIHZhbHVlIGF0dHJpYnV0ZSBmb3IgbnVtYmVyIGlucHV0c1xuXG5cbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3Vzb3V0Jykge1xuICAgIGhhbmRsZUNvbnRyb2xsZWRJbnB1dEJsdXIodGFyZ2V0Tm9kZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMkMigpIHtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Nb3VzZUVudGVyJywgWydtb3VzZW91dCcsICdtb3VzZW92ZXInXSk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uTW91c2VMZWF2ZScsIFsnbW91c2VvdXQnLCAnbW91c2VvdmVyJ10pO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvblBvaW50ZXJFbnRlcicsIFsncG9pbnRlcm91dCcsICdwb2ludGVyb3ZlciddKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Qb2ludGVyTGVhdmUnLCBbJ3BvaW50ZXJvdXQnLCAncG9pbnRlcm92ZXInXSk7XG59XG4vKipcbiAqIEZvciBhbG1vc3QgZXZlcnkgaW50ZXJhY3Rpb24gd2UgY2FyZSBhYm91dCwgdGhlcmUgd2lsbCBiZSBib3RoIGEgdG9wLWxldmVsXG4gKiBgbW91c2VvdmVyYCBhbmQgYG1vdXNlb3V0YCBldmVudCB0aGF0IG9jY3Vycy4gT25seSB1c2UgYG1vdXNlb3V0YCBzbyB0aGF0XG4gKiB3ZSBkbyBub3QgZXh0cmFjdCBkdXBsaWNhdGUgZXZlbnRzLiBIb3dldmVyLCBtb3ZpbmcgdGhlIG1vdXNlIGludG8gdGhlXG4gKiBicm93c2VyIGZyb20gb3V0c2lkZSB3aWxsIG5vdCBmaXJlIGEgYG1vdXNlb3V0YCBldmVudC4gSW4gdGhpcyBjYXNlLCB3ZSB1c2VcbiAqIHRoZSBgbW91c2VvdmVyYCB0b3AtbGV2ZWwgZXZlbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDIoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgaXNPdmVyRXZlbnQgPSBkb21FdmVudE5hbWUgPT09ICdtb3VzZW92ZXInIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdmVyJztcbiAgdmFyIGlzT3V0RXZlbnQgPSBkb21FdmVudE5hbWUgPT09ICdtb3VzZW91dCcgfHwgZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm91dCc7XG5cbiAgaWYgKGlzT3ZlckV2ZW50ICYmICFpc1JlcGxheWluZ0V2ZW50KG5hdGl2ZUV2ZW50KSkge1xuICAgIC8vIElmIHRoaXMgaXMgYW4gb3ZlciBldmVudCB3aXRoIGEgdGFyZ2V0LCB3ZSBtaWdodCBoYXZlIGFscmVhZHkgZGlzcGF0Y2hlZFxuICAgIC8vIHRoZSBldmVudCBpbiB0aGUgb3V0IGV2ZW50IG9mIHRoZSBvdGhlciB0YXJnZXQuIElmIHRoaXMgaXMgcmVwbGF5ZWQsXG4gICAgLy8gdGhlbiBpdCdzIGJlY2F1c2Ugd2UgY291bGRuJ3QgZGlzcGF0Y2ggYWdhaW5zdCB0aGlzIHRhcmdldCBwcmV2aW91c2x5XG4gICAgLy8gc28gd2UgaGF2ZSB0byBkbyBpdCBub3cgaW5zdGVhZC5cbiAgICB2YXIgcmVsYXRlZCA9IG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQuZnJvbUVsZW1lbnQ7XG5cbiAgICBpZiAocmVsYXRlZCkge1xuICAgICAgLy8gSWYgdGhlIHJlbGF0ZWQgbm9kZSBpcyBtYW5hZ2VkIGJ5IFJlYWN0LCB3ZSBjYW4gYXNzdW1lIHRoYXQgd2UgaGF2ZVxuICAgICAgLy8gYWxyZWFkeSBkaXNwYXRjaGVkIHRoZSBjb3JyZXNwb25kaW5nIGV2ZW50cyBkdXJpbmcgaXRzIG1vdXNlb3V0LlxuICAgICAgaWYgKGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHJlbGF0ZWQpIHx8IGlzQ29udGFpbmVyTWFya2VkQXNSb290KHJlbGF0ZWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIWlzT3V0RXZlbnQgJiYgIWlzT3ZlckV2ZW50KSB7XG4gICAgLy8gTXVzdCBub3QgYmUgYSBtb3VzZSBvciBwb2ludGVyIGluIG9yIG91dCAtIGlnbm9yaW5nLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB3aW47IC8vIFRPRE86IHdoeSBpcyB0aGlzIG51bGxhYmxlIGluIHRoZSB0eXBlcyBidXQgd2UgcmVhZCBmcm9tIGl0P1xuXG4gIGlmIChuYXRpdmVFdmVudFRhcmdldC53aW5kb3cgPT09IG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgLy8gYG5hdGl2ZUV2ZW50VGFyZ2V0YCBpcyBwcm9iYWJseSBhIHdpbmRvdyBvYmplY3QuXG4gICAgd2luID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gVE9ETzogRmlndXJlIG91dCB3aHkgYG93bmVyRG9jdW1lbnRgIGlzIHNvbWV0aW1lcyB1bmRlZmluZWQgaW4gSUU4LlxuICAgIHZhciBkb2MgPSBuYXRpdmVFdmVudFRhcmdldC5vd25lckRvY3VtZW50O1xuXG4gICAgaWYgKGRvYykge1xuICAgICAgd2luID0gZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3c7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbiA9IHdpbmRvdztcbiAgICB9XG4gIH1cblxuICB2YXIgZnJvbTtcbiAgdmFyIHRvO1xuXG4gIGlmIChpc091dEV2ZW50KSB7XG4gICAgdmFyIF9yZWxhdGVkID0gbmF0aXZlRXZlbnQucmVsYXRlZFRhcmdldCB8fCBuYXRpdmVFdmVudC50b0VsZW1lbnQ7XG5cbiAgICBmcm9tID0gdGFyZ2V0SW5zdDtcbiAgICB0byA9IF9yZWxhdGVkID8gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoX3JlbGF0ZWQpIDogbnVsbDtcblxuICAgIGlmICh0byAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5lYXJlc3RNb3VudGVkID0gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcih0byk7XG5cbiAgICAgIGlmICh0byAhPT0gbmVhcmVzdE1vdW50ZWQgfHwgdG8udGFnICE9PSBIb3N0Q29tcG9uZW50ICYmIHRvLnRhZyAhPT0gSG9zdFRleHQpIHtcbiAgICAgICAgdG8gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBNb3ZpbmcgdG8gYSBub2RlIGZyb20gb3V0c2lkZSB0aGUgd2luZG93LlxuICAgIGZyb20gPSBudWxsO1xuICAgIHRvID0gdGFyZ2V0SW5zdDtcbiAgfVxuXG4gIGlmIChmcm9tID09PSB0bykge1xuICAgIC8vIE5vdGhpbmcgcGVydGFpbnMgdG8gb3VyIG1hbmFnZWQgY29tcG9uZW50cy5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljTW91c2VFdmVudDtcbiAgdmFyIGxlYXZlRXZlbnRUeXBlID0gJ29uTW91c2VMZWF2ZSc7XG4gIHZhciBlbnRlckV2ZW50VHlwZSA9ICdvbk1vdXNlRW50ZXInO1xuICB2YXIgZXZlbnRUeXBlUHJlZml4ID0gJ21vdXNlJztcblxuICBpZiAoZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm91dCcgfHwgZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm92ZXInKSB7XG4gICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljUG9pbnRlckV2ZW50O1xuICAgIGxlYXZlRXZlbnRUeXBlID0gJ29uUG9pbnRlckxlYXZlJztcbiAgICBlbnRlckV2ZW50VHlwZSA9ICdvblBvaW50ZXJFbnRlcic7XG4gICAgZXZlbnRUeXBlUHJlZml4ID0gJ3BvaW50ZXInO1xuICB9XG5cbiAgdmFyIGZyb21Ob2RlID0gZnJvbSA9PSBudWxsID8gd2luIDogZ2V0Tm9kZUZyb21JbnN0YW5jZShmcm9tKTtcbiAgdmFyIHRvTm9kZSA9IHRvID09IG51bGwgPyB3aW4gOiBnZXROb2RlRnJvbUluc3RhbmNlKHRvKTtcbiAgdmFyIGxlYXZlID0gbmV3IFN5bnRoZXRpY0V2ZW50Q3RvcihsZWF2ZUV2ZW50VHlwZSwgZXZlbnRUeXBlUHJlZml4ICsgJ2xlYXZlJywgZnJvbSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgbGVhdmUudGFyZ2V0ID0gZnJvbU5vZGU7XG4gIGxlYXZlLnJlbGF0ZWRUYXJnZXQgPSB0b05vZGU7XG4gIHZhciBlbnRlciA9IG51bGw7IC8vIFdlIHNob3VsZCBvbmx5IHByb2Nlc3MgdGhpcyBuYXRpdmVFdmVudCBpZiB3ZSBhcmUgcHJvY2Vzc2luZ1xuICAvLyB0aGUgZmlyc3QgYW5jZXN0b3IuIE5leHQgdGltZSwgd2Ugd2lsbCBpZ25vcmUgdGhlIGV2ZW50LlxuXG4gIHZhciBuYXRpdmVUYXJnZXRJbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGlmIChuYXRpdmVUYXJnZXRJbnN0ID09PSB0YXJnZXRJbnN0KSB7XG4gICAgdmFyIGVudGVyRXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnRDdG9yKGVudGVyRXZlbnRUeXBlLCBldmVudFR5cGVQcmVmaXggKyAnZW50ZXInLCB0bywgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBlbnRlckV2ZW50LnRhcmdldCA9IHRvTm9kZTtcbiAgICBlbnRlckV2ZW50LnJlbGF0ZWRUYXJnZXQgPSBmcm9tTm9kZTtcbiAgICBlbnRlciA9IGVudGVyRXZlbnQ7XG4gIH1cblxuICBhY2N1bXVsYXRlRW50ZXJMZWF2ZVR3b1BoYXNlTGlzdGVuZXJzKGRpc3BhdGNoUXVldWUsIGxlYXZlLCBlbnRlciwgZnJvbSwgdG8pO1xufVxuXG4vKipcbiAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBvd25cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuICovXG5mdW5jdGlvbiBpcyh4LCB5KSB7XG4gIHJldHVybiB4ID09PSB5ICYmICh4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geSkgfHwgeCAhPT0geCAmJiB5ICE9PSB5IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIDtcbn1cblxudmFyIG9iamVjdElzID0gdHlwZW9mIE9iamVjdC5pcyA9PT0gJ2Z1bmN0aW9uJyA/IE9iamVjdC5pcyA6IGlzO1xuXG4vKipcbiAqIFBlcmZvcm1zIGVxdWFsaXR5IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGtleXMgb24gYW4gb2JqZWN0IGFuZCByZXR1cm5pbmcgZmFsc2VcbiAqIHdoZW4gYW55IGtleSBoYXMgdmFsdWVzIHdoaWNoIGFyZSBub3Qgc3RyaWN0bHkgZXF1YWwgYmV0d2VlbiB0aGUgYXJndW1lbnRzLlxuICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHZhbHVlcyBvZiBhbGwga2V5cyBhcmUgc3RyaWN0bHkgZXF1YWwuXG4gKi9cblxuZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIpIHtcbiAgaWYgKG9iamVjdElzKG9iakEsIG9iakIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iakEgIT09ICdvYmplY3QnIHx8IG9iakEgPT09IG51bGwgfHwgdHlwZW9mIG9iakIgIT09ICdvYmplY3QnIHx8IG9iakIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIFRlc3QgZm9yIEEncyBrZXlzIGRpZmZlcmVudCBmcm9tIEIuXG5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXNBLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGN1cnJlbnRLZXkgPSBrZXlzQVtpXTtcblxuICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChvYmpCLCBjdXJyZW50S2V5KSB8fCAhb2JqZWN0SXMob2JqQVtjdXJyZW50S2V5XSwgb2JqQltjdXJyZW50S2V5XSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBHaXZlbiBhbnkgbm9kZSByZXR1cm4gdGhlIGZpcnN0IGxlYWYgbm9kZSB3aXRob3V0IGNoaWxkcmVuLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHJldHVybiB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX1cbiAqL1xuXG5mdW5jdGlvbiBnZXRMZWFmTm9kZShub2RlKSB7XG4gIHdoaWxlIChub2RlICYmIG5vZGUuZmlyc3RDaGlsZCkge1xuICAgIG5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn1cbi8qKlxuICogR2V0IHRoZSBuZXh0IHNpYmxpbmcgd2l0aGluIGEgY29udGFpbmVyLiBUaGlzIHdpbGwgd2FsayB1cCB0aGVcbiAqIERPTSBpZiBhIG5vZGUncyBzaWJsaW5ncyBoYXZlIGJlZW4gZXhoYXVzdGVkLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHJldHVybiB7P0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXRTaWJsaW5nTm9kZShub2RlKSB7XG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nO1xuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gIH1cbn1cbi8qKlxuICogR2V0IG9iamVjdCBkZXNjcmliaW5nIHRoZSBub2RlcyB3aGljaCBjb250YWluIGNoYXJhY3RlcnMgYXQgb2Zmc2V0LlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gcm9vdFxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICogQHJldHVybiB7P29iamVjdH1cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQocm9vdCwgb2Zmc2V0KSB7XG4gIHZhciBub2RlID0gZ2V0TGVhZk5vZGUocm9vdCk7XG4gIHZhciBub2RlU3RhcnQgPSAwO1xuICB2YXIgbm9kZUVuZCA9IDA7XG5cbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICBub2RlRW5kID0gbm9kZVN0YXJ0ICsgbm9kZS50ZXh0Q29udGVudC5sZW5ndGg7XG5cbiAgICAgIGlmIChub2RlU3RhcnQgPD0gb2Zmc2V0ICYmIG5vZGVFbmQgPj0gb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICBvZmZzZXQ6IG9mZnNldCAtIG5vZGVTdGFydFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBub2RlU3RhcnQgPSBub2RlRW5kO1xuICAgIH1cblxuICAgIG5vZGUgPSBnZXRMZWFmTm9kZShnZXRTaWJsaW5nTm9kZShub2RlKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG91dGVyTm9kZVxuICogQHJldHVybiB7P29iamVjdH1cbiAqL1xuXG5mdW5jdGlvbiBnZXRPZmZzZXRzKG91dGVyTm9kZSkge1xuICB2YXIgb3duZXJEb2N1bWVudCA9IG91dGVyTm9kZS5vd25lckRvY3VtZW50O1xuICB2YXIgd2luID0gb3duZXJEb2N1bWVudCAmJiBvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgdmFyIHNlbGVjdGlvbiA9IHdpbi5nZXRTZWxlY3Rpb24gJiYgd2luLmdldFNlbGVjdGlvbigpO1xuXG4gIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgYW5jaG9yTm9kZSA9IHNlbGVjdGlvbi5hbmNob3JOb2RlLFxuICAgICAgYW5jaG9yT2Zmc2V0ID0gc2VsZWN0aW9uLmFuY2hvck9mZnNldCxcbiAgICAgIGZvY3VzTm9kZSA9IHNlbGVjdGlvbi5mb2N1c05vZGUsXG4gICAgICBmb2N1c09mZnNldCA9IHNlbGVjdGlvbi5mb2N1c09mZnNldDsgLy8gSW4gRmlyZWZveCwgYW5jaG9yTm9kZSBhbmQgZm9jdXNOb2RlIGNhbiBiZSBcImFub255bW91cyBkaXZzXCIsIGUuZy4gdGhlXG4gIC8vIHVwL2Rvd24gYnV0dG9ucyBvbiBhbiA8aW5wdXQgdHlwZT1cIm51bWJlclwiPi4gQW5vbnltb3VzIGRpdnMgZG8gbm90IHNlZW0gdG9cbiAgLy8gZXhwb3NlIHByb3BlcnRpZXMsIHRyaWdnZXJpbmcgYSBcIlBlcm1pc3Npb24gZGVuaWVkIGVycm9yXCIgaWYgYW55IG9mIGl0c1xuICAvLyBwcm9wZXJ0aWVzIGFyZSBhY2Nlc3NlZC4gVGhlIG9ubHkgc2VlbWluZ2x5IHBvc3NpYmxlIHdheSB0byBhdm9pZCBlcnJvcmluZ1xuICAvLyBpcyB0byBhY2Nlc3MgYSBwcm9wZXJ0eSB0aGF0IHR5cGljYWxseSB3b3JrcyBmb3Igbm9uLWFub255bW91cyBkaXZzIGFuZFxuICAvLyBjYXRjaCBhbnkgZXJyb3IgdGhhdCBtYXkgb3RoZXJ3aXNlIGFyaXNlLiBTZWVcbiAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjA4NDI3XG5cbiAgdHJ5IHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtZXhwcmVzc2lvbnMgKi9cbiAgICBhbmNob3JOb2RlLm5vZGVUeXBlO1xuICAgIGZvY3VzTm9kZS5ub2RlVHlwZTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZ2V0TW9kZXJuT2Zmc2V0c0Zyb21Qb2ludHMob3V0ZXJOb2RlLCBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpO1xufVxuLyoqXG4gKiBSZXR1cm5zIHtzdGFydCwgZW5kfSB3aGVyZSBgc3RhcnRgIGlzIHRoZSBjaGFyYWN0ZXIvY29kZXBvaW50IGluZGV4IG9mXG4gKiAoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0KSB3aXRoaW4gdGhlIHRleHRDb250ZW50IG9mIGBvdXRlck5vZGVgLCBhbmRcbiAqIGBlbmRgIGlzIHRoZSBpbmRleCBvZiAoZm9jdXNOb2RlLCBmb2N1c09mZnNldCkuXG4gKlxuICogUmV0dXJucyBudWxsIGlmIHlvdSBwYXNzIGluIGdhcmJhZ2UgaW5wdXQgYnV0IHdlIHNob3VsZCBwcm9iYWJseSBqdXN0IGNyYXNoLlxuICpcbiAqIEV4cG9ydGVkIG9ubHkgZm9yIHRlc3RpbmcuXG4gKi9cblxuZnVuY3Rpb24gZ2V0TW9kZXJuT2Zmc2V0c0Zyb21Qb2ludHMob3V0ZXJOb2RlLCBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpIHtcbiAgdmFyIGxlbmd0aCA9IDA7XG4gIHZhciBzdGFydCA9IC0xO1xuICB2YXIgZW5kID0gLTE7XG4gIHZhciBpbmRleFdpdGhpbkFuY2hvciA9IDA7XG4gIHZhciBpbmRleFdpdGhpbkZvY3VzID0gMDtcbiAgdmFyIG5vZGUgPSBvdXRlck5vZGU7XG4gIHZhciBwYXJlbnROb2RlID0gbnVsbDtcblxuICBvdXRlcjogd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgbmV4dCA9IG51bGw7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUgPT09IGFuY2hvck5vZGUgJiYgKGFuY2hvck9mZnNldCA9PT0gMCB8fCBub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpKSB7XG4gICAgICAgIHN0YXJ0ID0gbGVuZ3RoICsgYW5jaG9yT2Zmc2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSA9PT0gZm9jdXNOb2RlICYmIChmb2N1c09mZnNldCA9PT0gMCB8fCBub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpKSB7XG4gICAgICAgIGVuZCA9IGxlbmd0aCArIGZvY3VzT2Zmc2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICAgIGxlbmd0aCArPSBub2RlLm5vZGVWYWx1ZS5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmICgobmV4dCA9IG5vZGUuZmlyc3RDaGlsZCkgPT09IG51bGwpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IC8vIE1vdmluZyBmcm9tIGBub2RlYCB0byBpdHMgZmlyc3QgY2hpbGQgYG5leHRgLlxuXG5cbiAgICAgIHBhcmVudE5vZGUgPSBub2RlO1xuICAgICAgbm9kZSA9IG5leHQ7XG4gICAgfVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlID09PSBvdXRlck5vZGUpIHtcbiAgICAgICAgLy8gSWYgYG91dGVyTm9kZWAgaGFzIGNoaWxkcmVuLCB0aGlzIGlzIGFsd2F5cyB0aGUgc2Vjb25kIHRpbWUgdmlzaXRpbmdcbiAgICAgICAgLy8gaXQuIElmIGl0IGhhcyBubyBjaGlsZHJlbiwgdGhpcyBpcyBzdGlsbCB0aGUgZmlyc3QgbG9vcCwgYW5kIHRoZSBvbmx5XG4gICAgICAgIC8vIHZhbGlkIHNlbGVjdGlvbiBpcyBhbmNob3JOb2RlIGFuZCBmb2N1c05vZGUgYm90aCBlcXVhbCB0byB0aGlzIG5vZGVcbiAgICAgICAgLy8gYW5kIGJvdGggb2Zmc2V0cyAwLCBpbiB3aGljaCBjYXNlIHdlIHdpbGwgaGF2ZSBoYW5kbGVkIGFib3ZlLlxuICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudE5vZGUgPT09IGFuY2hvck5vZGUgJiYgKytpbmRleFdpdGhpbkFuY2hvciA9PT0gYW5jaG9yT2Zmc2V0KSB7XG4gICAgICAgIHN0YXJ0ID0gbGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Tm9kZSA9PT0gZm9jdXNOb2RlICYmICsraW5kZXhXaXRoaW5Gb2N1cyA9PT0gZm9jdXNPZmZzZXQpIHtcbiAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAoKG5leHQgPSBub2RlLm5leHRTaWJsaW5nKSAhPT0gbnVsbCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IHBhcmVudE5vZGU7XG4gICAgICBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH0gLy8gTW92aW5nIGZyb20gYG5vZGVgIHRvIGl0cyBuZXh0IHNpYmxpbmcgYG5leHRgLlxuXG5cbiAgICBub2RlID0gbmV4dDtcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gLTEgfHwgZW5kID09PSAtMSkge1xuICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gKFdvdWxkIGhhcHBlbiBpZiB0aGUgYW5jaG9yL2ZvY3VzIG5vZGVzIGFyZW4ndFxuICAgIC8vIGFjdHVhbGx5IGluc2lkZSB0aGUgcGFzc2VkLWluIG5vZGUuKVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydDogc3RhcnQsXG4gICAgZW5kOiBlbmRcbiAgfTtcbn1cbi8qKlxuICogSW4gbW9kZXJuIG5vbi1JRSBicm93c2Vycywgd2UgY2FuIHN1cHBvcnQgYm90aCBmb3J3YXJkIGFuZCBiYWNrd2FyZFxuICogc2VsZWN0aW9ucy5cbiAqXG4gKiBOb3RlOiBJRTEwKyBzdXBwb3J0cyB0aGUgU2VsZWN0aW9uIG9iamVjdCwgYnV0IGl0IGRvZXMgbm90IHN1cHBvcnRcbiAqIHRoZSBgZXh0ZW5kYCBtZXRob2QsIHdoaWNoIG1lYW5zIHRoYXQgZXZlbiBpbiBtb2Rlcm4gSUUsIGl0J3Mgbm90IHBvc3NpYmxlXG4gKiB0byBwcm9ncmFtbWF0aWNhbGx5IGNyZWF0ZSBhIGJhY2t3YXJkIHNlbGVjdGlvbi4gVGh1cywgZm9yIGFsbCBJRVxuICogdmVyc2lvbnMsIHdlIHVzZSB0aGUgb2xkIElFIEFQSSB0byBjcmVhdGUgb3VyIHNlbGVjdGlvbnMuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcGFyYW0ge29iamVjdH0gb2Zmc2V0c1xuICovXG5cbmZ1bmN0aW9uIHNldE9mZnNldHMobm9kZSwgb2Zmc2V0cykge1xuICB2YXIgZG9jID0gbm9kZS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50O1xuICB2YXIgd2luID0gZG9jICYmIGRvYy5kZWZhdWx0VmlldyB8fCB3aW5kb3c7IC8vIEVkZ2UgZmFpbHMgd2l0aCBcIk9iamVjdCBleHBlY3RlZFwiIGluIHNvbWUgc2NlbmFyaW9zLlxuICAvLyAoRm9yIGluc3RhbmNlOiBUaW55TUNFIGVkaXRvciB1c2VkIGluIGEgbGlzdCBjb21wb25lbnQgdGhhdCBzdXBwb3J0cyBwYXN0aW5nIHRvIGFkZCBtb3JlLFxuICAvLyBmYWlscyB3aGVuIHBhc3RpbmcgMTAwKyBpdGVtcylcblxuICBpZiAoIXdpbi5nZXRTZWxlY3Rpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbigpO1xuICB2YXIgbGVuZ3RoID0gbm9kZS50ZXh0Q29udGVudC5sZW5ndGg7XG4gIHZhciBzdGFydCA9IE1hdGgubWluKG9mZnNldHMuc3RhcnQsIGxlbmd0aCk7XG4gIHZhciBlbmQgPSBvZmZzZXRzLmVuZCA9PT0gdW5kZWZpbmVkID8gc3RhcnQgOiBNYXRoLm1pbihvZmZzZXRzLmVuZCwgbGVuZ3RoKTsgLy8gSUUgMTEgdXNlcyBtb2Rlcm4gc2VsZWN0aW9uLCBidXQgZG9lc24ndCBzdXBwb3J0IHRoZSBleHRlbmQgbWV0aG9kLlxuICAvLyBGbGlwIGJhY2t3YXJkIHNlbGVjdGlvbnMsIHNvIHdlIGNhbiBzZXQgd2l0aCBhIHNpbmdsZSByYW5nZS5cblxuICBpZiAoIXNlbGVjdGlvbi5leHRlbmQgJiYgc3RhcnQgPiBlbmQpIHtcbiAgICB2YXIgdGVtcCA9IGVuZDtcbiAgICBlbmQgPSBzdGFydDtcbiAgICBzdGFydCA9IHRlbXA7XG4gIH1cblxuICB2YXIgc3RhcnRNYXJrZXIgPSBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KG5vZGUsIHN0YXJ0KTtcbiAgdmFyIGVuZE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQobm9kZSwgZW5kKTtcblxuICBpZiAoc3RhcnRNYXJrZXIgJiYgZW5kTWFya2VyKSB7XG4gICAgaWYgKHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAxICYmIHNlbGVjdGlvbi5hbmNob3JOb2RlID09PSBzdGFydE1hcmtlci5ub2RlICYmIHNlbGVjdGlvbi5hbmNob3JPZmZzZXQgPT09IHN0YXJ0TWFya2VyLm9mZnNldCAmJiBzZWxlY3Rpb24uZm9jdXNOb2RlID09PSBlbmRNYXJrZXIubm9kZSAmJiBzZWxlY3Rpb24uZm9jdXNPZmZzZXQgPT09IGVuZE1hcmtlci5vZmZzZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcmFuZ2UgPSBkb2MuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZS5zZXRTdGFydChzdGFydE1hcmtlci5ub2RlLCBzdGFydE1hcmtlci5vZmZzZXQpO1xuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcblxuICAgIGlmIChzdGFydCA+IGVuZCkge1xuICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgIHNlbGVjdGlvbi5leHRlbmQoZW5kTWFya2VyLm5vZGUsIGVuZE1hcmtlci5vZmZzZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByYW5nZS5zZXRFbmQoZW5kTWFya2VyLm5vZGUsIGVuZE1hcmtlci5vZmZzZXQpO1xuICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNUZXh0Tm9kZShub2RlKSB7XG4gIHJldHVybiBub2RlICYmIG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERTtcbn1cblxuZnVuY3Rpb24gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlKSB7XG4gIGlmICghb3V0ZXJOb2RlIHx8ICFpbm5lck5vZGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAob3V0ZXJOb2RlID09PSBpbm5lck5vZGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc1RleHROb2RlKG91dGVyTm9kZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAoaXNUZXh0Tm9kZShpbm5lck5vZGUpKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5zTm9kZShvdXRlck5vZGUsIGlubmVyTm9kZS5wYXJlbnROb2RlKTtcbiAgfSBlbHNlIGlmICgnY29udGFpbnMnIGluIG91dGVyTm9kZSkge1xuICAgIHJldHVybiBvdXRlck5vZGUuY29udGFpbnMoaW5uZXJOb2RlKTtcbiAgfSBlbHNlIGlmIChvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24pIHtcbiAgICByZXR1cm4gISEob3V0ZXJOb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGlubmVyTm9kZSkgJiAxNik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzSW5Eb2N1bWVudChub2RlKSB7XG4gIHJldHVybiBub2RlICYmIG5vZGUub3duZXJEb2N1bWVudCAmJiBjb250YWluc05vZGUobm9kZS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgbm9kZSk7XG59XG5cbmZ1bmN0aW9uIGlzU2FtZU9yaWdpbkZyYW1lKGlmcmFtZSkge1xuICB0cnkge1xuICAgIC8vIEFjY2Vzc2luZyB0aGUgY29udGVudERvY3VtZW50IG9mIGEgSFRNTElmcmFtZUVsZW1lbnQgY2FuIGNhdXNlIHRoZSBicm93c2VyXG4gICAgLy8gdG8gdGhyb3csIGUuZy4gaWYgaXQgaGFzIGEgY3Jvc3Mtb3JpZ2luIHNyYyBhdHRyaWJ1dGUuXG4gICAgLy8gU2FmYXJpIHdpbGwgc2hvdyBhbiBlcnJvciBpbiB0aGUgY29uc29sZSB3aGVuIHRoZSBhY2Nlc3MgcmVzdWx0cyBpbiBcIkJsb2NrZWQgYSBmcmFtZSB3aXRoIG9yaWdpblwiLiBlLmc6XG4gICAgLy8gaWZyYW1lLmNvbnRlbnREb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICAvLyBBIHNhZmV0eSB3YXkgaXMgdG8gYWNjZXNzIG9uZSBvZiB0aGUgY3Jvc3Mgb3JpZ2luIHByb3BlcnRpZXM6IFdpbmRvdyBvciBMb2NhdGlvblxuICAgIC8vIFdoaWNoIG1pZ2h0IHJlc3VsdCBpbiBcIlNlY3VyaXR5RXJyb3JcIiBET00gRXhjZXB0aW9uIGFuZCBpdCBpcyBjb21wYXRpYmxlIHRvIFNhZmFyaS5cbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9icm93c2Vycy5odG1sI2ludGVncmF0aW9uLXdpdGgtaWRsXG4gICAgcmV0dXJuIHR5cGVvZiBpZnJhbWUuY29udGVudFdpbmRvdy5sb2NhdGlvbi5ocmVmID09PSAnc3RyaW5nJztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEFjdGl2ZUVsZW1lbnREZWVwKCkge1xuICB2YXIgd2luID0gd2luZG93O1xuICB2YXIgZWxlbWVudCA9IGdldEFjdGl2ZUVsZW1lbnQoKTtcblxuICB3aGlsZSAoZWxlbWVudCBpbnN0YW5jZW9mIHdpbi5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgIGlmIChpc1NhbWVPcmlnaW5GcmFtZShlbGVtZW50KSkge1xuICAgICAgd2luID0gZWxlbWVudC5jb250ZW50V2luZG93O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICBlbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudCh3aW4uZG9jdW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG4vKipcbiAqIEBSZWFjdElucHV0U2VsZWN0aW9uOiBSZWFjdCBpbnB1dCBzZWxlY3Rpb24gbW9kdWxlLiBCYXNlZCBvbiBTZWxlY3Rpb24uanMsXG4gKiBidXQgbW9kaWZpZWQgdG8gYmUgc3VpdGFibGUgZm9yIHJlYWN0IGFuZCBoYXMgYSBjb3VwbGUgb2YgYnVnIGZpeGVzIChkb2Vzbid0XG4gKiBhc3N1bWUgYnV0dG9ucyBoYXZlIHJhbmdlIHNlbGVjdGlvbnMgYWxsb3dlZCkuXG4gKiBJbnB1dCBzZWxlY3Rpb24gbW9kdWxlIGZvciBSZWFjdC5cbiAqL1xuXG4vKipcbiAqIEBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXM6IHdlIGdldCB0aGUgZWxlbWVudCB0eXBlcyB0aGF0IHN1cHBvcnQgc2VsZWN0aW9uXG4gKiBmcm9tIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2RvLW5vdC1hcHBseSwgbG9va2luZyBhdCBgc2VsZWN0aW9uU3RhcnRgXG4gKiBhbmQgYHNlbGVjdGlvbkVuZGAgcm93cy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBub2RlTmFtZSAmJiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgKGVsZW0udHlwZSA9PT0gJ3RleHQnIHx8IGVsZW0udHlwZSA9PT0gJ3NlYXJjaCcgfHwgZWxlbS50eXBlID09PSAndGVsJyB8fCBlbGVtLnR5cGUgPT09ICd1cmwnIHx8IGVsZW0udHlwZSA9PT0gJ3Bhc3N3b3JkJykgfHwgbm9kZU5hbWUgPT09ICd0ZXh0YXJlYScgfHwgZWxlbS5jb250ZW50RWRpdGFibGUgPT09ICd0cnVlJyk7XG59XG5mdW5jdGlvbiBnZXRTZWxlY3Rpb25JbmZvcm1hdGlvbigpIHtcbiAgdmFyIGZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxlbWVudERlZXAoKTtcbiAgcmV0dXJuIHtcbiAgICBmb2N1c2VkRWxlbTogZm9jdXNlZEVsZW0sXG4gICAgc2VsZWN0aW9uUmFuZ2U6IGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhmb2N1c2VkRWxlbSkgPyBnZXRTZWxlY3Rpb24oZm9jdXNlZEVsZW0pIDogbnVsbFxuICB9O1xufVxuLyoqXG4gKiBAcmVzdG9yZVNlbGVjdGlvbjogSWYgYW55IHNlbGVjdGlvbiBpbmZvcm1hdGlvbiB3YXMgcG90ZW50aWFsbHkgbG9zdCxcbiAqIHJlc3RvcmUgaXQuIFRoaXMgaXMgdXNlZnVsIHdoZW4gcGVyZm9ybWluZyBvcGVyYXRpb25zIHRoYXQgY291bGQgcmVtb3ZlIGRvbVxuICogbm9kZXMgYW5kIHBsYWNlIHRoZW0gYmFjayBpbiwgcmVzdWx0aW5nIGluIGZvY3VzIGJlaW5nIGxvc3QuXG4gKi9cblxuZnVuY3Rpb24gcmVzdG9yZVNlbGVjdGlvbihwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uKSB7XG4gIHZhciBjdXJGb2N1c2VkRWxlbSA9IGdldEFjdGl2ZUVsZW1lbnREZWVwKCk7XG4gIHZhciBwcmlvckZvY3VzZWRFbGVtID0gcHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbi5mb2N1c2VkRWxlbTtcbiAgdmFyIHByaW9yU2VsZWN0aW9uUmFuZ2UgPSBwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uLnNlbGVjdGlvblJhbmdlO1xuXG4gIGlmIChjdXJGb2N1c2VkRWxlbSAhPT0gcHJpb3JGb2N1c2VkRWxlbSAmJiBpc0luRG9jdW1lbnQocHJpb3JGb2N1c2VkRWxlbSkpIHtcbiAgICBpZiAocHJpb3JTZWxlY3Rpb25SYW5nZSAhPT0gbnVsbCAmJiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMocHJpb3JGb2N1c2VkRWxlbSkpIHtcbiAgICAgIHNldFNlbGVjdGlvbihwcmlvckZvY3VzZWRFbGVtLCBwcmlvclNlbGVjdGlvblJhbmdlKTtcbiAgICB9IC8vIEZvY3VzaW5nIGEgbm9kZSBjYW4gY2hhbmdlIHRoZSBzY3JvbGwgcG9zaXRpb24sIHdoaWNoIGlzIHVuZGVzaXJhYmxlXG5cblxuICAgIHZhciBhbmNlc3RvcnMgPSBbXTtcbiAgICB2YXIgYW5jZXN0b3IgPSBwcmlvckZvY3VzZWRFbGVtO1xuXG4gICAgd2hpbGUgKGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50Tm9kZSkge1xuICAgICAgaWYgKGFuY2VzdG9yLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgYW5jZXN0b3JzLnB1c2goe1xuICAgICAgICAgIGVsZW1lbnQ6IGFuY2VzdG9yLFxuICAgICAgICAgIGxlZnQ6IGFuY2VzdG9yLnNjcm9sbExlZnQsXG4gICAgICAgICAgdG9wOiBhbmNlc3Rvci5zY3JvbGxUb3BcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwcmlvckZvY3VzZWRFbGVtLmZvY3VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwcmlvckZvY3VzZWRFbGVtLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbmNlc3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpbmZvID0gYW5jZXN0b3JzW2ldO1xuICAgICAgaW5mby5lbGVtZW50LnNjcm9sbExlZnQgPSBpbmZvLmxlZnQ7XG4gICAgICBpbmZvLmVsZW1lbnQuc2Nyb2xsVG9wID0gaW5mby50b3A7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEBnZXRTZWxlY3Rpb246IEdldHMgdGhlIHNlbGVjdGlvbiBib3VuZHMgb2YgYSBmb2N1c2VkIHRleHRhcmVhLCBpbnB1dCBvclxuICogY29udGVudEVkaXRhYmxlIG5vZGUuXG4gKiAtQGlucHV0OiBMb29rIHVwIHNlbGVjdGlvbiBib3VuZHMgb2YgdGhpcyBpbnB1dFxuICogLUByZXR1cm4ge3N0YXJ0OiBzZWxlY3Rpb25TdGFydCwgZW5kOiBzZWxlY3Rpb25FbmR9XG4gKi9cblxuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uKGlucHV0KSB7XG4gIHZhciBzZWxlY3Rpb247XG5cbiAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gaW5wdXQpIHtcbiAgICAvLyBNb2Rlcm4gYnJvd3NlciB3aXRoIGlucHV0IG9yIHRleHRhcmVhLlxuICAgIHNlbGVjdGlvbiA9IHtcbiAgICAgIHN0YXJ0OiBpbnB1dC5zZWxlY3Rpb25TdGFydCxcbiAgICAgIGVuZDogaW5wdXQuc2VsZWN0aW9uRW5kXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDb250ZW50IGVkaXRhYmxlIG9yIG9sZCBJRSB0ZXh0YXJlYS5cbiAgICBzZWxlY3Rpb24gPSBnZXRPZmZzZXRzKGlucHV0KTtcbiAgfVxuXG4gIHJldHVybiBzZWxlY3Rpb24gfHwge1xuICAgIHN0YXJ0OiAwLFxuICAgIGVuZDogMFxuICB9O1xufVxuLyoqXG4gKiBAc2V0U2VsZWN0aW9uOiBTZXRzIHRoZSBzZWxlY3Rpb24gYm91bmRzIG9mIGEgdGV4dGFyZWEgb3IgaW5wdXQgYW5kIGZvY3VzZXNcbiAqIHRoZSBpbnB1dC5cbiAqIC1AaW5wdXQgICAgIFNldCBzZWxlY3Rpb24gYm91bmRzIG9mIHRoaXMgaW5wdXQgb3IgdGV4dGFyZWFcbiAqIC1Ab2Zmc2V0cyAgIE9iamVjdCBvZiBzYW1lIGZvcm0gdGhhdCBpcyByZXR1cm5lZCBmcm9tIGdldCpcbiAqL1xuXG5mdW5jdGlvbiBzZXRTZWxlY3Rpb24oaW5wdXQsIG9mZnNldHMpIHtcbiAgdmFyIHN0YXJ0ID0gb2Zmc2V0cy5zdGFydDtcbiAgdmFyIGVuZCA9IG9mZnNldHMuZW5kO1xuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHN0YXJ0O1xuICB9XG5cbiAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gaW5wdXQpIHtcbiAgICBpbnB1dC5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0O1xuICAgIGlucHV0LnNlbGVjdGlvbkVuZCA9IE1hdGgubWluKGVuZCwgaW5wdXQudmFsdWUubGVuZ3RoKTtcbiAgfSBlbHNlIHtcbiAgICBzZXRPZmZzZXRzKGlucHV0LCBvZmZzZXRzKTtcbiAgfVxufVxuXG52YXIgc2tpcFNlbGVjdGlvbkNoYW5nZUV2ZW50ID0gY2FuVXNlRE9NICYmICdkb2N1bWVudE1vZGUnIGluIGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA8PSAxMTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMkMygpIHtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvblNlbGVjdCcsIFsnZm9jdXNvdXQnLCAnY29udGV4dG1lbnUnLCAnZHJhZ2VuZCcsICdmb2N1c2luJywgJ2tleWRvd24nLCAna2V5dXAnLCAnbW91c2Vkb3duJywgJ21vdXNldXAnLCAnc2VsZWN0aW9uY2hhbmdlJ10pO1xufVxuXG52YXIgYWN0aXZlRWxlbWVudCQxID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50SW5zdCQxID0gbnVsbDtcbnZhciBsYXN0U2VsZWN0aW9uID0gbnVsbDtcbnZhciBtb3VzZURvd24gPSBmYWxzZTtcbi8qKlxuICogR2V0IGFuIG9iamVjdCB3aGljaCBpcyBhIHVuaXF1ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24uXG4gKlxuICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIG5vdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBub2RlcyBvciBicm93c2VycywgYnV0XG4gKiB0d28gaWRlbnRpY2FsIHNlbGVjdGlvbnMgb24gdGhlIHNhbWUgbm9kZSB3aWxsIHJldHVybiBpZGVudGljYWwgb2JqZWN0cy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24kMShub2RlKSB7XG4gIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIG5vZGUgJiYgaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKG5vZGUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0OiBub2RlLnNlbGVjdGlvblN0YXJ0LFxuICAgICAgZW5kOiBub2RlLnNlbGVjdGlvbkVuZFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdmFyIHdpbiA9IG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICAgIHZhciBzZWxlY3Rpb24gPSB3aW4uZ2V0U2VsZWN0aW9uKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFuY2hvck5vZGU6IHNlbGVjdGlvbi5hbmNob3JOb2RlLFxuICAgICAgYW5jaG9yT2Zmc2V0OiBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LFxuICAgICAgZm9jdXNOb2RlOiBzZWxlY3Rpb24uZm9jdXNOb2RlLFxuICAgICAgZm9jdXNPZmZzZXQ6IHNlbGVjdGlvbi5mb2N1c09mZnNldFxuICAgIH07XG4gIH1cbn1cbi8qKlxuICogR2V0IGRvY3VtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQgdGFyZ2V0LlxuICovXG5cblxuZnVuY3Rpb24gZ2V0RXZlbnRUYXJnZXREb2N1bWVudChldmVudFRhcmdldCkge1xuICByZXR1cm4gZXZlbnRUYXJnZXQud2luZG93ID09PSBldmVudFRhcmdldCA/IGV2ZW50VGFyZ2V0LmRvY3VtZW50IDogZXZlbnRUYXJnZXQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyBldmVudFRhcmdldCA6IGV2ZW50VGFyZ2V0Lm93bmVyRG9jdW1lbnQ7XG59XG4vKipcbiAqIFBvbGwgc2VsZWN0aW9uIHRvIHNlZSB3aGV0aGVyIGl0J3MgY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFRhcmdldFxuICogQHJldHVybiB7P1N5bnRoZXRpY0V2ZW50fVxuICovXG5cblxuZnVuY3Rpb24gY29uc3RydWN0U2VsZWN0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIC8vIEVuc3VyZSB3ZSBoYXZlIHRoZSByaWdodCBlbGVtZW50LCBhbmQgdGhhdCB0aGUgdXNlciBpcyBub3QgZHJhZ2dpbmcgYVxuICAvLyBzZWxlY3Rpb24gKHRoaXMgbWF0Y2hlcyBuYXRpdmUgYHNlbGVjdGAgZXZlbnQgYmVoYXZpb3IpLiBJbiBIVE1MNSwgc2VsZWN0XG4gIC8vIGZpcmVzIG9ubHkgb24gaW5wdXQgYW5kIHRleHRhcmVhIHRodXMgaWYgdGhlcmUncyBubyBmb2N1c2VkIGVsZW1lbnQgd2VcbiAgLy8gd29uJ3QgZGlzcGF0Y2guXG4gIHZhciBkb2MgPSBnZXRFdmVudFRhcmdldERvY3VtZW50KG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBpZiAobW91c2VEb3duIHx8IGFjdGl2ZUVsZW1lbnQkMSA9PSBudWxsIHx8IGFjdGl2ZUVsZW1lbnQkMSAhPT0gZ2V0QWN0aXZlRWxlbWVudChkb2MpKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIE9ubHkgZmlyZSB3aGVuIHNlbGVjdGlvbiBoYXMgYWN0dWFsbHkgY2hhbmdlZC5cblxuXG4gIHZhciBjdXJyZW50U2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uJDEoYWN0aXZlRWxlbWVudCQxKTtcblxuICBpZiAoIWxhc3RTZWxlY3Rpb24gfHwgIXNoYWxsb3dFcXVhbChsYXN0U2VsZWN0aW9uLCBjdXJyZW50U2VsZWN0aW9uKSkge1xuICAgIGxhc3RTZWxlY3Rpb24gPSBjdXJyZW50U2VsZWN0aW9uO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnMoYWN0aXZlRWxlbWVudEluc3QkMSwgJ29uU2VsZWN0Jyk7XG5cbiAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBldmVudCA9IG5ldyBTeW50aGV0aWNFdmVudCgnb25TZWxlY3QnLCAnc2VsZWN0JywgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICAgIH0pO1xuICAgICAgZXZlbnQudGFyZ2V0ID0gYWN0aXZlRWxlbWVudCQxO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBUaGlzIHBsdWdpbiBjcmVhdGVzIGFuIGBvblNlbGVjdGAgZXZlbnQgdGhhdCBub3JtYWxpemVzIHNlbGVjdCBldmVudHNcbiAqIGFjcm9zcyBmb3JtIGVsZW1lbnRzLlxuICpcbiAqIFN1cHBvcnRlZCBlbGVtZW50cyBhcmU6XG4gKiAtIGlucHV0IChzZWUgYGlzVGV4dElucHV0RWxlbWVudGApXG4gKiAtIHRleHRhcmVhXG4gKiAtIGNvbnRlbnRFZGl0YWJsZVxuICpcbiAqIFRoaXMgZGlmZmVycyBmcm9tIG5hdGl2ZSBicm93c2VyIGltcGxlbWVudGF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHdheXM6XG4gKiAtIEZpcmVzIG9uIGNvbnRlbnRFZGl0YWJsZSBmaWVsZHMgYXMgd2VsbCBhcyBpbnB1dHMuXG4gKiAtIEZpcmVzIGZvciBjb2xsYXBzZWQgc2VsZWN0aW9uLlxuICogLSBGaXJlcyBhZnRlciB1c2VyIGlucHV0LlxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIHRhcmdldE5vZGUgPSB0YXJnZXRJbnN0ID8gZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KSA6IHdpbmRvdztcblxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIC8vIFRyYWNrIHRoZSBpbnB1dCBub2RlIHRoYXQgaGFzIGZvY3VzLlxuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAgaWYgKGlzVGV4dElucHV0RWxlbWVudCh0YXJnZXROb2RlKSB8fCB0YXJnZXROb2RlLmNvbnRlbnRFZGl0YWJsZSA9PT0gJ3RydWUnKSB7XG4gICAgICAgIGFjdGl2ZUVsZW1lbnQkMSA9IHRhcmdldE5vZGU7XG4gICAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSB0YXJnZXRJbnN0O1xuICAgICAgICBsYXN0U2VsZWN0aW9uID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICBhY3RpdmVFbGVtZW50JDEgPSBudWxsO1xuICAgICAgYWN0aXZlRWxlbWVudEluc3QkMSA9IG51bGw7XG4gICAgICBsYXN0U2VsZWN0aW9uID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuICAgIC8vIERvbid0IGZpcmUgdGhlIGV2ZW50IHdoaWxlIHRoZSB1c2VyIGlzIGRyYWdnaW5nLiBUaGlzIG1hdGNoZXMgdGhlXG4gICAgLy8gc2VtYW50aWNzIG9mIHRoZSBuYXRpdmUgc2VsZWN0IGV2ZW50LlxuXG4gICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICAgIG1vdXNlRG93biA9IHRydWU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2NvbnRleHRtZW51JzpcbiAgICBjYXNlICdtb3VzZXVwJzpcbiAgICBjYXNlICdkcmFnZW5kJzpcbiAgICAgIG1vdXNlRG93biA9IGZhbHNlO1xuICAgICAgY29uc3RydWN0U2VsZWN0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICAgIGJyZWFrO1xuICAgIC8vIENocm9tZSBhbmQgSUUgZmlyZSBub24tc3RhbmRhcmQgZXZlbnQgd2hlbiBzZWxlY3Rpb24gaXMgY2hhbmdlZCAoYW5kXG4gICAgLy8gc29tZXRpbWVzIHdoZW4gaXQgaGFzbid0KS4gSUUncyBldmVudCBmaXJlcyBvdXQgb2Ygb3JkZXIgd2l0aCByZXNwZWN0XG4gICAgLy8gdG8ga2V5IGFuZCBpbnB1dCBldmVudHMgb24gZGVsZXRpb24sIHNvIHdlIGRpc2NhcmQgaXQuXG4gICAgLy9cbiAgICAvLyBGaXJlZm94IGRvZXNuJ3Qgc3VwcG9ydCBzZWxlY3Rpb25jaGFuZ2UsIHNvIGNoZWNrIHNlbGVjdGlvbiBzdGF0dXNcbiAgICAvLyBhZnRlciBlYWNoIGtleSBlbnRyeS4gVGhlIHNlbGVjdGlvbiBjaGFuZ2VzIGFmdGVyIGtleWRvd24gYW5kIGJlZm9yZVxuICAgIC8vIGtleXVwLCBidXQgd2UgY2hlY2sgb24ga2V5ZG93biBhcyB3ZWxsIGluIHRoZSBjYXNlIG9mIGhvbGRpbmcgZG93biBhXG4gICAgLy8ga2V5LCB3aGVuIG11bHRpcGxlIGtleWRvd24gZXZlbnRzIGFyZSBmaXJlZCBidXQgb25seSBvbmUga2V5dXAgaXMuXG4gICAgLy8gVGhpcyBpcyBhbHNvIG91ciBhcHByb2FjaCBmb3IgSUUgaGFuZGxpbmcsIGZvciB0aGUgcmVhc29uIGFib3ZlLlxuXG4gICAgY2FzZSAnc2VsZWN0aW9uY2hhbmdlJzpcbiAgICAgIGlmIChza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAvLyBmYWxscyB0aHJvdWdoXG5cbiAgICBjYXNlICdrZXlkb3duJzpcbiAgICBjYXNlICdrZXl1cCc6XG4gICAgICBjb25zdHJ1Y3RTZWxlY3RFdmVudChkaXNwYXRjaFF1ZXVlLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBtYXBwaW5nIG9mIHN0YW5kYXJkIHZlbmRvciBwcmVmaXhlcyB1c2luZyB0aGUgZGVmaW5lZCBzdHlsZSBwcm9wZXJ0eSBhbmQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3R5bGVQcm9wXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIG1ha2VQcmVmaXhNYXAoc3R5bGVQcm9wLCBldmVudE5hbWUpIHtcbiAgdmFyIHByZWZpeGVzID0ge307XG4gIHByZWZpeGVzW3N0eWxlUHJvcC50b0xvd2VyQ2FzZSgpXSA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICBwcmVmaXhlc1snV2Via2l0JyArIHN0eWxlUHJvcF0gPSAnd2Via2l0JyArIGV2ZW50TmFtZTtcbiAgcHJlZml4ZXNbJ01veicgKyBzdHlsZVByb3BdID0gJ21veicgKyBldmVudE5hbWU7XG4gIHJldHVybiBwcmVmaXhlcztcbn1cbi8qKlxuICogQSBsaXN0IG9mIGV2ZW50IG5hbWVzIHRvIGEgY29uZmlndXJhYmxlIGxpc3Qgb2YgdmVuZG9yIHByZWZpeGVzLlxuICovXG5cblxudmFyIHZlbmRvclByZWZpeGVzID0ge1xuICBhbmltYXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ0FuaW1hdGlvbicsICdBbmltYXRpb25FbmQnKSxcbiAgYW5pbWF0aW9uaXRlcmF0aW9uOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uSXRlcmF0aW9uJyksXG4gIGFuaW1hdGlvbnN0YXJ0OiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uU3RhcnQnKSxcbiAgdHJhbnNpdGlvbmVuZDogbWFrZVByZWZpeE1hcCgnVHJhbnNpdGlvbicsICdUcmFuc2l0aW9uRW5kJylcbn07XG4vKipcbiAqIEV2ZW50IG5hbWVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gZGV0ZWN0ZWQgYW5kIHByZWZpeGVkIChpZiBhcHBsaWNhYmxlKS5cbiAqL1xuXG52YXIgcHJlZml4ZWRFdmVudE5hbWVzID0ge307XG4vKipcbiAqIEVsZW1lbnQgdG8gY2hlY2sgZm9yIHByZWZpeGVzIG9uLlxuICovXG5cbnZhciBzdHlsZSA9IHt9O1xuLyoqXG4gKiBCb290c3RyYXAgaWYgYSBET00gZXhpc3RzLlxuICovXG5cbmlmIChjYW5Vc2VET00pIHtcbiAgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZTsgLy8gT24gc29tZSBwbGF0Zm9ybXMsIGluIHBhcnRpY3VsYXIgc29tZSByZWxlYXNlcyBvZiBBbmRyb2lkIDQueCxcbiAgLy8gdGhlIHVuLXByZWZpeGVkIFwiYW5pbWF0aW9uXCIgYW5kIFwidHJhbnNpdGlvblwiIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgb24gdGhlXG4gIC8vIHN0eWxlIG9iamVjdCBidXQgdGhlIGV2ZW50cyB0aGF0IGZpcmUgd2lsbCBzdGlsbCBiZSBwcmVmaXhlZCwgc28gd2UgbmVlZFxuICAvLyB0byBjaGVjayBpZiB0aGUgdW4tcHJlZml4ZWQgZXZlbnRzIGFyZSB1c2FibGUsIGFuZCBpZiBub3QgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgbWFwLlxuXG4gIGlmICghKCdBbmltYXRpb25FdmVudCcgaW4gd2luZG93KSkge1xuICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy5hbmltYXRpb25lbmQuYW5pbWF0aW9uO1xuICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy5hbmltYXRpb25pdGVyYXRpb24uYW5pbWF0aW9uO1xuICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy5hbmltYXRpb25zdGFydC5hbmltYXRpb247XG4gIH0gLy8gU2FtZSBhcyBhYm92ZVxuXG5cbiAgaWYgKCEoJ1RyYW5zaXRpb25FdmVudCcgaW4gd2luZG93KSkge1xuICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy50cmFuc2l0aW9uZW5kLnRyYW5zaXRpb247XG4gIH1cbn1cbi8qKlxuICogQXR0ZW1wdHMgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHZlbmRvciBwcmVmaXhlZCBldmVudCBuYW1lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShldmVudE5hbWUpIHtcbiAgaWYgKHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdO1xuICB9IGVsc2UgaWYgKCF2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZTtcbiAgfVxuXG4gIHZhciBwcmVmaXhNYXAgPSB2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdO1xuXG4gIGZvciAodmFyIHN0eWxlUHJvcCBpbiBwcmVmaXhNYXApIHtcbiAgICBpZiAocHJlZml4TWFwLmhhc093blByb3BlcnR5KHN0eWxlUHJvcCkgJiYgc3R5bGVQcm9wIGluIHN0eWxlKSB7XG4gICAgICByZXR1cm4gcHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV0gPSBwcmVmaXhNYXBbc3R5bGVQcm9wXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXZlbnROYW1lO1xufVxuXG52YXIgQU5JTUFUSU9OX0VORCA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25lbmQnKTtcbnZhciBBTklNQVRJT05fSVRFUkFUSU9OID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ2FuaW1hdGlvbml0ZXJhdGlvbicpO1xudmFyIEFOSU1BVElPTl9TVEFSVCA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25zdGFydCcpO1xudmFyIFRSQU5TSVRJT05fRU5EID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ3RyYW5zaXRpb25lbmQnKTtcblxudmFyIHRvcExldmVsRXZlbnRzVG9SZWFjdE5hbWVzID0gbmV3IE1hcCgpOyAvLyBOT1RFOiBDYXBpdGFsaXphdGlvbiBpcyBpbXBvcnRhbnQgaW4gdGhpcyBsaXN0IVxuLy9cbi8vIEUuZy4gaXQgbmVlZHMgXCJwb2ludGVyRG93blwiLCBub3QgXCJwb2ludGVyZG93blwiLlxuLy8gVGhpcyBpcyBiZWNhdXNlIHdlIGRlcml2ZSBib3RoIFJlYWN0IG5hbWUgKFwib25Qb2ludGVyRG93blwiKVxuLy8gYW5kIERPTSBuYW1lIChcInBvaW50ZXJkb3duXCIpIGZyb20gdGhlIHNhbWUgbGlzdC5cbi8vXG4vLyBFeGNlcHRpb25zIHRoYXQgZG9uJ3QgbWF0Y2ggdGhpcyBjb252ZW50aW9uIGFyZSBsaXN0ZWQgc2VwYXJhdGVseS5cbi8vXG4vLyBwcmV0dGllci1pZ25vcmVcblxudmFyIHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzID0gWydhYm9ydCcsICdhdXhDbGljaycsICdjYW5jZWwnLCAnY2FuUGxheScsICdjYW5QbGF5VGhyb3VnaCcsICdjbGljaycsICdjbG9zZScsICdjb250ZXh0TWVudScsICdjb3B5JywgJ2N1dCcsICdkcmFnJywgJ2RyYWdFbmQnLCAnZHJhZ0VudGVyJywgJ2RyYWdFeGl0JywgJ2RyYWdMZWF2ZScsICdkcmFnT3ZlcicsICdkcmFnU3RhcnQnLCAnZHJvcCcsICdkdXJhdGlvbkNoYW5nZScsICdlbXB0aWVkJywgJ2VuY3J5cHRlZCcsICdlbmRlZCcsICdlcnJvcicsICdnb3RQb2ludGVyQ2FwdHVyZScsICdpbnB1dCcsICdpbnZhbGlkJywgJ2tleURvd24nLCAna2V5UHJlc3MnLCAna2V5VXAnLCAnbG9hZCcsICdsb2FkZWREYXRhJywgJ2xvYWRlZE1ldGFkYXRhJywgJ2xvYWRTdGFydCcsICdsb3N0UG9pbnRlckNhcHR1cmUnLCAnbW91c2VEb3duJywgJ21vdXNlTW92ZScsICdtb3VzZU91dCcsICdtb3VzZU92ZXInLCAnbW91c2VVcCcsICdwYXN0ZScsICdwYXVzZScsICdwbGF5JywgJ3BsYXlpbmcnLCAncG9pbnRlckNhbmNlbCcsICdwb2ludGVyRG93bicsICdwb2ludGVyTW92ZScsICdwb2ludGVyT3V0JywgJ3BvaW50ZXJPdmVyJywgJ3BvaW50ZXJVcCcsICdwcm9ncmVzcycsICdyYXRlQ2hhbmdlJywgJ3Jlc2V0JywgJ3Jlc2l6ZScsICdzZWVrZWQnLCAnc2Vla2luZycsICdzdGFsbGVkJywgJ3N1Ym1pdCcsICdzdXNwZW5kJywgJ3RpbWVVcGRhdGUnLCAndG91Y2hDYW5jZWwnLCAndG91Y2hFbmQnLCAndG91Y2hTdGFydCcsICd2b2x1bWVDaGFuZ2UnLCAnc2Nyb2xsJywgJ3RvZ2dsZScsICd0b3VjaE1vdmUnLCAnd2FpdGluZycsICd3aGVlbCddO1xuXG5mdW5jdGlvbiByZWdpc3RlclNpbXBsZUV2ZW50KGRvbUV2ZW50TmFtZSwgcmVhY3ROYW1lKSB7XG4gIHRvcExldmVsRXZlbnRzVG9SZWFjdE5hbWVzLnNldChkb21FdmVudE5hbWUsIHJlYWN0TmFtZSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudChyZWFjdE5hbWUsIFtkb21FdmVudE5hbWVdKTtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJTaW1wbGVFdmVudHMoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2ltcGxlRXZlbnRQbHVnaW5FdmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZXZlbnROYW1lID0gc2ltcGxlRXZlbnRQbHVnaW5FdmVudHNbaV07XG4gICAgdmFyIGRvbUV2ZW50TmFtZSA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBjYXBpdGFsaXplZEV2ZW50ID0gZXZlbnROYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBldmVudE5hbWUuc2xpY2UoMSk7XG4gICAgcmVnaXN0ZXJTaW1wbGVFdmVudChkb21FdmVudE5hbWUsICdvbicgKyBjYXBpdGFsaXplZEV2ZW50KTtcbiAgfSAvLyBTcGVjaWFsIGNhc2VzIHdoZXJlIGV2ZW50IG5hbWVzIGRvbid0IG1hdGNoLlxuXG5cbiAgcmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fRU5ELCAnb25BbmltYXRpb25FbmQnKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fSVRFUkFUSU9OLCAnb25BbmltYXRpb25JdGVyYXRpb24nKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fU1RBUlQsICdvbkFuaW1hdGlvblN0YXJ0Jyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoJ2RibGNsaWNrJywgJ29uRG91YmxlQ2xpY2snKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudCgnZm9jdXNpbicsICdvbkZvY3VzJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoJ2ZvY3Vzb3V0JywgJ29uQmx1cicpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KFRSQU5TSVRJT05fRU5ELCAnb25UcmFuc2l0aW9uRW5kJyk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkNChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciByZWFjdE5hbWUgPSB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcy5nZXQoZG9tRXZlbnROYW1lKTtcblxuICBpZiAocmVhY3ROYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRXZlbnQ7XG4gIHZhciByZWFjdEV2ZW50VHlwZSA9IGRvbUV2ZW50TmFtZTtcblxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICAgIC8vIEZpcmVmb3ggY3JlYXRlcyBhIGtleXByZXNzIGV2ZW50IGZvciBmdW5jdGlvbiBrZXlzIHRvby4gVGhpcyByZW1vdmVzXG4gICAgICAvLyB0aGUgdW53YW50ZWQga2V5cHJlc3MgZXZlbnRzLiBFbnRlciBpcyBob3dldmVyIGJvdGggcHJpbnRhYmxlIGFuZFxuICAgICAgLy8gbm9uLXByaW50YWJsZS4gT25lIHdvdWxkIGV4cGVjdCBUYWIgdG8gYmUgYXMgd2VsbCAoYnV0IGl0IGlzbid0KS5cbiAgICAgIGlmIChnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KSA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAvKiBmYWxscyB0aHJvdWdoICovXG5cbiAgICBjYXNlICdrZXlkb3duJzpcbiAgICBjYXNlICdrZXl1cCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNLZXlib2FyZEV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgIHJlYWN0RXZlbnRUeXBlID0gJ2ZvY3VzJztcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgIHJlYWN0RXZlbnRUeXBlID0gJ2JsdXInO1xuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRm9jdXNFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnYmVmb3JlYmx1cic6XG4gICAgY2FzZSAnYWZ0ZXJibHVyJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2NsaWNrJzpcbiAgICAgIC8vIEZpcmVmb3ggY3JlYXRlcyBhIGNsaWNrIGV2ZW50IG9uIHJpZ2h0IG1vdXNlIGNsaWNrcy4gVGhpcyByZW1vdmVzIHRoZVxuICAgICAgLy8gdW53YW50ZWQgY2xpY2sgZXZlbnRzLlxuICAgICAgaWYgKG5hdGl2ZUV2ZW50LmJ1dHRvbiA9PT0gMikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAvKiBmYWxscyB0aHJvdWdoICovXG5cbiAgICBjYXNlICdhdXhjbGljayc6XG4gICAgY2FzZSAnZGJsY2xpY2snOlxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgY2FzZSAnbW91c2Vtb3ZlJzpcbiAgICBjYXNlICdtb3VzZXVwJzogLy8gVE9ETzogRGlzYWJsZWQgZWxlbWVudHMgc2hvdWxkIG5vdCByZXNwb25kIHRvIG1vdXNlIGV2ZW50c1xuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAnbW91c2VvdXQnOlxuICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgY2FzZSAnY29udGV4dG1lbnUnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljTW91c2VFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZHJhZyc6XG4gICAgY2FzZSAnZHJhZ2VuZCc6XG4gICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICBjYXNlICdkcmFnZXhpdCc6XG4gICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICBjYXNlICdkcmFnb3Zlcic6XG4gICAgY2FzZSAnZHJhZ3N0YXJ0JzpcbiAgICBjYXNlICdkcm9wJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0RyYWdFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndG91Y2hjYW5jZWwnOlxuICAgIGNhc2UgJ3RvdWNoZW5kJzpcbiAgICBjYXNlICd0b3VjaG1vdmUnOlxuICAgIGNhc2UgJ3RvdWNoc3RhcnQnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljVG91Y2hFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBBTklNQVRJT05fRU5EOlxuICAgIGNhc2UgQU5JTUFUSU9OX0lURVJBVElPTjpcbiAgICBjYXNlIEFOSU1BVElPTl9TVEFSVDpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFRSQU5TSVRJT05fRU5EOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljVHJhbnNpdGlvbkV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzY3JvbGwnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljVUlFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnd2hlZWwnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljV2hlZWxFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnY29weSc6XG4gICAgY2FzZSAnY3V0JzpcbiAgICBjYXNlICdwYXN0ZSc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNDbGlwYm9hcmRFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZ290cG9pbnRlcmNhcHR1cmUnOlxuICAgIGNhc2UgJ2xvc3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgY2FzZSAncG9pbnRlcmNhbmNlbCc6XG4gICAgY2FzZSAncG9pbnRlcmRvd24nOlxuICAgIGNhc2UgJ3BvaW50ZXJtb3ZlJzpcbiAgICBjYXNlICdwb2ludGVyb3V0JzpcbiAgICBjYXNlICdwb2ludGVyb3Zlcic6XG4gICAgY2FzZSAncG9pbnRlcnVwJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1BvaW50ZXJFdmVudDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdmFyIGluQ2FwdHVyZVBoYXNlID0gKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19DQVBUVVJFX1BIQVNFKSAhPT0gMDtcblxuICB7XG4gICAgLy8gU29tZSBldmVudHMgZG9uJ3QgYnViYmxlIGluIHRoZSBicm93c2VyLlxuICAgIC8vIEluIHRoZSBwYXN0LCBSZWFjdCBoYXMgYWx3YXlzIGJ1YmJsZWQgdGhlbSwgYnV0IHRoaXMgY2FuIGJlIHN1cnByaXNpbmcuXG4gICAgLy8gV2UncmUgZ29pbmcgdG8gdHJ5IGFsaWduaW5nIGNsb3NlciB0byB0aGUgYnJvd3NlciBiZWhhdmlvciBieSBub3QgYnViYmxpbmdcbiAgICAvLyB0aGVtIGluIFJlYWN0IGVpdGhlci4gV2UnbGwgc3RhcnQgYnkgbm90IGJ1YmJsaW5nIG9uU2Nyb2xsLCBhbmQgdGhlbiBleHBhbmQuXG4gICAgdmFyIGFjY3VtdWxhdGVUYXJnZXRPbmx5ID0gIWluQ2FwdHVyZVBoYXNlICYmIC8vIFRPRE86IGlkZWFsbHksIHdlJ2QgZXZlbnR1YWxseSBhZGQgYWxsIGV2ZW50cyBmcm9tXG4gICAgLy8gbm9uRGVsZWdhdGVkRXZlbnRzIGxpc3QgaW4gRE9NUGx1Z2luRXZlbnRTeXN0ZW0uXG4gICAgLy8gVGhlbiB3ZSBjYW4gcmVtb3ZlIHRoaXMgc3BlY2lhbCBsaXN0LlxuICAgIC8vIFRoaXMgaXMgYSBicmVha2luZyBjaGFuZ2UgdGhhdCBjYW4gd2FpdCB1bnRpbCBSZWFjdCAxOC5cbiAgICBkb21FdmVudE5hbWUgPT09ICdzY3JvbGwnO1xuXG4gICAgdmFyIF9saXN0ZW5lcnMgPSBhY2N1bXVsYXRlU2luZ2xlUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgcmVhY3ROYW1lLCBuYXRpdmVFdmVudC50eXBlLCBpbkNhcHR1cmVQaGFzZSwgYWNjdW11bGF0ZVRhcmdldE9ubHkpO1xuXG4gICAgaWYgKF9saXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gSW50ZW50aW9uYWxseSBjcmVhdGUgZXZlbnQgbGF6aWx5LlxuICAgICAgdmFyIF9ldmVudCA9IG5ldyBTeW50aGV0aWNFdmVudEN0b3IocmVhY3ROYW1lLCByZWFjdEV2ZW50VHlwZSwgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICAgICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgICAgZXZlbnQ6IF9ldmVudCxcbiAgICAgICAgbGlzdGVuZXJzOiBfbGlzdGVuZXJzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRvcC1sZXZlbCBzaWRlIGVmZmVjdC5cbnJlZ2lzdGVyU2ltcGxlRXZlbnRzKCk7XG5yZWdpc3RlckV2ZW50cyQyKCk7XG5yZWdpc3RlckV2ZW50cyQxKCk7XG5yZWdpc3RlckV2ZW50cyQzKCk7XG5yZWdpc3RlckV2ZW50cygpO1xuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDUoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICAvLyBUT0RPOiB3ZSBzaG91bGQgcmVtb3ZlIHRoZSBjb25jZXB0IG9mIGEgXCJTaW1wbGVFdmVudFBsdWdpblwiLlxuICAvLyBUaGlzIGlzIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IG9mIHRoZSBldmVudCBzeXN0ZW0uIEFsbFxuICAvLyB0aGUgb3RoZXIgcGx1Z2lucyBhcmUgZXNzZW50aWFsbHkgcG9seWZpbGxzLiBTbyB0aGUgcGx1Z2luXG4gIC8vIHNob3VsZCBwcm9iYWJseSBiZSBpbmxpbmVkIHNvbWV3aGVyZSBhbmQgaGF2ZSBpdHMgbG9naWNcbiAgLy8gYmUgY29yZSB0aGUgdG8gZXZlbnQgc3lzdGVtLiBUaGlzIHdvdWxkIHBvdGVudGlhbGx5IGFsbG93XG4gIC8vIHVzIHRvIHNoaXAgYnVpbGRzIG9mIFJlYWN0IHdpdGhvdXQgdGhlIHBvbHlmaWxsZWQgcGx1Z2lucyBiZWxvdy5cbiAgZXh0cmFjdEV2ZW50cyQ0KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzKTtcbiAgdmFyIHNob3VsZFByb2Nlc3NQb2x5ZmlsbFBsdWdpbnMgPSAoZXZlbnRTeXN0ZW1GbGFncyAmIFNIT1VMRF9OT1RfUFJPQ0VTU19QT0xZRklMTF9FVkVOVF9QTFVHSU5TKSA9PT0gMDsgLy8gV2UgZG9uJ3QgcHJvY2VzcyB0aGVzZSBldmVudHMgdW5sZXNzIHdlIGFyZSBpbiB0aGVcbiAgLy8gZXZlbnQncyBuYXRpdmUgXCJidWJibGVcIiBwaGFzZSwgd2hpY2ggbWVhbnMgdGhhdCB3ZSdyZVxuICAvLyBub3QgaW4gdGhlIGNhcHR1cmUgcGhhc2UuIFRoYXQncyBiZWNhdXNlIHdlIGVtdWxhdGVcbiAgLy8gdGhlIGNhcHR1cmUgcGhhc2UgaGVyZSBzdGlsbC4gVGhpcyBpcyBhIHRyYWRlLW9mZixcbiAgLy8gYmVjYXVzZSBpbiBhbiBpZGVhbCB3b3JsZCB3ZSB3b3VsZCBub3QgZW11bGF0ZSBhbmQgdXNlXG4gIC8vIHRoZSBwaGFzZXMgcHJvcGVybHksIGxpa2Ugd2UgZG8gd2l0aCB0aGUgU2ltcGxlRXZlbnRcbiAgLy8gcGx1Z2luLiBIb3dldmVyLCB0aGUgcGx1Z2lucyBiZWxvdyBlaXRoZXIgZXhwZWN0XG4gIC8vIGVtdWxhdGlvbiAoRW50ZXJMZWF2ZSkgb3IgdXNlIHN0YXRlIGxvY2FsaXplZCB0byB0aGF0XG4gIC8vIHBsdWdpbiAoQmVmb3JlSW5wdXQsIENoYW5nZSwgU2VsZWN0KS4gVGhlIHN0YXRlIGluXG4gIC8vIHRoZXNlIG1vZHVsZXMgY29tcGxpY2F0ZXMgdGhpbmdzLCBhcyB5b3UnbGwgZXNzZW50aWFsbHlcbiAgLy8gZ2V0IHRoZSBjYXNlIHdoZXJlIHRoZSBjYXB0dXJlIHBoYXNlIGV2ZW50IG1pZ2h0IGNoYW5nZVxuICAvLyBzdGF0ZSwgb25seSBmb3IgdGhlIGZvbGxvd2luZyBidWJibGUgZXZlbnQgdG8gY29tZSBpblxuICAvLyBsYXRlciBhbmQgbm90IHRyaWdnZXIgYW55dGhpbmcgYXMgdGhlIHN0YXRlIG5vd1xuICAvLyBpbnZhbGlkYXRlcyB0aGUgaGV1cmlzdGljcyBvZiB0aGUgZXZlbnQgcGx1Z2luLiBXZVxuICAvLyBjb3VsZCBhbHRlciBhbGwgdGhlc2UgcGx1Z2lucyB0byB3b3JrIGluIHN1Y2ggd2F5cywgYnV0XG4gIC8vIHRoYXQgbWlnaHQgY2F1c2Ugb3RoZXIgdW5rbm93biBzaWRlLWVmZmVjdHMgdGhhdCB3ZVxuICAvLyBjYW4ndCBmb3Jlc2VlIHJpZ2h0IG5vdy5cblxuICBpZiAoc2hvdWxkUHJvY2Vzc1BvbHlmaWxsUGx1Z2lucykge1xuICAgIGV4dHJhY3RFdmVudHMkMihkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZXh0cmFjdEV2ZW50cyQxKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBleHRyYWN0RXZlbnRzJDMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGV4dHJhY3RFdmVudHMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICB9XG59IC8vIExpc3Qgb2YgZXZlbnRzIHRoYXQgbmVlZCB0byBiZSBpbmRpdmlkdWFsbHkgYXR0YWNoZWQgdG8gbWVkaWEgZWxlbWVudHMuXG5cblxudmFyIG1lZGlhRXZlbnRUeXBlcyA9IFsnYWJvcnQnLCAnY2FucGxheScsICdjYW5wbGF5dGhyb3VnaCcsICdkdXJhdGlvbmNoYW5nZScsICdlbXB0aWVkJywgJ2VuY3J5cHRlZCcsICdlbmRlZCcsICdlcnJvcicsICdsb2FkZWRkYXRhJywgJ2xvYWRlZG1ldGFkYXRhJywgJ2xvYWRzdGFydCcsICdwYXVzZScsICdwbGF5JywgJ3BsYXlpbmcnLCAncHJvZ3Jlc3MnLCAncmF0ZWNoYW5nZScsICdyZXNpemUnLCAnc2Vla2VkJywgJ3NlZWtpbmcnLCAnc3RhbGxlZCcsICdzdXNwZW5kJywgJ3RpbWV1cGRhdGUnLCAndm9sdW1lY2hhbmdlJywgJ3dhaXRpbmcnXTsgLy8gV2Ugc2hvdWxkIG5vdCBkZWxlZ2F0ZSB0aGVzZSBldmVudHMgdG8gdGhlIGNvbnRhaW5lciwgYnV0IHJhdGhlclxuLy8gc2V0IHRoZW0gb24gdGhlIGFjdHVhbCB0YXJnZXQgZWxlbWVudCBpdHNlbGYuIFRoaXMgaXMgcHJpbWFyaWx5XG4vLyBiZWNhdXNlIHRoZXNlIGV2ZW50cyBkbyBub3QgY29uc2lzdGVudGx5IGJ1YmJsZSBpbiB0aGUgRE9NLlxuXG52YXIgbm9uRGVsZWdhdGVkRXZlbnRzID0gbmV3IFNldChbJ2NhbmNlbCcsICdjbG9zZScsICdpbnZhbGlkJywgJ2xvYWQnLCAnc2Nyb2xsJywgJ3RvZ2dsZSddLmNvbmNhdChtZWRpYUV2ZW50VHlwZXMpKTtcblxuZnVuY3Rpb24gZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBsaXN0ZW5lciwgY3VycmVudFRhcmdldCkge1xuICB2YXIgdHlwZSA9IGV2ZW50LnR5cGUgfHwgJ3Vua25vd24tZXZlbnQnO1xuICBldmVudC5jdXJyZW50VGFyZ2V0ID0gY3VycmVudFRhcmdldDtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrQW5kQ2F0Y2hGaXJzdEVycm9yKHR5cGUsIGxpc3RlbmVyLCB1bmRlZmluZWQsIGV2ZW50KTtcbiAgZXZlbnQuY3VycmVudFRhcmdldCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NEaXNwYXRjaFF1ZXVlSXRlbXNJbk9yZGVyKGV2ZW50LCBkaXNwYXRjaExpc3RlbmVycywgaW5DYXB0dXJlUGhhc2UpIHtcbiAgdmFyIHByZXZpb3VzSW5zdGFuY2U7XG5cbiAgaWYgKGluQ2FwdHVyZVBoYXNlKSB7XG4gICAgZm9yICh2YXIgaSA9IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgX2Rpc3BhdGNoTGlzdGVuZXJzJGkgPSBkaXNwYXRjaExpc3RlbmVyc1tpXSxcbiAgICAgICAgICBpbnN0YW5jZSA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmluc3RhbmNlLFxuICAgICAgICAgIGN1cnJlbnRUYXJnZXQgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5jdXJyZW50VGFyZ2V0LFxuICAgICAgICAgIGxpc3RlbmVyID0gX2Rpc3BhdGNoTGlzdGVuZXJzJGkubGlzdGVuZXI7XG5cbiAgICAgIGlmIChpbnN0YW5jZSAhPT0gcHJldmlvdXNJbnN0YW5jZSAmJiBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBsaXN0ZW5lciwgY3VycmVudFRhcmdldCk7XG4gICAgICBwcmV2aW91c0luc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBkaXNwYXRjaExpc3RlbmVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kgPSBkaXNwYXRjaExpc3RlbmVyc1tfaV0sXG4gICAgICAgICAgX2luc3RhbmNlID0gX2Rpc3BhdGNoTGlzdGVuZXJzJF9pLmluc3RhbmNlLFxuICAgICAgICAgIF9jdXJyZW50VGFyZ2V0ID0gX2Rpc3BhdGNoTGlzdGVuZXJzJF9pLmN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgX2xpc3RlbmVyID0gX2Rpc3BhdGNoTGlzdGVuZXJzJF9pLmxpc3RlbmVyO1xuXG4gICAgICBpZiAoX2luc3RhbmNlICE9PSBwcmV2aW91c0luc3RhbmNlICYmIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIF9saXN0ZW5lciwgX2N1cnJlbnRUYXJnZXQpO1xuICAgICAgcHJldmlvdXNJbnN0YW5jZSA9IF9pbnN0YW5jZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0Rpc3BhdGNoUXVldWUoZGlzcGF0Y2hRdWV1ZSwgZXZlbnRTeXN0ZW1GbGFncykge1xuICB2YXIgaW5DYXB0dXJlUGhhc2UgPSAoZXZlbnRTeXN0ZW1GbGFncyAmIElTX0NBUFRVUkVfUEhBU0UpICE9PSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGlzcGF0Y2hRdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBfZGlzcGF0Y2hRdWV1ZSRpID0gZGlzcGF0Y2hRdWV1ZVtpXSxcbiAgICAgICAgZXZlbnQgPSBfZGlzcGF0Y2hRdWV1ZSRpLmV2ZW50LFxuICAgICAgICBsaXN0ZW5lcnMgPSBfZGlzcGF0Y2hRdWV1ZSRpLmxpc3RlbmVycztcbiAgICBwcm9jZXNzRGlzcGF0Y2hRdWV1ZUl0ZW1zSW5PcmRlcihldmVudCwgbGlzdGVuZXJzLCBpbkNhcHR1cmVQaGFzZSk7IC8vICBldmVudCBzeXN0ZW0gZG9lc24ndCB1c2UgcG9vbGluZy5cbiAgfSAvLyBUaGlzIHdvdWxkIGJlIGEgZ29vZCB0aW1lIHRvIHJldGhyb3cgaWYgYW55IG9mIHRoZSBldmVudCBoYW5kbGVycyB0aHJldy5cblxuXG4gIHJldGhyb3dDYXVnaHRFcnJvcigpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50c0ZvclBsdWdpbnMoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciBuYXRpdmVFdmVudFRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KTtcbiAgdmFyIGRpc3BhdGNoUXVldWUgPSBbXTtcbiAgZXh0cmFjdEV2ZW50cyQ1KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzKTtcbiAgcHJvY2Vzc0Rpc3BhdGNoUXVldWUoZGlzcGF0Y2hRdWV1ZSwgZXZlbnRTeXN0ZW1GbGFncyk7XG59XG5cbmZ1bmN0aW9uIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRFbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoIW5vbkRlbGVnYXRlZEV2ZW50cy5oYXMoZG9tRXZlbnROYW1lKSkge1xuICAgICAgZXJyb3IoJ0RpZCBub3QgZXhwZWN0IGEgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgpIGNhbGwgZm9yIFwiJXNcIi4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBkb21FdmVudE5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyID0gZmFsc2U7XG4gIHZhciBsaXN0ZW5lclNldCA9IGdldEV2ZW50TGlzdGVuZXJTZXQodGFyZ2V0RWxlbWVudCk7XG4gIHZhciBsaXN0ZW5lclNldEtleSA9IGdldExpc3RlbmVyU2V0S2V5KGRvbUV2ZW50TmFtZSwgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcik7XG5cbiAgaWYgKCFsaXN0ZW5lclNldC5oYXMobGlzdGVuZXJTZXRLZXkpKSB7XG4gICAgYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0RWxlbWVudCwgZG9tRXZlbnROYW1lLCBJU19OT05fREVMRUdBVEVELCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKTtcbiAgICBsaXN0ZW5lclNldC5hZGQobGlzdGVuZXJTZXRLZXkpO1xuICB9XG59XG5mdW5jdGlvbiBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lciwgdGFyZ2V0KSB7XG4gIHtcbiAgICBpZiAobm9uRGVsZWdhdGVkRXZlbnRzLmhhcyhkb21FdmVudE5hbWUpICYmICFpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgICBlcnJvcignRGlkIG5vdCBleHBlY3QgYSBsaXN0ZW5Ub05hdGl2ZUV2ZW50KCkgY2FsbCBmb3IgXCIlc1wiIGluIHRoZSBidWJibGUgcGhhc2UuICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZG9tRXZlbnROYW1lKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZXZlbnRTeXN0ZW1GbGFncyA9IDA7XG5cbiAgaWYgKGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpIHtcbiAgICBldmVudFN5c3RlbUZsYWdzIHw9IElTX0NBUFRVUkVfUEhBU0U7XG4gIH1cblxuICBhZGRUcmFwcGVkRXZlbnRMaXN0ZW5lcih0YXJnZXQsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcik7XG59IC8vIFRoaXMgaXMgb25seSB1c2VkIGJ5IGNyZWF0ZUV2ZW50SGFuZGxlIHdoZW4gdGhlXG52YXIgbGlzdGVuaW5nTWFya2VyID0gJ19yZWFjdExpc3RlbmluZycgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtcbmZ1bmN0aW9uIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIGlmICghcm9vdENvbnRhaW5lckVsZW1lbnRbbGlzdGVuaW5nTWFya2VyXSkge1xuICAgIHJvb3RDb250YWluZXJFbGVtZW50W2xpc3RlbmluZ01hcmtlcl0gPSB0cnVlO1xuICAgIGFsbE5hdGl2ZUV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChkb21FdmVudE5hbWUpIHtcbiAgICAgIC8vIFdlIGhhbmRsZSBzZWxlY3Rpb25jaGFuZ2Ugc2VwYXJhdGVseSBiZWNhdXNlIGl0XG4gICAgICAvLyBkb2Vzbid0IGJ1YmJsZSBhbmQgbmVlZHMgdG8gYmUgb24gdGhlIGRvY3VtZW50LlxuICAgICAgaWYgKGRvbUV2ZW50TmFtZSAhPT0gJ3NlbGVjdGlvbmNoYW5nZScpIHtcbiAgICAgICAgaWYgKCFub25EZWxlZ2F0ZWRFdmVudHMuaGFzKGRvbUV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgZmFsc2UsIHJvb3RDb250YWluZXJFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpc3RlblRvTmF0aXZlRXZlbnQoZG9tRXZlbnROYW1lLCB0cnVlLCByb290Q29udGFpbmVyRWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdmFyIG93bmVyRG9jdW1lbnQgPSByb290Q29udGFpbmVyRWxlbWVudC5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/IHJvb3RDb250YWluZXJFbGVtZW50IDogcm9vdENvbnRhaW5lckVsZW1lbnQub3duZXJEb2N1bWVudDtcblxuICAgIGlmIChvd25lckRvY3VtZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGUgc2VsZWN0aW9uY2hhbmdlIGV2ZW50IGFsc28gbmVlZHMgZGVkdXBsaWNhdGlvblxuICAgICAgLy8gYnV0IGl0IGlzIGF0dGFjaGVkIHRvIHRoZSBkb2N1bWVudC5cbiAgICAgIGlmICghb3duZXJEb2N1bWVudFtsaXN0ZW5pbmdNYXJrZXJdKSB7XG4gICAgICAgIG93bmVyRG9jdW1lbnRbbGlzdGVuaW5nTWFya2VyXSA9IHRydWU7XG4gICAgICAgIGxpc3RlblRvTmF0aXZlRXZlbnQoJ3NlbGVjdGlvbmNoYW5nZScsIGZhbHNlLCBvd25lckRvY3VtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIsIGlzRGVmZXJyZWRMaXN0ZW5lckZvckxlZ2FjeUZCU3VwcG9ydCkge1xuICB2YXIgbGlzdGVuZXIgPSBjcmVhdGVFdmVudExpc3RlbmVyV3JhcHBlcldpdGhQcmlvcml0eSh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncyk7IC8vIElmIHBhc3NpdmUgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIHRoZW4gdGhlIGV2ZW50IHdpbGwgYmVcbiAgLy8gYWN0aXZlIGFuZCBub3QgcGFzc2l2ZS5cblxuICB2YXIgaXNQYXNzaXZlTGlzdGVuZXIgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkKSB7XG4gICAgLy8gQnJvd3NlcnMgaW50cm9kdWNlZCBhbiBpbnRlcnZlbnRpb24sIG1ha2luZyB0aGVzZSBldmVudHNcbiAgICAvLyBwYXNzaXZlIGJ5IGRlZmF1bHQgb24gZG9jdW1lbnQuIFJlYWN0IGRvZXNuJ3QgYmluZCB0aGVtXG4gICAgLy8gdG8gZG9jdW1lbnQgYW55bW9yZSwgYnV0IGNoYW5naW5nIHRoaXMgbm93IHdvdWxkIHVuZG9cbiAgICAvLyB0aGUgcGVyZm9ybWFuY2Ugd2lucyBmcm9tIHRoZSBjaGFuZ2UuIFNvIHdlIGVtdWxhdGVcbiAgICAvLyB0aGUgZXhpc3RpbmcgYmVoYXZpb3IgbWFudWFsbHkgb24gdGhlIHJvb3RzIG5vdy5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5NjUxXG4gICAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3RvdWNoc3RhcnQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3RvdWNobW92ZScgfHwgZG9tRXZlbnROYW1lID09PSAnd2hlZWwnKSB7XG4gICAgICBpc1Bhc3NpdmVMaXN0ZW5lciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdGFyZ2V0Q29udGFpbmVyID0gIHRhcmdldENvbnRhaW5lcjtcbiAgdmFyIHVuc3Vic2NyaWJlTGlzdGVuZXI7IC8vIFdoZW4gbGVnYWN5RkJTdXBwb3J0IGlzIGVuYWJsZWQsIGl0J3MgZm9yIHdoZW4gd2VcblxuXG4gIGlmIChpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgaWYgKGlzUGFzc2l2ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIsIGlzUGFzc2l2ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChpc1Bhc3NpdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIsIGlzUGFzc2l2ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50QnViYmxlTGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNNYXRjaGluZ1Jvb3RDb250YWluZXIoZ3JhbmRDb250YWluZXIsIHRhcmdldENvbnRhaW5lcikge1xuICByZXR1cm4gZ3JhbmRDb250YWluZXIgPT09IHRhcmdldENvbnRhaW5lciB8fCBncmFuZENvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFICYmIGdyYW5kQ29udGFpbmVyLnBhcmVudE5vZGUgPT09IHRhcmdldENvbnRhaW5lcjtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHRhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgYW5jZXN0b3JJbnN0ID0gdGFyZ2V0SW5zdDtcblxuICBpZiAoKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSkgPT09IDAgJiYgKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19OT05fREVMRUdBVEVEKSA9PT0gMCkge1xuICAgIHZhciB0YXJnZXRDb250YWluZXJOb2RlID0gdGFyZ2V0Q29udGFpbmVyOyAvLyBJZiB3ZSBhcmUgdXNpbmcgdGhlIGxlZ2FjeSBGQiBzdXBwb3J0IGZsYWcsIHdlXG5cbiAgICBpZiAodGFyZ2V0SW5zdCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhlIGJlbG93IGxvZ2ljIGF0dGVtcHRzIHRvIHdvcmsgb3V0IGlmIHdlIG5lZWQgdG8gY2hhbmdlXG4gICAgICAvLyB0aGUgdGFyZ2V0IGZpYmVyIHRvIGEgZGlmZmVyZW50IGFuY2VzdG9yLiBXZSBoYWQgc2ltaWxhciBsb2dpY1xuICAgICAgLy8gaW4gdGhlIGxlZ2FjeSBldmVudCBzeXN0ZW0sIGV4Y2VwdCB0aGUgYmlnIGRpZmZlcmVuY2UgYmV0d2VlblxuICAgICAgLy8gc3lzdGVtcyBpcyB0aGF0IHRoZSBtb2Rlcm4gZXZlbnQgc3lzdGVtIG5vdyBoYXMgYW4gZXZlbnQgbGlzdGVuZXJcbiAgICAgIC8vIGF0dGFjaGVkIHRvIGVhY2ggUmVhY3QgUm9vdCBhbmQgUmVhY3QgUG9ydGFsIFJvb3QuIFRvZ2V0aGVyLFxuICAgICAgLy8gdGhlIERPTSBub2RlcyByZXByZXNlbnRpbmcgdGhlc2Ugcm9vdHMgYXJlIHRoZSBcInJvb3RDb250YWluZXJcIi5cbiAgICAgIC8vIFRvIGZpZ3VyZSBvdXQgd2hpY2ggYW5jZXN0b3IgaW5zdGFuY2Ugd2Ugc2hvdWxkIHVzZSwgd2UgdHJhdmVyc2VcbiAgICAgIC8vIHVwIHRoZSBmaWJlciB0cmVlIGZyb20gdGhlIHRhcmdldCBpbnN0YW5jZSBhbmQgYXR0ZW1wdCB0byBmaW5kXG4gICAgICAvLyByb290IGJvdW5kYXJpZXMgdGhhdCBtYXRjaCB0aGF0IG9mIG91ciBjdXJyZW50IFwicm9vdENvbnRhaW5lclwiLlxuICAgICAgLy8gSWYgd2UgZmluZCB0aGF0IFwicm9vdENvbnRhaW5lclwiLCB3ZSBmaW5kIHRoZSBwYXJlbnQgZmliZXJcbiAgICAgIC8vIHN1Yi10cmVlIGZvciB0aGF0IHJvb3QgYW5kIG1ha2UgdGhhdCBvdXIgYW5jZXN0b3IgaW5zdGFuY2UuXG4gICAgICB2YXIgbm9kZSA9IHRhcmdldEluc3Q7XG5cbiAgICAgIG1haW5Mb29wOiB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBub2RlVGFnID0gbm9kZS50YWc7XG5cbiAgICAgICAgaWYgKG5vZGVUYWcgPT09IEhvc3RSb290IHx8IG5vZGVUYWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgICB2YXIgY29udGFpbmVyID0gbm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICAgIGlmIChpc01hdGNoaW5nUm9vdENvbnRhaW5lcihjb250YWluZXIsIHRhcmdldENvbnRhaW5lck5vZGUpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobm9kZVRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAgICAgLy8gVGhlIHRhcmdldCBpcyBhIHBvcnRhbCwgYnV0IGl0J3Mgbm90IHRoZSByb290Q29udGFpbmVyIHdlJ3JlIGxvb2tpbmcgZm9yLlxuICAgICAgICAgICAgLy8gTm9ybWFsbHkgcG9ydGFscyBoYW5kbGUgdGhlaXIgb3duIGV2ZW50cyBhbGwgdGhlIHdheSBkb3duIHRvIHRoZSByb290LlxuICAgICAgICAgICAgLy8gU28gd2Ugc2hvdWxkIGJlIGFibGUgdG8gc3RvcCBub3cuIEhvd2V2ZXIsIHdlIGRvbid0IGtub3cgaWYgdGhpcyBwb3J0YWxcbiAgICAgICAgICAgIC8vIHdhcyBwYXJ0IG9mICpvdXIqIHJvb3QuXG4gICAgICAgICAgICB2YXIgZ3JhbmROb2RlID0gbm9kZS5yZXR1cm47XG5cbiAgICAgICAgICAgIHdoaWxlIChncmFuZE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIGdyYW5kVGFnID0gZ3JhbmROb2RlLnRhZztcblxuICAgICAgICAgICAgICBpZiAoZ3JhbmRUYWcgPT09IEhvc3RSb290IHx8IGdyYW5kVGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgICAgICAgICAgdmFyIGdyYW5kQ29udGFpbmVyID0gZ3JhbmROb2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzTWF0Y2hpbmdSb290Q29udGFpbmVyKGdyYW5kQ29udGFpbmVyLCB0YXJnZXRDb250YWluZXJOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgcm9vdENvbnRhaW5lciB3ZSdyZSBsb29raW5nIGZvciBhbmQgd2UgZm91bmQgaXQgYXNcbiAgICAgICAgICAgICAgICAgIC8vIGEgcGFyZW50IG9mIHRoZSBQb3J0YWwuIFRoYXQgbWVhbnMgd2UgY2FuIGlnbm9yZSBpdCBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gUG9ydGFsIHdpbGwgYnViYmxlIHRocm91Z2ggdG8gdXMuXG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZ3JhbmROb2RlID0gZ3JhbmROb2RlLnJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIE5vdyB3ZSBuZWVkIHRvIGZpbmQgaXQncyBjb3JyZXNwb25kaW5nIGhvc3QgZmliZXIgaW4gdGhlIG90aGVyXG4gICAgICAgICAgLy8gdHJlZS4gVG8gZG8gdGhpcyB3ZSBjYW4gdXNlIGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLCBidXQgd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGZpYmVyIGlzIGEgaG9zdCBpbnN0YW5jZSwgb3RoZXJ3aXNlXG4gICAgICAgICAgLy8gd2UgbmVlZCB0byB0cmF2ZXJzZSB1cCB0aHJvdWdoIHRoZSBET00gdGlsbCB3ZSBmaW5kIHRoZSBjb3JyZWN0XG4gICAgICAgICAgLy8gbm9kZSB0aGF0IGlzIGZyb20gdGhlIG90aGVyIHRyZWUuXG5cblxuICAgICAgICAgIHdoaWxlIChjb250YWluZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnROb2RlID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoY29udGFpbmVyKTtcblxuICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcGFyZW50VGFnID0gcGFyZW50Tm9kZS50YWc7XG5cbiAgICAgICAgICAgIGlmIChwYXJlbnRUYWcgPT09IEhvc3RDb21wb25lbnQgfHwgcGFyZW50VGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICAgICAgICBub2RlID0gYW5jZXN0b3JJbnN0ID0gcGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgY29udGludWUgbWFpbkxvb3A7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBiYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoRXZlbnRzRm9yUGx1Z2lucyhkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCBhbmNlc3Rvckluc3QpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgbGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIHtcbiAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgbGlzdGVuZXI6IGxpc3RlbmVyLFxuICAgIGN1cnJlbnRUYXJnZXQ6IGN1cnJlbnRUYXJnZXRcbiAgfTtcbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZVNpbmdsZVBoYXNlTGlzdGVuZXJzKHRhcmdldEZpYmVyLCByZWFjdE5hbWUsIG5hdGl2ZUV2ZW50VHlwZSwgaW5DYXB0dXJlUGhhc2UsIGFjY3VtdWxhdGVUYXJnZXRPbmx5LCBuYXRpdmVFdmVudCkge1xuICB2YXIgY2FwdHVyZU5hbWUgPSByZWFjdE5hbWUgIT09IG51bGwgPyByZWFjdE5hbWUgKyAnQ2FwdHVyZScgOiBudWxsO1xuICB2YXIgcmVhY3RFdmVudE5hbWUgPSBpbkNhcHR1cmVQaGFzZSA/IGNhcHR1cmVOYW1lIDogcmVhY3ROYW1lO1xuICB2YXIgbGlzdGVuZXJzID0gW107XG4gIHZhciBpbnN0YW5jZSA9IHRhcmdldEZpYmVyO1xuICB2YXIgbGFzdEhvc3RDb21wb25lbnQgPSBudWxsOyAvLyBBY2N1bXVsYXRlIGFsbCBpbnN0YW5jZXMgYW5kIGxpc3RlbmVycyB2aWEgdGhlIHRhcmdldCAtPiByb290IHBhdGguXG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgdmFyIF9pbnN0YW5jZTIgPSBpbnN0YW5jZSxcbiAgICAgICAgc3RhdGVOb2RlID0gX2luc3RhbmNlMi5zdGF0ZU5vZGUsXG4gICAgICAgIHRhZyA9IF9pbnN0YW5jZTIudGFnOyAvLyBIYW5kbGUgbGlzdGVuZXJzIHRoYXQgYXJlIG9uIEhvc3RDb21wb25lbnRzIChpLmUuIDxkaXY+KVxuXG4gICAgaWYgKHRhZyA9PT0gSG9zdENvbXBvbmVudCAmJiBzdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIGxhc3RIb3N0Q29tcG9uZW50ID0gc3RhdGVOb2RlOyAvLyBjcmVhdGVFdmVudEhhbmRsZSBsaXN0ZW5lcnNcblxuXG4gICAgICBpZiAocmVhY3RFdmVudE5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlYWN0RXZlbnROYW1lKTtcblxuICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICAgIGxpc3RlbmVycy5wdXNoKGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGxpc3RlbmVyLCBsYXN0SG9zdENvbXBvbmVudCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBJZiB3ZSBhcmUgb25seSBhY2N1bXVsYXRpbmcgZXZlbnRzIGZvciB0aGUgdGFyZ2V0LCB0aGVuIHdlIGRvbid0XG4gICAgLy8gY29udGludWUgdG8gcHJvcGFnYXRlIHRocm91Z2ggdGhlIFJlYWN0IGZpYmVyIHRyZWUgdG8gZmluZCBvdGhlclxuICAgIC8vIGxpc3RlbmVycy5cblxuXG4gICAgaWYgKGFjY3VtdWxhdGVUYXJnZXRPbmx5KSB7XG4gICAgICBicmVhaztcbiAgICB9IC8vIElmIHdlIGFyZSBwcm9jZXNzaW5nIHRoZSBvbkJlZm9yZUJsdXIgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byB0YWtlXG5cbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlLnJldHVybjtcbiAgfVxuXG4gIHJldHVybiBsaXN0ZW5lcnM7XG59IC8vIFdlIHNob3VsZCBvbmx5IHVzZSB0aGlzIGZ1bmN0aW9uIGZvcjpcbi8vIC0gQmVmb3JlSW5wdXRFdmVudFBsdWdpblxuLy8gLSBDaGFuZ2VFdmVudFBsdWdpblxuLy8gLSBTZWxlY3RFdmVudFBsdWdpblxuLy8gVGhpcyBpcyBiZWNhdXNlIHdlIG9ubHkgcHJvY2VzcyB0aGVzZSBwbHVnaW5zXG4vLyBpbiB0aGUgYnViYmxlIHBoYXNlLCBzbyB3ZSBuZWVkIHRvIGFjY3VtdWxhdGUgdHdvXG4vLyBwaGFzZSBldmVudCBsaXN0ZW5lcnMgKHZpYSBlbXVsYXRpb24pLlxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0RmliZXIsIHJlYWN0TmFtZSkge1xuICB2YXIgY2FwdHVyZU5hbWUgPSByZWFjdE5hbWUgKyAnQ2FwdHVyZSc7XG4gIHZhciBsaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIGluc3RhbmNlID0gdGFyZ2V0RmliZXI7IC8vIEFjY3VtdWxhdGUgYWxsIGluc3RhbmNlcyBhbmQgbGlzdGVuZXJzIHZpYSB0aGUgdGFyZ2V0IC0+IHJvb3QgcGF0aC5cblxuICB3aGlsZSAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICB2YXIgX2luc3RhbmNlMyA9IGluc3RhbmNlLFxuICAgICAgICBzdGF0ZU5vZGUgPSBfaW5zdGFuY2UzLnN0YXRlTm9kZSxcbiAgICAgICAgdGFnID0gX2luc3RhbmNlMy50YWc7IC8vIEhhbmRsZSBsaXN0ZW5lcnMgdGhhdCBhcmUgb24gSG9zdENvbXBvbmVudHMgKGkuZS4gPGRpdj4pXG5cbiAgICBpZiAodGFnID09PSBIb3N0Q29tcG9uZW50ICYmIHN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBzdGF0ZU5vZGU7XG4gICAgICB2YXIgY2FwdHVyZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIGNhcHR1cmVOYW1lKTtcblxuICAgICAgaWYgKGNhcHR1cmVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGNhcHR1cmVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgfVxuXG4gICAgICB2YXIgYnViYmxlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVhY3ROYW1lKTtcblxuICAgICAgaWYgKGJ1YmJsZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgbGlzdGVuZXJzLnB1c2goY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgYnViYmxlTGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlLnJldHVybjtcbiAgfVxuXG4gIHJldHVybiBsaXN0ZW5lcnM7XG59XG5cbmZ1bmN0aW9uIGdldFBhcmVudChpbnN0KSB7XG4gIGlmIChpbnN0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBkbyB7XG4gICAgaW5zdCA9IGluc3QucmV0dXJuOyAvLyBUT0RPOiBJZiB0aGlzIGlzIGEgSG9zdFJvb3Qgd2UgbWlnaHQgd2FudCB0byBiYWlsIG91dC5cbiAgICAvLyBUaGF0IGlzIGRlcGVuZGluZyBvbiBpZiB3ZSB3YW50IG5lc3RlZCBzdWJ0cmVlcyAobGF5ZXJzKSB0byBidWJibGVcbiAgICAvLyBldmVudHMgdG8gdGhlaXIgcGFyZW50LiBXZSBjb3VsZCBhbHNvIGdvIHRocm91Z2ggcGFyZW50Tm9kZSBvbiB0aGVcbiAgICAvLyBob3N0IG5vZGUgYnV0IHRoYXQgd291bGRuJ3Qgd29yayBmb3IgUmVhY3QgTmF0aXZlIGFuZCBkb2Vzbid0IGxldCB1c1xuICAgIC8vIGRvIHRoZSBwb3J0YWwgZmVhdHVyZS5cbiAgfSB3aGlsZSAoaW5zdCAmJiBpbnN0LnRhZyAhPT0gSG9zdENvbXBvbmVudCk7XG5cbiAgaWYgKGluc3QpIHtcbiAgICByZXR1cm4gaW5zdDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBSZXR1cm4gdGhlIGxvd2VzdCBjb21tb24gYW5jZXN0b3Igb2YgQSBhbmQgQiwgb3IgbnVsbCBpZiB0aGV5IGFyZSBpblxuICogZGlmZmVyZW50IHRyZWVzLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoaW5zdEEsIGluc3RCKSB7XG4gIHZhciBub2RlQSA9IGluc3RBO1xuICB2YXIgbm9kZUIgPSBpbnN0QjtcbiAgdmFyIGRlcHRoQSA9IDA7XG5cbiAgZm9yICh2YXIgdGVtcEEgPSBub2RlQTsgdGVtcEE7IHRlbXBBID0gZ2V0UGFyZW50KHRlbXBBKSkge1xuICAgIGRlcHRoQSsrO1xuICB9XG5cbiAgdmFyIGRlcHRoQiA9IDA7XG5cbiAgZm9yICh2YXIgdGVtcEIgPSBub2RlQjsgdGVtcEI7IHRlbXBCID0gZ2V0UGFyZW50KHRlbXBCKSkge1xuICAgIGRlcHRoQisrO1xuICB9IC8vIElmIEEgaXMgZGVlcGVyLCBjcmF3bCB1cC5cblxuXG4gIHdoaWxlIChkZXB0aEEgLSBkZXB0aEIgPiAwKSB7XG4gICAgbm9kZUEgPSBnZXRQYXJlbnQobm9kZUEpO1xuICAgIGRlcHRoQS0tO1xuICB9IC8vIElmIEIgaXMgZGVlcGVyLCBjcmF3bCB1cC5cblxuXG4gIHdoaWxlIChkZXB0aEIgLSBkZXB0aEEgPiAwKSB7XG4gICAgbm9kZUIgPSBnZXRQYXJlbnQobm9kZUIpO1xuICAgIGRlcHRoQi0tO1xuICB9IC8vIFdhbGsgaW4gbG9ja3N0ZXAgdW50aWwgd2UgZmluZCBhIG1hdGNoLlxuXG5cbiAgdmFyIGRlcHRoID0gZGVwdGhBO1xuXG4gIHdoaWxlIChkZXB0aC0tKSB7XG4gICAgaWYgKG5vZGVBID09PSBub2RlQiB8fCBub2RlQiAhPT0gbnVsbCAmJiBub2RlQSA9PT0gbm9kZUIuYWx0ZXJuYXRlKSB7XG4gICAgICByZXR1cm4gbm9kZUE7XG4gICAgfVxuXG4gICAgbm9kZUEgPSBnZXRQYXJlbnQobm9kZUEpO1xuICAgIG5vZGVCID0gZ2V0UGFyZW50KG5vZGVCKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGV2ZW50LCB0YXJnZXQsIGNvbW1vbiwgaW5DYXB0dXJlUGhhc2UpIHtcbiAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUgPSBldmVudC5fcmVhY3ROYW1lO1xuICB2YXIgbGlzdGVuZXJzID0gW107XG4gIHZhciBpbnN0YW5jZSA9IHRhcmdldDtcblxuICB3aGlsZSAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICBpZiAoaW5zdGFuY2UgPT09IGNvbW1vbikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIF9pbnN0YW5jZTQgPSBpbnN0YW5jZSxcbiAgICAgICAgYWx0ZXJuYXRlID0gX2luc3RhbmNlNC5hbHRlcm5hdGUsXG4gICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTQuc3RhdGVOb2RlLFxuICAgICAgICB0YWcgPSBfaW5zdGFuY2U0LnRhZztcblxuICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwgJiYgYWx0ZXJuYXRlID09PSBjb21tb24pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09IEhvc3RDb21wb25lbnQgJiYgc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudFRhcmdldCA9IHN0YXRlTm9kZTtcblxuICAgICAgaWYgKGluQ2FwdHVyZVBoYXNlKSB7XG4gICAgICAgIHZhciBjYXB0dXJlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgaWYgKGNhcHR1cmVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgICAgbGlzdGVuZXJzLnVuc2hpZnQoY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgY2FwdHVyZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWluQ2FwdHVyZVBoYXNlKSB7XG4gICAgICAgIHZhciBidWJibGVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWdpc3RyYXRpb25OYW1lKTtcblxuICAgICAgICBpZiAoYnViYmxlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICAgIGxpc3RlbmVycy5wdXNoKGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGJ1YmJsZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlLnJldHVybjtcbiAgfVxuXG4gIGlmIChsaXN0ZW5lcnMubGVuZ3RoICE9PSAwKSB7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG4gIH1cbn0gLy8gV2Ugc2hvdWxkIG9ubHkgdXNlIHRoaXMgZnVuY3Rpb24gZm9yOlxuLy8gLSBFbnRlckxlYXZlRXZlbnRQbHVnaW5cbi8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBvbmx5IHByb2Nlc3MgdGhpcyBwbHVnaW5cbi8vIGluIHRoZSBidWJibGUgcGhhc2UsIHNvIHdlIG5lZWQgdG8gYWNjdW11bGF0ZSB0d29cbi8vIHBoYXNlIGV2ZW50IGxpc3RlbmVycy5cblxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlRW50ZXJMZWF2ZVR3b1BoYXNlTGlzdGVuZXJzKGRpc3BhdGNoUXVldWUsIGxlYXZlRXZlbnQsIGVudGVyRXZlbnQsIGZyb20sIHRvKSB7XG4gIHZhciBjb21tb24gPSBmcm9tICYmIHRvID8gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoZnJvbSwgdG8pIDogbnVsbDtcblxuICBpZiAoZnJvbSAhPT0gbnVsbCkge1xuICAgIGFjY3VtdWxhdGVFbnRlckxlYXZlTGlzdGVuZXJzRm9yRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbGVhdmVFdmVudCwgZnJvbSwgY29tbW9uLCBmYWxzZSk7XG4gIH1cblxuICBpZiAodG8gIT09IG51bGwgJiYgZW50ZXJFdmVudCAhPT0gbnVsbCkge1xuICAgIGFjY3VtdWxhdGVFbnRlckxlYXZlTGlzdGVuZXJzRm9yRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZW50ZXJFdmVudCwgdG8sIGNvbW1vbiwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldExpc3RlbmVyU2V0S2V5KGRvbUV2ZW50TmFtZSwgY2FwdHVyZSkge1xuICByZXR1cm4gZG9tRXZlbnROYW1lICsgXCJfX1wiICsgKGNhcHR1cmUgPyAnY2FwdHVyZScgOiAnYnViYmxlJyk7XG59XG5cbnZhciBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IGZhbHNlO1xudmFyIERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MID0gJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJztcbnZhciBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgPSAnc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nJztcbnZhciBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyA9ICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnO1xudmFyIEFVVE9GT0NVUyA9ICdhdXRvRm9jdXMnO1xudmFyIENISUxEUkVOID0gJ2NoaWxkcmVuJztcbnZhciBTVFlMRSA9ICdzdHlsZSc7XG52YXIgSFRNTCQxID0gJ19faHRtbCc7XG52YXIgd2FybmVkVW5rbm93blRhZ3M7XG52YXIgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudDtcbnZhciB3YXJuRm9yUHJvcERpZmZlcmVuY2U7XG52YXIgd2FybkZvckV4dHJhQXR0cmlidXRlcztcbnZhciB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXI7XG52YXIgY2FuRGlmZlN0eWxlRm9ySHlkcmF0aW9uV2FybmluZztcbnZhciBub3JtYWxpemVIVE1MO1xuXG57XG4gIHdhcm5lZFVua25vd25UYWdzID0ge1xuICAgIC8vIFRoZXJlIGFyZSB3b3JraW5nIHBvbHlmaWxscyBmb3IgPGRpYWxvZz4uIExldCBwZW9wbGUgdXNlIGl0LlxuICAgIGRpYWxvZzogdHJ1ZSxcbiAgICAvLyBFbGVjdHJvbiBzaGlwcyBhIGN1c3RvbSA8d2Vidmlldz4gdGFnIHRvIGRpc3BsYXkgZXh0ZXJuYWwgd2ViIGNvbnRlbnQgaW5cbiAgICAvLyBhbiBpc29sYXRlZCBmcmFtZSBhbmQgcHJvY2Vzcy5cbiAgICAvLyBUaGlzIHRhZyBpcyBub3QgcHJlc2VudCBpbiBub24gRWxlY3Ryb24gZW52aXJvbm1lbnRzIHN1Y2ggYXMgSlNEb20gd2hpY2hcbiAgICAvLyBpcyBvZnRlbiB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICAgIC8vIEBzZWUgaHR0cHM6Ly9lbGVjdHJvbmpzLm9yZy9kb2NzL2FwaS93ZWJ2aWV3LXRhZ1xuICAgIHdlYnZpZXc6IHRydWVcbiAgfTtcblxuICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50ID0gZnVuY3Rpb24gKHR5cGUsIHByb3BzKSB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGUsIHByb3BzKTtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXMkMSh0eXBlLCBwcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzJDIodHlwZSwgcHJvcHMsIHtcbiAgICAgIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXM6IHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMsXG4gICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzOiBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzXG4gICAgfSk7XG4gIH07IC8vIElFIDExIHBhcnNlcyAmIG5vcm1hbGl6ZXMgdGhlIHN0eWxlIGF0dHJpYnV0ZSBhcyBvcHBvc2VkIHRvIG90aGVyXG4gIC8vIGJyb3dzZXJzLiBJdCBhZGRzIHNwYWNlcyBhbmQgc29ydHMgdGhlIHByb3BlcnRpZXMgaW4gc29tZVxuICAvLyBub24tYWxwaGFiZXRpY2FsIG9yZGVyLiBIYW5kbGluZyB0aGF0IHdvdWxkIHJlcXVpcmUgc29ydGluZyBDU1NcbiAgLy8gcHJvcGVydGllcyBpbiB0aGUgY2xpZW50ICYgc2VydmVyIHZlcnNpb25zIG9yIGFwcGx5aW5nXG4gIC8vIGBleHBlY3RlZFN0eWxlYCB0byBhIHRlbXBvcmFyeSBET00gbm9kZSB0byByZWFkIGl0cyBgc3R5bGVgIGF0dHJpYnV0ZVxuICAvLyBub3JtYWxpemVkLiBTaW5jZSBpdCBvbmx5IGFmZmVjdHMgSUUsIHdlJ3JlIHNraXBwaW5nIHN0eWxlIHdhcm5pbmdzXG4gIC8vIGluIHRoYXQgYnJvd3NlciBjb21wbGV0ZWx5IGluIGZhdm9yIG9mIGRvaW5nIGFsbCB0aGF0IHdvcmsuXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExODA3XG5cblxuICBjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nID0gY2FuVXNlRE9NICYmICFkb2N1bWVudC5kb2N1bWVudE1vZGU7XG5cbiAgd2FybkZvclByb3BEaWZmZXJlbmNlID0gZnVuY3Rpb24gKHByb3BOYW1lLCBzZXJ2ZXJWYWx1ZSwgY2xpZW50VmFsdWUpIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbm9ybWFsaXplZENsaWVudFZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKGNsaWVudFZhbHVlKTtcbiAgICB2YXIgbm9ybWFsaXplZFNlcnZlclZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKHNlcnZlclZhbHVlKTtcblxuICAgIGlmIChub3JtYWxpemVkU2VydmVyVmFsdWUgPT09IG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdQcm9wIGAlc2AgZGlkIG5vdCBtYXRjaC4gU2VydmVyOiAlcyBDbGllbnQ6ICVzJywgcHJvcE5hbWUsIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWRTZXJ2ZXJWYWx1ZSksIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSkpO1xuICB9O1xuXG4gIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoYXR0cmlidXRlTmFtZXMpIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG4gICAgdmFyIG5hbWVzID0gW107XG4gICAgYXR0cmlidXRlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgbmFtZXMucHVzaChuYW1lKTtcbiAgICB9KTtcblxuICAgIGVycm9yKCdFeHRyYSBhdHRyaWJ1dGVzIGZyb20gdGhlIHNlcnZlcjogJXMnLCBuYW1lcyk7XG4gIH07XG5cbiAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHJlZ2lzdHJhdGlvbk5hbWUsIGxpc3RlbmVyKSB7XG4gICAgaWYgKGxpc3RlbmVyID09PSBmYWxzZSkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGAlc2AgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYGZhbHNlYC5cXG5cXG4nICsgJ0lmIHlvdSB1c2VkIHRvIGNvbmRpdGlvbmFsbHkgb21pdCBpdCB3aXRoICVzPXtjb25kaXRpb24gJiYgdmFsdWV9LCAnICsgJ3Bhc3MgJXM9e2NvbmRpdGlvbiA/IHZhbHVlIDogdW5kZWZpbmVkfSBpbnN0ZWFkLicsIHJlZ2lzdHJhdGlvbk5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgYCVzYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBhIHZhbHVlIG9mIGAlc2AgdHlwZS4nLCByZWdpc3RyYXRpb25OYW1lLCB0eXBlb2YgbGlzdGVuZXIpO1xuICAgIH1cbiAgfTsgLy8gUGFyc2UgdGhlIEhUTUwgYW5kIHJlYWQgaXQgYmFjayB0byBub3JtYWxpemUgdGhlIEhUTUwgc3RyaW5nIHNvIHRoYXQgaXRcbiAgLy8gY2FuIGJlIHVzZWQgZm9yIGNvbXBhcmlzb24uXG5cblxuICBub3JtYWxpemVIVE1MID0gZnVuY3Rpb24gKHBhcmVudCwgaHRtbCkge1xuICAgIC8vIFdlIGNvdWxkIGhhdmUgY3JlYXRlZCBhIHNlcGFyYXRlIGRvY3VtZW50IGhlcmUgdG8gYXZvaWRcbiAgICAvLyByZS1pbml0aWFsaXppbmcgY3VzdG9tIGVsZW1lbnRzIGlmIHRoZXkgZXhpc3QuIEJ1dCB0aGlzIGJyZWFrc1xuICAgIC8vIGhvdyA8bm9zY3JpcHQ+IGlzIGJlaW5nIGhhbmRsZWQuIFNvIHdlIHVzZSB0aGUgc2FtZSBkb2N1bWVudC5cbiAgICAvLyBTZWUgdGhlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTExNTcuXG4gICAgdmFyIHRlc3RFbGVtZW50ID0gcGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UgPyBwYXJlbnQub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHBhcmVudC50YWdOYW1lKSA6IHBhcmVudC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhwYXJlbnQubmFtZXNwYWNlVVJJLCBwYXJlbnQudGFnTmFtZSk7XG4gICAgdGVzdEVsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICByZXR1cm4gdGVzdEVsZW1lbnQuaW5uZXJIVE1MO1xuICB9O1xufSAvLyBIVE1MIHBhcnNpbmcgbm9ybWFsaXplcyBDUiBhbmQgQ1JMRiB0byBMRi5cbi8vIEl0IGFsc28gY2FuIHR1cm4gXFx1MDAwMCBpbnRvIFxcdUZGRkQgaW5zaWRlIGF0dHJpYnV0ZXMuXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvc2luZ2xlLXBhZ2UuaHRtbCNwcmVwcm9jZXNzaW5nLXRoZS1pbnB1dC1zdHJlYW1cbi8vIElmIHdlIGhhdmUgYSBtaXNtYXRjaCwgaXQgbWlnaHQgYmUgY2F1c2VkIGJ5IHRoYXQuXG4vLyBXZSB3aWxsIHN0aWxsIHBhdGNoIHVwIGluIHRoaXMgY2FzZSBidXQgbm90IGZpcmUgdGhlIHdhcm5pbmcuXG5cblxudmFyIE5PUk1BTElaRV9ORVdMSU5FU19SRUdFWCA9IC9cXHJcXG4/L2c7XG52YXIgTk9STUFMSVpFX05VTExfQU5EX1JFUExBQ0VNRU5UX1JFR0VYID0gL1xcdTAwMDB8XFx1RkZGRC9nO1xuXG5mdW5jdGlvbiBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUobWFya3VwKSB7XG4gIHtcbiAgICBjaGVja0h0bWxTdHJpbmdDb2VyY2lvbihtYXJrdXApO1xuICB9XG5cbiAgdmFyIG1hcmt1cFN0cmluZyA9IHR5cGVvZiBtYXJrdXAgPT09ICdzdHJpbmcnID8gbWFya3VwIDogJycgKyBtYXJrdXA7XG4gIHJldHVybiBtYXJrdXBTdHJpbmcucmVwbGFjZShOT1JNQUxJWkVfTkVXTElORVNfUkVHRVgsICdcXG4nKS5yZXBsYWNlKE5PUk1BTElaRV9OVUxMX0FORF9SRVBMQUNFTUVOVF9SRUdFWCwgJycpO1xufVxuXG5mdW5jdGlvbiBjaGVja0ZvclVubWF0Y2hlZFRleHQoc2VydmVyVGV4dCwgY2xpZW50VGV4dCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldikge1xuICB2YXIgbm9ybWFsaXplZENsaWVudFRleHQgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoY2xpZW50VGV4dCk7XG4gIHZhciBub3JtYWxpemVkU2VydmVyVGV4dCA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShzZXJ2ZXJUZXh0KTtcblxuICBpZiAobm9ybWFsaXplZFNlcnZlclRleHQgPT09IG5vcm1hbGl6ZWRDbGllbnRUZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNob3VsZFdhcm5EZXYpIHtcbiAgICB7XG4gICAgICBpZiAoIWRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignVGV4dCBjb250ZW50IGRpZCBub3QgbWF0Y2guIFNlcnZlcjogXCIlc1wiIENsaWVudDogXCIlc1wiJywgbm9ybWFsaXplZFNlcnZlclRleHQsIG5vcm1hbGl6ZWRDbGllbnRUZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoaXNDb25jdXJyZW50TW9kZSAmJiBlbmFibGVDbGllbnRSZW5kZXJGYWxsYmFja09uVGV4dE1pc21hdGNoKSB7XG4gICAgLy8gSW4gY29uY3VycmVudCByb290cywgd2UgdGhyb3cgd2hlbiB0aGVyZSdzIGEgdGV4dCBtaXNtYXRjaCBhbmQgcmV2ZXJ0IHRvXG4gICAgLy8gY2xpZW50IHJlbmRlcmluZywgdXAgdG8gdGhlIG5lYXJlc3QgU3VzcGVuc2UgYm91bmRhcnkuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUZXh0IGNvbnRlbnQgZG9lcyBub3QgbWF0Y2ggc2VydmVyLXJlbmRlcmVkIEhUTUwuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0T3duZXJEb2N1bWVudEZyb21Sb290Q29udGFpbmVyKHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHJldHVybiByb290Q29udGFpbmVyRWxlbWVudC5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/IHJvb3RDb250YWluZXJFbGVtZW50IDogcm9vdENvbnRhaW5lckVsZW1lbnQub3duZXJEb2N1bWVudDtcbn1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbmZ1bmN0aW9uIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KG5vZGUpIHtcbiAgLy8gTW9iaWxlIFNhZmFyaSBkb2VzIG5vdCBmaXJlIHByb3Blcmx5IGJ1YmJsZSBjbGljayBldmVudHMgb25cbiAgLy8gbm9uLWludGVyYWN0aXZlIGVsZW1lbnRzLCB3aGljaCBtZWFucyBkZWxlZ2F0ZWQgY2xpY2sgbGlzdGVuZXJzIGRvIG5vdFxuICAvLyBmaXJlLiBUaGUgd29ya2Fyb3VuZCBmb3IgdGhpcyBidWcgaW52b2x2ZXMgYXR0YWNoaW5nIGFuIGVtcHR5IGNsaWNrXG4gIC8vIGxpc3RlbmVyIG9uIHRoZSB0YXJnZXQgbm9kZS5cbiAgLy8gaHR0cHM6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDEwLzA5L2NsaWNrX2V2ZW50X2RlbC5odG1sXG4gIC8vIEp1c3Qgc2V0IGl0IHVzaW5nIHRoZSBvbmNsaWNrIHByb3BlcnR5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBtYW5hZ2UgYW55XG4gIC8vIGJvb2trZWVwaW5nIGZvciBpdC4gTm90IHN1cmUgaWYgd2UgbmVlZCB0byBjbGVhciBpdCB3aGVuIHRoZSBsaXN0ZW5lciBpc1xuICAvLyByZW1vdmVkLlxuICAvLyBUT0RPOiBPbmx5IGRvIHRoaXMgZm9yIHRoZSByZWxldmFudCBTYWZhcmlzIG1heWJlP1xuICBub2RlLm9uY2xpY2sgPSBub29wO1xufVxuXG5mdW5jdGlvbiBzZXRJbml0aWFsRE9NUHJvcGVydGllcyh0YWcsIGRvbUVsZW1lbnQsIHJvb3RDb250YWluZXJFbGVtZW50LCBuZXh0UHJvcHMsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGZvciAodmFyIHByb3BLZXkgaW4gbmV4dFByb3BzKSB7XG4gICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBuZXh0UHJvcCA9IG5leHRQcm9wc1twcm9wS2V5XTtcblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAge1xuICAgICAgICBpZiAobmV4dFByb3ApIHtcbiAgICAgICAgICAvLyBGcmVlemUgdGhlIG5leHQgc3R5bGUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGFzc3VtZSBpdCB3b24ndCBiZVxuICAgICAgICAgIC8vIG11dGF0ZWQuIFdlIGhhdmUgYWxyZWFkeSB3YXJuZWQgZm9yIHRoaXMgaW4gdGhlIHBhc3QuXG4gICAgICAgICAgT2JqZWN0LmZyZWV6ZShuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gUmVsaWVzIG9uIGB1cGRhdGVTdHlsZXNCeUlEYCBub3QgbXV0YXRpbmcgYHN0eWxlVXBkYXRlc2AuXG5cblxuICAgICAgc2V0VmFsdWVGb3JTdHlsZXMoZG9tRWxlbWVudCwgbmV4dFByb3ApO1xuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKG5leHRIdG1sICE9IG51bGwpIHtcbiAgICAgICAgc2V0SW5uZXJIVE1MKGRvbUVsZW1lbnQsIG5leHRIdG1sKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBBdm9pZCBzZXR0aW5nIGluaXRpYWwgdGV4dENvbnRlbnQgd2hlbiB0aGUgdGV4dCBpcyBlbXB0eS4gSW4gSUUxMSBzZXR0aW5nXG4gICAgICAgIC8vIHRleHRDb250ZW50IG9uIGEgPHRleHRhcmVhPiB3aWxsIGNhdXNlIHRoZSBwbGFjZWhvbGRlciB0byBub3RcbiAgICAgICAgLy8gc2hvdyB3aXRoaW4gdGhlIDx0ZXh0YXJlYT4gdW50aWwgaXQgaGFzIGJlZW4gZm9jdXNlZCBhbmQgYmx1cnJlZCBhZ2Fpbi5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy82NzMxI2lzc3VlY29tbWVudC0yNTQ4NzQ1NTNcbiAgICAgICAgdmFyIGNhblNldFRleHRDb250ZW50ID0gdGFnICE9PSAndGV4dGFyZWEnIHx8IG5leHRQcm9wICE9PSAnJztcblxuICAgICAgICBpZiAoY2FuU2V0VGV4dENvbnRlbnQpIHtcbiAgICAgICAgICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnbnVtYmVyJykge1xuICAgICAgICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCAnJyArIG5leHRQcm9wKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORykgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBBVVRPRk9DVVMpIDsgZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgICAgaWYgKCB0eXBlb2YgbmV4dFByb3AgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIocHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BLZXkgPT09ICdvblNjcm9sbCcpIHtcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdzY3JvbGwnLCBkb21FbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgc2V0VmFsdWVGb3JQcm9wZXJ0eShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCwgaXNDdXN0b21Db21wb25lbnRUYWcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVET01Qcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHdhc0N1c3RvbUNvbXBvbmVudFRhZywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgLy8gVE9ETzogSGFuZGxlIHdhc0N1c3RvbUNvbXBvbmVudFRhZ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHVwZGF0ZVBheWxvYWQubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgcHJvcEtleSA9IHVwZGF0ZVBheWxvYWRbaV07XG4gICAgdmFyIHByb3BWYWx1ZSA9IHVwZGF0ZVBheWxvYWRbaSArIDFdO1xuXG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICBzZXRWYWx1ZUZvclN0eWxlcyhkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgIHNldElubmVySFRNTChkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIHByb3BWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgcHJvcFZhbHVlLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJFbGVtZW50LCBwYXJlbnROYW1lc3BhY2UpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnOyAvLyBXZSBjcmVhdGUgdGFncyBpbiB0aGUgbmFtZXNwYWNlIG9mIHRoZWlyIHBhcmVudCBjb250YWluZXIsIGV4Y2VwdCBIVE1MXG4gIC8vIHRhZ3MgZ2V0IG5vIG5hbWVzcGFjZS5cblxuICB2YXIgb3duZXJEb2N1bWVudCA9IGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCk7XG4gIHZhciBkb21FbGVtZW50O1xuICB2YXIgbmFtZXNwYWNlVVJJID0gcGFyZW50TmFtZXNwYWNlO1xuXG4gIGlmIChuYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgbmFtZXNwYWNlVVJJID0gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpO1xuICB9XG5cbiAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICB7XG4gICAgICBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHR5cGUsIHByb3BzKTsgLy8gU2hvdWxkIHRoaXMgY2hlY2sgYmUgZ2F0ZWQgYnkgcGFyZW50IG5hbWVzcGFjZT8gTm90IHN1cmUgd2Ugd2FudCB0b1xuICAgICAgLy8gYWxsb3cgPFNWRz4gb3IgPG1BVEg+LlxuXG4gICAgICBpZiAoIWlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIHR5cGUgIT09IHR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBlcnJvcignPCVzIC8+IGlzIHVzaW5nIGluY29ycmVjdCBjYXNpbmcuICcgKyAnVXNlIFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMsICcgKyAnb3IgbG93ZXJjYXNlIGZvciBIVE1MIGVsZW1lbnRzLicsIHR5cGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAnc2NyaXB0Jykge1xuICAgICAgLy8gQ3JlYXRlIHRoZSBzY3JpcHQgdmlhIC5pbm5lckhUTUwgc28gaXRzIFwicGFyc2VyLWluc2VydGVkXCIgZmxhZyBpc1xuICAgICAgLy8gc2V0IHRvIHRydWUgYW5kIGl0IGRvZXMgbm90IGV4ZWN1dGVcbiAgICAgIHZhciBkaXYgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICBkaXYuaW5uZXJIVE1MID0gJzxzY3JpcHQ+PCcgKyAnL3NjcmlwdD4nOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAvLyBUaGlzIGlzIGd1YXJhbnRlZWQgdG8geWllbGQgYSBzY3JpcHQgZWxlbWVudC5cblxuICAgICAgdmFyIGZpcnN0Q2hpbGQgPSBkaXYuZmlyc3RDaGlsZDtcbiAgICAgIGRvbUVsZW1lbnQgPSBkaXYucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcHJvcHMuaXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyAkRmxvd0lzc3VlIGBjcmVhdGVFbGVtZW50YCBzaG91bGQgYmUgdXBkYXRlZCBmb3IgV2ViIENvbXBvbmVudHNcbiAgICAgIGRvbUVsZW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSwge1xuICAgICAgICBpczogcHJvcHMuaXNcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTZXBhcmF0ZSBlbHNlIGJyYW5jaCBpbnN0ZWFkIG9mIHVzaW5nIGBwcm9wcy5pcyB8fCB1bmRlZmluZWRgIGFib3ZlIGJlY2F1c2Ugb2YgYSBGaXJlZm94IGJ1Zy5cbiAgICAgIC8vIFNlZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzY4OTZcbiAgICAgIC8vIGFuZCBkaXNjdXNzaW9uIGluIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEyNzYyNDBcbiAgICAgIGRvbUVsZW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSk7IC8vIE5vcm1hbGx5IGF0dHJpYnV0ZXMgYXJlIGFzc2lnbmVkIGluIGBzZXRJbml0aWFsRE9NUHJvcGVydGllc2AsIGhvd2V2ZXIgdGhlIGBtdWx0aXBsZWAgYW5kIGBzaXplYFxuICAgICAgLy8gYXR0cmlidXRlcyBvbiBgc2VsZWN0YHMgbmVlZHMgdG8gYmUgYWRkZWQgYmVmb3JlIGBvcHRpb25gcyBhcmUgaW5zZXJ0ZWQuXG4gICAgICAvLyBUaGlzIHByZXZlbnRzOlxuICAgICAgLy8gLSBhIGJ1ZyB3aGVyZSB0aGUgYHNlbGVjdGAgZG9lcyBub3Qgc2Nyb2xsIHRvIHRoZSBjb3JyZWN0IG9wdGlvbiBiZWNhdXNlIHNpbmd1bGFyXG4gICAgICAvLyAgYHNlbGVjdGAgZWxlbWVudHMgYXV0b21hdGljYWxseSBwaWNrIHRoZSBmaXJzdCBpdGVtICMxMzIyMlxuICAgICAgLy8gLSBhIGJ1ZyB3aGVyZSB0aGUgYHNlbGVjdGAgc2V0IHRoZSBmaXJzdCBpdGVtIGFzIHNlbGVjdGVkIGRlc3BpdGUgdGhlIGBzaXplYCBhdHRyaWJ1dGUgIzE0MjM5XG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzIyMlxuICAgICAgLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTQyMzlcblxuICAgICAgaWYgKHR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgIHZhciBub2RlID0gZG9tRWxlbWVudDtcblxuICAgICAgICBpZiAocHJvcHMubXVsdGlwbGUpIHtcbiAgICAgICAgICBub2RlLm11bHRpcGxlID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9wcy5zaXplKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBhIHNpemUgZ3JlYXRlciB0aGFuIDEgY2F1c2VzIGEgc2VsZWN0IHRvIGJlaGF2ZSBsaWtlIGBtdWx0aXBsZT10cnVlYCwgd2hlcmVcbiAgICAgICAgICAvLyBpdCBpcyBwb3NzaWJsZSB0aGF0IG5vIG9wdGlvbiBpcyBzZWxlY3RlZC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoaXMgaXMgb25seSBuZWNlc3Nhcnkgd2hlbiBhIHNlbGVjdCBpbiBcInNpbmdsZSBzZWxlY3Rpb24gbW9kZVwiLlxuICAgICAgICAgIG5vZGUuc2l6ZSA9IHByb3BzLnNpemU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwgdHlwZSk7XG4gIH1cblxuICB7XG4gICAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgIGlmICghaXNDdXN0b21Db21wb25lbnRUYWcgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRvbUVsZW1lbnQpID09PSAnW29iamVjdCBIVE1MVW5rbm93bkVsZW1lbnRdJyAmJiAhaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRVbmtub3duVGFncywgdHlwZSkpIHtcbiAgICAgICAgd2FybmVkVW5rbm93blRhZ3NbdHlwZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdUaGUgdGFnIDwlcz4gaXMgdW5yZWNvZ25pemVkIGluIHRoaXMgYnJvd3Nlci4gJyArICdJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgUmVhY3QgY29tcG9uZW50LCBzdGFydCBpdHMgbmFtZSB3aXRoICcgKyAnYW4gdXBwZXJjYXNlIGxldHRlci4nLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZG9tRWxlbWVudDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlKHRleHQsIHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHJldHVybiBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckVsZW1lbnQpLmNyZWF0ZVRleHROb2RlKHRleHQpO1xufVxuZnVuY3Rpb24gc2V0SW5pdGlhbFByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCByYXdQcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCByYXdQcm9wcyk7XG5cbiAge1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCByYXdQcm9wcyk7XG4gIH0gLy8gVE9ETzogTWFrZSBzdXJlIHRoYXQgd2UgY2hlY2sgaXNNb3VudGVkIGJlZm9yZSBmaXJpbmcgYW55IG9mIHRoZXNlIGV2ZW50cy5cblxuXG4gIHZhciBwcm9wcztcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjYW5jZWwnLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Nsb3NlJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnZW1iZWQnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGxvYWQgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd2aWRlbyc6XG4gICAgY2FzZSAnYXVkaW8nOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBhbGwgdGhlIG1lZGlhIGV2ZW50cy5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVkaWFFdmVudFR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQobWVkaWFFdmVudFR5cGVzW2ldLCBkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc291cmNlJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBlcnJvciBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgZXJyb3IgYW5kIGxvYWQgZXZlbnRzLlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RldGFpbHMnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIHRvZ2dsZSBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3RvZ2dsZScsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICB2YWxpZGF0ZVByb3BzKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMihkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgcHJvcHMpO1xuICBzZXRJbml0aWFsRE9NUHJvcGVydGllcyh0YWcsIGRvbUVsZW1lbnQsIHJvb3RDb250YWluZXJFbGVtZW50LCBwcm9wcywgaXNDdXN0b21Db21wb25lbnRUYWcpO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlcihkb21FbGVtZW50LCByYXdQcm9wcywgZmFsc2UpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDMoZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgcG9zdE1vdW50V3JhcHBlciQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cbn0gLy8gQ2FsY3VsYXRlIHRoZSBkaWZmIGJldHdlZW4gdGhlIHR3byBvYmplY3RzLlxuXG5mdW5jdGlvbiBkaWZmUHJvcGVydGllcyhkb21FbGVtZW50LCB0YWcsIGxhc3RSYXdQcm9wcywgbmV4dFJhd1Byb3BzLCByb290Q29udGFpbmVyRWxlbWVudCkge1xuICB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0YWcsIG5leHRSYXdQcm9wcyk7XG4gIH1cblxuICB2YXIgdXBkYXRlUGF5bG9hZCA9IG51bGw7XG4gIHZhciBsYXN0UHJvcHM7XG4gIHZhciBuZXh0UHJvcHM7XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICBsYXN0UHJvcHMgPSBnZXRIb3N0UHJvcHMoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTtcbiAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzJDEoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTtcbiAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyQxKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyQyKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMihkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgbGFzdFByb3BzID0gbGFzdFJhd1Byb3BzO1xuICAgICAgbmV4dFByb3BzID0gbmV4dFJhd1Byb3BzO1xuXG4gICAgICBpZiAodHlwZW9mIGxhc3RQcm9wcy5vbkNsaWNrICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBuZXh0UHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgbmV4dFByb3BzKTtcbiAgdmFyIHByb3BLZXk7XG4gIHZhciBzdHlsZU5hbWU7XG4gIHZhciBzdHlsZVVwZGF0ZXMgPSBudWxsO1xuXG4gIGZvciAocHJvcEtleSBpbiBsYXN0UHJvcHMpIHtcbiAgICBpZiAobmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8ICFsYXN0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbGFzdFByb3BzW3Byb3BLZXldID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgdmFyIGxhc3RTdHlsZSA9IGxhc3RQcm9wc1twcm9wS2V5XTtcblxuICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbGFzdFN0eWxlKSB7XG4gICAgICAgIGlmIChsYXN0U3R5bGUuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCB8fCBwcm9wS2V5ID09PSBDSElMRFJFTikgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gQVVUT0ZPQ1VTKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UuIElmIGFueSBsaXN0ZW5lciB1cGRhdGVzIHdlIG5lZWQgdG8gZW5zdXJlXG4gICAgICAvLyB0aGF0IHRoZSBcImN1cnJlbnRcIiBmaWJlciBwb2ludGVyIGdldHMgdXBkYXRlZCBzbyB3ZSBuZWVkIGEgY29tbWl0XG4gICAgICAvLyB0byB1cGRhdGUgdGhpcyBlbGVtZW50LlxuICAgICAgaWYgKCF1cGRhdGVQYXlsb2FkKSB7XG4gICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGFsbCBvdGhlciBkZWxldGVkIHByb3BlcnRpZXMgd2UgYWRkIGl0IHRvIHRoZSBxdWV1ZS4gV2UgdXNlXG4gICAgICAvLyB0aGUgYWxsb3dlZCBwcm9wZXJ0eSBsaXN0IGluIHRoZSBjb21taXQgcGhhc2UgaW5zdGVhZC5cbiAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCBudWxsKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHByb3BLZXkgaW4gbmV4dFByb3BzKSB7XG4gICAgdmFyIG5leHRQcm9wID0gbmV4dFByb3BzW3Byb3BLZXldO1xuICAgIHZhciBsYXN0UHJvcCA9IGxhc3RQcm9wcyAhPSBudWxsID8gbGFzdFByb3BzW3Byb3BLZXldIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbmV4dFByb3AgPT09IGxhc3RQcm9wIHx8IG5leHRQcm9wID09IG51bGwgJiYgbGFzdFByb3AgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICB7XG4gICAgICAgIGlmIChuZXh0UHJvcCkge1xuICAgICAgICAgIC8vIEZyZWV6ZSB0aGUgbmV4dCBzdHlsZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gYXNzdW1lIGl0IHdvbid0IGJlXG4gICAgICAgICAgLy8gbXV0YXRlZC4gV2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBmb3IgdGhpcyBpbiB0aGUgcGFzdC5cbiAgICAgICAgICBPYmplY3QuZnJlZXplKG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobGFzdFByb3ApIHtcbiAgICAgICAgLy8gVW5zZXQgc3R5bGVzIG9uIGBsYXN0UHJvcGAgYnV0IG5vdCBvbiBgbmV4dFByb3BgLlxuICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0UHJvcCkge1xuICAgICAgICAgIGlmIChsYXN0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmICghbmV4dFByb3AgfHwgIW5leHRQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpKSB7XG4gICAgICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVXBkYXRlIHN0eWxlcyB0aGF0IGNoYW5nZWQgc2luY2UgYGxhc3RQcm9wYC5cblxuXG4gICAgICAgIGZvciAoc3R5bGVOYW1lIGluIG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKG5leHRQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkgJiYgbGFzdFByb3Bbc3R5bGVOYW1lXSAhPT0gbmV4dFByb3Bbc3R5bGVOYW1lXSkge1xuICAgICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gbmV4dFByb3Bbc3R5bGVOYW1lXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlbGllcyBvbiBgdXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLlxuICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgIGlmICghdXBkYXRlUGF5bG9hZCkge1xuICAgICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQucHVzaChwcm9wS2V5LCBzdHlsZVVwZGF0ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGVVcGRhdGVzID0gbmV4dFByb3A7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgdmFyIG5leHRIdG1sID0gbmV4dFByb3AgPyBuZXh0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuICAgICAgdmFyIGxhc3RIdG1sID0gbGFzdFByb3AgPyBsYXN0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgICBpZiAobGFzdEh0bWwgIT09IG5leHRIdG1sKSB7XG4gICAgICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksIG5leHRIdG1sKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksICcnICsgbmV4dFByb3ApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIC8vIFdlIGVhZ2VybHkgbGlzdGVuIHRvIHRoaXMgZXZlbiB0aG91Z2ggd2UgaGF2ZW4ndCBjb21taXR0ZWQgeWV0LlxuICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykge1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdXBkYXRlUGF5bG9hZCAmJiBsYXN0UHJvcCAhPT0gbmV4dFByb3ApIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZS4gSWYgYW55IGxpc3RlbmVyIHVwZGF0ZXMgd2UgbmVlZCB0byBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCB0aGUgXCJjdXJyZW50XCIgcHJvcHMgcG9pbnRlciBnZXRzIHVwZGF0ZWQgc28gd2UgbmVlZCBhIGNvbW1pdFxuICAgICAgICAvLyB0byB1cGRhdGUgdGhpcyBlbGVtZW50LlxuICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBhbnkgb3RoZXIgcHJvcGVydHkgd2UgYWx3YXlzIGFkZCBpdCB0byB0aGUgcXVldWUgYW5kIHRoZW4gd2VcbiAgICAgIC8vIGZpbHRlciBpdCBvdXQgdXNpbmcgdGhlIGFsbG93ZWQgcHJvcGVydHkgbGlzdCBkdXJpbmcgdGhlIGNvbW1pdC5cbiAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0eWxlVXBkYXRlcykge1xuICAgIHtcbiAgICAgIHZhbGlkYXRlU2hvcnRoYW5kUHJvcGVydHlDb2xsaXNpb25JbkRldihzdHlsZVVwZGF0ZXMsIG5leHRQcm9wc1tTVFlMRV0pO1xuICAgIH1cblxuICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChTVFlMRSwgc3R5bGVVcGRhdGVzKTtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVQYXlsb2FkO1xufSAvLyBBcHBseSB0aGUgZGlmZi5cblxuZnVuY3Rpb24gdXBkYXRlUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB0YWcsIGxhc3RSYXdQcm9wcywgbmV4dFJhd1Byb3BzKSB7XG4gIC8vIFVwZGF0ZSBjaGVja2VkICpiZWZvcmUqIG5hbWUuXG4gIC8vIEluIHRoZSBtaWRkbGUgb2YgYW4gdXBkYXRlLCBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGNoZWNrZWQuXG4gIC8vIFdoZW4gYSBjaGVja2VkIHJhZGlvIHRyaWVzIHRvIGNoYW5nZSBuYW1lLCBicm93c2VyIG1ha2VzIGFub3RoZXIgcmFkaW8ncyBjaGVja2VkIGZhbHNlLlxuICBpZiAodGFnID09PSAnaW5wdXQnICYmIG5leHRSYXdQcm9wcy50eXBlID09PSAncmFkaW8nICYmIG5leHRSYXdQcm9wcy5uYW1lICE9IG51bGwpIHtcbiAgICB1cGRhdGVDaGVja2VkKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gIH1cblxuICB2YXIgd2FzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCBsYXN0UmF3UHJvcHMpO1xuICB2YXIgaXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIG5leHRSYXdQcm9wcyk7IC8vIEFwcGx5IHRoZSBkaWZmLlxuXG4gIHVwZGF0ZURPTVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgd2FzQ3VzdG9tQ29tcG9uZW50VGFnLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7IC8vIFRPRE86IEVuc3VyZSB0aGF0IGFuIHVwZGF0ZSBnZXRzIHNjaGVkdWxlZCBpZiBhbnkgb2YgdGhlIHNwZWNpYWwgcHJvcHNcbiAgLy8gY2hhbmdlZC5cblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFVwZGF0ZSB0aGUgd3JhcHBlciBhcm91bmQgaW5wdXRzICphZnRlciogdXBkYXRpbmcgcHJvcHMuIFRoaXMgaGFzIHRvXG4gICAgICAvLyBoYXBwZW4gYWZ0ZXIgYHVwZGF0ZURPTVByb3BlcnRpZXNgLiBPdGhlcndpc2UgSFRNTDUgaW5wdXQgdmFsaWRhdGlvbnNcbiAgICAgIC8vIHJhaXNlIHdhcm5pbmdzIGFuZCBwcmV2ZW50IHRoZSBuZXcgdmFsdWUgZnJvbSBiZWluZyBhc3NpZ25lZC5cbiAgICAgIHVwZGF0ZVdyYXBwZXIoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgdXBkYXRlV3JhcHBlciQxKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAvLyA8c2VsZWN0PiB2YWx1ZSB1cGRhdGUgbmVlZHMgdG8gb2NjdXIgYWZ0ZXIgPG9wdGlvbj4gY2hpbGRyZW5cbiAgICAgIC8vIHJlY29uY2lsaWF0aW9uXG4gICAgICBwb3N0VXBkYXRlV3JhcHBlcihkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UG9zc2libGVTdGFuZGFyZE5hbWUocHJvcE5hbWUpIHtcbiAge1xuICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IHByb3BOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAoIXBvc3NpYmxlU3RhbmRhcmROYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBwb3NzaWJsZVN0YW5kYXJkTmFtZXNbbG93ZXJDYXNlZE5hbWVdIHx8IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlmZkh5ZHJhdGVkUHJvcGVydGllcyhkb21FbGVtZW50LCB0YWcsIHJhd1Byb3BzLCBwYXJlbnROYW1lc3BhY2UsIHJvb3RDb250YWluZXJFbGVtZW50LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KSB7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZztcbiAgdmFyIGV4dHJhQXR0cmlidXRlTmFtZXM7XG5cbiAge1xuICAgIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCByYXdQcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0YWcsIHJhd1Byb3BzKTtcbiAgfSAvLyBUT0RPOiBNYWtlIHN1cmUgdGhhdCB3ZSBjaGVjayBpc01vdW50ZWQgYmVmb3JlIGZpcmluZyBhbnkgb2YgdGhlc2UgZXZlbnRzLlxuXG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2FuY2VsJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjbG9zZScsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnZW1iZWQnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGxvYWQgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICBjYXNlICdhdWRpbyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGFsbCB0aGUgbWVkaWEgZXZlbnRzLlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZWRpYUV2ZW50VHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChtZWRpYUV2ZW50VHlwZXNbaV0sIGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NvdXJjZSc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgZXJyb3IgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgZXJyb3IgYW5kIGxvYWQgZXZlbnRzLlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgdG9nZ2xlIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgndG9nZ2xlJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgdmFsaWRhdGVQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgcmF3UHJvcHMpO1xuXG4gIHtcbiAgICBleHRyYUF0dHJpYnV0ZU5hbWVzID0gbmV3IFNldCgpO1xuICAgIHZhciBhdHRyaWJ1dGVzID0gZG9tRWxlbWVudC5hdHRyaWJ1dGVzO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IGF0dHJpYnV0ZXNbX2ldLm5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgIC8vIENvbnRyb2xsZWQgYXR0cmlidXRlcyBhcmUgbm90IHZhbGlkYXRlZFxuICAgICAgICAvLyBUT0RPOiBPbmx5IGlnbm9yZSB0aGVtIG9uIGNvbnRyb2xsZWQgdGFncy5cbiAgICAgICAgY2FzZSAndmFsdWUnOlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2NoZWNrZWQnOlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkJzpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgdXNlIHRoZSBvcmlnaW5hbCBuYW1lLlxuICAgICAgICAgIC8vIFNlZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzEwNjc2LlxuICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuYWRkKGF0dHJpYnV0ZXNbX2ldLm5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciB1cGRhdGVQYXlsb2FkID0gbnVsbDtcblxuICBmb3IgKHZhciBwcm9wS2V5IGluIHJhd1Byb3BzKSB7XG4gICAgaWYgKCFyYXdQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIG5leHRQcm9wID0gcmF3UHJvcHNbcHJvcEtleV07XG5cbiAgICBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIC8vIEZvciB0ZXh0IGNvbnRlbnQgY2hpbGRyZW4gd2UgY29tcGFyZSBhZ2FpbnN0IHRleHRDb250ZW50LiBUaGlzXG4gICAgICAvLyBtaWdodCBtYXRjaCBhZGRpdGlvbmFsIEhUTUwgdGhhdCBpcyBoaWRkZW4gd2hlbiB3ZSByZWFkIGl0IHVzaW5nXG4gICAgICAvLyB0ZXh0Q29udGVudC4gRS5nLiBcImZvb1wiIHdpbGwgbWF0Y2ggXCJmPHNwYW4+b288L3NwYW4+XCIgYnV0IHRoYXQgc3RpbGxcbiAgICAgIC8vIHNhdGlzZmllcyBvdXIgcmVxdWlyZW1lbnQuIE91ciByZXF1aXJlbWVudCBpcyBub3QgdG8gcHJvZHVjZSBwZXJmZWN0XG4gICAgICAvLyBIVE1MIGFuZCBhdHRyaWJ1dGVzLiBJZGVhbGx5IHdlIHNob3VsZCBwcmVzZXJ2ZSBzdHJ1Y3R1cmUgYnV0IGl0J3NcbiAgICAgIC8vIG9rIG5vdCB0byBpZiB0aGUgdmlzaWJsZSBjb250ZW50IGlzIHN0aWxsIGVub3VnaCB0byBpbmRpY2F0ZSB3aGF0XG4gICAgICAvLyBldmVuIGxpc3RlbmVycyB0aGVzZSBub2RlcyBtaWdodCBiZSB3aXJlZCB1cCB0by5cbiAgICAgIC8vIFRPRE86IFdhcm4gaWYgdGhlcmUgaXMgbW9yZSB0aGFuIGEgc2luZ2xlIHRleHROb2RlIGFzIGEgY2hpbGQuXG4gICAgICAvLyBUT0RPOiBTaG91bGQgd2UgdXNlIGRvbUVsZW1lbnQuZmlyc3RDaGlsZC5ub2RlVmFsdWUgdG8gY29tcGFyZT9cbiAgICAgIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChkb21FbGVtZW50LnRleHRDb250ZW50ICE9PSBuZXh0UHJvcCkge1xuICAgICAgICAgIGlmIChyYXdQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklOR10gIT09IHRydWUpIHtcbiAgICAgICAgICAgIGNoZWNrRm9yVW5tYXRjaGVkVGV4dChkb21FbGVtZW50LnRleHRDb250ZW50LCBuZXh0UHJvcCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtDSElMRFJFTiwgbmV4dFByb3BdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQudGV4dENvbnRlbnQgIT09ICcnICsgbmV4dFByb3ApIHtcbiAgICAgICAgICBpZiAocmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBjaGVja0ZvclVubWF0Y2hlZFRleHQoZG9tRWxlbWVudC50ZXh0Q29udGVudCwgbmV4dFByb3AsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbQ0hJTERSRU4sICcnICsgbmV4dFByb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykge1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzaG91bGRXYXJuRGV2ICYmIHRydWUgJiYgLy8gQ29udmluY2UgRmxvdyB3ZSd2ZSBjYWxjdWxhdGVkIGl0IChpdCdzIERFVi1vbmx5IGluIHRoaXMgbWV0aG9kLilcbiAgICB0eXBlb2YgaXNDdXN0b21Db21wb25lbnRUYWcgPT09ICdib29sZWFuJykge1xuICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgcHJvcGVydGllcyBjb3JyZXNwb25kIHRvIHRoZWlyIGV4cGVjdGVkIHZhbHVlcy5cbiAgICAgIHZhciBzZXJ2ZXJWYWx1ZSA9IHZvaWQgMDtcbiAgICAgIHZhciBwcm9wZXJ0eUluZm8gPSBpc0N1c3RvbUNvbXBvbmVudFRhZyAmJiBlbmFibGVDdXN0b21FbGVtZW50UHJvcGVydHlTdXBwb3J0ID8gbnVsbCA6IGdldFByb3BlcnR5SW5mbyhwcm9wS2V5KTtcblxuICAgICAgaWYgKHJhd1Byb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSA9PT0gdHJ1ZSkgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcgfHwgLy8gQ29udHJvbGxlZCBhdHRyaWJ1dGVzIGFyZSBub3QgdmFsaWRhdGVkXG4gICAgICAvLyBUT0RPOiBPbmx5IGlnbm9yZSB0aGVtIG9uIGNvbnRyb2xsZWQgdGFncy5cbiAgICAgIHByb3BLZXkgPT09ICd2YWx1ZScgfHwgcHJvcEtleSA9PT0gJ2NoZWNrZWQnIHx8IHByb3BLZXkgPT09ICdzZWxlY3RlZCcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgICAgdmFyIHNlcnZlckhUTUwgPSBkb21FbGVtZW50LmlubmVySFRNTDtcbiAgICAgICAgdmFyIG5leHRIdG1sID0gbmV4dFByb3AgPyBuZXh0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIGV4cGVjdGVkSFRNTCA9IG5vcm1hbGl6ZUhUTUwoZG9tRWxlbWVudCwgbmV4dEh0bWwpO1xuXG4gICAgICAgICAgaWYgKGV4cGVjdGVkSFRNTCAhPT0gc2VydmVySFRNTCkge1xuICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlckhUTUwsIGV4cGVjdGVkSFRNTCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleSk7XG5cbiAgICAgICAgaWYgKGNhbkRpZmZTdHlsZUZvckh5ZHJhdGlvbldhcm5pbmcpIHtcbiAgICAgICAgICB2YXIgZXhwZWN0ZWRTdHlsZSA9IGNyZWF0ZURhbmdlcm91c1N0cmluZ0ZvclN0eWxlcyhuZXh0UHJvcCk7XG4gICAgICAgICAgc2VydmVyVmFsdWUgPSBkb21FbGVtZW50LmdldEF0dHJpYnV0ZSgnc3R5bGUnKTtcblxuICAgICAgICAgIGlmIChleHBlY3RlZFN0eWxlICE9PSBzZXJ2ZXJWYWx1ZSkge1xuICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlclZhbHVlLCBleHBlY3RlZFN0eWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcgJiYgIWVuYWJsZUN1c3RvbUVsZW1lbnRQcm9wZXJ0eVN1cHBvcnQpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGdldFZhbHVlRm9yQXR0cmlidXRlKGRvbUVsZW1lbnQsIHByb3BLZXksIG5leHRQcm9wKTtcblxuICAgICAgICBpZiAobmV4dFByb3AgIT09IHNlcnZlclZhbHVlKSB7XG4gICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlclZhbHVlLCBuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXNob3VsZElnbm9yZUF0dHJpYnV0ZShwcm9wS2V5LCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSAmJiAhc2hvdWxkUmVtb3ZlQXR0cmlidXRlKHByb3BLZXksIG5leHRQcm9wLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgICAgICB2YXIgaXNNaXNtYXRjaER1ZVRvQmFkQ2FzaW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZSk7XG4gICAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvclByb3BlcnR5KGRvbUVsZW1lbnQsIHByb3BLZXksIG5leHRQcm9wLCBwcm9wZXJ0eUluZm8pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBvd25OYW1lc3BhY2UgPSBwYXJlbnROYW1lc3BhY2U7XG5cbiAgICAgICAgICBpZiAob3duTmFtZXNwYWNlID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICAgICAgb3duTmFtZXNwYWNlID0gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHRhZyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG93bk5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZShwcm9wS2V5KTtcblxuICAgICAgICAgICAgaWYgKHN0YW5kYXJkTmFtZSAhPT0gbnVsbCAmJiBzdGFuZGFyZE5hbWUgIT09IHByb3BLZXkpIHtcbiAgICAgICAgICAgICAgLy8gSWYgYW4gU1ZHIHByb3AgaXMgc3VwcGxpZWQgd2l0aCBiYWQgY2FzaW5nLCBpdCB3aWxsXG4gICAgICAgICAgICAgIC8vIGJlIHN1Y2Nlc3NmdWxseSBwYXJzZWQgZnJvbSBIVE1MLCBidXQgd2lsbCBwcm9kdWNlIGEgbWlzbWF0Y2hcbiAgICAgICAgICAgICAgLy8gKGFuZCB3b3VsZCBiZSBpbmNvcnJlY3RseSByZW5kZXJlZCBvbiB0aGUgY2xpZW50KS5cbiAgICAgICAgICAgICAgLy8gSG93ZXZlciwgd2UgYWxyZWFkeSB3YXJuIGFib3V0IGJhZCBjYXNpbmcgZWxzZXdoZXJlLlxuICAgICAgICAgICAgICAvLyBTbyB3ZSdsbCBza2lwIHRoZSBtaXNsZWFkaW5nIGV4dHJhIG1pc21hdGNoIHdhcm5pbmcgaW4gdGhpcyBjYXNlLlxuICAgICAgICAgICAgICBpc01pc21hdGNoRHVlVG9CYWRDYXNpbmcgPSB0cnVlOyAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG5cbiAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUoc3RhbmRhcmROYW1lKTtcbiAgICAgICAgICAgIH0gLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuXG5cbiAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlcnZlclZhbHVlID0gZ2V0VmFsdWVGb3JBdHRyaWJ1dGUoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRvbnRXYXJuQ3VzdG9tRWxlbWVudCA9IGVuYWJsZUN1c3RvbUVsZW1lbnRQcm9wZXJ0eVN1cHBvcnQgIDtcblxuICAgICAgICBpZiAoIWRvbnRXYXJuQ3VzdG9tRWxlbWVudCAmJiBuZXh0UHJvcCAhPT0gc2VydmVyVmFsdWUgJiYgIWlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZykge1xuICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChzaG91bGRXYXJuRGV2KSB7XG4gICAgICBpZiAoIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuc2l6ZSA+IDAgJiYgcmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddICE9PSB0cnVlKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgd2FybkZvckV4dHJhQXR0cmlidXRlcyhleHRyYUF0dHJpYnV0ZU5hbWVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIoZG9tRWxlbWVudCwgcmF3UHJvcHMsIHRydWUpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDMoZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIC8vIEZvciBpbnB1dCBhbmQgdGV4dGFyZWEgd2UgY3VycmVudCBhbHdheXMgc2V0IHRoZSB2YWx1ZSBwcm9wZXJ0eSBhdFxuICAgICAgLy8gcG9zdCBtb3VudCB0byBmb3JjZSBpdCB0byBkaXZlcmdlIGZyb20gYXR0cmlidXRlcy4gSG93ZXZlciwgZm9yXG4gICAgICAvLyBvcHRpb24gYW5kIHNlbGVjdCB3ZSBkb24ndCBxdWl0ZSBkbyB0aGUgc2FtZSB0aGluZyBhbmQgc2VsZWN0XG4gICAgICAvLyBpcyBub3QgcmVzaWxpZW50IHRvIHRoZSBET00gc3RhdGUgY2hhbmdpbmcgc28gd2UgZG9uJ3QgZG8gdGhhdCBoZXJlLlxuICAgICAgLy8gVE9ETzogQ29uc2lkZXIgbm90IGRvaW5nIHRoaXMgZm9yIGlucHV0IGFuZCB0ZXh0YXJlYS5cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0eXBlb2YgcmF3UHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlUGF5bG9hZDtcbn1cbmZ1bmN0aW9uIGRpZmZIeWRyYXRlZFRleHQodGV4dE5vZGUsIHRleHQsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAgdmFyIGlzRGlmZmVyZW50ID0gdGV4dE5vZGUubm9kZVZhbHVlICE9PSB0ZXh0O1xuICByZXR1cm4gaXNEaWZmZXJlbnQ7XG59XG5mdW5jdGlvbiB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudE5vZGUsIGNoaWxkKSB7XG4gIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRGlkIG5vdCBleHBlY3Qgc2VydmVyIEhUTUwgdG8gY29udGFpbiBhIDwlcz4gaW4gPCVzPi4nLCBjaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudE5vZGUsIGNoaWxkKSB7XG4gIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRGlkIG5vdCBleHBlY3Qgc2VydmVyIEhUTUwgdG8gY29udGFpbiB0aGUgdGV4dCBub2RlIFwiJXNcIiBpbiA8JXM+LicsIGNoaWxkLm5vZGVWYWx1ZSwgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50KHBhcmVudE5vZGUsIHRhZywgcHJvcHMpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdFeHBlY3RlZCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIGEgbWF0Y2hpbmcgPCVzPiBpbiA8JXM+LicsIHRhZywgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudE5vZGUsIHRleHQpIHtcbiAge1xuICAgIGlmICh0ZXh0ID09PSAnJykge1xuICAgICAgLy8gV2UgZXhwZWN0IHRvIGluc2VydCBlbXB0eSB0ZXh0IG5vZGVzIHNpbmNlIHRoZXkncmUgbm90IHJlcHJlc2VudGVkIGluXG4gICAgICAvLyB0aGUgSFRNTC5cbiAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIHNwZWNpYWwgY2FzZSBpZiB3ZSBjYW4ganVzdCBhdm9pZCBpbnNlcnRpbmcgZW1wdHlcbiAgICAgIC8vIHRleHQgbm9kZXMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0V4cGVjdGVkIHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gYSBtYXRjaGluZyB0ZXh0IG5vZGUgZm9yIFwiJXNcIiBpbiA8JXM+LicsIHRleHQsIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMyhkb21FbGVtZW50LCB0YWcsIHByb3BzKSB7XG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZShkb21FbGVtZW50LCBwcm9wcyk7XG4gICAgICByZXR1cm47XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDIoZG9tRWxlbWVudCwgcHJvcHMpO1xuICAgICAgcmV0dXJuO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMShkb21FbGVtZW50LCBwcm9wcyk7XG4gICAgICByZXR1cm47XG4gIH1cbn1cblxudmFyIHZhbGlkYXRlRE9NTmVzdGluZyA9IGZ1bmN0aW9uICgpIHt9O1xuXG52YXIgdXBkYXRlZEFuY2VzdG9ySW5mbyA9IGZ1bmN0aW9uICgpIHt9O1xuXG57XG4gIC8vIFRoaXMgdmFsaWRhdGlvbiBjb2RlIHdhcyB3cml0dGVuIGJhc2VkIG9uIHRoZSBIVE1MNSBwYXJzaW5nIHNwZWM6XG4gIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLXNjb3BlXG4gIC8vXG4gIC8vIE5vdGU6IHRoaXMgZG9lcyBub3QgY2F0Y2ggYWxsIGludmFsaWQgbmVzdGluZywgbm9yIGRvZXMgaXQgdHJ5IHRvIChhcyBpdCdzXG4gIC8vIG5vdCBjbGVhciB3aGF0IHByYWN0aWNhbCBiZW5lZml0IGRvaW5nIHNvIHByb3ZpZGVzKTsgaW5zdGVhZCwgd2Ugd2FybiBvbmx5XG4gIC8vIGZvciBjYXNlcyB3aGVyZSB0aGUgcGFyc2VyIHdpbGwgZ2l2ZSBhIHBhcnNlIHRyZWUgZGlmZmVyaW5nIGZyb20gd2hhdCBSZWFjdFxuICAvLyBpbnRlbmRlZC4gRm9yIGV4YW1wbGUsIDxiPjxkaXY+PC9kaXY+PC9iPiBpcyBpbnZhbGlkIGJ1dCB3ZSBkb24ndCB3YXJuXG4gIC8vIGJlY2F1c2UgaXQgc3RpbGwgcGFyc2VzIGNvcnJlY3RseTsgd2UgZG8gd2FybiBmb3Igb3RoZXIgY2FzZXMgbGlrZSBuZXN0ZWRcbiAgLy8gPHA+IHRhZ3Mgd2hlcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Vjb25kIGVsZW1lbnQgaW1wbGljaXRseSBjbG9zZXMgdGhlXG4gIC8vIGZpcnN0LCBjYXVzaW5nIGEgY29uZnVzaW5nIG1lc3MuXG4gIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3NwZWNpYWxcbiAgdmFyIHNwZWNpYWxUYWdzID0gWydhZGRyZXNzJywgJ2FwcGxldCcsICdhcmVhJywgJ2FydGljbGUnLCAnYXNpZGUnLCAnYmFzZScsICdiYXNlZm9udCcsICdiZ3NvdW5kJywgJ2Jsb2NrcXVvdGUnLCAnYm9keScsICdicicsICdidXR0b24nLCAnY2FwdGlvbicsICdjZW50ZXInLCAnY29sJywgJ2NvbGdyb3VwJywgJ2RkJywgJ2RldGFpbHMnLCAnZGlyJywgJ2RpdicsICdkbCcsICdkdCcsICdlbWJlZCcsICdmaWVsZHNldCcsICdmaWdjYXB0aW9uJywgJ2ZpZ3VyZScsICdmb290ZXInLCAnZm9ybScsICdmcmFtZScsICdmcmFtZXNldCcsICdoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNicsICdoZWFkJywgJ2hlYWRlcicsICdoZ3JvdXAnLCAnaHInLCAnaHRtbCcsICdpZnJhbWUnLCAnaW1nJywgJ2lucHV0JywgJ2lzaW5kZXgnLCAnbGknLCAnbGluaycsICdsaXN0aW5nJywgJ21haW4nLCAnbWFycXVlZScsICdtZW51JywgJ21lbnVpdGVtJywgJ21ldGEnLCAnbmF2JywgJ25vZW1iZWQnLCAnbm9mcmFtZXMnLCAnbm9zY3JpcHQnLCAnb2JqZWN0JywgJ29sJywgJ3AnLCAncGFyYW0nLCAncGxhaW50ZXh0JywgJ3ByZScsICdzY3JpcHQnLCAnc2VjdGlvbicsICdzZWxlY3QnLCAnc291cmNlJywgJ3N0eWxlJywgJ3N1bW1hcnknLCAndGFibGUnLCAndGJvZHknLCAndGQnLCAndGVtcGxhdGUnLCAndGV4dGFyZWEnLCAndGZvb3QnLCAndGgnLCAndGhlYWQnLCAndGl0bGUnLCAndHInLCAndHJhY2snLCAndWwnLCAnd2JyJywgJ3htcCddOyAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMtYW4tZWxlbWVudC1pbi1zY29wZVxuXG4gIHZhciBpblNjb3BlVGFncyA9IFsnYXBwbGV0JywgJ2NhcHRpb24nLCAnaHRtbCcsICd0YWJsZScsICd0ZCcsICd0aCcsICdtYXJxdWVlJywgJ29iamVjdCcsICd0ZW1wbGF0ZScsIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2h0bWwtaW50ZWdyYXRpb24tcG9pbnRcbiAgLy8gVE9ETzogRGlzdGluZ3Vpc2ggYnkgbmFtZXNwYWNlIGhlcmUgLS0gZm9yIDx0aXRsZT4sIGluY2x1ZGluZyBpdCBoZXJlXG4gIC8vIGVycnMgb24gdGhlIHNpZGUgb2YgZmV3ZXIgd2FybmluZ3NcbiAgJ2ZvcmVpZ25PYmplY3QnLCAnZGVzYycsICd0aXRsZSddOyAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMtYW4tZWxlbWVudC1pbi1idXR0b24tc2NvcGVcblxuICB2YXIgYnV0dG9uU2NvcGVUYWdzID0gaW5TY29wZVRhZ3MuY29uY2F0KFsnYnV0dG9uJ10pOyAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNnZW5lcmF0ZS1pbXBsaWVkLWVuZC10YWdzXG5cbiAgdmFyIGltcGxpZWRFbmRUYWdzID0gWydkZCcsICdkdCcsICdsaScsICdvcHRpb24nLCAnb3B0Z3JvdXAnLCAncCcsICdycCcsICdydCddO1xuICB2YXIgZW1wdHlBbmNlc3RvckluZm8gPSB7XG4gICAgY3VycmVudDogbnVsbCxcbiAgICBmb3JtVGFnOiBudWxsLFxuICAgIGFUYWdJblNjb3BlOiBudWxsLFxuICAgIGJ1dHRvblRhZ0luU2NvcGU6IG51bGwsXG4gICAgbm9iclRhZ0luU2NvcGU6IG51bGwsXG4gICAgcFRhZ0luQnV0dG9uU2NvcGU6IG51bGwsXG4gICAgbGlzdEl0ZW1UYWdBdXRvY2xvc2luZzogbnVsbCxcbiAgICBkbEl0ZW1UYWdBdXRvY2xvc2luZzogbnVsbFxuICB9O1xuXG4gIHVwZGF0ZWRBbmNlc3RvckluZm8gPSBmdW5jdGlvbiAob2xkSW5mbywgdGFnKSB7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IGFzc2lnbih7fSwgb2xkSW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbyk7XG5cbiAgICB2YXIgaW5mbyA9IHtcbiAgICAgIHRhZzogdGFnXG4gICAgfTtcblxuICAgIGlmIChpblNjb3BlVGFncy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoYnV0dG9uU2NvcGVUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZSA9IG51bGw7XG4gICAgfSAvLyBTZWUgcnVsZXMgZm9yICdsaScsICdkZCcsICdkdCcgc3RhcnQgdGFncyBpblxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHlcblxuXG4gICAgaWYgKHNwZWNpYWxUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEgJiYgdGFnICE9PSAnYWRkcmVzcycgJiYgdGFnICE9PSAnZGl2JyAmJiB0YWcgIT09ICdwJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gbnVsbDtcbiAgICB9XG5cbiAgICBhbmNlc3RvckluZm8uY3VycmVudCA9IGluZm87XG5cbiAgICBpZiAodGFnID09PSAnZm9ybScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5mb3JtVGFnID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnYScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2J1dHRvbicpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnbm9icicpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ3AnKSB7XG4gICAgICBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdsaScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnZGQnIHx8IHRhZyA9PT0gJ2R0Jykge1xuICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICB9XG5cbiAgICByZXR1cm4gYW5jZXN0b3JJbmZvO1xuICB9O1xuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyXG4gICAqL1xuXG5cbiAgdmFyIGlzVGFnVmFsaWRXaXRoUGFyZW50ID0gZnVuY3Rpb24gKHRhZywgcGFyZW50VGFnKSB7XG4gICAgLy8gRmlyc3QsIGxldCdzIGNoZWNrIGlmIHdlJ3JlIGluIGFuIHVudXN1YWwgcGFyc2luZyBtb2RlLi4uXG4gICAgc3dpdGNoIChwYXJlbnRUYWcpIHtcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnNlbGVjdFxuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ29wdGlvbicgfHwgdGFnID09PSAnb3B0Z3JvdXAnIHx8IHRhZyA9PT0gJyN0ZXh0JztcblxuICAgICAgY2FzZSAnb3B0Z3JvdXAnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnb3B0aW9uJyB8fCB0YWcgPT09ICcjdGV4dCc7XG4gICAgICAvLyBTdHJpY3RseSBzcGVha2luZywgc2VlaW5nIGFuIDxvcHRpb24+IGRvZXNuJ3QgbWVhbiB3ZSdyZSBpbiBhIDxzZWxlY3Q+XG4gICAgICAvLyBidXRcblxuICAgICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJyN0ZXh0JztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRkXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5jYXB0aW9uXG4gICAgICAvLyBObyBzcGVjaWFsIGJlaGF2aW9yIHNpbmNlIHRoZXNlIHJ1bGVzIGZhbGwgYmFjayB0byBcImluIGJvZHlcIiBtb2RlIGZvclxuICAgICAgLy8gYWxsIGV4Y2VwdCBzcGVjaWFsIHRhYmxlIG5vZGVzIHdoaWNoIGNhdXNlIGJhZCBwYXJzaW5nIGJlaGF2aW9yIGFueXdheS5cbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRyXG5cbiAgICAgIGNhc2UgJ3RyJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ3RoJyB8fCB0YWcgPT09ICd0ZCcgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGJvZHlcblxuICAgICAgY2FzZSAndGJvZHknOlxuICAgICAgY2FzZSAndGhlYWQnOlxuICAgICAgY2FzZSAndGZvb3QnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAndHInIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmNvbGdyb3VwXG5cbiAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2NvbCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGFibGVcblxuICAgICAgY2FzZSAndGFibGUnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnY2FwdGlvbicgfHwgdGFnID09PSAnY29sZ3JvdXAnIHx8IHRhZyA9PT0gJ3Rib2R5JyB8fCB0YWcgPT09ICd0Zm9vdCcgfHwgdGFnID09PSAndGhlYWQnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmhlYWRcblxuICAgICAgY2FzZSAnaGVhZCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdiYXNlJyB8fCB0YWcgPT09ICdiYXNlZm9udCcgfHwgdGFnID09PSAnYmdzb3VuZCcgfHwgdGFnID09PSAnbGluaycgfHwgdGFnID09PSAnbWV0YScgfHwgdGFnID09PSAndGl0bGUnIHx8IHRhZyA9PT0gJ25vc2NyaXB0JyB8fCB0YWcgPT09ICdub2ZyYW1lcycgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VtYW50aWNzLmh0bWwjdGhlLWh0bWwtZWxlbWVudFxuXG4gICAgICBjYXNlICdodG1sJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2hlYWQnIHx8IHRhZyA9PT0gJ2JvZHknIHx8IHRhZyA9PT0gJ2ZyYW1lc2V0JztcblxuICAgICAgY2FzZSAnZnJhbWVzZXQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnZnJhbWUnO1xuXG4gICAgICBjYXNlICcjZG9jdW1lbnQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnaHRtbCc7XG4gICAgfSAvLyBQcm9iYWJseSBpbiB0aGUgXCJpbiBib2R5XCIgcGFyc2luZyBtb2RlLCBzbyB3ZSBvdXRsYXcgb25seSB0YWcgY29tYm9zXG4gICAgLy8gd2hlcmUgdGhlIHBhcnNpbmcgcnVsZXMgY2F1c2UgaW1wbGljaXQgb3BlbnMgb3IgY2xvc2VzIHRvIGJlIGFkZGVkLlxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHlcblxuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ2gxJzpcbiAgICAgIGNhc2UgJ2gyJzpcbiAgICAgIGNhc2UgJ2gzJzpcbiAgICAgIGNhc2UgJ2g0JzpcbiAgICAgIGNhc2UgJ2g1JzpcbiAgICAgIGNhc2UgJ2g2JzpcbiAgICAgICAgcmV0dXJuIHBhcmVudFRhZyAhPT0gJ2gxJyAmJiBwYXJlbnRUYWcgIT09ICdoMicgJiYgcGFyZW50VGFnICE9PSAnaDMnICYmIHBhcmVudFRhZyAhPT0gJ2g0JyAmJiBwYXJlbnRUYWcgIT09ICdoNScgJiYgcGFyZW50VGFnICE9PSAnaDYnO1xuXG4gICAgICBjYXNlICdycCc6XG4gICAgICBjYXNlICdydCc6XG4gICAgICAgIHJldHVybiBpbXBsaWVkRW5kVGFncy5pbmRleE9mKHBhcmVudFRhZykgPT09IC0xO1xuXG4gICAgICBjYXNlICdib2R5JzpcbiAgICAgIGNhc2UgJ2NhcHRpb24nOlxuICAgICAgY2FzZSAnY29sJzpcbiAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcbiAgICAgIGNhc2UgJ2ZyYW1lc2V0JzpcbiAgICAgIGNhc2UgJ2ZyYW1lJzpcbiAgICAgIGNhc2UgJ2hlYWQnOlxuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICBjYXNlICd0Ym9keSc6XG4gICAgICBjYXNlICd0ZCc6XG4gICAgICBjYXNlICd0Zm9vdCc6XG4gICAgICBjYXNlICd0aCc6XG4gICAgICBjYXNlICd0aGVhZCc6XG4gICAgICBjYXNlICd0cic6XG4gICAgICAgIC8vIFRoZXNlIHRhZ3MgYXJlIG9ubHkgdmFsaWQgd2l0aCBhIGZldyBwYXJlbnRzIHRoYXQgaGF2ZSBzcGVjaWFsIGNoaWxkXG4gICAgICAgIC8vIHBhcnNpbmcgcnVsZXMgLS0gaWYgd2UncmUgZG93biBoZXJlLCB0aGVuIG5vbmUgb2YgdGhvc2UgbWF0Y2hlZCBhbmRcbiAgICAgICAgLy8gc28gd2UgYWxsb3cgaXQgb25seSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIHBhcmVudCBpcywgYXMgYWxsIG90aGVyXG4gICAgICAgIC8vIGNhc2VzIGFyZSBpbnZhbGlkLlxuICAgICAgICByZXR1cm4gcGFyZW50VGFnID09IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXJcbiAgICovXG5cblxuICB2YXIgZmluZEludmFsaWRBbmNlc3RvckZvclRhZyA9IGZ1bmN0aW9uICh0YWcsIGFuY2VzdG9ySW5mbykge1xuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdhZGRyZXNzJzpcbiAgICAgIGNhc2UgJ2FydGljbGUnOlxuICAgICAgY2FzZSAnYXNpZGUnOlxuICAgICAgY2FzZSAnYmxvY2txdW90ZSc6XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgY2FzZSAnZGlyJzpcbiAgICAgIGNhc2UgJ2Rpdic6XG4gICAgICBjYXNlICdkbCc6XG4gICAgICBjYXNlICdmaWVsZHNldCc6XG4gICAgICBjYXNlICdmaWdjYXB0aW9uJzpcbiAgICAgIGNhc2UgJ2ZpZ3VyZSc6XG4gICAgICBjYXNlICdmb290ZXInOlxuICAgICAgY2FzZSAnaGVhZGVyJzpcbiAgICAgIGNhc2UgJ2hncm91cCc6XG4gICAgICBjYXNlICdtYWluJzpcbiAgICAgIGNhc2UgJ21lbnUnOlxuICAgICAgY2FzZSAnbmF2JzpcbiAgICAgIGNhc2UgJ29sJzpcbiAgICAgIGNhc2UgJ3AnOlxuICAgICAgY2FzZSAnc2VjdGlvbic6XG4gICAgICBjYXNlICdzdW1tYXJ5JzpcbiAgICAgIGNhc2UgJ3VsJzpcbiAgICAgIGNhc2UgJ3ByZSc6XG4gICAgICBjYXNlICdsaXN0aW5nJzpcbiAgICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgIGNhc2UgJ2hyJzpcbiAgICAgIGNhc2UgJ3htcCc6XG4gICAgICBjYXNlICdoMSc6XG4gICAgICBjYXNlICdoMic6XG4gICAgICBjYXNlICdoMyc6XG4gICAgICBjYXNlICdoNCc6XG4gICAgICBjYXNlICdoNSc6XG4gICAgICBjYXNlICdoNic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2Zvcm0nOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmZvcm1UYWcgfHwgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlO1xuXG4gICAgICBjYXNlICdsaSc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZztcblxuICAgICAgY2FzZSAnZGQnOlxuICAgICAgY2FzZSAnZHQnOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nO1xuXG4gICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2EnOlxuICAgICAgICAvLyBTcGVjIHNheXMgc29tZXRoaW5nIGFib3V0IHN0b3JpbmcgYSBsaXN0IG9mIG1hcmtlcnMsIGJ1dCBpdCBzb3VuZHNcbiAgICAgICAgLy8gZXF1aXZhbGVudCB0byB0aGlzIGNoZWNrLlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlO1xuXG4gICAgICBjYXNlICdub2JyJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICB2YXIgZGlkV2FybiQxID0ge307XG5cbiAgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKGNoaWxkVGFnLCBjaGlsZFRleHQsIGFuY2VzdG9ySW5mbykge1xuICAgIGFuY2VzdG9ySW5mbyA9IGFuY2VzdG9ySW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbztcbiAgICB2YXIgcGFyZW50SW5mbyA9IGFuY2VzdG9ySW5mby5jdXJyZW50O1xuICAgIHZhciBwYXJlbnRUYWcgPSBwYXJlbnRJbmZvICYmIHBhcmVudEluZm8udGFnO1xuXG4gICAgaWYgKGNoaWxkVGV4dCAhPSBudWxsKSB7XG4gICAgICBpZiAoY2hpbGRUYWcgIT0gbnVsbCkge1xuICAgICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nOiB3aGVuIGNoaWxkVGV4dCBpcyBwYXNzZWQsIGNoaWxkVGFnIHNob3VsZCBiZSBudWxsJyk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkVGFnID0gJyN0ZXh0JztcbiAgICB9XG5cbiAgICB2YXIgaW52YWxpZFBhcmVudCA9IGlzVGFnVmFsaWRXaXRoUGFyZW50KGNoaWxkVGFnLCBwYXJlbnRUYWcpID8gbnVsbCA6IHBhcmVudEluZm87XG4gICAgdmFyIGludmFsaWRBbmNlc3RvciA9IGludmFsaWRQYXJlbnQgPyBudWxsIDogZmluZEludmFsaWRBbmNlc3RvckZvclRhZyhjaGlsZFRhZywgYW5jZXN0b3JJbmZvKTtcbiAgICB2YXIgaW52YWxpZFBhcmVudE9yQW5jZXN0b3IgPSBpbnZhbGlkUGFyZW50IHx8IGludmFsaWRBbmNlc3RvcjtcblxuICAgIGlmICghaW52YWxpZFBhcmVudE9yQW5jZXN0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYW5jZXN0b3JUYWcgPSBpbnZhbGlkUGFyZW50T3JBbmNlc3Rvci50YWc7XG4gICAgdmFyIHdhcm5LZXkgPSAhIWludmFsaWRQYXJlbnQgKyAnfCcgKyBjaGlsZFRhZyArICd8JyArIGFuY2VzdG9yVGFnO1xuXG4gICAgaWYgKGRpZFdhcm4kMVt3YXJuS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm4kMVt3YXJuS2V5XSA9IHRydWU7XG4gICAgdmFyIHRhZ0Rpc3BsYXlOYW1lID0gY2hpbGRUYWc7XG4gICAgdmFyIHdoaXRlc3BhY2VJbmZvID0gJyc7XG5cbiAgICBpZiAoY2hpbGRUYWcgPT09ICcjdGV4dCcpIHtcbiAgICAgIGlmICgvXFxTLy50ZXN0KGNoaWxkVGV4dCkpIHtcbiAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnVGV4dCBub2Rlcyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YWdEaXNwbGF5TmFtZSA9ICdXaGl0ZXNwYWNlIHRleHQgbm9kZXMnO1xuICAgICAgICB3aGl0ZXNwYWNlSW5mbyA9IFwiIE1ha2Ugc3VyZSB5b3UgZG9uJ3QgaGF2ZSBhbnkgZXh0cmEgd2hpdGVzcGFjZSBiZXR3ZWVuIHRhZ3Mgb24gXCIgKyAnZWFjaCBsaW5lIG9mIHlvdXIgc291cmNlIGNvZGUuJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGFnRGlzcGxheU5hbWUgPSAnPCcgKyBjaGlsZFRhZyArICc+JztcbiAgICB9XG5cbiAgICBpZiAoaW52YWxpZFBhcmVudCkge1xuICAgICAgdmFyIGluZm8gPSAnJztcblxuICAgICAgaWYgKGFuY2VzdG9yVGFnID09PSAndGFibGUnICYmIGNoaWxkVGFnID09PSAndHInKSB7XG4gICAgICAgIGluZm8gKz0gJyBBZGQgYSA8dGJvZHk+LCA8dGhlYWQ+IG9yIDx0Zm9vdD4gdG8geW91ciBjb2RlIHRvIG1hdGNoIHRoZSBET00gdHJlZSBnZW5lcmF0ZWQgYnkgJyArICd0aGUgYnJvd3Nlci4nO1xuICAgICAgfVxuXG4gICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nKC4uLik6ICVzIGNhbm5vdCBhcHBlYXIgYXMgYSBjaGlsZCBvZiA8JXM+LiVzJXMnLCB0YWdEaXNwbGF5TmFtZSwgYW5jZXN0b3JUYWcsIHdoaXRlc3BhY2VJbmZvLCBpbmZvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3IoJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgZGVzY2VuZGFudCBvZiAnICsgJzwlcz4uJywgdGFnRGlzcGxheU5hbWUsIGFuY2VzdG9yVGFnKTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxID0gJ3N1cHByZXNzSHlkcmF0aW9uV2FybmluZyc7XG52YXIgU1VTUEVOU0VfU1RBUlRfREFUQSA9ICckJztcbnZhciBTVVNQRU5TRV9FTkRfREFUQSA9ICcvJCc7XG52YXIgU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBID0gJyQ/JztcbnZhciBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBID0gJyQhJztcbnZhciBTVFlMRSQxID0gJ3N0eWxlJztcbnZhciBldmVudHNFbmFibGVkID0gbnVsbDtcbnZhciBzZWxlY3Rpb25JbmZvcm1hdGlvbiA9IG51bGw7XG5mdW5jdGlvbiBnZXRSb290SG9zdENvbnRleHQocm9vdENvbnRhaW5lckluc3RhbmNlKSB7XG4gIHZhciB0eXBlO1xuICB2YXIgbmFtZXNwYWNlO1xuICB2YXIgbm9kZVR5cGUgPSByb290Q29udGFpbmVySW5zdGFuY2Uubm9kZVR5cGU7XG5cbiAgc3dpdGNoIChub2RlVHlwZSkge1xuICAgIGNhc2UgRE9DVU1FTlRfTk9ERTpcbiAgICBjYXNlIERPQ1VNRU5UX0ZSQUdNRU5UX05PREU6XG4gICAgICB7XG4gICAgICAgIHR5cGUgPSBub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/ICcjZG9jdW1lbnQnIDogJyNmcmFnbWVudCc7XG4gICAgICAgIHZhciByb290ID0gcm9vdENvbnRhaW5lckluc3RhbmNlLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgbmFtZXNwYWNlID0gcm9vdCA/IHJvb3QubmFtZXNwYWNlVVJJIDogZ2V0Q2hpbGROYW1lc3BhY2UobnVsbCwgJycpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHZhciBjb250YWluZXIgPSBub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gcm9vdENvbnRhaW5lckluc3RhbmNlLnBhcmVudE5vZGUgOiByb290Q29udGFpbmVySW5zdGFuY2U7XG4gICAgICAgIHZhciBvd25OYW1lc3BhY2UgPSBjb250YWluZXIubmFtZXNwYWNlVVJJIHx8IG51bGw7XG4gICAgICAgIHR5cGUgPSBjb250YWluZXIudGFnTmFtZTtcbiAgICAgICAgbmFtZXNwYWNlID0gZ2V0Q2hpbGROYW1lc3BhY2Uob3duTmFtZXNwYWNlLCB0eXBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cblxuICB7XG4gICAgdmFyIHZhbGlkYXRlZFRhZyA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgYW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhudWxsLCB2YWxpZGF0ZWRUYWcpO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZSxcbiAgICAgIGFuY2VzdG9ySW5mbzogYW5jZXN0b3JJbmZvXG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0Q2hpbGRIb3N0Q29udGV4dChwYXJlbnRIb3N0Q29udGV4dCwgdHlwZSwgcm9vdENvbnRhaW5lckluc3RhbmNlKSB7XG4gIHtcbiAgICB2YXIgcGFyZW50SG9zdENvbnRleHREZXYgPSBwYXJlbnRIb3N0Q29udGV4dDtcbiAgICB2YXIgbmFtZXNwYWNlID0gZ2V0Q2hpbGROYW1lc3BhY2UocGFyZW50SG9zdENvbnRleHREZXYubmFtZXNwYWNlLCB0eXBlKTtcbiAgICB2YXIgYW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhwYXJlbnRIb3N0Q29udGV4dERldi5hbmNlc3RvckluZm8sIHR5cGUpO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZSxcbiAgICAgIGFuY2VzdG9ySW5mbzogYW5jZXN0b3JJbmZvXG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0UHVibGljSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gcHJlcGFyZUZvckNvbW1pdChjb250YWluZXJJbmZvKSB7XG4gIGV2ZW50c0VuYWJsZWQgPSBpc0VuYWJsZWQoKTtcbiAgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBnZXRTZWxlY3Rpb25JbmZvcm1hdGlvbigpO1xuICB2YXIgYWN0aXZlSW5zdGFuY2UgPSBudWxsO1xuXG4gIHNldEVuYWJsZWQoZmFsc2UpO1xuICByZXR1cm4gYWN0aXZlSW5zdGFuY2U7XG59XG5mdW5jdGlvbiByZXNldEFmdGVyQ29tbWl0KGNvbnRhaW5lckluZm8pIHtcbiAgcmVzdG9yZVNlbGVjdGlvbihzZWxlY3Rpb25JbmZvcm1hdGlvbik7XG4gIHNldEVuYWJsZWQoZXZlbnRzRW5hYmxlZCk7XG4gIGV2ZW50c0VuYWJsZWQgPSBudWxsO1xuICBzZWxlY3Rpb25JbmZvcm1hdGlvbiA9IG51bGw7XG59XG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZSh0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICB2YXIgcGFyZW50TmFtZXNwYWNlO1xuXG4gIHtcbiAgICAvLyBUT0RPOiB0YWtlIG5hbWVzcGFjZSBpbnRvIGFjY291bnQgd2hlbiB2YWxpZGF0aW5nLlxuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuICAgIHZhbGlkYXRlRE9NTmVzdGluZyh0eXBlLCBudWxsLCBob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8pO1xuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJykge1xuICAgICAgdmFyIHN0cmluZyA9ICcnICsgcHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgb3duQW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8sIHR5cGUpO1xuICAgICAgdmFsaWRhdGVET01OZXN0aW5nKG51bGwsIHN0cmluZywgb3duQW5jZXN0b3JJbmZvKTtcbiAgICB9XG5cbiAgICBwYXJlbnROYW1lc3BhY2UgPSBob3N0Q29udGV4dERldi5uYW1lc3BhY2U7XG4gIH1cblxuICB2YXIgZG9tRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgcGFyZW50TmFtZXNwYWNlKTtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgZG9tRWxlbWVudCk7XG4gIHVwZGF0ZUZpYmVyUHJvcHMoZG9tRWxlbWVudCwgcHJvcHMpO1xuICByZXR1cm4gZG9tRWxlbWVudDtcbn1cbmZ1bmN0aW9uIGFwcGVuZEluaXRpYWxDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UuYXBwZW5kQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gZmluYWxpemVJbml0aWFsQ2hpbGRyZW4oZG9tRWxlbWVudCwgdHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQpIHtcbiAgc2V0SW5pdGlhbFByb3BlcnRpZXMoZG9tRWxlbWVudCwgdHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnYnV0dG9uJzpcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICByZXR1cm4gISFwcm9wcy5hdXRvRm9jdXM7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBwcmVwYXJlVXBkYXRlKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCkge1xuICB7XG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG5cbiAgICBpZiAodHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuICE9PSB0eXBlb2Ygb2xkUHJvcHMuY2hpbGRyZW4gJiYgKHR5cGVvZiBuZXdQcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJykpIHtcbiAgICAgIHZhciBzdHJpbmcgPSAnJyArIG5ld1Byb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIG93bkFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8oaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBzdHJpbmcsIG93bkFuY2VzdG9ySW5mbyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpZmZQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcyk7XG59XG5mdW5jdGlvbiBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBwcm9wcykge1xuICByZXR1cm4gdHlwZSA9PT0gJ3RleHRhcmVhJyB8fCB0eXBlID09PSAnbm9zY3JpcHQnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPT09ICdvYmplY3QnICYmIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9PSBudWxsICYmIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbCAhPSBudWxsO1xufVxuZnVuY3Rpb24gY3JlYXRlVGV4dEluc3RhbmNlKHRleHQsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAge1xuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCB0ZXh0LCBob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8pO1xuICB9XG5cbiAgdmFyIHRleHROb2RlID0gY3JlYXRlVGV4dE5vZGUodGV4dCwgcm9vdENvbnRhaW5lckluc3RhbmNlKTtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgdGV4dE5vZGUpO1xuICByZXR1cm4gdGV4dE5vZGU7XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50RXZlbnRQcmlvcml0eSgpIHtcbiAgdmFyIGN1cnJlbnRFdmVudCA9IHdpbmRvdy5ldmVudDtcblxuICBpZiAoY3VycmVudEV2ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gIH1cblxuICByZXR1cm4gZ2V0RXZlbnRQcmlvcml0eShjdXJyZW50RXZlbnQudHlwZSk7XG59XG4vLyBpZiBhIGNvbXBvbmVudCBqdXN0IGltcG9ydHMgUmVhY3RET00gKGUuZy4gZm9yIGZpbmRET01Ob2RlKS5cbi8vIFNvbWUgZW52aXJvbm1lbnRzIG1pZ2h0IG5vdCBoYXZlIHNldFRpbWVvdXQgb3IgY2xlYXJUaW1lb3V0LlxuXG52YXIgc2NoZWR1bGVUaW1lb3V0ID0gdHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBzZXRUaW1lb3V0IDogdW5kZWZpbmVkO1xudmFyIGNhbmNlbFRpbWVvdXQgPSB0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gY2xlYXJUaW1lb3V0IDogdW5kZWZpbmVkO1xudmFyIG5vVGltZW91dCA9IC0xO1xudmFyIGxvY2FsUHJvbWlzZSA9IHR5cGVvZiBQcm9taXNlID09PSAnZnVuY3Rpb24nID8gUHJvbWlzZSA6IHVuZGVmaW5lZDsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIHNjaGVkdWxlTWljcm90YXNrID0gdHlwZW9mIHF1ZXVlTWljcm90YXNrID09PSAnZnVuY3Rpb24nID8gcXVldWVNaWNyb3Rhc2sgOiB0eXBlb2YgbG9jYWxQcm9taXNlICE9PSAndW5kZWZpbmVkJyA/IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICByZXR1cm4gbG9jYWxQcm9taXNlLnJlc29sdmUobnVsbCkudGhlbihjYWxsYmFjaykuY2F0Y2goaGFuZGxlRXJyb3JJbk5leHRUaWNrKTtcbn0gOiBzY2hlZHVsZVRpbWVvdXQ7IC8vIFRPRE86IERldGVybWluZSB0aGUgYmVzdCBmYWxsYmFjayBoZXJlLlxuXG5mdW5jdGlvbiBoYW5kbGVFcnJvckluTmV4dFRpY2soZXJyb3IpIHtcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0pO1xufSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBjb21taXRNb3VudChkb21FbGVtZW50LCB0eXBlLCBuZXdQcm9wcywgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICAvLyBEZXNwaXRlIHRoZSBuYW1pbmcgdGhhdCBtaWdodCBpbXBseSBvdGhlcndpc2UsIHRoaXMgbWV0aG9kIG9ubHlcbiAgLy8gZmlyZXMgaWYgdGhlcmUgaXMgYW4gYFVwZGF0ZWAgZWZmZWN0IHNjaGVkdWxlZCBkdXJpbmcgbW91bnRpbmcuXG4gIC8vIFRoaXMgaGFwcGVucyBpZiBgZmluYWxpemVJbml0aWFsQ2hpbGRyZW5gIHJldHVybnMgYHRydWVgICh3aGljaCBpdFxuICAvLyBkb2VzIHRvIGltcGxlbWVudCB0aGUgYGF1dG9Gb2N1c2AgYXR0cmlidXRlIG9uIHRoZSBjbGllbnQpLiBCdXRcbiAgLy8gdGhlcmUgYXJlIGFsc28gb3RoZXIgY2FzZXMgd2hlbiB0aGlzIG1pZ2h0IGhhcHBlbiAoc3VjaCBhcyBwYXRjaGluZ1xuICAvLyB1cCB0ZXh0IGNvbnRlbnQgZHVyaW5nIGh5ZHJhdGlvbiBtaXNtYXRjaCkuIFNvIHdlJ2xsIGNoZWNrIHRoaXMgYWdhaW4uXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaWYgKG5ld1Byb3BzLmF1dG9Gb2N1cykge1xuICAgICAgICBkb21FbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcblxuICAgIGNhc2UgJ2ltZyc6XG4gICAgICB7XG4gICAgICAgIGlmIChuZXdQcm9wcy5zcmMpIHtcbiAgICAgICAgICBkb21FbGVtZW50LnNyYyA9IG5ld1Byb3BzLnNyYztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY29tbWl0VXBkYXRlKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICAvLyBBcHBseSB0aGUgZGlmZiB0byB0aGUgRE9NIG5vZGUuXG4gIHVwZGF0ZVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzKTsgLy8gVXBkYXRlIHRoZSBwcm9wcyBoYW5kbGUgc28gdGhhdCB3ZSBrbm93IHdoaWNoIHByb3BzIGFyZSB0aGUgb25lcyB3aXRoXG4gIC8vIHdpdGggY3VycmVudCBldmVudCBoYW5kbGVycy5cblxuICB1cGRhdGVGaWJlclByb3BzKGRvbUVsZW1lbnQsIG5ld1Byb3BzKTtcbn1cbmZ1bmN0aW9uIHJlc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCkge1xuICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCAnJyk7XG59XG5mdW5jdGlvbiBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gbmV3VGV4dDtcbn1cbmZ1bmN0aW9uIGFwcGVuZENoaWxkKHBhcmVudEluc3RhbmNlLCBjaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5hcHBlbmRDaGlsZChjaGlsZCk7XG59XG5mdW5jdGlvbiBhcHBlbmRDaGlsZFRvQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHtcbiAgdmFyIHBhcmVudE5vZGU7XG5cbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgcGFyZW50Tm9kZSA9IGNvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBjb250YWluZXIpO1xuICB9IGVsc2Uge1xuICAgIHBhcmVudE5vZGUgPSBjb250YWluZXI7XG4gICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gIH0gLy8gVGhpcyBjb250YWluZXIgbWlnaHQgYmUgdXNlZCBmb3IgYSBwb3J0YWwuXG4gIC8vIElmIHNvbWV0aGluZyBpbnNpZGUgYSBwb3J0YWwgaXMgY2xpY2tlZCwgdGhhdCBjbGljayBzaG91bGQgYnViYmxlXG4gIC8vIHRocm91Z2ggdGhlIFJlYWN0IHRyZWUuIEhvd2V2ZXIsIG9uIE1vYmlsZSBTYWZhcmkgdGhlIGNsaWNrIHdvdWxkXG4gIC8vIG5ldmVyIGJ1YmJsZSB0aHJvdWdoIHRoZSAqRE9NKiB0cmVlIHVubGVzcyBhbiBhbmNlc3RvciB3aXRoIG9uY2xpY2tcbiAgLy8gZXZlbnQgZXhpc3RzLiBTbyB3ZSB3b3VsZG4ndCBzZWUgaXQgYW5kIGRpc3BhdGNoIGl0LlxuICAvLyBUaGlzIGlzIHdoeSB3ZSBlbnN1cmUgdGhhdCBub24gUmVhY3Qgcm9vdCBjb250YWluZXJzIGhhdmUgaW5saW5lIG9uY2xpY2tcbiAgLy8gZGVmaW5lZC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTkxOFxuXG5cbiAgdmFyIHJlYWN0Um9vdENvbnRhaW5lciA9IGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyO1xuXG4gIGlmICgocmVhY3RSb290Q29udGFpbmVyID09PSBudWxsIHx8IHJlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSAmJiBwYXJlbnROb2RlLm9uY2xpY2sgPT09IG51bGwpIHtcbiAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KHBhcmVudE5vZGUpO1xuICB9XG59XG5mdW5jdGlvbiBpbnNlcnRCZWZvcmUocGFyZW50SW5zdGFuY2UsIGNoaWxkLCBiZWZvcmVDaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbn1cbmZ1bmN0aW9uIGluc2VydEluQ29udGFpbmVyQmVmb3JlKGNvbnRhaW5lciwgY2hpbGQsIGJlZm9yZUNoaWxkKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIGNvbnRhaW5lci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlQ2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGRGcm9tQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjaGlsZCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNsZWFyU3VzcGVuc2VCb3VuZGFyeShwYXJlbnRJbnN0YW5jZSwgc3VzcGVuc2VJbnN0YW5jZSkge1xuICB2YXIgbm9kZSA9IHN1c3BlbnNlSW5zdGFuY2U7IC8vIERlbGV0ZSBhbGwgbm9kZXMgd2l0aGluIHRoaXMgc3VzcGVuc2UgYm91bmRhcnkuXG4gIC8vIFRoZXJlIG1pZ2h0IGJlIG5lc3RlZCBub2RlcyBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaG93XG4gIC8vIGRlZXAgd2UgYXJlIGFuZCBvbmx5IGJyZWFrIG91dCB3aGVuIHdlJ3JlIGJhY2sgb24gdG9wLlxuXG4gIHZhciBkZXB0aCA9IDA7XG5cbiAgZG8ge1xuICAgIHZhciBuZXh0Tm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQobm9kZSk7XG5cbiAgICBpZiAobmV4dE5vZGUgJiYgbmV4dE5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGRhdGEgPSBuZXh0Tm9kZS5kYXRhO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQobmV4dE5vZGUpOyAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG5cbiAgICAgICAgICByZXRyeUlmQmxvY2tlZE9uKHN1c3BlbnNlSW5zdGFuY2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0gbmV4dE5vZGU7XG4gIH0gd2hpbGUgKG5vZGUpOyAvLyBUT0RPOiBXYXJuLCB3ZSBkaWRuJ3QgZmluZCB0aGUgZW5kIGNvbW1lbnQgYm91bmRhcnkuXG4gIC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cblxuXG4gIHJldHJ5SWZCbG9ja2VkT24oc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBjbGVhclN1c3BlbnNlQm91bmRhcnlGcm9tQ29udGFpbmVyKGNvbnRhaW5lciwgc3VzcGVuc2VJbnN0YW5jZSkge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICBjbGVhclN1c3BlbnNlQm91bmRhcnkoY29udGFpbmVyLnBhcmVudE5vZGUsIHN1c3BlbnNlSW5zdGFuY2UpO1xuICB9IGVsc2UgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KGNvbnRhaW5lciwgc3VzcGVuc2VJbnN0YW5jZSk7XG4gIH0gLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuXG5cbiAgcmV0cnlJZkJsb2NrZWRPbihjb250YWluZXIpO1xufVxuZnVuY3Rpb24gaGlkZUluc3RhbmNlKGluc3RhbmNlKSB7XG4gIC8vIFRPRE86IERvZXMgdGhpcyB3b3JrIGZvciBhbGwgZWxlbWVudCB0eXBlcz8gV2hhdCBhYm91dCBNYXRoTUw/IFNob3VsZCB3ZVxuICAvLyBwYXNzIGhvc3QgY29udGV4dCB0byB0aGlzIG1ldGhvZD9cbiAgaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgdmFyIHN0eWxlID0gaW5zdGFuY2Uuc3R5bGU7XG5cbiAgaWYgKHR5cGVvZiBzdHlsZS5zZXRQcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywgJ25vbmUnLCAnaW1wb3J0YW50Jyk7XG4gIH0gZWxzZSB7XG4gICAgc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxufVxuZnVuY3Rpb24gaGlkZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UpIHtcbiAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9ICcnO1xufVxuZnVuY3Rpb24gdW5oaWRlSW5zdGFuY2UoaW5zdGFuY2UsIHByb3BzKSB7XG4gIGluc3RhbmNlID0gaW5zdGFuY2U7XG4gIHZhciBzdHlsZVByb3AgPSBwcm9wc1tTVFlMRSQxXTtcbiAgdmFyIGRpc3BsYXkgPSBzdHlsZVByb3AgIT09IHVuZGVmaW5lZCAmJiBzdHlsZVByb3AgIT09IG51bGwgJiYgc3R5bGVQcm9wLmhhc093blByb3BlcnR5KCdkaXNwbGF5JykgPyBzdHlsZVByb3AuZGlzcGxheSA6IG51bGw7XG4gIGluc3RhbmNlLnN0eWxlLmRpc3BsYXkgPSBkYW5nZXJvdXNTdHlsZVZhbHVlKCdkaXNwbGF5JywgZGlzcGxheSk7XG59XG5mdW5jdGlvbiB1bmhpZGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlLCB0ZXh0KSB7XG4gIHRleHRJbnN0YW5jZS5ub2RlVmFsdWUgPSB0ZXh0O1xufVxuZnVuY3Rpb24gY2xlYXJDb250YWluZXIoY29udGFpbmVyKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgIGNvbnRhaW5lci50ZXh0Q29udGVudCA9ICcnO1xuICB9IGVsc2UgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSkge1xuICAgIGlmIChjb250YWluZXIuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY29udGFpbmVyLmRvY3VtZW50RWxlbWVudCk7XG4gICAgfVxuICB9XG59IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGNhbkh5ZHJhdGVJbnN0YW5jZShpbnN0YW5jZSwgdHlwZSwgcHJvcHMpIHtcbiAgaWYgKGluc3RhbmNlLm5vZGVUeXBlICE9PSBFTEVNRU5UX05PREUgfHwgdHlwZS50b0xvd2VyQ2FzZSgpICE9PSBpbnN0YW5jZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gVGhpcyBoYXMgbm93IGJlZW4gcmVmaW5lZCB0byBhbiBlbGVtZW50IG5vZGUuXG5cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBjYW5IeWRyYXRlVGV4dEluc3RhbmNlKGluc3RhbmNlLCB0ZXh0KSB7XG4gIGlmICh0ZXh0ID09PSAnJyB8fCBpbnN0YW5jZS5ub2RlVHlwZSAhPT0gVEVYVF9OT0RFKSB7XG4gICAgLy8gRW1wdHkgc3RyaW5ncyBhcmUgbm90IHBhcnNlZCBieSBIVE1MIHNvIHRoZXJlIHdvbid0IGJlIGEgY29ycmVjdCBtYXRjaCBoZXJlLlxuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoaXMgaGFzIG5vdyBiZWVuIHJlZmluZWQgdG8gYSB0ZXh0IG5vZGUuXG5cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBjYW5IeWRyYXRlU3VzcGVuc2VJbnN0YW5jZShpbnN0YW5jZSkge1xuICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgIC8vIEVtcHR5IHN0cmluZ3MgYXJlIG5vdCBwYXJzZWQgYnkgSFRNTCBzbyB0aGVyZSB3b24ndCBiZSBhIGNvcnJlY3QgbWF0Y2ggaGVyZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGhhcyBub3cgYmVlbiByZWZpbmVkIHRvIGEgc3VzcGVuc2Ugbm9kZS5cblxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2VJbnN0YW5jZVBlbmRpbmcoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlLmRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZS5kYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBO1xufVxuZnVuY3Rpb24gZ2V0U3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrRXJyb3JEZXRhaWxzKGluc3RhbmNlKSB7XG4gIHZhciBkYXRhc2V0ID0gaW5zdGFuY2UubmV4dFNpYmxpbmcgJiYgaW5zdGFuY2UubmV4dFNpYmxpbmcuZGF0YXNldDtcbiAgdmFyIGRpZ2VzdCwgbWVzc2FnZSwgc3RhY2s7XG5cbiAgaWYgKGRhdGFzZXQpIHtcbiAgICBkaWdlc3QgPSBkYXRhc2V0LmRnc3Q7XG5cbiAgICB7XG4gICAgICBtZXNzYWdlID0gZGF0YXNldC5tc2c7XG4gICAgICBzdGFjayA9IGRhdGFzZXQuc3RjaztcbiAgICB9XG4gIH1cblxuICB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICBkaWdlc3Q6IGRpZ2VzdCxcbiAgICAgIHN0YWNrOiBzdGFja1xuICAgIH07XG4gIH0gLy8gbGV0IHZhbHVlID0ge21lc3NhZ2U6IHVuZGVmaW5lZCwgaGFzaDogdW5kZWZpbmVkfTtcbiAgLy8gY29uc3QgbmV4dFNpYmxpbmcgPSBpbnN0YW5jZS5uZXh0U2libGluZztcbiAgLy8gaWYgKG5leHRTaWJsaW5nKSB7XG4gIC8vICAgY29uc3QgZGF0YXNldCA9ICgobmV4dFNpYmxpbmc6IGFueSk6IEhUTUxUZW1wbGF0ZUVsZW1lbnQpLmRhdGFzZXQ7XG4gIC8vICAgdmFsdWUubWVzc2FnZSA9IGRhdGFzZXQubXNnO1xuICAvLyAgIHZhbHVlLmhhc2ggPSBkYXRhc2V0Lmhhc2g7XG4gIC8vICAgaWYgKHRydWUpIHtcbiAgLy8gICAgIHZhbHVlLnN0YWNrID0gZGF0YXNldC5zdGFjaztcbiAgLy8gICB9XG4gIC8vIH1cbiAgLy8gcmV0dXJuIHZhbHVlO1xuXG59XG5mdW5jdGlvbiByZWdpc3RlclN1c3BlbnNlSW5zdGFuY2VSZXRyeShpbnN0YW5jZSwgY2FsbGJhY2spIHtcbiAgaW5zdGFuY2UuX3JlYWN0UmV0cnkgPSBjYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGUobm9kZSkge1xuICAvLyBTa2lwIG5vbi1oeWRyYXRhYmxlIG5vZGVzLlxuICBmb3IgKDsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5uZXh0U2libGluZykge1xuICAgIHZhciBub2RlVHlwZSA9IG5vZGUubm9kZVR5cGU7XG5cbiAgICBpZiAobm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSB8fCBub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAobm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIG5vZGVEYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAobm9kZURhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgbm9kZURhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEgfHwgbm9kZURhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGVEYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGluc3RhbmNlKSB7XG4gIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZShpbnN0YW5jZS5uZXh0U2libGluZyk7XG59XG5mdW5jdGlvbiBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZChwYXJlbnRJbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUocGFyZW50SW5zdGFuY2UuZmlyc3RDaGlsZCk7XG59XG5mdW5jdGlvbiBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKHBhcmVudENvbnRhaW5lci5maXJzdENoaWxkKTtcbn1cbmZ1bmN0aW9uIGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkV2l0aGluU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRJbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUocGFyZW50SW5zdGFuY2UubmV4dFNpYmxpbmcpO1xufVxuZnVuY3Rpb24gaHlkcmF0ZUluc3RhbmNlKGluc3RhbmNlLCB0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgc2hvdWxkV2FybkRldikge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBpbnN0YW5jZSk7IC8vIFRPRE86IFBvc3NpYmx5IGRlZmVyIHRoaXMgdW50aWwgdGhlIGNvbW1pdCBwaGFzZSB3aGVyZSBhbGwgdGhlIGV2ZW50c1xuICAvLyBnZXQgYXR0YWNoZWQuXG5cbiAgdXBkYXRlRmliZXJQcm9wcyhpbnN0YW5jZSwgcHJvcHMpO1xuICB2YXIgcGFyZW50TmFtZXNwYWNlO1xuXG4gIHtcbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICBwYXJlbnROYW1lc3BhY2UgPSBob3N0Q29udGV4dERldi5uYW1lc3BhY2U7XG4gIH0gLy8gVE9ETzogVGVtcG9yYXJ5IGhhY2sgdG8gY2hlY2sgaWYgd2UncmUgaW4gYSBjb25jdXJyZW50IHJvb3QuIFdlIGNhbiBkZWxldGVcbiAgLy8gd2hlbiB0aGUgbGVnYWN5IHJvb3QgQVBJIGlzIHJlbW92ZWQuXG5cblxuICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChpbnRlcm5hbEluc3RhbmNlSGFuZGxlLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcbiAgcmV0dXJuIGRpZmZIeWRyYXRlZFByb3BlcnRpZXMoaW5zdGFuY2UsIHR5cGUsIHByb3BzLCBwYXJlbnROYW1lc3BhY2UsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG59XG5mdW5jdGlvbiBoeWRyYXRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgc2hvdWxkV2FybkRldikge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCB0ZXh0SW5zdGFuY2UpOyAvLyBUT0RPOiBUZW1wb3JhcnkgaGFjayB0byBjaGVjayBpZiB3ZSdyZSBpbiBhIGNvbmN1cnJlbnQgcm9vdC4gV2UgY2FuIGRlbGV0ZVxuICAvLyB3aGVuIHRoZSBsZWdhY3kgcm9vdCBBUEkgaXMgcmVtb3ZlZC5cblxuICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChpbnRlcm5hbEluc3RhbmNlSGFuZGxlLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcbiAgcmV0dXJuIGRpZmZIeWRyYXRlZFRleHQodGV4dEluc3RhbmNlLCB0ZXh0KTtcbn1cbmZ1bmN0aW9uIGh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBnZXROZXh0SHlkcmF0YWJsZUluc3RhbmNlQWZ0ZXJTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSBzdXNwZW5zZUluc3RhbmNlLm5leHRTaWJsaW5nOyAvLyBTa2lwIHBhc3QgYWxsIG5vZGVzIHdpdGhpbiB0aGlzIHN1c3BlbnNlIGJvdW5kYXJ5LlxuICAvLyBUaGVyZSBtaWdodCBiZSBuZXN0ZWQgbm9kZXMgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGhvd1xuICAvLyBkZWVwIHdlIGFyZSBhbmQgb25seSBicmVhayBvdXQgd2hlbiB3ZSdyZSBiYWNrIG9uIHRvcC5cblxuICB2YXIgZGVwdGggPSAwO1xuXG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGRhdGEgPSBub2RlLmRhdGE7XG5cbiAgICAgIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKG5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSkge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICB9IC8vIFRPRE86IFdhcm4sIHdlIGRpZG4ndCBmaW5kIHRoZSBlbmQgY29tbWVudCBib3VuZGFyeS5cblxuXG4gIHJldHVybiBudWxsO1xufSAvLyBSZXR1cm5zIHRoZSBTdXNwZW5zZUluc3RhbmNlIGlmIHRoaXMgbm9kZSBpcyBhIGRpcmVjdCBjaGlsZCBvZiBhXG4vLyBTdXNwZW5zZUluc3RhbmNlLiBJLmUuIGlmIGl0cyBwcmV2aW91cyBzaWJsaW5nIGlzIGEgQ29tbWVudCB3aXRoXG4vLyBTVVNQRU5TRV94X1NUQVJUX0RBVEEuIE90aGVyd2lzZSwgbnVsbC5cblxuZnVuY3Rpb24gZ2V0UGFyZW50U3VzcGVuc2VJbnN0YW5jZSh0YXJnZXRJbnN0YW5jZSkge1xuICB2YXIgbm9kZSA9IHRhcmdldEluc3RhbmNlLnByZXZpb3VzU2libGluZzsgLy8gU2tpcCBwYXN0IGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS5cbiAgLy8gVGhlcmUgbWlnaHQgYmUgbmVzdGVkIG5vZGVzIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBob3dcbiAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuXG5cbiAgdmFyIGRlcHRoID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBkYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSkge1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX0VORF9EQVRBKSB7XG4gICAgICAgIGRlcHRoKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBjb21taXRIeWRyYXRlZENvbnRhaW5lcihjb250YWluZXIpIHtcbiAgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuICByZXRyeUlmQmxvY2tlZE9uKGNvbnRhaW5lcik7XG59XG5mdW5jdGlvbiBjb21taXRIeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSkge1xuICAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG4gIHJldHJ5SWZCbG9ja2VkT24oc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBzaG91bGREZWxldGVVbmh5ZHJhdGVkVGFpbEluc3RhbmNlcyhwYXJlbnRUeXBlKSB7XG4gIHJldHVybiBwYXJlbnRUeXBlICE9PSAnaGVhZCcgJiYgcGFyZW50VHlwZSAhPT0gJ2JvZHknO1xufVxuZnVuY3Rpb24gZGlkTm90TWF0Y2hIeWRyYXRlZENvbnRhaW5lclRleHRJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHRleHRJbnN0YW5jZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSkge1xuICB2YXIgc2hvdWxkV2FybkRldiA9IHRydWU7XG4gIGNoZWNrRm9yVW5tYXRjaGVkVGV4dCh0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbn1cbmZ1bmN0aW9uIGRpZE5vdE1hdGNoSHlkcmF0ZWRUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0SW5zdGFuY2UsIHRleHQsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAgaWYgKHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgdmFyIHNob3VsZFdhcm5EZXYgPSB0cnVlO1xuICAgIGNoZWNrRm9yVW5tYXRjaGVkVGV4dCh0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpIHtcbiAge1xuICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSkge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZTogT25seSBFbGVtZW50IG9yIERvY3VtZW50IGNhbiBiZSBwYXJlbnQgbm9kZXMuXG4gICAgdmFyIHBhcmVudE5vZGUgPSBwYXJlbnRJbnN0YW5jZS5wYXJlbnROb2RlO1xuXG4gICAgaWYgKHBhcmVudE5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50Tm9kZSwgaW5zdGFuY2UpO1xuICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSA7IGVsc2Uge1xuICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudE5vZGUsIGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIGluc3RhbmNlLCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHtcbiAgICBpZiAoaXNDb25jdXJyZW50TW9kZSB8fCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgICAgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlRWxlbWVudChwYXJlbnRJbnN0YW5jZSwgaW5zdGFuY2UpO1xuICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSA7IGVsc2Uge1xuICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnRDb250YWluZXIsIHR5cGUpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHRleHQpIHtcbiAge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnRDb250YWluZXIsIHRleHQpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRJbnN0YW5jZSwgdHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWU6IE9ubHkgRWxlbWVudCBvciBEb2N1bWVudCBjYW4gYmUgcGFyZW50IG5vZGVzLlxuICAgIHZhciBwYXJlbnROb2RlID0gcGFyZW50SW5zdGFuY2UucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50Tm9kZSAhPT0gbnVsbCkgd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50KHBhcmVudE5vZGUsIHR5cGUpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UocGFyZW50SW5zdGFuY2UsIHRleHQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWU6IE9ubHkgRWxlbWVudCBvciBEb2N1bWVudCBjYW4gYmUgcGFyZW50IG5vZGVzLlxuICAgIHZhciBwYXJlbnROb2RlID0gcGFyZW50SW5zdGFuY2UucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50Tm9kZSAhPT0gbnVsbCkgd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudE5vZGUsIHRleHQpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdHlwZSwgcHJvcHMsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAge1xuICAgIGlmIChpc0NvbmN1cnJlbnRNb2RlIHx8IHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50SW5zdGFuY2UsIHR5cGUpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHtcbiAgICBpZiAoaXNDb25jdXJyZW50TW9kZSB8fCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgICAgd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudEluc3RhbmNlLCB0ZXh0KTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGVycm9ySHlkcmF0aW5nQ29udGFpbmVyKHBhcmVudENvbnRhaW5lcikge1xuICB7XG4gICAgLy8gVE9ETzogVGhpcyBnZXRzIGxvZ2dlZCBieSBvblJlY292ZXJhYmxlRXJyb3IsIHRvbywgc28gd2Ugc2hvdWxkIGJlXG4gICAgLy8gYWJsZSB0byByZW1vdmUgaXQuXG4gICAgZXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIGR1cmluZyBoeWRyYXRpb24uIFRoZSBzZXJ2ZXIgSFRNTCB3YXMgcmVwbGFjZWQgd2l0aCBjbGllbnQgY29udGVudCBpbiA8JXM+LicsIHBhcmVudENvbnRhaW5lci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZVBvcnRhbE1vdW50KHBvcnRhbEluc3RhbmNlKSB7XG4gIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHBvcnRhbEluc3RhbmNlKTtcbn1cblxudmFyIHJhbmRvbUtleSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO1xudmFyIGludGVybmFsSW5zdGFuY2VLZXkgPSAnX19yZWFjdEZpYmVyJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxQcm9wc0tleSA9ICdfX3JlYWN0UHJvcHMkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5ID0gJ19fcmVhY3RDb250YWluZXIkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbEV2ZW50SGFuZGxlcnNLZXkgPSAnX19yZWFjdEV2ZW50cyQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsRXZlbnRIYW5kbGVyTGlzdGVuZXJzS2V5ID0gJ19fcmVhY3RMaXN0ZW5lcnMkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbEV2ZW50SGFuZGxlc1NldEtleSA9ICdfX3JlYWN0SGFuZGxlcyQnICsgcmFuZG9tS2V5O1xuZnVuY3Rpb24gZGV0YWNoRGVsZXRlZEluc3RhbmNlKG5vZGUpIHtcbiAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBvbiBob3N0IGNvbXBvbmVudHMuIEkgZG9uJ3QgdGhpbmsgYWxsIG9mXG4gIC8vIHRoZXNlIGZpZWxkcyBhcmUgcmVsZXZhbnQuXG4gIGRlbGV0ZSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuICBkZWxldGUgbm9kZVtpbnRlcm5hbFByb3BzS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJMaXN0ZW5lcnNLZXldO1xuICBkZWxldGUgbm9kZVtpbnRlcm5hbEV2ZW50SGFuZGxlc1NldEtleV07XG59XG5mdW5jdGlvbiBwcmVjYWNoZUZpYmVyTm9kZShob3N0SW5zdCwgbm9kZSkge1xuICBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldID0gaG9zdEluc3Q7XG59XG5mdW5jdGlvbiBtYXJrQ29udGFpbmVyQXNSb290KGhvc3RSb290LCBub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBob3N0Um9vdDtcbn1cbmZ1bmN0aW9uIHVubWFya0NvbnRhaW5lckFzUm9vdChub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBudWxsO1xufVxuZnVuY3Rpb24gaXNDb250YWluZXJNYXJrZWRBc1Jvb3Qobm9kZSkge1xuICByZXR1cm4gISFub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldO1xufSAvLyBHaXZlbiBhIERPTSBub2RlLCByZXR1cm4gdGhlIGNsb3Nlc3QgSG9zdENvbXBvbmVudCBvciBIb3N0VGV4dCBmaWJlciBhbmNlc3Rvci5cbi8vIElmIHRoZSB0YXJnZXQgbm9kZSBpcyBwYXJ0IG9mIGEgaHlkcmF0ZWQgb3Igbm90IHlldCByZW5kZXJlZCBzdWJ0cmVlLCB0aGVuXG4vLyB0aGlzIG1heSBhbHNvIHJldHVybiBhIFN1c3BlbnNlQ29tcG9uZW50IG9yIEhvc3RSb290IHRvIGluZGljYXRlIHRoYXQuXG4vLyBDb25jZXB0dWFsbHkgdGhlIEhvc3RSb290IGZpYmVyIGlzIGEgY2hpbGQgb2YgdGhlIENvbnRhaW5lciBub2RlLiBTbyBpZiB5b3Vcbi8vIHBhc3MgdGhlIENvbnRhaW5lciBub2RlIGFzIHRoZSB0YXJnZXROb2RlLCB5b3Ugd2lsbCBub3QgYWN0dWFsbHkgZ2V0IHRoZVxuLy8gSG9zdFJvb3QgYmFjay4gVG8gZ2V0IHRvIHRoZSBIb3N0Um9vdCwgeW91IG5lZWQgdG8gcGFzcyBhIGNoaWxkIG9mIGl0LlxuLy8gVGhlIHNhbWUgdGhpbmcgYXBwbGllcyB0byBTdXNwZW5zZSBib3VuZGFyaWVzLlxuXG5mdW5jdGlvbiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXROb2RlKSB7XG4gIHZhciB0YXJnZXRJbnN0ID0gdGFyZ2V0Tm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcblxuICBpZiAodGFyZ2V0SW5zdCkge1xuICAgIC8vIERvbid0IHJldHVybiBIb3N0Um9vdCBvciBTdXNwZW5zZUNvbXBvbmVudCBoZXJlLlxuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9IC8vIElmIHRoZSBkaXJlY3QgZXZlbnQgdGFyZ2V0IGlzbid0IGEgUmVhY3Qgb3duZWQgRE9NIG5vZGUsIHdlIG5lZWQgdG8gbG9va1xuICAvLyB0byBzZWUgaWYgb25lIG9mIGl0cyBwYXJlbnRzIGlzIGEgUmVhY3Qgb3duZWQgRE9NIG5vZGUuXG5cblxuICB2YXIgcGFyZW50Tm9kZSA9IHRhcmdldE5vZGUucGFyZW50Tm9kZTtcblxuICB3aGlsZSAocGFyZW50Tm9kZSkge1xuICAgIC8vIFdlJ2xsIGNoZWNrIGlmIHRoaXMgaXMgYSBjb250YWluZXIgcm9vdCB0aGF0IGNvdWxkIGluY2x1ZGVcbiAgICAvLyBSZWFjdCBub2RlcyBpbiB0aGUgZnV0dXJlLiBXZSBuZWVkIHRvIGNoZWNrIHRoaXMgZmlyc3QgYmVjYXVzZVxuICAgIC8vIGlmIHdlJ3JlIGEgY2hpbGQgb2YgYSBkZWh5ZHJhdGVkIGNvbnRhaW5lciwgd2UgbmVlZCB0byBmaXJzdFxuICAgIC8vIGZpbmQgdGhhdCBpbm5lciBjb250YWluZXIgYmVmb3JlIG1vdmluZyBvbiB0byBmaW5kaW5nIHRoZSBwYXJlbnRcbiAgICAvLyBpbnN0YW5jZS4gTm90ZSB0aGF0IHdlIGRvbid0IGNoZWNrIHRoaXMgZmllbGQgb24gIHRoZSB0YXJnZXROb2RlXG4gICAgLy8gaXRzZWxmIGJlY2F1c2UgdGhlIGZpYmVycyBhcmUgY29uY2VwdHVhbGx5IGJldHdlZW4gdGhlIGNvbnRhaW5lclxuICAgIC8vIG5vZGUgYW5kIHRoZSBmaXJzdCBjaGlsZC4gSXQgaXNuJ3Qgc3Vycm91bmRpbmcgdGhlIGNvbnRhaW5lciBub2RlLlxuICAgIC8vIElmIGl0J3Mgbm90IGEgY29udGFpbmVyLCB3ZSBjaGVjayBpZiBpdCdzIGFuIGluc3RhbmNlLlxuICAgIHRhcmdldEluc3QgPSBwYXJlbnROb2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldIHx8IHBhcmVudE5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgICBpZiAodGFyZ2V0SW5zdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyB3YXNuJ3QgdGhlIGRpcmVjdCB0YXJnZXQgb2YgdGhlIGV2ZW50LCB3ZSBtaWdodCBoYXZlXG4gICAgICAvLyBzdGVwcGVkIHBhc3QgZGVoeWRyYXRlZCBET00gbm9kZXMgdG8gZ2V0IGhlcmUuIEhvd2V2ZXIgdGhleSBjb3VsZFxuICAgICAgLy8gYWxzbyBoYXZlIGJlZW4gbm9uLVJlYWN0IG5vZGVzLiBXZSBuZWVkIHRvIGFuc3dlciB3aGljaCBvbmUuXG4gICAgICAvLyBJZiB3ZSB0aGUgaW5zdGFuY2UgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiwgdGhlbiB0aGVyZSBjYW4ndCBiZVxuICAgICAgLy8gYSBuZXN0ZWQgc3VzcGVuc2UgYm91bmRhcnkgd2l0aGluIGl0LiBTbyB3ZSBjYW4gdXNlIHRoaXMgYXMgYSBmYXN0XG4gICAgICAvLyBiYWlsb3V0LiBNb3N0IG9mIHRoZSB0aW1lLCB3aGVuIHBlb3BsZSBhZGQgbm9uLVJlYWN0IGNoaWxkcmVuIHRvXG4gICAgICAvLyB0aGUgdHJlZSwgaXQgaXMgdXNpbmcgYSByZWYgdG8gYSBjaGlsZC1sZXNzIERPTSBub2RlLlxuICAgICAgLy8gTm9ybWFsbHkgd2UnZCBvbmx5IG5lZWQgdG8gY2hlY2sgb25lIG9mIHRoZSBmaWJlcnMgYmVjYXVzZSBpZiBpdFxuICAgICAgLy8gaGFzIGV2ZXIgZ29uZSBmcm9tIGhhdmluZyBjaGlsZHJlbiB0byBkZWxldGluZyB0aGVtIG9yIHZpY2UgdmVyc2FcbiAgICAgIC8vIGl0IHdvdWxkIGhhdmUgZGVsZXRlZCB0aGUgZGVoeWRyYXRlZCBib3VuZGFyeSBuZXN0ZWQgaW5zaWRlIGFscmVhZHkuXG4gICAgICAvLyBIb3dldmVyLCBzaW5jZSB0aGUgSG9zdFJvb3Qgc3RhcnRzIG91dCB3aXRoIGFuIGFsdGVybmF0ZSBpdCBtaWdodFxuICAgICAgLy8gaGF2ZSBvbmUgb24gdGhlIGFsdGVybmF0ZSBzbyB3ZSBuZWVkIHRvIGNoZWNrIGluIGNhc2UgdGhpcyB3YXMgYVxuICAgICAgLy8gcm9vdC5cbiAgICAgIHZhciBhbHRlcm5hdGUgPSB0YXJnZXRJbnN0LmFsdGVybmF0ZTtcblxuICAgICAgaWYgKHRhcmdldEluc3QuY2hpbGQgIT09IG51bGwgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBOZXh0IHdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgbm9kZSB0aGF0IHNraXBwZWQgcGFzdCBpc1xuICAgICAgICAvLyBuZXN0ZWQgd2l0aGluIGEgZGVoeWRyYXRlZCBib3VuZGFyeSBhbmQgaWYgc28sIHdoaWNoIG9uZS5cbiAgICAgICAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHRhcmdldE5vZGUpO1xuXG4gICAgICAgIHdoaWxlIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgZm91bmQgYSBzdXNwZW5zZSBpbnN0YW5jZS4gVGhhdCBtZWFucyB0aGF0IHdlIGhhdmVuJ3RcbiAgICAgICAgICAvLyBoeWRyYXRlZCBpdCB5ZXQuIEV2ZW4gdGhvdWdoIHdlIGxlYXZlIHRoZSBjb21tZW50cyBpbiB0aGVcbiAgICAgICAgICAvLyBET00gYWZ0ZXIgaHlkcmF0aW5nLCBhbmQgdGhlcmUgYXJlIGJvdW5kYXJpZXMgaW4gdGhlIERPTVxuICAgICAgICAgIC8vIHRoYXQgY291bGQgYWxyZWFkeSBiZSBoeWRyYXRlZCwgd2Ugd291bGRuJ3QgaGF2ZSBmb3VuZCB0aGVtXG4gICAgICAgICAgLy8gdGhyb3VnaCB0aGlzIHBhc3Mgc2luY2UgaWYgdGhlIHRhcmdldCBpcyBoeWRyYXRlZCBpdCB3b3VsZFxuICAgICAgICAgIC8vIGhhdmUgaGFkIGFuIGludGVybmFsSW5zdGFuY2VLZXkgb24gaXQuXG4gICAgICAgICAgLy8gTGV0J3MgZ2V0IHRoZSBmaWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIFN1c3BlbnNlQ29tcG9uZW50XG4gICAgICAgICAgLy8gYXMgdGhlIGRlZXBlc3QgaW5zdGFuY2UuXG4gICAgICAgICAgdmFyIHRhcmdldFN1c3BlbnNlSW5zdCA9IHN1c3BlbnNlSW5zdGFuY2VbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgICAgICAgICBpZiAodGFyZ2V0U3VzcGVuc2VJbnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0U3VzcGVuc2VJbnN0O1xuICAgICAgICAgIH0gLy8gSWYgd2UgZG9uJ3QgZmluZCBhIEZpYmVyIG9uIHRoZSBjb21tZW50LCBpdCBtaWdodCBiZSBiZWNhdXNlXG4gICAgICAgICAgLy8gd2UgaGF2ZW4ndCBnb3R0ZW4gdG8gaHlkcmF0ZSBpdCB5ZXQuIFRoZXJlIG1pZ2h0IHN0aWxsIGJlIGFcbiAgICAgICAgICAvLyBwYXJlbnQgYm91bmRhcnkgdGhhdCBoYXNuJ3QgYWJvdmUgdGhpcyBvbmUgc28gd2UgbmVlZCB0byBmaW5kXG4gICAgICAgICAgLy8gdGhlIG91dGVyIG1vc3QgdGhhdCBpcyBrbm93bi5cblxuXG4gICAgICAgICAgc3VzcGVuc2VJbnN0YW5jZSA9IGdldFBhcmVudFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7IC8vIElmIHdlIGRvbid0IGZpbmQgb25lLCB0aGVuIHRoYXQgc2hvdWxkIG1lYW4gdGhhdCB0aGUgcGFyZW50XG4gICAgICAgICAgLy8gaG9zdCBjb21wb25lbnQgYWxzbyBoYXNuJ3QgaHlkcmF0ZWQgeWV0LiBXZSBjYW4gcmV0dXJuIGl0XG4gICAgICAgICAgLy8gYmVsb3cgc2luY2UgaXQgd2lsbCBiYWlsIG91dCBvbiB0aGUgaXNNb3VudGVkIGNoZWNrIGxhdGVyLlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICAgIH1cblxuICAgIHRhcmdldE5vZGUgPSBwYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUgPSB0YXJnZXROb2RlLnBhcmVudE5vZGU7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnRcbiAqIGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBub2RlIHdhcyBub3QgcmVuZGVyZWQgYnkgdGhpcyBSZWFjdC5cbiAqL1xuXG5mdW5jdGlvbiBnZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpIHtcbiAgdmFyIGluc3QgPSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldIHx8IG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV07XG5cbiAgaWYgKGluc3QpIHtcbiAgICBpZiAoaW5zdC50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgaW5zdC50YWcgPT09IEhvc3RUZXh0IHx8IGluc3QudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgIHJldHVybiBpbnN0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2l2ZW4gYSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnQsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZ1xuICogRE9NIG5vZGUuXG4gKi9cblxuZnVuY3Rpb24gZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KSB7XG4gIGlmIChpbnN0LnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAvLyBJbiBGaWJlciB0aGlzLCBpcyBqdXN0IHRoZSBzdGF0ZSBub2RlIHJpZ2h0IG5vdy4gV2UgYXNzdW1lIGl0IHdpbGwgYmVcbiAgICAvLyBhIGhvc3QgY29tcG9uZW50IG9yIGhvc3QgdGV4dC5cbiAgICByZXR1cm4gaW5zdC5zdGF0ZU5vZGU7XG4gIH0gLy8gV2l0aG91dCB0aGlzIGZpcnN0IGludmFyaWFudCwgcGFzc2luZyBhIG5vbi1ET00tY29tcG9uZW50IHRyaWdnZXJzIHRoZSBuZXh0XG4gIC8vIGludmFyaWFudCBmb3IgYSBtaXNzaW5nIHBhcmVudCwgd2hpY2ggaXMgc3VwZXIgY29uZnVzaW5nLlxuXG5cbiAgdGhyb3cgbmV3IEVycm9yKCdnZXROb2RlRnJvbUluc3RhbmNlOiBJbnZhbGlkIGFyZ3VtZW50LicpO1xufVxuZnVuY3Rpb24gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShub2RlKSB7XG4gIHJldHVybiBub2RlW2ludGVybmFsUHJvcHNLZXldIHx8IG51bGw7XG59XG5mdW5jdGlvbiB1cGRhdGVGaWJlclByb3BzKG5vZGUsIHByb3BzKSB7XG4gIG5vZGVbaW50ZXJuYWxQcm9wc0tleV0gPSBwcm9wcztcbn1cbmZ1bmN0aW9uIGdldEV2ZW50TGlzdGVuZXJTZXQobm9kZSkge1xuICB2YXIgZWxlbWVudExpc3RlbmVyU2V0ID0gbm9kZVtpbnRlcm5hbEV2ZW50SGFuZGxlcnNLZXldO1xuXG4gIGlmIChlbGVtZW50TGlzdGVuZXJTZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVsZW1lbnRMaXN0ZW5lclNldCA9IG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XSA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50TGlzdGVuZXJTZXQ7XG59XG5cbnZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZWxlbWVudCkge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZSBUaGlzIGlzIG9rYXkgYnV0IEZsb3cgZG9lc24ndCBrbm93IGl0LlxuICAgIHZhciBoYXMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoaGFzT3duUHJvcGVydHkpO1xuXG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yJDEgPSB2b2lkIDA7IC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICsgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJyArICdUaGlzIG9mdGVuIGhhcHBlbnMgYmVjYXVzZSBvZiB0eXBvcyBzdWNoIGFzIGBQcm9wVHlwZXMuZnVuY3Rpb25gIGluc3RlYWQgb2YgYFByb3BUeXBlcy5mdW5jYC4nKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yJDEgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCcpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yJDEgPSBleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxICYmICEoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMnICsgJyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IkMSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvciQxLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yJDEubWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJ0ZhaWxlZCAlcyB0eXBlOiAlcycsIGxvY2F0aW9uLCBlcnJvciQxLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIHZhbHVlU3RhY2sgPSBbXTtcbnZhciBmaWJlclN0YWNrO1xuXG57XG4gIGZpYmVyU3RhY2sgPSBbXTtcbn1cblxudmFyIGluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNyZWF0ZUN1cnNvcihkZWZhdWx0VmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50OiBkZWZhdWx0VmFsdWVcbiAgfTtcbn1cblxuZnVuY3Rpb24gcG9wKGN1cnNvciwgZmliZXIpIHtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHtcbiAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHBvcC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgaWYgKGZpYmVyICE9PSBmaWJlclN0YWNrW2luZGV4XSkge1xuICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgRmliZXIgcG9wcGVkLicpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnNvci5jdXJyZW50ID0gdmFsdWVTdGFja1tpbmRleF07XG4gIHZhbHVlU3RhY2tbaW5kZXhdID0gbnVsbDtcblxuICB7XG4gICAgZmliZXJTdGFja1tpbmRleF0gPSBudWxsO1xuICB9XG5cbiAgaW5kZXgtLTtcbn1cblxuZnVuY3Rpb24gcHVzaChjdXJzb3IsIHZhbHVlLCBmaWJlcikge1xuICBpbmRleCsrO1xuICB2YWx1ZVN0YWNrW2luZGV4XSA9IGN1cnNvci5jdXJyZW50O1xuXG4gIHtcbiAgICBmaWJlclN0YWNrW2luZGV4XSA9IGZpYmVyO1xuICB9XG5cbiAgY3Vyc29yLmN1cnJlbnQgPSB2YWx1ZTtcbn1cblxudmFyIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dDtcblxue1xuICB3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHQgPSB7fTtcbn1cblxudmFyIGVtcHR5Q29udGV4dE9iamVjdCA9IHt9O1xuXG57XG4gIE9iamVjdC5mcmVlemUoZW1wdHlDb250ZXh0T2JqZWN0KTtcbn0gLy8gQSBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgbWVyZ2VkIGNvbnRleHQgb2JqZWN0IG9uIHRoZSBzdGFjay5cblxuXG52YXIgY29udGV4dFN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKGVtcHR5Q29udGV4dE9iamVjdCk7IC8vIEEgY3Vyc29yIHRvIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNvbnRleHQgaGFzIGNoYW5nZWQuXG5cbnZhciBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKGZhbHNlKTsgLy8gS2VlcCB0cmFjayBvZiB0aGUgcHJldmlvdXMgY29udGV4dCBvYmplY3QgdGhhdCB3YXMgb24gdGhlIHN0YWNrLlxuLy8gV2UgdXNlIHRoaXMgdG8gZ2V0IGFjY2VzcyB0byB0aGUgcGFyZW50IGNvbnRleHQgYWZ0ZXIgd2UgaGF2ZSBhbHJlYWR5XG4vLyBwdXNoZWQgdGhlIG5leHQgY29udGV4dCBwcm92aWRlciwgYW5kIG5vdyBuZWVkIHRvIG1lcmdlIHRoZWlyIGNvbnRleHRzLlxuXG52YXIgcHJldmlvdXNDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuXG5mdW5jdGlvbiBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZGlkUHVzaE93bkNvbnRleHRJZlByb3ZpZGVyKSB7XG4gIHtcbiAgICBpZiAoZGlkUHVzaE93bkNvbnRleHRJZlByb3ZpZGVyICYmIGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgIC8vIElmIHRoZSBmaWJlciBpcyBhIGNvbnRleHQgcHJvdmlkZXIgaXRzZWxmLCB3aGVuIHdlIHJlYWQgaXRzIGNvbnRleHRcbiAgICAgIC8vIHdlIG1heSBoYXZlIGFscmVhZHkgcHVzaGVkIGl0cyBvd24gY2hpbGQgY29udGV4dCBvbiB0aGUgc3RhY2suIEEgY29udGV4dFxuICAgICAgLy8gcHJvdmlkZXIgc2hvdWxkIG5vdCBcInNlZVwiIGl0cyBvd24gY2hpbGQgY29udGV4dC4gVGhlcmVmb3JlIHdlIHJlYWQgdGhlXG4gICAgICAvLyBwcmV2aW91cyAocGFyZW50KSBjb250ZXh0IGluc3RlYWQgZm9yIGEgY29udGV4dCBwcm92aWRlci5cbiAgICAgIHJldHVybiBwcmV2aW91c0NvbnRleHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhY2hlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0LCBtYXNrZWRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dCA9IHVubWFza2VkQ29udGV4dDtcbiAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dCA9IG1hc2tlZENvbnRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgdmFyIGNvbnRleHRUeXBlcyA9IHR5cGUuY29udGV4dFR5cGVzO1xuXG4gICAgaWYgKCFjb250ZXh0VHlwZXMpIHtcbiAgICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gICAgfSAvLyBBdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyB1bm1hc2tlZCBjb250ZXh0IGhhcyBjaGFuZ2VkLlxuICAgIC8vIEZhaWxpbmcgdG8gZG8gdGhpcyB3aWxsIHJlc3VsdCBpbiB1bm5lY2Vzc2FyeSBjYWxscyB0byBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLlxuICAgIC8vIFRoaXMgbWF5IHRyaWdnZXIgaW5maW5pdGUgbG9vcHMgaWYgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBjYWxscyBzZXRTdGF0ZS5cblxuXG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQgPT09IHVubWFza2VkQ29udGV4dCkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O1xuICAgIH1cblxuICAgIHZhciBjb250ZXh0ID0ge307XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gY29udGV4dFR5cGVzKSB7XG4gICAgICBjb250ZXh0W2tleV0gPSB1bm1hc2tlZENvbnRleHRba2V5XTtcbiAgICB9XG5cbiAgICB7XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdVbmtub3duJztcbiAgICAgIGNoZWNrUHJvcFR5cGVzKGNvbnRleHRUeXBlcywgY29udGV4dCwgJ2NvbnRleHQnLCBuYW1lKTtcbiAgICB9IC8vIENhY2hlIHVubWFza2VkIGNvbnRleHQgc28gd2UgY2FuIGF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIG5lY2Vzc2FyeS5cbiAgICAvLyBDb250ZXh0IGlzIGNyZWF0ZWQgYmVmb3JlIHRoZSBjbGFzcyBjb21wb25lbnQgaXMgaW5zdGFudGlhdGVkIHNvIGNoZWNrIGZvciBpbnN0YW5jZS5cblxuXG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzQ29udGV4dENoYW5nZWQoKSB7XG4gIHtcbiAgICByZXR1cm4gZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvci5jdXJyZW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKHR5cGUpIHtcbiAge1xuICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IHR5cGUuY2hpbGRDb250ZXh0VHlwZXM7XG4gICAgcmV0dXJuIGNoaWxkQ29udGV4dFR5cGVzICE9PSBudWxsICYmIGNoaWxkQ29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wQ29udGV4dChmaWJlcikge1xuICB7XG4gICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGZpYmVyKSB7XG4gIHtcbiAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZmliZXIpO1xuICAgIHBvcChjb250ZXh0U3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGZpYmVyLCBjb250ZXh0LCBkaWRDaGFuZ2UpIHtcbiAge1xuICAgIGlmIChjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudCAhPT0gZW1wdHlDb250ZXh0T2JqZWN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgY29udGV4dCBmb3VuZCBvbiBzdGFjay4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBjb250ZXh0LCBmaWJlcik7XG4gICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRDaGFuZ2UsIGZpYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzQ2hpbGRDb250ZXh0KGZpYmVyLCB0eXBlLCBwYXJlbnRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gICAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gdHlwZS5jaGlsZENvbnRleHRUeXBlczsgLy8gVE9ETyAoYnZhdWdobikgUmVwbGFjZSB0aGlzIGJlaGF2aW9yIHdpdGggYW4gaW52YXJpYW50KCkgaW4gdGhlIGZ1dHVyZS5cbiAgICAvLyBJdCBoYXMgb25seSBiZWVuIGFkZGVkIGluIEZpYmVyIHRvIG1hdGNoIHRoZSAodW5pbnRlbnRpb25hbCkgYmVoYXZpb3IgaW4gU3RhY2suXG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAge1xuICAgICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJztcblxuICAgICAgICBpZiAoIXdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignJXMuY2hpbGRDb250ZXh0VHlwZXMgaXMgc3BlY2lmaWVkIGJ1dCB0aGVyZSBpcyBubyBnZXRDaGlsZENvbnRleHQoKSBtZXRob2QgJyArICdvbiB0aGUgaW5zdGFuY2UuIFlvdSBjYW4gZWl0aGVyIGRlZmluZSBnZXRDaGlsZENvbnRleHQoKSBvbiAlcyBvciByZW1vdmUgJyArICdjaGlsZENvbnRleHRUeXBlcyBmcm9tIGl0LicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJlbnRDb250ZXh0O1xuICAgIH1cblxuICAgIHZhciBjaGlsZENvbnRleHQgPSBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQoKTtcblxuICAgIGZvciAodmFyIGNvbnRleHRLZXkgaW4gY2hpbGRDb250ZXh0KSB7XG4gICAgICBpZiAoIShjb250ZXh0S2V5IGluIGNoaWxkQ29udGV4dFR5cGVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJykgKyBcIi5nZXRDaGlsZENvbnRleHQoKToga2V5IFxcXCJcIiArIGNvbnRleHRLZXkgKyBcIlxcXCIgaXMgbm90IGRlZmluZWQgaW4gY2hpbGRDb250ZXh0VHlwZXMuXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nO1xuICAgICAgY2hlY2tQcm9wVHlwZXMoY2hpbGRDb250ZXh0VHlwZXMsIGNoaWxkQ29udGV4dCwgJ2NoaWxkIGNvbnRleHQnLCBuYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXNzaWduKHt9LCBwYXJlbnRDb250ZXh0LCBjaGlsZENvbnRleHQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsgLy8gV2UgcHVzaCB0aGUgY29udGV4dCBhcyBlYXJseSBhcyBwb3NzaWJsZSB0byBlbnN1cmUgc3RhY2sgaW50ZWdyaXR5LlxuICAgIC8vIElmIHRoZSBpbnN0YW5jZSBkb2VzIG5vdCBleGlzdCB5ZXQsIHdlIHdpbGwgcHVzaCBudWxsIGF0IGZpcnN0LFxuICAgIC8vIGFuZCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBsYXRlciB3aGVuIGludmFsaWRhdGluZyB0aGUgY29udGV4dC5cblxuICAgIHZhciBtZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCA9IGluc3RhbmNlICYmIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0IHx8IGVtcHR5Q29udGV4dE9iamVjdDsgLy8gUmVtZW1iZXIgdGhlIHBhcmVudCBjb250ZXh0IHNvIHdlIGNhbiBtZXJnZSB3aXRoIGl0IGxhdGVyLlxuICAgIC8vIEluaGVyaXQgdGhlIHBhcmVudCdzIGRpZC1wZXJmb3JtLXdvcmsgdmFsdWUgdG8gYXZvaWQgaW5hZHZlcnRlbnRseSBibG9ja2luZyB1cGRhdGVzLlxuXG4gICAgcHJldmlvdXNDb250ZXh0ID0gY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLmN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZhbGlkYXRlQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCB0eXBlLCBkaWRDaGFuZ2UpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gaGF2ZSBhbiBpbnN0YW5jZSBieSB0aGlzIHBvaW50LiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgaWYgKGRpZENoYW5nZSkge1xuICAgICAgLy8gTWVyZ2UgcGFyZW50IGFuZCBvd24gY29udGV4dC5cbiAgICAgIC8vIFNraXAgdGhpcyBpZiB3ZSdyZSBub3QgdXBkYXRpbmcgZHVlIHRvIHNDVS5cbiAgICAgIC8vIFRoaXMgYXZvaWRzIHVubmVjZXNzYXJpbHkgcmVjb21wdXRpbmcgbWVtb2l6ZWQgdmFsdWVzLlxuICAgICAgdmFyIG1lcmdlZENvbnRleHQgPSBwcm9jZXNzQ2hpbGRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB0eXBlLCBwcmV2aW91c0NvbnRleHQpO1xuICAgICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgPSBtZXJnZWRDb250ZXh0OyAvLyBSZXBsYWNlIHRoZSBvbGQgKG9yIGVtcHR5KSBjb250ZXh0IHdpdGggdGhlIG5ldyBvbmUuXG4gICAgICAvLyBJdCBpcyBpbXBvcnRhbnQgdG8gdW53aW5kIHRoZSBjb250ZXh0IGluIHRoZSByZXZlcnNlIG9yZGVyLlxuXG4gICAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpOyAvLyBOb3cgcHVzaCB0aGUgbmV3IGNvbnRleHQgYW5kIG1hcmsgdGhhdCBpdCBoYXMgY2hhbmdlZC5cblxuICAgICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lcmdlZENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcikge1xuICB7XG4gICAgLy8gQ3VycmVudGx5IHRoaXMgaXMgb25seSB1c2VkIHdpdGggcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7IG5vdCBzdXJlIGlmIGl0XG4gICAgLy8gbWFrZXMgc2Vuc2UgZWxzZXdoZXJlXG4gICAgaWYgKCFpc0ZpYmVyTW91bnRlZChmaWJlcikgfHwgZmliZXIudGFnICE9PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBzdWJ0cmVlIHBhcmVudCB0byBiZSBhIG1vdW50ZWQgY2xhc3MgY29tcG9uZW50LiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgdmFyIG5vZGUgPSBmaWJlcjtcblxuICAgIGRvIHtcbiAgICAgIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICByZXR1cm4gbm9kZS5zdGF0ZU5vZGUuY29udGV4dDtcblxuICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBDb21wb25lbnQgPSBub2RlLnR5cGU7XG5cbiAgICAgICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBub2RlLnN0YXRlTm9kZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfSB3aGlsZSAobm9kZSAhPT0gbnVsbCk7XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIHVuZXhwZWN0ZWQgZGV0YWNoZWQgc3VidHJlZSBwYXJlbnQuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxufVxuXG52YXIgTGVnYWN5Um9vdCA9IDA7XG52YXIgQ29uY3VycmVudFJvb3QgPSAxO1xuXG52YXIgc3luY1F1ZXVlID0gbnVsbDtcbnZhciBpbmNsdWRlc0xlZ2FjeVN5bmNDYWxsYmFja3MgPSBmYWxzZTtcbnZhciBpc0ZsdXNoaW5nU3luY1F1ZXVlID0gZmFsc2U7XG5mdW5jdGlvbiBzY2hlZHVsZVN5bmNDYWxsYmFjayhjYWxsYmFjaykge1xuICAvLyBQdXNoIHRoaXMgY2FsbGJhY2sgaW50byBhbiBpbnRlcm5hbCBxdWV1ZS4gV2UnbGwgZmx1c2ggdGhlc2UgZWl0aGVyIGluXG4gIC8vIHRoZSBuZXh0IHRpY2ssIG9yIGVhcmxpZXIgaWYgc29tZXRoaW5nIGNhbGxzIGBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlYC5cbiAgaWYgKHN5bmNRdWV1ZSA9PT0gbnVsbCkge1xuICAgIHN5bmNRdWV1ZSA9IFtjYWxsYmFja107XG4gIH0gZWxzZSB7XG4gICAgLy8gUHVzaCBvbnRvIGV4aXN0aW5nIHF1ZXVlLiBEb24ndCBuZWVkIHRvIHNjaGVkdWxlIGEgY2FsbGJhY2sgYmVjYXVzZVxuICAgIC8vIHdlIGFscmVhZHkgc2NoZWR1bGVkIG9uZSB3aGVuIHdlIGNyZWF0ZWQgdGhlIHF1ZXVlLlxuICAgIHN5bmNRdWV1ZS5wdXNoKGNhbGxiYWNrKTtcbiAgfVxufVxuZnVuY3Rpb24gc2NoZWR1bGVMZWdhY3lTeW5jQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzID0gdHJ1ZTtcbiAgc2NoZWR1bGVTeW5jQ2FsbGJhY2soY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gZmx1c2hTeW5jQ2FsbGJhY2tzT25seUluTGVnYWN5TW9kZSgpIHtcbiAgLy8gT25seSBmbHVzaGVzIHRoZSBxdWV1ZSBpZiB0aGVyZSdzIGEgbGVnYWN5IHN5bmMgY2FsbGJhY2sgc2NoZWR1bGVkLlxuICAvLyBUT0RPOiBUaGVyZSdzIG9ubHkgYSBzaW5nbGUgdHlwZSBvZiBjYWxsYmFjazogcGVyZm9ybVN5bmNPbldvcmtPblJvb3QuIFNvXG4gIC8vIGl0IG1pZ2h0IG1ha2UgbW9yZSBzZW5zZSBmb3IgdGhlIHF1ZXVlIHRvIGJlIGEgbGlzdCBvZiByb290cyBpbnN0ZWFkIG9mIGFcbiAgLy8gbGlzdCBvZiBnZW5lcmljIGNhbGxiYWNrcy4gVGhlbiB3ZSBjYW4gaGF2ZSB0d286IG9uZSBmb3IgbGVnYWN5IHJvb3RzLCBvbmVcbiAgLy8gZm9yIGNvbmN1cnJlbnQgcm9vdHMuIEFuZCB0aGlzIG1ldGhvZCB3b3VsZCBvbmx5IGZsdXNoIHRoZSBsZWdhY3kgb25lcy5cbiAgaWYgKGluY2x1ZGVzTGVnYWN5U3luY0NhbGxiYWNrcykge1xuICAgIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuICB9XG59XG5mdW5jdGlvbiBmbHVzaFN5bmNDYWxsYmFja3MoKSB7XG4gIGlmICghaXNGbHVzaGluZ1N5bmNRdWV1ZSAmJiBzeW5jUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBQcmV2ZW50IHJlLWVudHJhbmNlLlxuICAgIGlzRmx1c2hpbmdTeW5jUXVldWUgPSB0cnVlO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcHJldmlvdXNVcGRhdGVQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBpc1N5bmMgPSB0cnVlO1xuICAgICAgdmFyIHF1ZXVlID0gc3luY1F1ZXVlOyAvLyBUT0RPOiBJcyB0aGlzIG5lY2Vzc2FyeSBhbnltb3JlPyBUaGUgb25seSB1c2VyIGNvZGUgdGhhdCBydW5zIGluIHRoaXNcbiAgICAgIC8vIHF1ZXVlIGlzIGluIHRoZSByZW5kZXIgb3IgY29tbWl0IHBoYXNlcy5cblxuICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG5cbiAgICAgIGZvciAoOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gcXVldWVbaV07XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2soaXNTeW5jKTtcbiAgICAgICAgfSB3aGlsZSAoY2FsbGJhY2sgIT09IG51bGwpO1xuICAgICAgfVxuXG4gICAgICBzeW5jUXVldWUgPSBudWxsO1xuICAgICAgaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzID0gZmFsc2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJvd3MsIGxlYXZlIHRoZSByZW1haW5pbmcgY2FsbGJhY2tzIG9uIHRoZSBxdWV1ZS5cbiAgICAgIGlmIChzeW5jUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgc3luY1F1ZXVlID0gc3luY1F1ZXVlLnNsaWNlKGkgKyAxKTtcbiAgICAgIH0gLy8gUmVzdW1lIGZsdXNoaW5nIGluIHRoZSBuZXh0IHRpY2tcblxuXG4gICAgICBzY2hlZHVsZUNhbGxiYWNrKEltbWVkaWF0ZVByaW9yaXR5LCBmbHVzaFN5bmNDYWxsYmFja3MpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1VwZGF0ZVByaW9yaXR5KTtcbiAgICAgIGlzRmx1c2hpbmdTeW5jUXVldWUgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gVE9ETzogVXNlIHRoZSB1bmlmaWVkIGZpYmVyIHN0YWNrIG1vZHVsZSBpbnN0ZWFkIG9mIHRoaXMgbG9jYWwgb25lP1xuLy8gSW50ZW50aW9uYWxseSBub3QgdXNpbmcgaXQgeWV0IHRvIGRlcmlzayB0aGUgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiwgYmVjYXVzZVxuLy8gdGhlIHdheSB3ZSBwdXNoL3BvcCB0aGVzZSB2YWx1ZXMgaXMgYSBiaXQgdW51c3VhbC4gSWYgdGhlcmUncyBhIG1pc3Rha2UsIEknZFxuLy8gcmF0aGVyIHRoZSBpZHMgYmUgd3JvbmcgdGhhbiBjcmFzaCB0aGUgd2hvbGUgcmVjb25jaWxlci5cbnZhciBmb3JrU3RhY2sgPSBbXTtcbnZhciBmb3JrU3RhY2tJbmRleCA9IDA7XG52YXIgdHJlZUZvcmtQcm92aWRlciA9IG51bGw7XG52YXIgdHJlZUZvcmtDb3VudCA9IDA7XG52YXIgaWRTdGFjayA9IFtdO1xudmFyIGlkU3RhY2tJbmRleCA9IDA7XG52YXIgdHJlZUNvbnRleHRQcm92aWRlciA9IG51bGw7XG52YXIgdHJlZUNvbnRleHRJZCA9IDE7XG52YXIgdHJlZUNvbnRleHRPdmVyZmxvdyA9ICcnO1xuZnVuY3Rpb24gaXNGb3JrZWRDaGlsZCh3b3JrSW5Qcm9ncmVzcykge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgcmV0dXJuICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmtlZCkgIT09IE5vRmxhZ3M7XG59XG5mdW5jdGlvbiBnZXRGb3Jrc0F0TGV2ZWwod29ya0luUHJvZ3Jlc3MpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIHJldHVybiB0cmVlRm9ya0NvdW50O1xufVxuZnVuY3Rpb24gZ2V0VHJlZUlkKCkge1xuICB2YXIgb3ZlcmZsb3cgPSB0cmVlQ29udGV4dE92ZXJmbG93O1xuICB2YXIgaWRXaXRoTGVhZGluZ0JpdCA9IHRyZWVDb250ZXh0SWQ7XG4gIHZhciBpZCA9IGlkV2l0aExlYWRpbmdCaXQgJiB+Z2V0TGVhZGluZ0JpdChpZFdpdGhMZWFkaW5nQml0KTtcbiAgcmV0dXJuIGlkLnRvU3RyaW5nKDMyKSArIG92ZXJmbG93O1xufVxuZnVuY3Rpb24gcHVzaFRyZWVGb3JrKHdvcmtJblByb2dyZXNzLCB0b3RhbENoaWxkcmVuKSB7XG4gIC8vIFRoaXMgaXMgY2FsbGVkIHJpZ2h0IGFmdGVyIHdlIHJlY29uY2lsZSBhbiBhcnJheSAob3IgaXRlcmF0b3IpIG9mIGNoaWxkXG4gIC8vIGZpYmVycywgYmVjYXVzZSB0aGF0J3MgdGhlIG9ubHkgcGxhY2Ugd2hlcmUgd2Uga25vdyBob3cgbWFueSBjaGlsZHJlbiBpblxuICAvLyB0aGUgd2hvbGUgc2V0IHdpdGhvdXQgZG9pbmcgZXh0cmEgd29yayBsYXRlciwgb3Igc3RvcmluZyBhZGR0aW9uYWxcbiAgLy8gaW5mb3JtYXRpb24gb24gdGhlIGZpYmVyLlxuICAvL1xuICAvLyBUaGF0J3Mgd2h5IHRoaXMgZnVuY3Rpb24gaXMgc2VwYXJhdGUgZnJvbSBwdXNoVHJlZUlkIOKAlCBpdCdzIGNhbGxlZCBkdXJpbmdcbiAgLy8gdGhlIHJlbmRlciBwaGFzZSBvZiB0aGUgZm9yayBwYXJlbnQsIG5vdCB0aGUgY2hpbGQsIHdoaWNoIGlzIHdoZXJlIHdlIHB1c2hcbiAgLy8gdGhlIG90aGVyIGNvbnRleHQgdmFsdWVzLlxuICAvL1xuICAvLyBJbiB0aGUgRml6eiBpbXBsZW1lbnRhdGlvbiB0aGlzIGlzIG11Y2ggc2ltcGxlciBiZWNhdXNlIHRoZSBjaGlsZCBpc1xuICAvLyByZW5kZXJlZCBpbiB0aGUgc2FtZSBjYWxsc3RhY2sgYXMgdGhlIHBhcmVudC5cbiAgLy9cbiAgLy8gSXQgbWlnaHQgYmUgYmV0dGVyIHRvIGp1c3QgYWRkIGEgYGZvcmtzYCBmaWVsZCB0byB0aGUgRmliZXIgdHlwZS4gSXQgd291bGRcbiAgLy8gbWFrZSB0aGlzIG1vZHVsZSBzaW1wbGVyLlxuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4KytdID0gdHJlZUZvcmtDb3VudDtcbiAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4KytdID0gdHJlZUZvcmtQcm92aWRlcjtcbiAgdHJlZUZvcmtQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xuICB0cmVlRm9ya0NvdW50ID0gdG90YWxDaGlsZHJlbjtcbn1cbmZ1bmN0aW9uIHB1c2hUcmVlSWQod29ya0luUHJvZ3Jlc3MsIHRvdGFsQ2hpbGRyZW4sIGluZGV4KSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0SWQ7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRPdmVyZmxvdztcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dFByb3ZpZGVyO1xuICB0cmVlQ29udGV4dFByb3ZpZGVyID0gd29ya0luUHJvZ3Jlc3M7XG4gIHZhciBiYXNlSWRXaXRoTGVhZGluZ0JpdCA9IHRyZWVDb250ZXh0SWQ7XG4gIHZhciBiYXNlT3ZlcmZsb3cgPSB0cmVlQ29udGV4dE92ZXJmbG93OyAvLyBUaGUgbGVmdG1vc3QgMSBtYXJrcyB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZSwgbm9uLWluY2x1c2l2ZS4gSXQncyBub3QgcGFydFxuICAvLyBvZiB0aGUgaWQ7IHdlIHVzZSBpdCB0byBhY2NvdW50IGZvciBsZWFkaW5nIDBzLlxuXG4gIHZhciBiYXNlTGVuZ3RoID0gZ2V0Qml0TGVuZ3RoKGJhc2VJZFdpdGhMZWFkaW5nQml0KSAtIDE7XG4gIHZhciBiYXNlSWQgPSBiYXNlSWRXaXRoTGVhZGluZ0JpdCAmIH4oMSA8PCBiYXNlTGVuZ3RoKTtcbiAgdmFyIHNsb3QgPSBpbmRleCArIDE7XG4gIHZhciBsZW5ndGggPSBnZXRCaXRMZW5ndGgodG90YWxDaGlsZHJlbikgKyBiYXNlTGVuZ3RoOyAvLyAzMCBpcyB0aGUgbWF4IGxlbmd0aCB3ZSBjYW4gc3RvcmUgd2l0aG91dCBvdmVyZmxvd2luZywgdGFraW5nIGludG9cbiAgLy8gY29uc2lkZXJhdGlvbiB0aGUgbGVhZGluZyAxIHdlIHVzZSB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLlxuXG4gIGlmIChsZW5ndGggPiAzMCkge1xuICAgIC8vIFdlIG92ZXJmbG93ZWQgdGhlIGJpdHdpc2Utc2FmZSByYW5nZS4gRmFsbCBiYWNrIHRvIHNsb3dlciBhbGdvcml0aG0uXG4gICAgLy8gVGhpcyBicmFuY2ggYXNzdW1lcyB0aGUgbGVuZ3RoIG9mIHRoZSBiYXNlIGlkIGlzIGdyZWF0ZXIgdGhhbiA1OyBpdCB3b24ndFxuICAgIC8vIHdvcmsgZm9yIHNtYWxsZXIgaWRzLCBiZWNhdXNlIHlvdSBuZWVkIDUgYml0cyBwZXIgY2hhcmFjdGVyLlxuICAgIC8vXG4gICAgLy8gV2UgZW5jb2RlIHRoZSBpZCBpbiBtdWx0aXBsZSBzdGVwczogZmlyc3QgdGhlIGJhc2UgaWQsIHRoZW4gdGhlXG4gICAgLy8gcmVtYWluaW5nIGRpZ2l0cy5cbiAgICAvL1xuICAgIC8vIEVhY2ggNSBiaXQgc2VxdWVuY2UgY29ycmVzcG9uZHMgdG8gYSBzaW5nbGUgYmFzZSAzMiBjaGFyYWN0ZXIuIFNvIGZvclxuICAgIC8vIGV4YW1wbGUsIGlmIHRoZSBjdXJyZW50IGlkIGlzIDIzIGJpdHMgbG9uZywgd2UgY2FuIGNvbnZlcnQgMjAgb2YgdGhvc2VcbiAgICAvLyBiaXRzIGludG8gYSBzdHJpbmcgb2YgNCBjaGFyYWN0ZXJzLCB3aXRoIDMgYml0cyBsZWZ0IG92ZXIuXG4gICAgLy9cbiAgICAvLyBGaXJzdCBjYWxjdWxhdGUgaG93IG1hbnkgYml0cyBpbiB0aGUgYmFzZSBpZCByZXByZXNlbnQgYSBjb21wbGV0ZVxuICAgIC8vIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMuXG4gICAgdmFyIG51bWJlck9mT3ZlcmZsb3dCaXRzID0gYmFzZUxlbmd0aCAtIGJhc2VMZW5ndGggJSA1OyAvLyBUaGVuIGNyZWF0ZSBhIGJpdG1hc2sgdGhhdCBzZWxlY3RzIG9ubHkgdGhvc2UgYml0cy5cblxuICAgIHZhciBuZXdPdmVyZmxvd0JpdHMgPSAoMSA8PCBudW1iZXJPZk92ZXJmbG93Qml0cykgLSAxOyAvLyBTZWxlY3QgdGhlIGJpdHMsIGFuZCBjb252ZXJ0IHRoZW0gdG8gYSBiYXNlIDMyIHN0cmluZy5cblxuICAgIHZhciBuZXdPdmVyZmxvdyA9IChiYXNlSWQgJiBuZXdPdmVyZmxvd0JpdHMpLnRvU3RyaW5nKDMyKTsgLy8gTm93IHdlIGNhbiByZW1vdmUgdGhvc2UgYml0cyBmcm9tIHRoZSBiYXNlIGlkLlxuXG4gICAgdmFyIHJlc3RPZkJhc2VJZCA9IGJhc2VJZCA+PiBudW1iZXJPZk92ZXJmbG93Qml0cztcbiAgICB2YXIgcmVzdE9mQmFzZUxlbmd0aCA9IGJhc2VMZW5ndGggLSBudW1iZXJPZk92ZXJmbG93Qml0czsgLy8gRmluYWxseSwgZW5jb2RlIHRoZSByZXN0IG9mIHRoZSBiaXRzIHVzaW5nIHRoZSBub3JtYWwgYWxnb3JpdGhtLiBCZWNhdXNlXG4gICAgLy8gd2UgbWFkZSBtb3JlIHJvb20sIHRoaXMgdGltZSBpdCB3b24ndCBvdmVyZmxvdy5cblxuICAgIHZhciByZXN0T2ZMZW5ndGggPSBnZXRCaXRMZW5ndGgodG90YWxDaGlsZHJlbikgKyByZXN0T2ZCYXNlTGVuZ3RoO1xuICAgIHZhciByZXN0T2ZOZXdCaXRzID0gc2xvdCA8PCByZXN0T2ZCYXNlTGVuZ3RoO1xuICAgIHZhciBpZCA9IHJlc3RPZk5ld0JpdHMgfCByZXN0T2ZCYXNlSWQ7XG4gICAgdmFyIG92ZXJmbG93ID0gbmV3T3ZlcmZsb3cgKyBiYXNlT3ZlcmZsb3c7XG4gICAgdHJlZUNvbnRleHRJZCA9IDEgPDwgcmVzdE9mTGVuZ3RoIHwgaWQ7XG4gICAgdHJlZUNvbnRleHRPdmVyZmxvdyA9IG92ZXJmbG93O1xuICB9IGVsc2Uge1xuICAgIC8vIE5vcm1hbCBwYXRoXG4gICAgdmFyIG5ld0JpdHMgPSBzbG90IDw8IGJhc2VMZW5ndGg7XG5cbiAgICB2YXIgX2lkID0gbmV3Qml0cyB8IGJhc2VJZDtcblxuICAgIHZhciBfb3ZlcmZsb3cgPSBiYXNlT3ZlcmZsb3c7XG4gICAgdHJlZUNvbnRleHRJZCA9IDEgPDwgbGVuZ3RoIHwgX2lkO1xuICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBfb3ZlcmZsb3c7XG4gIH1cbn1cbmZ1bmN0aW9uIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7IC8vIFRoaXMgY29tcG9uZW50IG1hdGVyaWFsaXplZCBhbiBpZC4gVGhpcyB3aWxsIGFmZmVjdCBhbnkgaWRzIHRoYXQgYXBwZWFyXG4gIC8vIGluIGl0cyBjaGlsZHJlbi5cblxuICB2YXIgcmV0dXJuRmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG5cbiAgaWYgKHJldHVybkZpYmVyICE9PSBudWxsKSB7XG4gICAgdmFyIG51bWJlck9mRm9ya3MgPSAxO1xuICAgIHZhciBzbG90SW5kZXggPSAwO1xuICAgIHB1c2hUcmVlRm9yayh3b3JrSW5Qcm9ncmVzcywgbnVtYmVyT2ZGb3Jrcyk7XG4gICAgcHVzaFRyZWVJZCh3b3JrSW5Qcm9ncmVzcywgbnVtYmVyT2ZGb3Jrcywgc2xvdEluZGV4KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRCaXRMZW5ndGgobnVtYmVyKSB7XG4gIHJldHVybiAzMiAtIGNsejMyKG51bWJlcik7XG59XG5cbmZ1bmN0aW9uIGdldExlYWRpbmdCaXQoaWQpIHtcbiAgcmV0dXJuIDEgPDwgZ2V0Qml0TGVuZ3RoKGlkKSAtIDE7XG59XG5cbmZ1bmN0aW9uIHBvcFRyZWVDb250ZXh0KHdvcmtJblByb2dyZXNzKSB7XG4gIC8vIFJlc3RvcmUgdGhlIHByZXZpb3VzIHZhbHVlcy5cbiAgLy8gVGhpcyBpcyBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gb3RoZXIgY29udGV4dC1saWtlIG1vZHVsZXMgaW4gRmliZXJcbiAgLy8gYmVjYXVzZSB0aGUgc2FtZSBGaWJlciBtYXkgYXBwZWFyIG9uIHRoZSBzdGFjayBtdWx0aXBsZSB0aW1lcyBhbmQgZm9yXG4gIC8vIGRpZmZlcmVudCByZWFzb25zLiBXZSBoYXZlIHRvIGtlZXAgcG9wcGluZyB1bnRpbCB0aGUgd29yay1pbi1wcm9ncmVzcyBpc1xuICAvLyBubyBsb25nZXIgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2suXG4gIHdoaWxlICh3b3JrSW5Qcm9ncmVzcyA9PT0gdHJlZUZvcmtQcm92aWRlcikge1xuICAgIHRyZWVGb3JrUHJvdmlkZXIgPSBmb3JrU3RhY2tbLS1mb3JrU3RhY2tJbmRleF07XG4gICAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4XSA9IG51bGw7XG4gICAgdHJlZUZvcmtDb3VudCA9IGZvcmtTdGFja1stLWZvcmtTdGFja0luZGV4XTtcbiAgICBmb3JrU3RhY2tbZm9ya1N0YWNrSW5kZXhdID0gbnVsbDtcbiAgfVxuXG4gIHdoaWxlICh3b3JrSW5Qcm9ncmVzcyA9PT0gdHJlZUNvbnRleHRQcm92aWRlcikge1xuICAgIHRyZWVDb250ZXh0UHJvdmlkZXIgPSBpZFN0YWNrWy0taWRTdGFja0luZGV4XTtcbiAgICBpZFN0YWNrW2lkU3RhY2tJbmRleF0gPSBudWxsO1xuICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBpZFN0YWNrWy0taWRTdGFja0luZGV4XTtcbiAgICBpZFN0YWNrW2lkU3RhY2tJbmRleF0gPSBudWxsO1xuICAgIHRyZWVDb250ZXh0SWQgPSBpZFN0YWNrWy0taWRTdGFja0luZGV4XTtcbiAgICBpZFN0YWNrW2lkU3RhY2tJbmRleF0gPSBudWxsO1xuICB9XG59XG5mdW5jdGlvbiBnZXRTdXNwZW5kZWRUcmVlQ29udGV4dCgpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG5cbiAgaWYgKHRyZWVDb250ZXh0UHJvdmlkZXIgIT09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRyZWVDb250ZXh0SWQsXG4gICAgICBvdmVyZmxvdzogdHJlZUNvbnRleHRPdmVyZmxvd1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVTdXNwZW5kZWRUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuZGVkQ29udGV4dCkge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dElkO1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0T3ZlcmZsb3c7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRQcm92aWRlcjtcbiAgdHJlZUNvbnRleHRJZCA9IHN1c3BlbmRlZENvbnRleHQuaWQ7XG4gIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBzdXNwZW5kZWRDb250ZXh0Lm92ZXJmbG93O1xuICB0cmVlQ29udGV4dFByb3ZpZGVyID0gd29ya0luUHJvZ3Jlc3M7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZk5vdEh5ZHJhdGluZygpIHtcbiAge1xuICAgIGlmICghZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHRvIGJlIGh5ZHJhdGluZy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgJyArICdhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhpcyBtYXkgaGF2ZSBiZWVuIGFuIGluc2VydGlvbiBvciBhIGh5ZHJhdGlvbi5cblxudmFyIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gbnVsbDtcbnZhciBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbnZhciBpc0h5ZHJhdGluZyA9IGZhbHNlOyAvLyBUaGlzIGZsYWcgYWxsb3dzIGZvciB3YXJuaW5nIHN1cHJlc3Npb24gd2hlbiB3ZSBleHBlY3QgdGhlcmUgdG8gYmUgbWlzbWF0Y2hlc1xuLy8gZHVlIHRvIGVhcmxpZXIgbWlzbWF0Y2hlcyBvciBhIHN1c3BlbmRlZCBmaWJlci5cblxudmFyIGRpZFN1c3BlbmRPckVycm9yREVWID0gZmFsc2U7IC8vIEh5ZHJhdGlvbiBlcnJvcnMgdGhhdCB3ZXJlIHRocm93biBpbnNpZGUgdGhpcyBib3VuZGFyeVxuXG52YXIgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcblxuZnVuY3Rpb24gd2FybklmSHlkcmF0aW5nKCkge1xuICB7XG4gICAgaWYgKGlzSHlkcmF0aW5nKSB7XG4gICAgICBlcnJvcignV2Ugc2hvdWxkIG5vdCBiZSBoeWRyYXRpbmcgaGVyZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYSBidWcuJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtEaWRUaHJvd1doaWxlSHlkcmF0aW5nREVWKCkge1xuICB7XG4gICAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSB0cnVlO1xuICB9XG59XG5mdW5jdGlvbiBkaWRTdXNwZW5kT3JFcnJvcldoaWxlSHlkcmF0aW5nREVWKCkge1xuICB7XG4gICAgcmV0dXJuIGRpZFN1c3BlbmRPckVycm9yREVWO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVudGVySHlkcmF0aW9uU3RhdGUoZmliZXIpIHtcblxuICB2YXIgcGFyZW50SW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkV2l0aGluQ29udGFpbmVyKHBhcmVudEluc3RhbmNlKTtcbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgaXNIeWRyYXRpbmcgPSB0cnVlO1xuICBoeWRyYXRpb25FcnJvcnMgPSBudWxsO1xuICBkaWRTdXNwZW5kT3JFcnJvckRFViA9IGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVlbnRlckh5ZHJhdGlvblN0YXRlRnJvbURlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKGZpYmVyLCBzdXNwZW5zZUluc3RhbmNlLCB0cmVlQ29udGV4dCkge1xuXG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpblN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gIGlzSHlkcmF0aW5nID0gdHJ1ZTtcbiAgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcbiAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTtcblxuICBpZiAodHJlZUNvbnRleHQgIT09IG51bGwpIHtcbiAgICByZXN0b3JlU3VzcGVuZGVkVHJlZUNvbnRleHQoZmliZXIsIHRyZWVDb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB3YXJuVW5oeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBpbnN0YW5jZSkge1xuICB7XG4gICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5Db250YWluZXIocmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8sIGluc3RhbmNlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gICAgICAgICAgZGlkTm90SHlkcmF0ZUluc3RhbmNlKHJldHVybkZpYmVyLnR5cGUsIHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHMsIHJldHVybkZpYmVyLnN0YXRlTm9kZSwgaW5zdGFuY2UsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgaXNDb25jdXJyZW50TW9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gcmV0dXJuRmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICBpZiAoc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCwgaW5zdGFuY2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShyZXR1cm5GaWJlciwgaW5zdGFuY2UpIHtcbiAgd2FyblVuaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgaW5zdGFuY2UpO1xuICB2YXIgY2hpbGRUb0RlbGV0ZSA9IGNyZWF0ZUZpYmVyRnJvbUhvc3RJbnN0YW5jZUZvckRlbGV0aW9uKCk7XG4gIGNoaWxkVG9EZWxldGUuc3RhdGVOb2RlID0gaW5zdGFuY2U7XG4gIGNoaWxkVG9EZWxldGUucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gIHZhciBkZWxldGlvbnMgPSByZXR1cm5GaWJlci5kZWxldGlvbnM7XG5cbiAgaWYgKGRlbGV0aW9ucyA9PT0gbnVsbCkge1xuICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjaGlsZFRvRGVsZXRlXTtcbiAgICByZXR1cm5GaWJlci5mbGFncyB8PSBDaGlsZERlbGV0aW9uO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0aW9ucy5wdXNoKGNoaWxkVG9EZWxldGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5Ob25oeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBmaWJlcikge1xuICB7XG4gICAgaWYgKGRpZFN1c3BlbmRPckVycm9yREVWKSB7XG4gICAgICAvLyBJbnNpZGUgYSBib3VuZGFyeSB0aGF0IGFscmVhZHkgc3VzcGVuZGVkLiBXZSdyZSBjdXJyZW50bHkgcmVuZGVyaW5nIHRoZVxuICAgICAgLy8gc2libGluZ3Mgb2YgYSBzdXNwZW5kZWQgbm9kZS4gVGhlIG1pc21hdGNoIG1heSBiZSBkdWUgdG8gdGhlIG1pc3NpbmdcbiAgICAgIC8vIGRhdGEsIHNvIGl0J3MgcHJvYmFibHkgYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBwYXJlbnRDb250YWluZXIgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgIHZhciB0eXBlID0gZmliZXIudHlwZTtcbiAgICAgICAgICAgICAgdmFyIHByb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdHlwZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICAgICAgICB2YXIgdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2VXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyLCB0ZXh0KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHBhcmVudFR5cGUgPSByZXR1cm5GaWJlci50eXBlO1xuICAgICAgICAgIHZhciBwYXJlbnRQcm9wcyA9IHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgdmFyIHBhcmVudEluc3RhbmNlID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBfdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgICAgdmFyIF9wcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gICAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIF90eXBlLCBfcHJvcHMsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgICAgICAgaXNDb25jdXJyZW50TW9kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBfdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wcztcblxuICAgICAgICAgICAgICAgIHZhciBfaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG5cbiAgICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIF90ZXh0LCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgICAgIF9pc0NvbmN1cnJlbnRNb2RlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHJldHVybkZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIF9wYXJlbnRJbnN0YW5jZSA9IHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZDtcbiAgICAgICAgICBpZiAoX3BhcmVudEluc3RhbmNlICE9PSBudWxsKSBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICB2YXIgX3R5cGUyID0gZmliZXIudHlwZTtcbiAgICAgICAgICAgICAgdmFyIF9wcm9wczIgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKF9wYXJlbnRJbnN0YW5jZSwgX3R5cGUyKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICAgICAgICAgIHZhciBfdGV4dDIgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShfcGFyZW50SW5zdGFuY2UsIF90ZXh0Mik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydE5vbkh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGZpYmVyKSB7XG4gIGZpYmVyLmZsYWdzID0gZmliZXIuZmxhZ3MgJiB+SHlkcmF0aW5nIHwgUGxhY2VtZW50O1xuICB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiB0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpIHtcbiAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciB0eXBlID0gZmliZXIudHlwZTtcbiAgICAgICAgdmFyIHByb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBjYW5IeWRyYXRlSW5zdGFuY2UobmV4dEluc3RhbmNlLCB0eXBlKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBmaWJlci5zdGF0ZU5vZGUgPSBpbnN0YW5jZTtcbiAgICAgICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICAgICAgICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZChpbnN0YW5jZSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICB2YXIgdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIHRleHRJbnN0YW5jZSA9IGNhbkh5ZHJhdGVUZXh0SW5zdGFuY2UobmV4dEluc3RhbmNlLCB0ZXh0KTtcblxuICAgICAgICBpZiAodGV4dEluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgZmliZXIuc3RhdGVOb2RlID0gdGV4dEluc3RhbmNlO1xuICAgICAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7IC8vIFRleHQgSW5zdGFuY2VzIGRvbid0IGhhdmUgY2hpbGRyZW4gc28gdGhlcmUncyBub3RoaW5nIHRvIGh5ZHJhdGUuXG5cbiAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBzdXNwZW5zZUluc3RhbmNlID0gY2FuSHlkcmF0ZVN1c3BlbnNlSW5zdGFuY2UobmV4dEluc3RhbmNlKTtcblxuICAgICAgICBpZiAoc3VzcGVuc2VJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0ge1xuICAgICAgICAgICAgZGVoeWRyYXRlZDogc3VzcGVuc2VJbnN0YW5jZSxcbiAgICAgICAgICAgIHRyZWVDb250ZXh0OiBnZXRTdXNwZW5kZWRUcmVlQ29udGV4dCgpLFxuICAgICAgICAgICAgcmV0cnlMYW5lOiBPZmZzY3JlZW5MYW5lXG4gICAgICAgICAgfTtcbiAgICAgICAgICBmaWJlci5tZW1vaXplZFN0YXRlID0gc3VzcGVuc2VTdGF0ZTsgLy8gU3RvcmUgdGhlIGRlaHlkcmF0ZWQgZnJhZ21lbnQgYXMgYSBjaGlsZCBmaWJlci5cbiAgICAgICAgICAvLyBUaGlzIHNpbXBsaWZpZXMgdGhlIGNvZGUgZm9yIGdldEhvc3RTaWJsaW5nIGFuZCBkZWxldGluZyBub2RlcyxcbiAgICAgICAgICAvLyBzaW5jZSBpdCBkb2Vzbid0IGhhdmUgdG8gY29uc2lkZXIgYWxsIFN1c3BlbnNlIGJvdW5kYXJpZXMgYW5kXG4gICAgICAgICAgLy8gY2hlY2sgaWYgdGhleSdyZSBkZWh5ZHJhdGVkIG9uZXMgb3Igbm90LlxuXG4gICAgICAgICAgdmFyIGRlaHlkcmF0ZWRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbURlaHlkcmF0ZWRGcmFnbWVudChzdXNwZW5zZUluc3RhbmNlKTtcbiAgICAgICAgICBkZWh5ZHJhdGVkRnJhZ21lbnQucmV0dXJuID0gZmliZXI7XG4gICAgICAgICAgZmliZXIuY2hpbGQgPSBkZWh5ZHJhdGVkRnJhZ21lbnQ7XG4gICAgICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjsgLy8gV2hpbGUgYSBTdXNwZW5zZSBJbnN0YW5jZSBkb2VzIGhhdmUgY2hpbGRyZW4sIHdlIHdvbid0IHN0ZXAgaW50b1xuICAgICAgICAgIC8vIGl0IGR1cmluZyB0aGUgZmlyc3QgcGFzcy4gSW5zdGVhZCwgd2UnbGwgcmVlbnRlciBpdCBsYXRlci5cblxuICAgICAgICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBudWxsO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDbGllbnRSZW5kZXJPbk1pc21hdGNoKGZpYmVyKSB7XG4gIHJldHVybiAoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlICYmIChmaWJlci5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzO1xufVxuXG5mdW5jdGlvbiB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2goZmliZXIpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdIeWRyYXRpb24gZmFpbGVkIGJlY2F1c2UgdGhlIGluaXRpYWwgVUkgZG9lcyBub3QgbWF0Y2ggd2hhdCB3YXMgJyArICdyZW5kZXJlZCBvbiB0aGUgc2VydmVyLicpO1xufVxuXG5mdW5jdGlvbiB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZShmaWJlcikge1xuICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIG5leHRJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG5cbiAgaWYgKCFuZXh0SW5zdGFuY2UpIHtcbiAgICBpZiAoc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikpIHtcbiAgICAgIHdhcm5Ob25oeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgICB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2goKTtcbiAgICB9IC8vIE5vdGhpbmcgdG8gaHlkcmF0ZS4gTWFrZSBpdCBhbiBpbnNlcnRpb24uXG5cblxuICAgIGluc2VydE5vbkh5ZHJhdGVkSW5zdGFuY2UoaHlkcmF0aW9uUGFyZW50RmliZXIsIGZpYmVyKTtcbiAgICBpc0h5ZHJhdGluZyA9IGZhbHNlO1xuICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UgPSBuZXh0SW5zdGFuY2U7XG5cbiAgaWYgKCF0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpKSB7XG4gICAgaWYgKHNob3VsZENsaWVudFJlbmRlck9uTWlzbWF0Y2goZmliZXIpKSB7XG4gICAgICB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpO1xuICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKCk7XG4gICAgfSAvLyBJZiB3ZSBjYW4ndCBoeWRyYXRlIHRoaXMgaW5zdGFuY2UgbGV0J3MgdHJ5IHRoZSBuZXh0IG9uZS5cbiAgICAvLyBXZSB1c2UgdGhpcyBhcyBhIGhldXJpc3RpYy4gSXQncyBiYXNlZCBvbiBpbnR1aXRpb24gYW5kIG5vdCBkYXRhIHNvIGl0XG4gICAgLy8gbWlnaHQgYmUgZmxhd2VkIG9yIHVubmVjZXNzYXJ5LlxuXG5cbiAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoZmlyc3RBdHRlbXB0ZWRJbnN0YW5jZSk7XG4gICAgdmFyIHByZXZIeWRyYXRpb25QYXJlbnRGaWJlciA9IGh5ZHJhdGlvblBhcmVudEZpYmVyO1xuXG4gICAgaWYgKCFuZXh0SW5zdGFuY2UgfHwgIXRyeUh5ZHJhdGUoZmliZXIsIG5leHRJbnN0YW5jZSkpIHtcbiAgICAgIC8vIE5vdGhpbmcgdG8gaHlkcmF0ZS4gTWFrZSBpdCBhbiBpbnNlcnRpb24uXG4gICAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgICBpc0h5ZHJhdGluZyA9IGZhbHNlO1xuICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFdlIG1hdGNoZWQgdGhlIG5leHQgb25lLCB3ZSdsbCBub3cgYXNzdW1lIHRoYXQgdGhlIGZpcnN0IG9uZSB3YXNcbiAgICAvLyBzdXBlcmZsdW91cyBhbmQgd2UnbGwgZGVsZXRlIGl0LiBTaW5jZSB3ZSBjYW4ndCBlYWdlcmx5IGRlbGV0ZSBpdFxuICAgIC8vIHdlJ2xsIGhhdmUgdG8gc2NoZWR1bGUgYSBkZWxldGlvbi4gVG8gZG8gdGhhdCwgdGhpcyBub2RlIG5lZWRzIGEgZHVtbXlcbiAgICAvLyBmaWJlciBhc3NvY2lhdGVkIHdpdGggaXQuXG5cblxuICAgIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShwcmV2SHlkcmF0aW9uUGFyZW50RmliZXIsIGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVUb0h5ZHJhdGVIb3N0SW5zdGFuY2UoZmliZXIsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQpIHtcblxuICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gIHZhciBzaG91bGRXYXJuSWZNaXNtYXRjaERldiA9ICFkaWRTdXNwZW5kT3JFcnJvckRFVjtcbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBoeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIGZpYmVyLnR5cGUsIGZpYmVyLm1lbW9pemVkUHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGZpYmVyLCBzaG91bGRXYXJuSWZNaXNtYXRjaERldik7IC8vIFRPRE86IFR5cGUgdGhpcyBzcGVjaWZpYyB0byB0aGlzIHR5cGUgb2YgY29tcG9uZW50LlxuXG4gIGZpYmVyLnVwZGF0ZVF1ZXVlID0gdXBkYXRlUGF5bG9hZDsgLy8gSWYgdGhlIHVwZGF0ZSBwYXlsb2FkIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEgY2hhbmdlIG9yIGlmIHRoZXJlXG4gIC8vIGlzIGEgbmV3IHJlZiB3ZSBtYXJrIHRoaXMgYXMgYW4gdXBkYXRlLlxuXG4gIGlmICh1cGRhdGVQYXlsb2FkICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVUb0h5ZHJhdGVIb3N0VGV4dEluc3RhbmNlKGZpYmVyKSB7XG5cbiAgdmFyIHRleHRJbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgdmFyIHRleHRDb250ZW50ID0gZmliZXIubWVtb2l6ZWRQcm9wcztcbiAgdmFyIHNob3VsZFVwZGF0ZSA9IGh5ZHJhdGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlLCB0ZXh0Q29udGVudCwgZmliZXIpO1xuXG4gIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAvLyBXZSBhc3N1bWUgdGhhdCBwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZSBpcyBjYWxsZWQgaW4gYSBjb250ZXh0IHdoZXJlIHRoZVxuICAgIC8vIGh5ZHJhdGlvbiBwYXJlbnQgaXMgdGhlIHBhcmVudCBob3N0IGNvbXBvbmVudCBvZiB0aGlzIGhvc3QgdGV4dC5cbiAgICB2YXIgcmV0dXJuRmliZXIgPSBoeWRyYXRpb25QYXJlbnRGaWJlcjtcblxuICAgIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGFyZW50Q29udGFpbmVyID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gICAgICAgICAgICBkaWROb3RNYXRjaEh5ZHJhdGVkQ29udGFpbmVyVGV4dEluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgdGV4dEluc3RhbmNlLCB0ZXh0Q29udGVudCwgLy8gVE9ETzogRGVsZXRlIHRoaXMgYXJndW1lbnQgd2hlbiB3ZSByZW1vdmUgdGhlIGxlZ2FjeSByb290IEFQSS5cbiAgICAgICAgICAgIGlzQ29uY3VycmVudE1vZGUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGFyZW50VHlwZSA9IHJldHVybkZpYmVyLnR5cGU7XG4gICAgICAgICAgICB2YXIgcGFyZW50UHJvcHMgPSByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzO1xuICAgICAgICAgICAgdmFyIHBhcmVudEluc3RhbmNlID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICB2YXIgX2lzQ29uY3VycmVudE1vZGUyID0gKHJldHVybkZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcblxuICAgICAgICAgICAgZGlkTm90TWF0Y2hIeWRyYXRlZFRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgICBfaXNDb25jdXJyZW50TW9kZTIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVUb0h5ZHJhdGVIb3N0U3VzcGVuc2VJbnN0YW5jZShmaWJlcikge1xuXG4gIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBzdXNwZW5zZVN0YXRlICE9PSBudWxsID8gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkIDogbnVsbDtcblxuICBpZiAoIXN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGhhdmUgYSBoeWRyYXRlZCBzdXNwZW5zZSBpbnN0YW5jZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgaHlkcmF0ZVN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBza2lwUGFzdERlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKGZpYmVyKSB7XG5cbiAgdmFyIHN1c3BlbnNlU3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IHN1c3BlbnNlU3RhdGUgIT09IG51bGwgPyBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgOiBudWxsO1xuXG4gIGlmICghc3VzcGVuc2VJbnN0YW5jZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gaGF2ZSBhIGh5ZHJhdGVkIHN1c3BlbnNlIGluc3RhbmNlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGVJbnN0YW5jZUFmdGVyU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcikge1xuICB2YXIgcGFyZW50ID0gZmliZXIucmV0dXJuO1xuXG4gIHdoaWxlIChwYXJlbnQgIT09IG51bGwgJiYgcGFyZW50LnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiBwYXJlbnQudGFnICE9PSBIb3N0Um9vdCAmJiBwYXJlbnQudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gIH1cblxuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IHBhcmVudDtcbn1cblxuZnVuY3Rpb24gcG9wSHlkcmF0aW9uU3RhdGUoZmliZXIpIHtcblxuICBpZiAoZmliZXIgIT09IGh5ZHJhdGlvblBhcmVudEZpYmVyKSB7XG4gICAgLy8gV2UncmUgZGVlcGVyIHRoYW4gdGhlIGN1cnJlbnQgaHlkcmF0aW9uIGNvbnRleHQsIGluc2lkZSBhbiBpbnNlcnRlZFxuICAgIC8vIHRyZWUuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgIC8vIElmIHdlJ3JlIG5vdCBjdXJyZW50bHkgaHlkcmF0aW5nIGJ1dCB3ZSdyZSBpbiBhIGh5ZHJhdGlvbiBjb250ZXh0LCB0aGVuXG4gICAgLy8gd2Ugd2VyZSBhbiBpbnNlcnRpb24gYW5kIG5vdyBuZWVkIHRvIHBvcCB1cCByZWVudGVyIGh5ZHJhdGlvbiBvZiBvdXJcbiAgICAvLyBzaWJsaW5ncy5cbiAgICBwb3BUb05leHRIb3N0UGFyZW50KGZpYmVyKTtcbiAgICBpc0h5ZHJhdGluZyA9IHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIElmIHdlIGhhdmUgYW55IHJlbWFpbmluZyBoeWRyYXRhYmxlIG5vZGVzLCB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGVtIG5vdy5cbiAgLy8gV2Ugb25seSBkbyB0aGlzIGRlZXBlciB0aGFuIGhlYWQgYW5kIGJvZHkgc2luY2UgdGhleSB0ZW5kIHRvIGhhdmUgcmFuZG9tXG4gIC8vIG90aGVyIG5vZGVzIGluIHRoZW0uIFdlIGFsc28gaWdub3JlIGNvbXBvbmVudHMgd2l0aCBwdXJlIHRleHQgY29udGVudCBpblxuICAvLyBzaWRlIG9mIHRoZW0uIFdlIGFsc28gZG9uJ3QgZGVsZXRlIGFueXRoaW5nIGluc2lkZSB0aGUgcm9vdCBjb250YWluZXIuXG5cblxuICBpZiAoZmliZXIudGFnICE9PSBIb3N0Um9vdCAmJiAoZmliZXIudGFnICE9PSBIb3N0Q29tcG9uZW50IHx8IHNob3VsZERlbGV0ZVVuaHlkcmF0ZWRUYWlsSW5zdGFuY2VzKGZpYmVyLnR5cGUpICYmICFzaG91bGRTZXRUZXh0Q29udGVudChmaWJlci50eXBlLCBmaWJlci5tZW1vaXplZFByb3BzKSkpIHtcbiAgICB2YXIgbmV4dEluc3RhbmNlID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZTtcblxuICAgIGlmIChuZXh0SW5zdGFuY2UpIHtcbiAgICAgIGlmIChzaG91bGRDbGllbnRSZW5kZXJPbk1pc21hdGNoKGZpYmVyKSkge1xuICAgICAgICB3YXJuSWZVbmh5ZHJhdGVkVGFpbE5vZGVzKGZpYmVyKTtcbiAgICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aGlsZSAobmV4dEluc3RhbmNlKSB7XG4gICAgICAgICAgZGVsZXRlSHlkcmF0YWJsZUluc3RhbmNlKGZpYmVyLCBuZXh0SW5zdGFuY2UpO1xuICAgICAgICAgIG5leHRJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhuZXh0SW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcik7XG5cbiAgaWYgKGZpYmVyLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gc2tpcFBhc3REZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlcik7XG4gIH0gZWxzZSB7XG4gICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGh5ZHJhdGlvblBhcmVudEZpYmVyID8gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGZpYmVyLnN0YXRlTm9kZSkgOiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGhhc1VuaHlkcmF0ZWRUYWlsTm9kZXMoKSB7XG4gIHJldHVybiBpc0h5ZHJhdGluZyAmJiBuZXh0SHlkcmF0YWJsZUluc3RhbmNlICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZVbmh5ZHJhdGVkVGFpbE5vZGVzKGZpYmVyKSB7XG4gIHZhciBuZXh0SW5zdGFuY2UgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlO1xuXG4gIHdoaWxlIChuZXh0SW5zdGFuY2UpIHtcbiAgICB3YXJuVW5oeWRyYXRlZEluc3RhbmNlKGZpYmVyLCBuZXh0SW5zdGFuY2UpO1xuICAgIG5leHRJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhuZXh0SW5zdGFuY2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0SHlkcmF0aW9uU3RhdGUoKSB7XG5cbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBudWxsO1xuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbiAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdXBncmFkZUh5ZHJhdGlvbkVycm9yc1RvUmVjb3ZlcmFibGUoKSB7XG4gIGlmIChoeWRyYXRpb25FcnJvcnMgIT09IG51bGwpIHtcbiAgICAvLyBTdWNjZXNzZnVsbHkgY29tcGxldGVkIGEgZm9yY2VkIGNsaWVudCByZW5kZXIuIFRoZSBlcnJvcnMgdGhhdCBvY2N1cnJlZFxuICAgIC8vIGR1cmluZyB0aGUgaHlkcmF0aW9uIGF0dGVtcHQgYXJlIG5vdyByZWNvdmVyZWQuIFdlIHdpbGwgbG9nIHRoZW0gaW5cbiAgICAvLyBjb21taXQgcGhhc2UsIG9uY2UgdGhlIGVudGlyZSB0cmVlIGhhcyBmaW5pc2hlZC5cbiAgICBxdWV1ZVJlY292ZXJhYmxlRXJyb3JzKGh5ZHJhdGlvbkVycm9ycyk7XG4gICAgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRJc0h5ZHJhdGluZygpIHtcbiAgcmV0dXJuIGlzSHlkcmF0aW5nO1xufVxuXG5mdW5jdGlvbiBxdWV1ZUh5ZHJhdGlvbkVycm9yKGVycm9yKSB7XG4gIGlmIChoeWRyYXRpb25FcnJvcnMgPT09IG51bGwpIHtcbiAgICBoeWRyYXRpb25FcnJvcnMgPSBbZXJyb3JdO1xuICB9IGVsc2Uge1xuICAgIGh5ZHJhdGlvbkVycm9ycy5wdXNoKGVycm9yKTtcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO1xudmFyIE5vVHJhbnNpdGlvbiA9IG51bGw7XG5mdW5jdGlvbiByZXF1ZXN0Q3VycmVudFRyYW5zaXRpb24oKSB7XG4gIHJldHVybiBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQxLnRyYW5zaXRpb247XG59XG5cbnZhciBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncyA9IHtcbiAgcmVjb3JkVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3M6IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHt9LFxuICBmbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5nczogZnVuY3Rpb24gKCkge30sXG4gIHJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nOiBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7fSxcbiAgZmx1c2hMZWdhY3lDb250ZXh0V2FybmluZzogZnVuY3Rpb24gKCkge30sXG4gIGRpc2NhcmRQZW5kaW5nV2FybmluZ3M6IGZ1bmN0aW9uICgpIHt9XG59O1xuXG57XG4gIHZhciBmaW5kU3RyaWN0Um9vdCA9IGZ1bmN0aW9uIChmaWJlcikge1xuICAgIHZhciBtYXliZVN0cmljdFJvb3QgPSBudWxsO1xuICAgIHZhciBub2RlID0gZmliZXI7XG5cbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgbWF5YmVTdHJpY3RSb290ID0gbm9kZTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBtYXliZVN0cmljdFJvb3Q7XG4gIH07XG5cbiAgdmFyIHNldFRvU29ydGVkU3RyaW5nID0gZnVuY3Rpb24gKHNldCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgYXJyYXkucHVzaCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFycmF5LnNvcnQoKS5qb2luKCcsICcpO1xuICB9O1xuXG4gIHZhciBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgdmFyIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgdmFyIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgdmFyIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdOyAvLyBUcmFja3MgY29tcG9uZW50cyB3ZSBoYXZlIGFscmVhZHkgd2FybmVkIGFib3V0LlxuXG4gIHZhciBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzID0gbmV3IFNldCgpO1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzID0gZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge1xuICAgIC8vIERlZHVwZSBzdHJhdGVneTogV2FybiBvbmNlIHBlciBjb21wb25lbnQuXG4gICAgaWYgKGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuaGFzKGZpYmVyLnR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgJiYgLy8gRG9uJ3Qgd2FybiBhYm91dCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMuXG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50Ll9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZS5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSAmJiB0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBXZSBkbyBhbiBpbml0aWFsIHBhc3MgdG8gZ2F0aGVyIGNvbXBvbmVudCBuYW1lc1xuICAgIHZhciBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIGNvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgfSAvLyBGaW5hbGx5LCB3ZSBmbHVzaCBhbGwgdGhlIHdhcm5pbmdzXG4gICAgLy8gVU5TQUZFXyBvbmVzIGJlZm9yZSB0aGUgZGVwcmVjYXRlZCBvbmVzLCBzaW5jZSB0aGV5J2xsIGJlICdsb3VkZXInXG5cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBzb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyk7XG5cbiAgICAgIGVycm9yKCdVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCBhbmQgbWF5IGluZGljYXRlIGJ1Z3MgaW4geW91ciBjb2RlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGNvZGUgd2l0aCBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkTW91bnQsIGFuZCBzZXQgaW5pdGlhbCBzdGF0ZSBpbiB0aGUgY29uc3RydWN0b3IuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBzb3J0ZWROYW1lcyk7XG4gICAgfVxuXG4gICAgaWYgKFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzKTtcblxuICAgICAgZXJyb3IoJ1VzaW5nIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCAnICsgJ2FuZCBtYXkgaW5kaWNhdGUgYnVncyBpbiB5b3VyIGNvZGUuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArIFwiKiBJZiB5b3UncmUgdXBkYXRpbmcgc3RhdGUgd2hlbmV2ZXIgcHJvcHMgY2hhbmdlLCBcIiArICdyZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIG1lbW9pemF0aW9uIHRlY2huaXF1ZXMgb3IgbW92ZSBpdCB0byAnICsgJ3N0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuIExlYXJuIG1vcmUgYXQ6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9kZXJpdmVkLXN0YXRlXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMpO1xuICAgIH1cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzMiA9IHNldFRvU29ydGVkU3RyaW5nKFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMpO1xuXG4gICAgICBlcnJvcignVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgaW4gc3RyaWN0IG1vZGUgaXMgbm90IHJlY29tbWVuZGVkICcgKyAnYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczIpO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczMgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyk7XG5cbiAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxNb3VudCBoYXMgYmVlbiByZW5hbWVkLCBhbmQgaXMgbm90IHJlY29tbWVuZGVkIGZvciB1c2UuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgY29kZSB3aXRoIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRNb3VudCwgYW5kIHNldCBpbml0aWFsIHN0YXRlIGluIHRoZSBjb25zdHJ1Y3Rvci5cXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxNb3VudCB0byBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IHRvIHN1cHByZXNzICcgKyAndGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gJyArICdUbyByZW5hbWUgYWxsIGRlcHJlY2F0ZWQgbGlmZWN5Y2xlcyB0byB0aGVpciBuZXcgbmFtZXMsIHlvdSBjYW4gcnVuICcgKyAnYG5weCByZWFjdC1jb2RlbW9kIHJlbmFtZS11bnNhZmUtbGlmZWN5Y2xlc2AgaW4geW91ciBwcm9qZWN0IHNvdXJjZSBmb2xkZXIuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMzKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzNCA9IHNldFRvU29ydGVkU3RyaW5nKGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyk7XG5cbiAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbicgKyBcIiogSWYgeW91J3JlIHVwZGF0aW5nIHN0YXRlIHdoZW5ldmVyIHByb3BzIGNoYW5nZSwgcmVmYWN0b3IgeW91ciBcIiArICdjb2RlIHRvIHVzZSBtZW1vaXphdGlvbiB0ZWNobmlxdWVzIG9yIG1vdmUgaXQgdG8gJyArICdzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBMZWFybiBtb3JlIGF0OiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGVyaXZlZC1zdGF0ZVxcbicgKyAnKiBSZW5hbWUgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB0byBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB0byBzdXBwcmVzcyAnICsgJ3RoaXMgd2FybmluZyBpbiBub24tc3RyaWN0IG1vZGUuIEluIFJlYWN0IDE4LngsIG9ubHkgdGhlIFVOU0FGRV8gbmFtZSB3aWxsIHdvcmsuICcgKyAnVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biAnICsgJ2BucHggcmVhY3QtY29kZW1vZCByZW5hbWUtdW5zYWZlLWxpZmVjeWNsZXNgIGluIHlvdXIgcHJvamVjdCBzb3VyY2UgZm9sZGVyLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzNCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczUgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsVXBkYXRlIGhhcyBiZWVuIHJlbmFtZWQsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxVcGRhdGUgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgdG8gc3VwcHJlc3MgJyArICd0aGlzIHdhcm5pbmcgaW4gbm9uLXN0cmljdCBtb2RlLiBJbiBSZWFjdCAxOC54LCBvbmx5IHRoZSBVTlNBRkVfIG5hbWUgd2lsbCB3b3JrLiAnICsgJ1RvIHJlbmFtZSBhbGwgZGVwcmVjYXRlZCBsaWZlY3ljbGVzIHRvIHRoZWlyIG5ldyBuYW1lcywgeW91IGNhbiBydW4gJyArICdgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczUpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nID0gbmV3IE1hcCgpOyAvLyBUcmFja3MgY29tcG9uZW50cyB3ZSBoYXZlIGFscmVhZHkgd2FybmVkIGFib3V0LlxuXG4gIHZhciBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0ID0gbmV3IFNldCgpO1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nID0gZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge1xuICAgIHZhciBzdHJpY3RSb290ID0gZmluZFN0cmljdFJvb3QoZmliZXIpO1xuXG4gICAgaWYgKHN0cmljdFJvb3QgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBmaW5kIGEgU3RyaWN0TW9kZSBjb21wb25lbnQgaW4gYSBzdHJpY3QgbW9kZSB0cmVlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIERlZHVwIHN0cmF0ZWd5OiBXYXJuIG9uY2UgcGVyIGNvbXBvbmVudC5cblxuXG4gICAgaWYgKGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQuaGFzKGZpYmVyLnR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHdhcm5pbmdzRm9yUm9vdCA9IHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZy5nZXQoc3RyaWN0Um9vdCk7XG5cbiAgICBpZiAoZmliZXIudHlwZS5jb250ZXh0VHlwZXMgIT0gbnVsbCB8fCBmaWJlci50eXBlLmNoaWxkQ29udGV4dFR5cGVzICE9IG51bGwgfHwgaW5zdGFuY2UgIT09IG51bGwgJiYgdHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHdhcm5pbmdzRm9yUm9vdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHdhcm5pbmdzRm9yUm9vdCA9IFtdO1xuICAgICAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuc2V0KHN0cmljdFJvb3QsIHdhcm5pbmdzRm9yUm9vdCk7XG4gICAgICB9XG5cbiAgICAgIHdhcm5pbmdzRm9yUm9vdC5wdXNoKGZpYmVyKTtcbiAgICB9XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hMZWdhY3lDb250ZXh0V2FybmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuZm9yRWFjaChmdW5jdGlvbiAoZmliZXJBcnJheSwgc3RyaWN0Um9vdCkge1xuICAgICAgaWYgKGZpYmVyQXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGZpcnN0RmliZXIgPSBmaWJlckFycmF5WzBdO1xuICAgICAgdmFyIHVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuICAgICAgZmliZXJBcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICB1bmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0LmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIHNvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcodW5pcXVlTmFtZXMpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBzZXRDdXJyZW50RmliZXIoZmlyc3RGaWJlcik7XG5cbiAgICAgICAgZXJyb3IoJ0xlZ2FjeSBjb250ZXh0IEFQSSBoYXMgYmVlbiBkZXRlY3RlZCB3aXRoaW4gYSBzdHJpY3QtbW9kZSB0cmVlLicgKyAnXFxuXFxuVGhlIG9sZCBBUEkgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gYWxsIDE2LnggcmVsZWFzZXMsIGJ1dCBhcHBsaWNhdGlvbnMgJyArICd1c2luZyBpdCBzaG91bGQgbWlncmF0ZSB0byB0aGUgbmV3IHZlcnNpb24uJyArICdcXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnICsgJ1xcblxcbkxlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9sZWdhY3ktY29udGV4dCcsIHNvcnRlZE5hbWVzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZGlzY2FyZFBlbmRpbmdXYXJuaW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nID0gbmV3IE1hcCgpO1xuICB9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudCwgYmFzZVByb3BzKSB7XG4gIGlmIChDb21wb25lbnQgJiYgQ29tcG9uZW50LmRlZmF1bHRQcm9wcykge1xuICAgIC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wcy4gVGFrZW4gZnJvbSBSZWFjdEVsZW1lbnRcbiAgICB2YXIgcHJvcHMgPSBhc3NpZ24oe30sIGJhc2VQcm9wcyk7XG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IENvbXBvbmVudC5kZWZhdWx0UHJvcHM7XG5cbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwcm9wcztcbiAgfVxuXG4gIHJldHVybiBiYXNlUHJvcHM7XG59XG5cbnZhciB2YWx1ZUN1cnNvciA9IGNyZWF0ZUN1cnNvcihudWxsKTtcbnZhciByZW5kZXJlclNpZ2lsO1xuXG57XG4gIC8vIFVzZSB0aGlzIHRvIGRldGVjdCBtdWx0aXBsZSByZW5kZXJlcnMgdXNpbmcgdGhlIHNhbWUgY29udGV4dFxuICByZW5kZXJlclNpZ2lsID0ge307XG59XG5cbnZhciBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG52YXIgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbnVsbDtcbnZhciBsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPSBudWxsO1xudmFyIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbmZ1bmN0aW9uIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpIHtcbiAgLy8gVGhpcyBpcyBjYWxsZWQgcmlnaHQgYmVmb3JlIFJlYWN0IHlpZWxkcyBleGVjdXRpb24sIHRvIGVuc3VyZSBgcmVhZENvbnRleHRgXG4gIC8vIGNhbm5vdCBiZSBjYWxsZWQgb3V0c2lkZSB0aGUgcmVuZGVyIHBoYXNlLlxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG4gIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG4gIGxhc3RGdWxseU9ic2VydmVkQ29udGV4dCA9IG51bGw7XG5cbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpIHtcbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSB0cnVlO1xuICB9XG59XG5mdW5jdGlvbiBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKSB7XG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHB1c2hQcm92aWRlcihwcm92aWRlckZpYmVyLCBjb250ZXh0LCBuZXh0VmFsdWUpIHtcbiAge1xuICAgIHB1c2godmFsdWVDdXJzb3IsIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSwgcHJvdmlkZXJGaWJlcik7XG4gICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gbmV4dFZhbHVlO1xuXG4gICAge1xuICAgICAgaWYgKGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gbnVsbCAmJiBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgIT09IHJlbmRlcmVyU2lnaWwpIHtcbiAgICAgICAgZXJyb3IoJ0RldGVjdGVkIG11bHRpcGxlIHJlbmRlcmVycyBjb25jdXJyZW50bHkgcmVuZGVyaW5nIHRoZSAnICsgJ3NhbWUgY29udGV4dCBwcm92aWRlci4gVGhpcyBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWQuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IHJlbmRlcmVyU2lnaWw7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3BQcm92aWRlcihjb250ZXh0LCBwcm92aWRlckZpYmVyKSB7XG4gIHZhciBjdXJyZW50VmFsdWUgPSB2YWx1ZUN1cnNvci5jdXJyZW50O1xuICBwb3AodmFsdWVDdXJzb3IsIHByb3ZpZGVyRmliZXIpO1xuXG4gIHtcbiAgICB7XG4gICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKHBhcmVudCwgcmVuZGVyTGFuZXMsIHByb3BhZ2F0aW9uUm9vdCkge1xuICAvLyBVcGRhdGUgdGhlIGNoaWxkIGxhbmVzIG9mIGFsbCB0aGUgYW5jZXN0b3JzLCBpbmNsdWRpbmcgdGhlIGFsdGVybmF0ZXMuXG4gIHZhciBub2RlID0gcGFyZW50O1xuXG4gIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgdmFyIGFsdGVybmF0ZSA9IG5vZGUuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKCFpc1N1YnNldE9mTGFuZXMobm9kZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgIG5vZGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobm9kZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgYWx0ZXJuYXRlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhbHRlcm5hdGUgIT09IG51bGwgJiYgIWlzU3Vic2V0T2ZMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgICBhbHRlcm5hdGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gcHJvcGFnYXRpb25Sb290KSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gIH1cblxuICB7XG4gICAgaWYgKG5vZGUgIT09IHByb3BhZ2F0aW9uUm9vdCkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgdGhlIHByb3BhZ2F0aW9uIHJvb3Qgd2hlbiBzY2hlZHVsaW5nIGNvbnRleHQgd29yay4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcHJvcGFnYXRlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2VfZWFnZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlX2VhZ2VyKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCByZW5kZXJMYW5lcykge1xuXG4gIHZhciBmaWJlciA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gIGlmIChmaWJlciAhPT0gbnVsbCkge1xuICAgIC8vIFNldCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIGNoaWxkIHRvIHRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuICAgIGZpYmVyLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB9XG5cbiAgd2hpbGUgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgdmFyIG5leHRGaWJlciA9IHZvaWQgMDsgLy8gVmlzaXQgdGhpcyBmaWJlci5cblxuICAgIHZhciBsaXN0ID0gZmliZXIuZGVwZW5kZW5jaWVzO1xuXG4gICAgaWYgKGxpc3QgIT09IG51bGwpIHtcbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLmNoaWxkO1xuICAgICAgdmFyIGRlcGVuZGVuY3kgPSBsaXN0LmZpcnN0Q29udGV4dDtcblxuICAgICAgd2hpbGUgKGRlcGVuZGVuY3kgIT09IG51bGwpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNvbnRleHQgbWF0Y2hlcy5cbiAgICAgICAgaWYgKGRlcGVuZGVuY3kuY29udGV4dCA9PT0gY29udGV4dCkge1xuICAgICAgICAgIC8vIE1hdGNoISBTY2hlZHVsZSBhbiB1cGRhdGUgb24gdGhpcyBmaWJlci5cbiAgICAgICAgICBpZiAoZmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgLy8gU2NoZWR1bGUgYSBmb3JjZSB1cGRhdGUgb24gdGhlIHdvcmstaW4tcHJvZ3Jlc3MuXG4gICAgICAgICAgICB2YXIgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKHJlbmRlckxhbmVzKTtcbiAgICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIGxhbmUpO1xuICAgICAgICAgICAgdXBkYXRlLnRhZyA9IEZvcmNlVXBkYXRlOyAvLyBUT0RPOiBCZWNhdXNlIHdlIGRvbid0IGhhdmUgYSB3b3JrLWluLXByb2dyZXNzLCB0aGlzIHdpbGwgYWRkIHRoZVxuICAgICAgICAgICAgLy8gdXBkYXRlIHRvIHRoZSBjdXJyZW50IGZpYmVyLCB0b28sIHdoaWNoIG1lYW5zIGl0IHdpbGwgcGVyc2lzdCBldmVuIGlmXG4gICAgICAgICAgICAvLyB0aGlzIHJlbmRlciBpcyB0aHJvd24gYXdheS4gU2luY2UgaXQncyBhIHJhY2UgY29uZGl0aW9uLCBub3Qgc3VyZSBpdCdzXG4gICAgICAgICAgICAvLyB3b3J0aCBmaXhpbmcuXG4gICAgICAgICAgICAvLyBJbmxpbmVkIGBlbnF1ZXVlVXBkYXRlYCB0byByZW1vdmUgaW50ZXJsZWF2ZWQgdXBkYXRlIGNoZWNrXG5cbiAgICAgICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpYmVyLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgICBpZiAodXBkYXRlUXVldWUgPT09IG51bGwpIDsgZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBzaGFyZWRRdWV1ZSA9IHVwZGF0ZVF1ZXVlLnNoYXJlZDtcbiAgICAgICAgICAgICAgdmFyIHBlbmRpbmcgPSBzaGFyZWRRdWV1ZS5wZW5kaW5nO1xuXG4gICAgICAgICAgICAgIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgICAgICAgICAgICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVwZGF0ZS5uZXh0ID0gcGVuZGluZy5uZXh0O1xuICAgICAgICAgICAgICAgIHBlbmRpbmcubmV4dCA9IHVwZGF0ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNoYXJlZFF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKGZpYmVyLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGFsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChmaWJlci5yZXR1cm4sIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7IC8vIE1hcmsgdGhlIHVwZGF0ZWQgbGFuZXMgb24gdGhlIGxpc3QsIHRvby5cblxuICAgICAgICAgIGxpc3QubGFuZXMgPSBtZXJnZUxhbmVzKGxpc3QubGFuZXMsIHJlbmRlckxhbmVzKTsgLy8gU2luY2Ugd2UgYWxyZWFkeSBmb3VuZCBhIG1hdGNoLCB3ZSBjYW4gc3RvcCB0cmF2ZXJzaW5nIHRoZVxuICAgICAgICAgIC8vIGRlcGVuZGVuY3kgbGlzdC5cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVwZW5kZW5jeSA9IGRlcGVuZGVuY3kubmV4dDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gQ29udGV4dFByb3ZpZGVyKSB7XG4gICAgICAvLyBEb24ndCBzY2FuIGRlZXBlciBpZiB0aGlzIGlzIGEgbWF0Y2hpbmcgcHJvdmlkZXJcbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLnR5cGUgPT09IHdvcmtJblByb2dyZXNzLnR5cGUgPyBudWxsIDogZmliZXIuY2hpbGQ7XG4gICAgfSBlbHNlIGlmIChmaWJlci50YWcgPT09IERlaHlkcmF0ZWRGcmFnbWVudCkge1xuICAgICAgLy8gSWYgYSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGJvdW5kYXJ5IGlzIGluIHRoaXMgc3VidHJlZSwgd2UgZG9uJ3Qga25vd1xuICAgICAgLy8gaWYgaXQgd2lsbCBoYXZlIGFueSBjb250ZXh0IGNvbnN1bWVycyBpbiBpdC4gVGhlIGJlc3Qgd2UgY2FuIGRvIGlzXG4gICAgICAvLyBtYXJrIGl0IGFzIGhhdmluZyB1cGRhdGVzLlxuICAgICAgdmFyIHBhcmVudFN1c3BlbnNlID0gZmliZXIucmV0dXJuO1xuXG4gICAgICBpZiAocGFyZW50U3VzcGVuc2UgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZSBqdXN0IGNhbWUgZnJvbSBhIHBhcmVudCBzbyB3ZSBtdXN0IGhhdmUgaGFkIGEgcGFyZW50LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRTdXNwZW5zZS5sYW5lcyA9IG1lcmdlTGFuZXMocGFyZW50U3VzcGVuc2UubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIHZhciBfYWx0ZXJuYXRlID0gcGFyZW50U3VzcGVuc2UuYWx0ZXJuYXRlO1xuXG4gICAgICBpZiAoX2FsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBfYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhfYWx0ZXJuYXRlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBwYXNzaW5nIHRoaXMgZmliZXIgYXMgdGhlIHBhcmVudFxuICAgICAgLy8gYmVjYXVzZSB3ZSB3YW50IHRvIHNjaGVkdWxlIHRoaXMgZmliZXIgYXMgaGF2aW5nIHdvcmtcbiAgICAgIC8vIG9uIGl0cyBjaGlsZHJlbi4gV2UnbGwgdXNlIHRoZSBjaGlsZExhbmVzIG9uXG4gICAgICAvLyB0aGlzIGZpYmVyIHRvIGluZGljYXRlIHRoYXQgYSBjb250ZXh0IGhhcyBjaGFuZ2VkLlxuXG5cbiAgICAgIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgocGFyZW50U3VzcGVuc2UsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5zaWJsaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUcmF2ZXJzZSBkb3duLlxuICAgICAgbmV4dEZpYmVyID0gZmliZXIuY2hpbGQ7XG4gICAgfVxuXG4gICAgaWYgKG5leHRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgLy8gU2V0IHRoZSByZXR1cm4gcG9pbnRlciBvZiB0aGUgY2hpbGQgdG8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuXG4gICAgICBuZXh0RmliZXIucmV0dXJuID0gZmliZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGNoaWxkLiBUcmF2ZXJzZSB0byBuZXh0IHNpYmxpbmcuXG4gICAgICBuZXh0RmliZXIgPSBmaWJlcjtcblxuICAgICAgd2hpbGUgKG5leHRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICBpZiAobmV4dEZpYmVyID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIC8vIFdlJ3JlIGJhY2sgdG8gdGhlIHJvb3Qgb2YgdGhpcyBzdWJ0cmVlLiBFeGl0LlxuICAgICAgICAgIG5leHRGaWJlciA9IG51bGw7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2libGluZyA9IG5leHRGaWJlci5zaWJsaW5nO1xuXG4gICAgICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gU2V0IHRoZSByZXR1cm4gcG9pbnRlciBvZiB0aGUgc2libGluZyB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICAgICAgICBzaWJsaW5nLnJldHVybiA9IG5leHRGaWJlci5yZXR1cm47XG4gICAgICAgICAgbmV4dEZpYmVyID0gc2libGluZztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSAvLyBObyBtb3JlIHNpYmxpbmdzLiBUcmF2ZXJzZSB1cC5cblxuXG4gICAgICAgIG5leHRGaWJlciA9IG5leHRGaWJlci5yZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmliZXIgPSBuZXh0RmliZXI7XG4gIH1cbn1cbmZ1bmN0aW9uIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IHdvcmtJblByb2dyZXNzO1xuICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBudWxsO1xuICBsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPSBudWxsO1xuICB2YXIgZGVwZW5kZW5jaWVzID0gd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzO1xuXG4gIGlmIChkZXBlbmRlbmNpZXMgIT09IG51bGwpIHtcbiAgICB7XG4gICAgICB2YXIgZmlyc3RDb250ZXh0ID0gZGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dDtcblxuICAgICAgaWYgKGZpcnN0Q29udGV4dCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShkZXBlbmRlbmNpZXMubGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgICAgICAgIC8vIENvbnRleHQgbGlzdCBoYXMgYSBwZW5kaW5nIHVwZGF0ZS4gTWFyayB0aGF0IHRoaXMgZmliZXIgcGVyZm9ybWVkIHdvcmsuXG4gICAgICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICAgICAgfSAvLyBSZXNldCB0aGUgd29yay1pbi1wcm9ncmVzcyBsaXN0XG5cblxuICAgICAgICBkZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHJlYWRDb250ZXh0KGNvbnRleHQpIHtcbiAge1xuICAgIC8vIFRoaXMgd2FybmluZyB3b3VsZCBmaXJlIGlmIHlvdSByZWFkIGNvbnRleHQgaW5zaWRlIGEgSG9vayBsaWtlIHVzZU1lbW8uXG4gICAgLy8gVW5saWtlIHRoZSBjbGFzcyBjaGVjayBiZWxvdywgaXQncyBub3QgZW5mb3JjZWQgaW4gcHJvZHVjdGlvbiBmb3IgcGVyZi5cbiAgICBpZiAoaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVikge1xuICAgICAgZXJyb3IoJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciB2YWx1ZSA9ICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgO1xuXG4gIGlmIChsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPT09IGNvbnRleHQpIDsgZWxzZSB7XG4gICAgdmFyIGNvbnRleHRJdGVtID0ge1xuICAgICAgY29udGV4dDogY29udGV4dCxcbiAgICAgIG1lbW9pemVkVmFsdWU6IHZhbHVlLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG5cbiAgICBpZiAobGFzdENvbnRleHREZXBlbmRlbmN5ID09PSBudWxsKSB7XG4gICAgICBpZiAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgICAgIH0gLy8gVGhpcyBpcyB0aGUgZmlyc3QgZGVwZW5kZW5jeSBmb3IgdGhpcyBjb21wb25lbnQuIENyZWF0ZSBhIG5ldyBsaXN0LlxuXG5cbiAgICAgIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IGNvbnRleHRJdGVtO1xuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIuZGVwZW5kZW5jaWVzID0ge1xuICAgICAgICBsYW5lczogTm9MYW5lcyxcbiAgICAgICAgZmlyc3RDb250ZXh0OiBjb250ZXh0SXRlbVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXBwZW5kIGEgbmV3IGNvbnRleHQgaXRlbS5cbiAgICAgIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IGxhc3RDb250ZXh0RGVwZW5kZW5jeS5uZXh0ID0gY29udGV4dEl0ZW07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vLyByZW5kZXIuIFdoZW4gdGhpcyByZW5kZXIgZXhpdHMsIGVpdGhlciBiZWNhdXNlIGl0IGZpbmlzaGVzIG9yIGJlY2F1c2UgaXQgaXNcbi8vIGludGVycnVwdGVkLCB0aGUgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsIGJlIHRyYW5zZmVycmVkIG9udG8gdGhlIG1haW4gcGFydFxuLy8gb2YgdGhlIHF1ZXVlLlxuXG52YXIgY29uY3VycmVudFF1ZXVlcyA9IG51bGw7XG5mdW5jdGlvbiBwdXNoQ29uY3VycmVudFVwZGF0ZVF1ZXVlKHF1ZXVlKSB7XG4gIGlmIChjb25jdXJyZW50UXVldWVzID09PSBudWxsKSB7XG4gICAgY29uY3VycmVudFF1ZXVlcyA9IFtxdWV1ZV07XG4gIH0gZWxzZSB7XG4gICAgY29uY3VycmVudFF1ZXVlcy5wdXNoKHF1ZXVlKTtcbiAgfVxufVxuZnVuY3Rpb24gZmluaXNoUXVldWVpbmdDb25jdXJyZW50VXBkYXRlcygpIHtcbiAgLy8gVHJhbnNmZXIgdGhlIGludGVybGVhdmVkIHVwZGF0ZXMgb250byB0aGUgbWFpbiBxdWV1ZS4gRWFjaCBxdWV1ZSBoYXMgYVxuICAvLyBgcGVuZGluZ2AgZmllbGQgYW5kIGFuIGBpbnRlcmxlYXZlZGAgZmllbGQuIFdoZW4gdGhleSBhcmUgbm90IG51bGwsIHRoZXlcbiAgLy8gcG9pbnQgdG8gdGhlIGxhc3Qgbm9kZSBpbiBhIGNpcmN1bGFyIGxpbmtlZCBsaXN0LiBXZSBuZWVkIHRvIGFwcGVuZCB0aGVcbiAgLy8gaW50ZXJsZWF2ZWQgbGlzdCB0byB0aGUgZW5kIG9mIHRoZSBwZW5kaW5nIGxpc3QgYnkgam9pbmluZyB0aGVtIGludG8gYVxuICAvLyBzaW5nbGUsIGNpcmN1bGFyIGxpc3QuXG4gIGlmIChjb25jdXJyZW50UXVldWVzICE9PSBudWxsKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25jdXJyZW50UXVldWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVldWUgPSBjb25jdXJyZW50UXVldWVzW2ldO1xuICAgICAgdmFyIGxhc3RJbnRlcmxlYXZlZFVwZGF0ZSA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gICAgICBpZiAobGFzdEludGVybGVhdmVkVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgIHF1ZXVlLmludGVybGVhdmVkID0gbnVsbDtcbiAgICAgICAgdmFyIGZpcnN0SW50ZXJsZWF2ZWRVcGRhdGUgPSBsYXN0SW50ZXJsZWF2ZWRVcGRhdGUubmV4dDtcbiAgICAgICAgdmFyIGxhc3RQZW5kaW5nVXBkYXRlID0gcXVldWUucGVuZGluZztcblxuICAgICAgICBpZiAobGFzdFBlbmRpbmdVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgZmlyc3RQZW5kaW5nVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGUubmV4dDtcbiAgICAgICAgICBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0ID0gZmlyc3RJbnRlcmxlYXZlZFVwZGF0ZTtcbiAgICAgICAgICBsYXN0SW50ZXJsZWF2ZWRVcGRhdGUubmV4dCA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlLnBlbmRpbmcgPSBsYXN0SW50ZXJsZWF2ZWRVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uY3VycmVudFF1ZXVlcyA9IG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSkge1xuICB2YXIgaW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICBpZiAoaW50ZXJsZWF2ZWQgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7IC8vIEF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcmVuZGVyLCB0aGlzIHF1ZXVlJ3MgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsXG4gICAgLy8gYmUgdHJhbnNmZXJyZWQgdG8gdGhlIHBlbmRpbmcgcXVldWUuXG5cbiAgICBwdXNoQ29uY3VycmVudFVwZGF0ZVF1ZXVlKHF1ZXVlKTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUubmV4dCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgaW50ZXJsZWF2ZWQubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLmludGVybGVhdmVkID0gdXBkYXRlO1xuICByZXR1cm4gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRIb29rVXBkYXRlQW5kRWFnZXJseUJhaWxvdXQoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpIHtcbiAgdmFyIGludGVybGVhdmVkID0gcXVldWUuaW50ZXJsZWF2ZWQ7XG5cbiAgaWYgKGludGVybGVhdmVkID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlOyAvLyBBdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJlbmRlciwgdGhpcyBxdWV1ZSdzIGludGVybGVhdmVkIHVwZGF0ZXMgd2lsbFxuICAgIC8vIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBwZW5kaW5nIHF1ZXVlLlxuXG4gICAgcHVzaENvbmN1cnJlbnRVcGRhdGVRdWV1ZShxdWV1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlLm5leHQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgIGludGVybGVhdmVkLm5leHQgPSB1cGRhdGU7XG4gIH1cblxuICBxdWV1ZS5pbnRlcmxlYXZlZCA9IHVwZGF0ZTtcbn1cbmZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50Q2xhc3NVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpIHtcbiAgdmFyIGludGVybGVhdmVkID0gcXVldWUuaW50ZXJsZWF2ZWQ7XG5cbiAgaWYgKGludGVybGVhdmVkID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlOyAvLyBBdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJlbmRlciwgdGhpcyBxdWV1ZSdzIGludGVybGVhdmVkIHVwZGF0ZXMgd2lsbFxuICAgIC8vIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBwZW5kaW5nIHF1ZXVlLlxuXG4gICAgcHVzaENvbmN1cnJlbnRVcGRhdGVRdWV1ZShxdWV1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlLm5leHQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgIGludGVybGVhdmVkLm5leHQgPSB1cGRhdGU7XG4gIH1cblxuICBxdWV1ZS5pbnRlcmxlYXZlZCA9IHVwZGF0ZTtcbiAgcmV0dXJuIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgbGFuZSkge1xuICByZXR1cm4gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoZmliZXIsIGxhbmUpO1xufSAvLyBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gb3V0c2lkZSB0aGlzIG1vZHVsZSBzaG91bGQgb25seSBiZSBkb25lIGZvciBiYWNrd2FyZHNcbi8vIGNvbXBhdGliaWxpdHkgYW5kIHNob3VsZCBhbHdheXMgYmUgYWNjb21wYW5pZWQgYnkgYSB3YXJuaW5nLlxuXG52YXIgdW5zYWZlX21hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290ID0gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3Q7XG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KHNvdXJjZUZpYmVyLCBsYW5lKSB7XG4gIC8vIFVwZGF0ZSB0aGUgc291cmNlIGZpYmVyJ3MgbGFuZXNcbiAgc291cmNlRmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKHNvdXJjZUZpYmVyLmxhbmVzLCBsYW5lKTtcbiAgdmFyIGFsdGVybmF0ZSA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUubGFuZXMsIGxhbmUpO1xuICB9XG5cbiAge1xuICAgIGlmIChhbHRlcm5hdGUgPT09IG51bGwgJiYgKHNvdXJjZUZpYmVyLmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICB3YXJuQWJvdXRVcGRhdGVPbk5vdFlldE1vdW50ZWRGaWJlckluREVWKHNvdXJjZUZpYmVyKTtcbiAgICB9XG4gIH0gLy8gV2FsayB0aGUgcGFyZW50IHBhdGggdG8gdGhlIHJvb3QgYW5kIHVwZGF0ZSB0aGUgY2hpbGQgbGFuZXMuXG5cblxuICB2YXIgbm9kZSA9IHNvdXJjZUZpYmVyO1xuICB2YXIgcGFyZW50ID0gc291cmNlRmliZXIucmV0dXJuO1xuXG4gIHdoaWxlIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICBwYXJlbnQuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMocGFyZW50LmNoaWxkTGFuZXMsIGxhbmUpO1xuICAgIGFsdGVybmF0ZSA9IHBhcmVudC5hbHRlcm5hdGU7XG5cbiAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICBhbHRlcm5hdGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIGxhbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB7XG4gICAgICAgIGlmICgocGFyZW50LmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgd2FybkFib3V0VXBkYXRlT25Ob3RZZXRNb3VudGVkRmliZXJJbkRFVihzb3VyY2VGaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0gcGFyZW50O1xuICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gIH1cblxuICBpZiAobm9kZS50YWcgPT09IEhvc3RSb290KSB7XG4gICAgdmFyIHJvb3QgPSBub2RlLnN0YXRlTm9kZTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG52YXIgVXBkYXRlU3RhdGUgPSAwO1xudmFyIFJlcGxhY2VTdGF0ZSA9IDE7XG52YXIgRm9yY2VVcGRhdGUgPSAyO1xudmFyIENhcHR1cmVVcGRhdGUgPSAzOyAvLyBHbG9iYWwgc3RhdGUgdGhhdCBpcyByZXNldCBhdCB0aGUgYmVnaW5uaW5nIG9mIGNhbGxpbmcgYHByb2Nlc3NVcGRhdGVRdWV1ZWAuXG4vLyBJdCBzaG91bGQgb25seSBiZSByZWFkIHJpZ2h0IGFmdGVyIGNhbGxpbmcgYHByb2Nlc3NVcGRhdGVRdWV1ZWAsIHZpYVxuLy8gYGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmdgLlxuXG52YXIgaGFzRm9yY2VVcGRhdGUgPSBmYWxzZTtcbnZhciBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlO1xudmFyIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZTtcblxue1xuICBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlID0gZmFsc2U7XG4gIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGluaXRpYWxpemVVcGRhdGVRdWV1ZShmaWJlcikge1xuICB2YXIgcXVldWUgPSB7XG4gICAgYmFzZVN0YXRlOiBmaWJlci5tZW1vaXplZFN0YXRlLFxuICAgIGZpcnN0QmFzZVVwZGF0ZTogbnVsbCxcbiAgICBsYXN0QmFzZVVwZGF0ZTogbnVsbCxcbiAgICBzaGFyZWQ6IHtcbiAgICAgIHBlbmRpbmc6IG51bGwsXG4gICAgICBpbnRlcmxlYXZlZDogbnVsbCxcbiAgICAgIGxhbmVzOiBOb0xhbmVzXG4gICAgfSxcbiAgICBlZmZlY3RzOiBudWxsXG4gIH07XG4gIGZpYmVyLnVwZGF0ZVF1ZXVlID0gcXVldWU7XG59XG5mdW5jdGlvbiBjbG9uZVVwZGF0ZVF1ZXVlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIC8vIENsb25lIHRoZSB1cGRhdGUgcXVldWUgZnJvbSBjdXJyZW50LiBVbmxlc3MgaXQncyBhbHJlYWR5IGEgY2xvbmUuXG4gIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICB2YXIgY3VycmVudFF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcblxuICBpZiAocXVldWUgPT09IGN1cnJlbnRRdWV1ZSkge1xuICAgIHZhciBjbG9uZSA9IHtcbiAgICAgIGJhc2VTdGF0ZTogY3VycmVudFF1ZXVlLmJhc2VTdGF0ZSxcbiAgICAgIGZpcnN0QmFzZVVwZGF0ZTogY3VycmVudFF1ZXVlLmZpcnN0QmFzZVVwZGF0ZSxcbiAgICAgIGxhc3RCYXNlVXBkYXRlOiBjdXJyZW50UXVldWUubGFzdEJhc2VVcGRhdGUsXG4gICAgICBzaGFyZWQ6IGN1cnJlbnRRdWV1ZS5zaGFyZWQsXG4gICAgICBlZmZlY3RzOiBjdXJyZW50UXVldWUuZWZmZWN0c1xuICAgIH07XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjbG9uZTtcbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSkge1xuICB2YXIgdXBkYXRlID0ge1xuICAgIGV2ZW50VGltZTogZXZlbnRUaW1lLFxuICAgIGxhbmU6IGxhbmUsXG4gICAgdGFnOiBVcGRhdGVTdGF0ZSxcbiAgICBwYXlsb2FkOiBudWxsLFxuICAgIGNhbGxiYWNrOiBudWxsLFxuICAgIG5leHQ6IG51bGxcbiAgfTtcbiAgcmV0dXJuIHVwZGF0ZTtcbn1cbmZ1bmN0aW9uIGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgbGFuZSkge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaWJlci51cGRhdGVRdWV1ZTtcblxuICBpZiAodXBkYXRlUXVldWUgPT09IG51bGwpIHtcbiAgICAvLyBPbmx5IG9jY3VycyBpZiB0aGUgZmliZXIgaGFzIGJlZW4gdW5tb3VudGVkLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHNoYXJlZFF1ZXVlID0gdXBkYXRlUXVldWUuc2hhcmVkO1xuXG4gIHtcbiAgICBpZiAoY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID09PSBzaGFyZWRRdWV1ZSAmJiAhZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSkge1xuICAgICAgZXJyb3IoJ0FuIHVwZGF0ZSAoc2V0U3RhdGUsIHJlcGxhY2VTdGF0ZSwgb3IgZm9yY2VVcGRhdGUpIHdhcyBzY2hlZHVsZWQgJyArICdmcm9tIGluc2lkZSBhbiB1cGRhdGUgZnVuY3Rpb24uIFVwZGF0ZSBmdW5jdGlvbnMgc2hvdWxkIGJlIHB1cmUsICcgKyAnd2l0aCB6ZXJvIHNpZGUtZWZmZWN0cy4gQ29uc2lkZXIgdXNpbmcgY29tcG9uZW50RGlkVXBkYXRlIG9yIGEgJyArICdjYWxsYmFjay4nKTtcblxuICAgICAgZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzVW5zYWZlQ2xhc3NSZW5kZXJQaGFzZVVwZGF0ZSgpKSB7XG4gICAgLy8gVGhpcyBpcyBhbiB1bnNhZmUgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gQWRkIGRpcmVjdGx5IHRvIHRoZSB1cGRhdGVcbiAgICAvLyBxdWV1ZSBzbyB3ZSBjYW4gcHJvY2VzcyBpdCBpbW1lZGlhdGVseSBkdXJpbmcgdGhlIGN1cnJlbnQgcmVuZGVyLlxuICAgIHZhciBwZW5kaW5nID0gc2hhcmVkUXVldWUucGVuZGluZztcblxuICAgIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXBkYXRlLm5leHQgPSBwZW5kaW5nLm5leHQ7XG4gICAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7XG4gICAgfVxuXG4gICAgc2hhcmVkUXVldWUucGVuZGluZyA9IHVwZGF0ZTsgLy8gVXBkYXRlIHRoZSBjaGlsZExhbmVzIGV2ZW4gdGhvdWdoIHdlJ3JlIG1vc3QgbGlrZWx5IGFscmVhZHkgcmVuZGVyaW5nXG4gICAgLy8gdGhpcyBmaWJlci4gVGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaW4gdGhlIGNhc2Ugd2hlcmUgeW91XG4gICAgLy8gdXBkYXRlIGEgZGlmZmVyZW50IGNvbXBvbmVudCBkdXJpbmcgcmVuZGVyIHBoYXNlIHRoYW4gdGhlIG9uZSB0aGF0IGlzXG4gICAgLy8gY3VycmVudGx5IHJlbmRlcmluZ3MgKGEgcGF0dGVybiB0aGF0IGlzIGFjY29tcGFuaWVkIGJ5IGEgd2FybmluZykuXG5cbiAgICByZXR1cm4gdW5zYWZlX21hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZW5xdWV1ZUNvbmN1cnJlbnRDbGFzc1VwZGF0ZShmaWJlciwgc2hhcmVkUXVldWUsIHVwZGF0ZSwgbGFuZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmliZXIudXBkYXRlUXVldWU7XG5cbiAgaWYgKHVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgLy8gT25seSBvY2N1cnMgaWYgdGhlIGZpYmVyIGhhcyBiZWVuIHVubW91bnRlZC5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2hhcmVkUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG5cbiAgaWYgKGlzVHJhbnNpdGlvbkxhbmUobGFuZSkpIHtcbiAgICB2YXIgcXVldWVMYW5lcyA9IHNoYXJlZFF1ZXVlLmxhbmVzOyAvLyBJZiBhbnkgZW50YW5nbGVkIGxhbmVzIGFyZSBubyBsb25nZXIgcGVuZGluZyBvbiB0aGUgcm9vdCwgdGhlbiB0aGV5IG11c3RcbiAgICAvLyBoYXZlIGZpbmlzaGVkLiBXZSBjYW4gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgc2hhcmVkIHF1ZXVlLCB3aGljaCByZXByZXNlbnRzXG4gICAgLy8gYSBzdXBlcnNldCBvZiB0aGUgYWN0dWFsbHkgcGVuZGluZyBsYW5lcy4gSW4gc29tZSBjYXNlcyB3ZSBtYXkgZW50YW5nbGVcbiAgICAvLyBtb3JlIHRoYW4gd2UgbmVlZCB0bywgYnV0IHRoYXQncyBPSy4gSW4gZmFjdCBpdCdzIHdvcnNlIGlmIHdlICpkb24ndCpcbiAgICAvLyBlbnRhbmdsZSB3aGVuIHdlIHNob3VsZC5cblxuICAgIHF1ZXVlTGFuZXMgPSBpbnRlcnNlY3RMYW5lcyhxdWV1ZUxhbmVzLCByb290LnBlbmRpbmdMYW5lcyk7IC8vIEVudGFuZ2xlIHRoZSBuZXcgdHJhbnNpdGlvbiBsYW5lIHdpdGggdGhlIG90aGVyIHRyYW5zaXRpb24gbGFuZXMuXG5cbiAgICB2YXIgbmV3UXVldWVMYW5lcyA9IG1lcmdlTGFuZXMocXVldWVMYW5lcywgbGFuZSk7XG4gICAgc2hhcmVkUXVldWUubGFuZXMgPSBuZXdRdWV1ZUxhbmVzOyAvLyBFdmVuIGlmIHF1ZXVlLmxhbmVzIGFscmVhZHkgaW5jbHVkZSBsYW5lLCB3ZSBkb24ndCBrbm93IGZvciBjZXJ0YWluIGlmXG4gICAgLy8gdGhlIGxhbmUgZmluaXNoZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBlbnRhbmdsZWQgaXQuIFNvIHdlIG5lZWQgdG9cbiAgICAvLyBlbnRhbmdsZSBpdCBhZ2FpbiwganVzdCB0byBiZSBzdXJlLlxuXG4gICAgbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgbmV3UXVldWVMYW5lcyk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY2FwdHVyZWRVcGRhdGUpIHtcbiAgLy8gQ2FwdHVyZWQgdXBkYXRlcyBhcmUgdXBkYXRlcyB0aGF0IGFyZSB0aHJvd24gYnkgYSBjaGlsZCBkdXJpbmcgdGhlIHJlbmRlclxuICAvLyBwaGFzZS4gVGhleSBzaG91bGQgYmUgZGlzY2FyZGVkIGlmIHRoZSByZW5kZXIgaXMgYWJvcnRlZC4gVGhlcmVmb3JlLFxuICAvLyB3ZSBzaG91bGQgb25seSBwdXQgdGhlbSBvbiB0aGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSwgbm90IHRoZSBjdXJyZW50IG9uZS5cbiAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7IC8vIENoZWNrIGlmIHRoZSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIGlzIGEgY2xvbmUuXG5cbiAgdmFyIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudFF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcblxuICAgIGlmIChxdWV1ZSA9PT0gY3VycmVudFF1ZXVlKSB7XG4gICAgICAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LiBUaGlzIGhhcHBlbnMgd2hlblxuICAgICAgLy8gd2UgYmFpbCBvdXQgb24gYSBwYXJlbnQgZmliZXIgdGhhdCB0aGVuIGNhcHR1cmVzIGFuIGVycm9yIHRocm93biBieVxuICAgICAgLy8gYSBjaGlsZC4gU2luY2Ugd2Ugd2FudCB0byBhcHBlbmQgdGhlIHVwZGF0ZSBvbmx5IHRvIHRoZSB3b3JrLWluXG4gICAgICAvLyAtcHJvZ3Jlc3MgcXVldWUsIHdlIG5lZWQgdG8gY2xvbmUgdGhlIHVwZGF0ZXMuIFdlIHVzdWFsbHkgY2xvbmUgZHVyaW5nXG4gICAgICAvLyBwcm9jZXNzVXBkYXRlUXVldWUsIGJ1dCB0aGF0IGRpZG4ndCBoYXBwZW4gaW4gdGhpcyBjYXNlIGJlY2F1c2Ugd2VcbiAgICAgIC8vIHNraXBwZWQgb3ZlciB0aGUgcGFyZW50IHdoZW4gd2UgYmFpbGVkIG91dC5cbiAgICAgIHZhciBuZXdGaXJzdCA9IG51bGw7XG4gICAgICB2YXIgbmV3TGFzdCA9IG51bGw7XG4gICAgICB2YXIgZmlyc3RCYXNlVXBkYXRlID0gcXVldWUuZmlyc3RCYXNlVXBkYXRlO1xuXG4gICAgICBpZiAoZmlyc3RCYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgdXBkYXRlcyBhbmQgY2xvbmUgdGhlbS5cbiAgICAgICAgdmFyIHVwZGF0ZSA9IGZpcnN0QmFzZVVwZGF0ZTtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgdmFyIGNsb25lID0ge1xuICAgICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGUuZXZlbnRUaW1lLFxuICAgICAgICAgICAgbGFuZTogdXBkYXRlLmxhbmUsXG4gICAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUucGF5bG9hZCxcbiAgICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChuZXdMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjbG9uZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3TGFzdC5uZXh0ID0gY2xvbmU7XG4gICAgICAgICAgICBuZXdMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gICAgICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gbnVsbCk7IC8vIEFwcGVuZCB0aGUgY2FwdHVyZWQgdXBkYXRlIHRoZSBlbmQgb2YgdGhlIGNsb25lZCBsaXN0LlxuXG5cbiAgICAgICAgaWYgKG5ld0xhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdMYXN0Lm5leHQgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgICAgICBuZXdMYXN0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZXJlIGFyZSBubyBiYXNlIHVwZGF0ZXMuXG4gICAgICAgIG5ld0ZpcnN0ID0gbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZSA9IHtcbiAgICAgICAgYmFzZVN0YXRlOiBjdXJyZW50UXVldWUuYmFzZVN0YXRlLFxuICAgICAgICBmaXJzdEJhc2VVcGRhdGU6IG5ld0ZpcnN0LFxuICAgICAgICBsYXN0QmFzZVVwZGF0ZTogbmV3TGFzdCxcbiAgICAgICAgc2hhcmVkOiBjdXJyZW50UXVldWUuc2hhcmVkLFxuICAgICAgICBlZmZlY3RzOiBjdXJyZW50UXVldWUuZWZmZWN0c1xuICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gcXVldWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IC8vIEFwcGVuZCB0aGUgdXBkYXRlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuXG5cblxuICB2YXIgbGFzdEJhc2VVcGRhdGUgPSBxdWV1ZS5sYXN0QmFzZVVwZGF0ZTtcblxuICBpZiAobGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgfSBlbHNlIHtcbiAgICBsYXN0QmFzZVVwZGF0ZS5uZXh0ID0gY2FwdHVyZWRVcGRhdGU7XG4gIH1cblxuICBxdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IGNhcHR1cmVkVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBnZXRTdGF0ZUZyb21VcGRhdGUod29ya0luUHJvZ3Jlc3MsIHF1ZXVlLCB1cGRhdGUsIHByZXZTdGF0ZSwgbmV4dFByb3BzLCBpbnN0YW5jZSkge1xuICBzd2l0Y2ggKHVwZGF0ZS50YWcpIHtcbiAgICBjYXNlIFJlcGxhY2VTdGF0ZTpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBheWxvYWQgPSB1cGRhdGUucGF5bG9hZDtcblxuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBVcGRhdGVyIGZ1bmN0aW9uXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBuZXh0U3RhdGUgPSBwYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXhpdERpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICAgICAgfSAvLyBTdGF0ZSBvYmplY3RcblxuXG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgfVxuXG4gICAgY2FzZSBDYXB0dXJlVXBkYXRlOlxuICAgICAge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IHdvcmtJblByb2dyZXNzLmZsYWdzICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlO1xuICAgICAgfVxuICAgIC8vIEludGVudGlvbmFsIGZhbGx0aHJvdWdoXG5cbiAgICBjYXNlIFVwZGF0ZVN0YXRlOlxuICAgICAge1xuICAgICAgICB2YXIgX3BheWxvYWQgPSB1cGRhdGUucGF5bG9hZDtcbiAgICAgICAgdmFyIHBhcnRpYWxTdGF0ZTtcblxuICAgICAgICBpZiAodHlwZW9mIF9wYXlsb2FkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gVXBkYXRlciBmdW5jdGlvblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJ0aWFsU3RhdGUgPSBfcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgX3BheWxvYWQuY2FsbChpbnN0YW5jZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMpO1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUGFydGlhbCBzdGF0ZSBvYmplY3RcbiAgICAgICAgICBwYXJ0aWFsU3RhdGUgPSBfcGF5bG9hZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0aWFsU3RhdGUgPT09IG51bGwgfHwgcGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBOdWxsIGFuZCB1bmRlZmluZWQgYXJlIHRyZWF0ZWQgYXMgbm8tb3BzLlxuICAgICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICAgIH0gLy8gTWVyZ2UgdGhlIHBhcnRpYWwgc3RhdGUgYW5kIHRoZSBwcmV2aW91cyBzdGF0ZS5cblxuXG4gICAgICAgIHJldHVybiBhc3NpZ24oe30sIHByZXZTdGF0ZSwgcGFydGlhbFN0YXRlKTtcbiAgICAgIH1cblxuICAgIGNhc2UgRm9yY2VVcGRhdGU6XG4gICAgICB7XG4gICAgICAgIGhhc0ZvcmNlVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZTtcbiAgICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcmV2U3RhdGU7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgcHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIGlzIGFsd2F5cyBub24tbnVsbCBvbiBhIENsYXNzQ29tcG9uZW50IG9yIEhvc3RSb290XG4gIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xuXG4gIHtcbiAgICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQ7XG4gIH1cblxuICB2YXIgZmlyc3RCYXNlVXBkYXRlID0gcXVldWUuZmlyc3RCYXNlVXBkYXRlO1xuICB2YXIgbGFzdEJhc2VVcGRhdGUgPSBxdWV1ZS5sYXN0QmFzZVVwZGF0ZTsgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIHBlbmRpbmcgdXBkYXRlcy4gSWYgc28sIHRyYW5zZmVyIHRoZW0gdG8gdGhlIGJhc2UgcXVldWUuXG5cbiAgdmFyIHBlbmRpbmdRdWV1ZSA9IHF1ZXVlLnNoYXJlZC5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nUXVldWUgIT09IG51bGwpIHtcbiAgICBxdWV1ZS5zaGFyZWQucGVuZGluZyA9IG51bGw7IC8vIFRoZSBwZW5kaW5nIHF1ZXVlIGlzIGNpcmN1bGFyLiBEaXNjb25uZWN0IHRoZSBwb2ludGVyIGJldHdlZW4gZmlyc3RcbiAgICAvLyBhbmQgbGFzdCBzbyB0aGF0IGl0J3Mgbm9uLWNpcmN1bGFyLlxuXG4gICAgdmFyIGxhc3RQZW5kaW5nVXBkYXRlID0gcGVuZGluZ1F1ZXVlO1xuICAgIHZhciBmaXJzdFBlbmRpbmdVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0O1xuICAgIGxhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBudWxsOyAvLyBBcHBlbmQgcGVuZGluZyB1cGRhdGVzIHRvIGJhc2UgcXVldWVcblxuICAgIGlmIChsYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgZmlyc3RCYXNlVXBkYXRlID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0QmFzZVVwZGF0ZS5uZXh0ID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgIH1cblxuICAgIGxhc3RCYXNlVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGU7IC8vIElmIHRoZXJlJ3MgYSBjdXJyZW50IHF1ZXVlLCBhbmQgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgYmFzZSBxdWV1ZSwgdGhlblxuICAgIC8vIHdlIG5lZWQgdG8gdHJhbnNmZXIgdGhlIHVwZGF0ZXMgdG8gdGhhdCBxdWV1ZSwgdG9vLiBCZWNhdXNlIHRoZSBiYXNlXG4gICAgLy8gcXVldWUgaXMgYSBzaW5nbHktbGlua2VkIGxpc3Qgd2l0aCBubyBjeWNsZXMsIHdlIGNhbiBhcHBlbmQgdG8gYm90aFxuICAgIC8vIGxpc3RzIGFuZCB0YWtlIGFkdmFudGFnZSBvZiBzdHJ1Y3R1cmFsIHNoYXJpbmcuXG4gICAgLy8gVE9ETzogUGFzcyBgY3VycmVudGAgYXMgYXJndW1lbnRcblxuICAgIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgYWx3YXlzIG5vbi1udWxsIG9uIGEgQ2xhc3NDb21wb25lbnQgb3IgSG9zdFJvb3RcbiAgICAgIHZhciBjdXJyZW50UXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuICAgICAgdmFyIGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSA9IGN1cnJlbnRRdWV1ZS5sYXN0QmFzZVVwZGF0ZTtcblxuICAgICAgaWYgKGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSAhPT0gbGFzdEJhc2VVcGRhdGUpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGN1cnJlbnRRdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudExhc3RCYXNlVXBkYXRlLm5leHQgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50UXVldWUubGFzdEJhc2VVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gVGhlc2UgdmFsdWVzIG1heSBjaGFuZ2UgYXMgd2UgcHJvY2VzcyB0aGUgcXVldWUuXG5cblxuICBpZiAoZmlyc3RCYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBsaXN0IG9mIHVwZGF0ZXMgdG8gY29tcHV0ZSB0aGUgcmVzdWx0LlxuICAgIHZhciBuZXdTdGF0ZSA9IHF1ZXVlLmJhc2VTdGF0ZTsgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byBhY2N1bXVsYXRlIHRoaXMuIEluc3RlYWQsIHdlIGNhbiByZW1vdmUgcmVuZGVyTGFuZXNcbiAgICAvLyBmcm9tIHRoZSBvcmlnaW5hbCBsYW5lcy5cblxuICAgIHZhciBuZXdMYW5lcyA9IE5vTGFuZXM7XG4gICAgdmFyIG5ld0Jhc2VTdGF0ZSA9IG51bGw7XG4gICAgdmFyIG5ld0ZpcnN0QmFzZVVwZGF0ZSA9IG51bGw7XG4gICAgdmFyIG5ld0xhc3RCYXNlVXBkYXRlID0gbnVsbDtcbiAgICB2YXIgdXBkYXRlID0gZmlyc3RCYXNlVXBkYXRlO1xuXG4gICAgZG8ge1xuICAgICAgdmFyIHVwZGF0ZUxhbmUgPSB1cGRhdGUubGFuZTtcbiAgICAgIHZhciB1cGRhdGVFdmVudFRpbWUgPSB1cGRhdGUuZXZlbnRUaW1lO1xuXG4gICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhyZW5kZXJMYW5lcywgdXBkYXRlTGFuZSkpIHtcbiAgICAgICAgLy8gUHJpb3JpdHkgaXMgaW5zdWZmaWNpZW50LiBTa2lwIHRoaXMgdXBkYXRlLiBJZiB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAvLyBza2lwcGVkIHVwZGF0ZSwgdGhlIHByZXZpb3VzIHVwZGF0ZS9zdGF0ZSBpcyB0aGUgbmV3IGJhc2VcbiAgICAgICAgLy8gdXBkYXRlL3N0YXRlLlxuICAgICAgICB2YXIgY2xvbmUgPSB7XG4gICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGVFdmVudFRpbWUsXG4gICAgICAgICAgbGFuZTogdXBkYXRlTGFuZSxcbiAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgcGF5bG9hZDogdXBkYXRlLnBheWxvYWQsXG4gICAgICAgICAgY2FsbGJhY2s6IHVwZGF0ZS5jYWxsYmFjayxcbiAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG5ld0xhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3Rmlyc3RCYXNlVXBkYXRlID0gbmV3TGFzdEJhc2VVcGRhdGUgPSBjbG9uZTtcbiAgICAgICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdMYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlLm5leHQgPSBjbG9uZTtcbiAgICAgICAgfSAvLyBVcGRhdGUgdGhlIHJlbWFpbmluZyBwcmlvcml0eSBpbiB0aGUgcXVldWUuXG5cblxuICAgICAgICBuZXdMYW5lcyA9IG1lcmdlTGFuZXMobmV3TGFuZXMsIHVwZGF0ZUxhbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyB1cGRhdGUgZG9lcyBoYXZlIHN1ZmZpY2llbnQgcHJpb3JpdHkuXG4gICAgICAgIGlmIChuZXdMYXN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfY2xvbmUgPSB7XG4gICAgICAgICAgICBldmVudFRpbWU6IHVwZGF0ZUV2ZW50VGltZSxcbiAgICAgICAgICAgIC8vIFRoaXMgdXBkYXRlIGlzIGdvaW5nIHRvIGJlIGNvbW1pdHRlZCBzbyB3ZSBuZXZlciB3YW50IHVuY29tbWl0XG4gICAgICAgICAgICAvLyBpdC4gVXNpbmcgTm9MYW5lIHdvcmtzIGJlY2F1c2UgMCBpcyBhIHN1YnNldCBvZiBhbGwgYml0bWFza3MsIHNvXG4gICAgICAgICAgICAvLyB0aGlzIHdpbGwgbmV2ZXIgYmUgc2tpcHBlZCBieSB0aGUgY2hlY2sgYWJvdmUuXG4gICAgICAgICAgICBsYW5lOiBOb0xhbmUsXG4gICAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUucGF5bG9hZCxcbiAgICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBuZXdMYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlLm5leHQgPSBfY2xvbmU7XG4gICAgICAgIH0gLy8gUHJvY2VzcyB0aGlzIHVwZGF0ZS5cblxuXG4gICAgICAgIG5ld1N0YXRlID0gZ2V0U3RhdGVGcm9tVXBkYXRlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgdXBkYXRlLCBuZXdTdGF0ZSwgcHJvcHMsIGluc3RhbmNlKTtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdXBkYXRlLmNhbGxiYWNrO1xuXG4gICAgICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCAmJiAvLyBJZiB0aGUgdXBkYXRlIHdhcyBhbHJlYWR5IGNvbW1pdHRlZCwgd2Ugc2hvdWxkIG5vdCBxdWV1ZSBpdHNcbiAgICAgICAgLy8gY2FsbGJhY2sgYWdhaW4uXG4gICAgICAgIHVwZGF0ZS5sYW5lICE9PSBOb0xhbmUpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDYWxsYmFjaztcbiAgICAgICAgICB2YXIgZWZmZWN0cyA9IHF1ZXVlLmVmZmVjdHM7XG5cbiAgICAgICAgICBpZiAoZWZmZWN0cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWUuZWZmZWN0cyA9IFt1cGRhdGVdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlZmZlY3RzLnB1c2godXBkYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG5cbiAgICAgIGlmICh1cGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgcGVuZGluZ1F1ZXVlID0gcXVldWUuc2hhcmVkLnBlbmRpbmc7XG5cbiAgICAgICAgaWYgKHBlbmRpbmdRdWV1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIGZyb20gaW5zaWRlIGEgcmVkdWNlci4gQWRkIHRoZSBuZXdcbiAgICAgICAgICAvLyBwZW5kaW5nIHVwZGF0ZXMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBhbmQga2VlcCBwcm9jZXNzaW5nLlxuICAgICAgICAgIHZhciBfbGFzdFBlbmRpbmdVcGRhdGUgPSBwZW5kaW5nUXVldWU7IC8vIEludGVudGlvbmFsbHkgdW5zb3VuZC4gUGVuZGluZyB1cGRhdGVzIGZvcm0gYSBjaXJjdWxhciBsaXN0LCBidXQgd2VcbiAgICAgICAgICAvLyB1bnJhdmVsIHRoZW0gd2hlbiB0cmFuc2ZlcnJpbmcgdGhlbSB0byB0aGUgYmFzZSBxdWV1ZS5cblxuICAgICAgICAgIHZhciBfZmlyc3RQZW5kaW5nVXBkYXRlID0gX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQ7XG4gICAgICAgICAgX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBudWxsO1xuICAgICAgICAgIHVwZGF0ZSA9IF9maXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBfbGFzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUuc2hhcmVkLnBlbmRpbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIG5ld0Jhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIH1cblxuICAgIHF1ZXVlLmJhc2VTdGF0ZSA9IG5ld0Jhc2VTdGF0ZTtcbiAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBuZXdGaXJzdEJhc2VVcGRhdGU7XG4gICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZTsgLy8gSW50ZXJsZWF2ZWQgdXBkYXRlcyBhcmUgc3RvcmVkIG9uIGEgc2VwYXJhdGUgcXVldWUuIFdlIGFyZW4ndCBnb2luZyB0b1xuICAgIC8vIHByb2Nlc3MgdGhlbSBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCB3ZSBkbyBuZWVkIHRvIHRyYWNrIHdoaWNoIGxhbmVzXG4gICAgLy8gYXJlIHJlbWFpbmluZy5cblxuICAgIHZhciBsYXN0SW50ZXJsZWF2ZWQgPSBxdWV1ZS5zaGFyZWQuaW50ZXJsZWF2ZWQ7XG5cbiAgICBpZiAobGFzdEludGVybGVhdmVkICE9PSBudWxsKSB7XG4gICAgICB2YXIgaW50ZXJsZWF2ZWQgPSBsYXN0SW50ZXJsZWF2ZWQ7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgbmV3TGFuZXMgPSBtZXJnZUxhbmVzKG5ld0xhbmVzLCBpbnRlcmxlYXZlZC5sYW5lKTtcbiAgICAgICAgaW50ZXJsZWF2ZWQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgICAgfSB3aGlsZSAoaW50ZXJsZWF2ZWQgIT09IGxhc3RJbnRlcmxlYXZlZCk7XG4gICAgfSBlbHNlIGlmIChmaXJzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIC8vIGBxdWV1ZS5sYW5lc2AgaXMgdXNlZCBmb3IgZW50YW5nbGluZyB0cmFuc2l0aW9ucy4gV2UgY2FuIHNldCBpdCBiYWNrIHRvXG4gICAgICAvLyB6ZXJvIG9uY2UgdGhlIHF1ZXVlIGlzIGVtcHR5LlxuICAgICAgcXVldWUuc2hhcmVkLmxhbmVzID0gTm9MYW5lcztcbiAgICB9IC8vIFNldCB0aGUgcmVtYWluaW5nIGV4cGlyYXRpb24gdGltZSB0byBiZSB3aGF0ZXZlciBpcyByZW1haW5pbmcgaW4gdGhlIHF1ZXVlLlxuICAgIC8vIFRoaXMgc2hvdWxkIGJlIGZpbmUgYmVjYXVzZSB0aGUgb25seSB0d28gb3RoZXIgdGhpbmdzIHRoYXQgY29udHJpYnV0ZSB0b1xuICAgIC8vIGV4cGlyYXRpb24gdGltZSBhcmUgcHJvcHMgYW5kIGNvbnRleHQuIFdlJ3JlIGFscmVhZHkgaW4gdGhlIG1pZGRsZSBvZiB0aGVcbiAgICAvLyBiZWdpbiBwaGFzZSBieSB0aGUgdGltZSB3ZSBzdGFydCBwcm9jZXNzaW5nIHRoZSBxdWV1ZSwgc28gd2UndmUgYWxyZWFkeVxuICAgIC8vIGRlYWx0IHdpdGggdGhlIHByb3BzLiBDb250ZXh0IGluIGNvbXBvbmVudHMgdGhhdCBzcGVjaWZ5XG4gICAgLy8gc2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIHRyaWNreTsgYnV0IHdlJ2xsIGhhdmUgdG8gYWNjb3VudCBmb3JcbiAgICAvLyB0aGF0IHJlZ2FyZGxlc3MuXG5cblxuICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMobmV3TGFuZXMpO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbmV3TGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9XG5cbiAge1xuICAgIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIGFzIGNhbGxiYWNrLiBFeHBlY3RlZCBhIGZ1bmN0aW9uLiBJbnN0ZWFkICcgKyAoXCJyZWNlaXZlZDogXCIgKyBjYWxsYmFjaykpO1xuICB9XG5cbiAgY2FsbGJhY2suY2FsbChjb250ZXh0KTtcbn1cblxuZnVuY3Rpb24gcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKSB7XG4gIGhhc0ZvcmNlVXBkYXRlID0gZmFsc2U7XG59XG5mdW5jdGlvbiBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkge1xuICByZXR1cm4gaGFzRm9yY2VVcGRhdGU7XG59XG5mdW5jdGlvbiBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIGZpbmlzaGVkUXVldWUsIGluc3RhbmNlKSB7XG4gIC8vIENvbW1pdCB0aGUgZWZmZWN0c1xuICB2YXIgZWZmZWN0cyA9IGZpbmlzaGVkUXVldWUuZWZmZWN0cztcbiAgZmluaXNoZWRRdWV1ZS5lZmZlY3RzID0gbnVsbDtcblxuICBpZiAoZWZmZWN0cyAhPT0gbnVsbCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWZmZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVmZmVjdCA9IGVmZmVjdHNbaV07XG4gICAgICB2YXIgY2FsbGJhY2sgPSBlZmZlY3QuY2FsbGJhY2s7XG5cbiAgICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgICBlZmZlY3QuY2FsbGJhY2sgPSBudWxsO1xuICAgICAgICBjYWxsQ2FsbGJhY2soY2FsbGJhY2ssIGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGZha2VJbnRlcm5hbEluc3RhbmNlID0ge307IC8vIFJlYWN0LkNvbXBvbmVudCB1c2VzIGEgc2hhcmVkIGZyb3plbiBvYmplY3QgYnkgZGVmYXVsdC5cbi8vIFdlJ2xsIHVzZSBpdCB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBuZWVkIHRvIGluaXRpYWxpemUgbGVnYWN5IHJlZnMuXG5cbnZhciBlbXB0eVJlZnNPYmplY3QgPSBuZXcgUmVhY3QuQ29tcG9uZW50KCkucmVmcztcbnZhciBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlO1xudmFyIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlO1xudmFyIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZTtcbnZhciB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGU7XG52YXIgd2Fybk9uSW52YWxpZENhbGxiYWNrO1xudmFyIGRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlO1xudmFyIGRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzO1xudmFyIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZTtcblxue1xuICBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcyA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlID0gbmV3IFNldCgpO1xuICB2YXIgZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrID0gbmV3IFNldCgpO1xuXG4gIHdhcm5PbkludmFsaWRDYWxsYmFjayA9IGZ1bmN0aW9uIChjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIGlmIChjYWxsYmFjayA9PT0gbnVsbCB8fCB0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIga2V5ID0gY2FsbGVyTmFtZSArICdfJyArIGNhbGxiYWNrO1xuXG4gICAgaWYgKCFkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2suaGFzKGtleSkpIHtcbiAgICAgIGRpZFdhcm5PbkludmFsaWRDYWxsYmFjay5hZGQoa2V5KTtcblxuICAgICAgZXJyb3IoJyVzKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsZXJOYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuICB9O1xuXG4gIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZSA9IGZ1bmN0aW9uICh0eXBlLCBwYXJ0aWFsU3RhdGUpIHtcbiAgICBpZiAocGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlLmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignJXMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCk6IEEgdmFsaWQgc3RhdGUgb2JqZWN0IChvciBudWxsKSBtdXN0IGJlIHJldHVybmVkLiAnICsgJ1lvdSBoYXZlIHJldHVybmVkIHVuZGVmaW5lZC4nLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07IC8vIFRoaXMgaXMgc28gZ3Jvc3MgYnV0IGl0J3MgYXQgbGVhc3Qgbm9uLWNyaXRpY2FsIGFuZCBjYW4gYmUgcmVtb3ZlZCBpZlxuICAvLyBpdCBjYXVzZXMgcHJvYmxlbXMuIFRoaXMgaXMgbWVhbnQgdG8gZ2l2ZSBhIG5pY2VyIGVycm9yIG1lc3NhZ2UgZm9yXG4gIC8vIFJlYWN0RE9NMTUudW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocmVhY3RET00xNkNvbXBvbmVudCxcbiAgLy8gLi4uKSkgd2hpY2ggb3RoZXJ3aXNlIHRocm93cyBhIFwiX3Byb2Nlc3NDaGlsZENvbnRleHQgaXMgbm90IGEgZnVuY3Rpb25cIlxuICAvLyBleGNlcHRpb24uXG5cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZmFrZUludGVybmFsSW5zdGFuY2UsICdfcHJvY2Vzc0NoaWxkQ29udGV4dCcsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdfcHJvY2Vzc0NoaWxkQ29udGV4dCBpcyBub3QgYXZhaWxhYmxlIGluIFJlYWN0IDE2Ky4gVGhpcyBsaWtlbHkgJyArICdtZWFucyB5b3UgaGF2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgUmVhY3QgYW5kIGFyZSBhdHRlbXB0aW5nIHRvIG5lc3QgJyArICdhIFJlYWN0IDE1IHRyZWUgaW5zaWRlIGEgUmVhY3QgMTYgdHJlZSB1c2luZyAnICsgXCJ1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lciwgd2hpY2ggaXNuJ3Qgc3VwcG9ydGVkLiBUcnkgXCIgKyAndG8gbWFrZSBzdXJlIHlvdSBoYXZlIG9ubHkgb25lIGNvcHkgb2YgUmVhY3QgKGFuZCBpZGVhbGx5LCBzd2l0Y2ggJyArICd0byBSZWFjdERPTS5jcmVhdGVQb3J0YWwpLicpO1xuICAgIH1cbiAgfSk7XG4gIE9iamVjdC5mcmVlemUoZmFrZUludGVybmFsSW5zdGFuY2UpO1xufVxuXG5mdW5jdGlvbiBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXh0UHJvcHMpIHtcbiAgdmFyIHByZXZTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBwYXJ0aWFsU3RhdGUgPSBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpO1xuXG4gIHtcbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbiBleHRyYSB0aW1lIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cbiAgICAgICAgcGFydGlhbFN0YXRlID0gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcywgcHJldlN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGUoY3RvciwgcGFydGlhbFN0YXRlKTtcbiAgfSAvLyBNZXJnZSB0aGUgcGFydGlhbCBzdGF0ZSBhbmQgdGhlIHByZXZpb3VzIHN0YXRlLlxuXG5cbiAgdmFyIG1lbW9pemVkU3RhdGUgPSBwYXJ0aWFsU3RhdGUgPT09IG51bGwgfHwgcGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQgPyBwcmV2U3RhdGUgOiBhc3NpZ24oe30sIHByZXZTdGF0ZSwgcGFydGlhbFN0YXRlKTtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG1lbW9pemVkU3RhdGU7IC8vIE9uY2UgdGhlIHVwZGF0ZSBxdWV1ZSBpcyBlbXB0eSwgcGVyc2lzdCB0aGUgZGVyaXZlZCBzdGF0ZSBvbnRvIHRoZVxuICAvLyBiYXNlIHN0YXRlLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFF1ZXVlIGlzIGFsd2F5cyBub24tbnVsbCBmb3IgY2xhc3Nlc1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICAgIHVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IG1lbW9pemVkU3RhdGU7XG4gIH1cbn1cblxudmFyIGNsYXNzQ29tcG9uZW50VXBkYXRlciA9IHtcbiAgaXNNb3VudGVkOiBpc01vdW50ZWQsXG4gIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKGluc3QsIHBheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICAgIHVwZGF0ZS5wYXlsb2FkID0gcGF5bG9hZDtcblxuICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjaywgJ3NldFN0YXRlJyk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBsYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGZpYmVyLCBsYW5lKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBtYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfSxcbiAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKGluc3QsIHBheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICAgIHVwZGF0ZS50YWcgPSBSZXBsYWNlU3RhdGU7XG4gICAgdXBkYXRlLnBheWxvYWQgPSBwYXlsb2FkO1xuXG4gICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgd2Fybk9uSW52YWxpZENhbGxiYWNrKGNhbGxiYWNrLCAncmVwbGFjZVN0YXRlJyk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBsYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGZpYmVyLCBsYW5lKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBtYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfSxcbiAgZW5xdWV1ZUZvcmNlVXBkYXRlOiBmdW5jdGlvbiAoaW5zdCwgY2FsbGJhY2spIHtcbiAgICB2YXIgZmliZXIgPSBnZXQoaW5zdCk7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7XG4gICAgdXBkYXRlLnRhZyA9IEZvcmNlVXBkYXRlO1xuXG4gICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgd2Fybk9uSW52YWxpZENhbGxiYWNrKGNhbGxiYWNrLCAnZm9yY2VVcGRhdGUnKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3Rvciwgb2xkUHJvcHMsIG5ld1Byb3BzLCBvbGRTdGF0ZSwgbmV3U3RhdGUsIG5leHRDb250ZXh0KSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICBpZiAodHlwZW9mIGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBzaG91bGRVcGRhdGUgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgICB7XG4gICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbiBleHRyYSB0aW1lIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cbiAgICAgICAgICBzaG91bGRVcGRhdGUgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRVcGRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlcnJvcignJXMuc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk6IFJldHVybmVkIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIGEgJyArICdib29sZWFuIHZhbHVlLiBNYWtlIHN1cmUgdG8gcmV0dXJuIHRydWUgb3IgZmFsc2UuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2hvdWxkVXBkYXRlO1xuICB9XG5cbiAgaWYgKGN0b3IucHJvdG90eXBlICYmIGN0b3IucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50KSB7XG4gICAgcmV0dXJuICFzaGFsbG93RXF1YWwob2xkUHJvcHMsIG5ld1Byb3BzKSB8fCAhc2hhbGxvd0VxdWFsKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY2hlY2tDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcykge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAge1xuICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuICAgIHZhciByZW5kZXJQcmVzZW50ID0gaW5zdGFuY2UucmVuZGVyO1xuXG4gICAgaWYgKCFyZW5kZXJQcmVzZW50KSB7XG4gICAgICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgdHlwZW9mIGN0b3IucHJvdG90eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcignJXMoLi4uKTogTm8gYHJlbmRlcmAgbWV0aG9kIGZvdW5kIG9uIHRoZSByZXR1cm5lZCBjb21wb25lbnQgJyArICdpbnN0YW5jZTogZGlkIHlvdSBhY2NpZGVudGFsbHkgcmV0dXJuIGFuIG9iamVjdCBmcm9tIHRoZSBjb25zdHJ1Y3Rvcj8nLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBObyBgcmVuZGVyYCBtZXRob2QgZm91bmQgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudCAnICsgJ2luc3RhbmNlOiB5b3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIGRlZmluZSBgcmVuZGVyYC4nLCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZ2V0SW5pdGlhbFN0YXRlICYmICFpbnN0YW5jZS5nZXRJbml0aWFsU3RhdGUuaXNSZWFjdENsYXNzQXBwcm92ZWQgJiYgIWluc3RhbmNlLnN0YXRlKSB7XG4gICAgICBlcnJvcignZ2V0SW5pdGlhbFN0YXRlIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBkZWZpbmUgYSBzdGF0ZSBwcm9wZXJ0eSBpbnN0ZWFkPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5nZXREZWZhdWx0UHJvcHMgJiYgIWluc3RhbmNlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyB3YXMgZGVmaW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiAnICsgJ1RoaXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGNsYXNzZXMgY3JlYXRlZCB1c2luZyBSZWFjdC5jcmVhdGVDbGFzcy4gJyArICdVc2UgYSBzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGRlZmF1bHRQcm9wcyBpbnN0ZWFkLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5wcm9wVHlwZXMpIHtcbiAgICAgIGVycm9yKCdwcm9wVHlwZXMgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBwcm9wVHlwZXMgaW5zdGVhZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuY29udGV4dFR5cGUpIHtcbiAgICAgIGVycm9yKCdjb250ZXh0VHlwZSB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIGNvbnRleHRUeXBlIGluc3RlYWQuJywgbmFtZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGluc3RhbmNlLmNvbnRleHRUeXBlcykge1xuICAgICAgICBlcnJvcignY29udGV4dFR5cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5cGVzIGluc3RlYWQuJywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdG9yLmNvbnRleHRUeXBlICYmIGN0b3IuY29udGV4dFR5cGVzICYmICFkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcy5oYXMoY3RvcikpIHtcbiAgICAgICAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMuYWRkKGN0b3IpO1xuXG4gICAgICAgIGVycm9yKCclcyBkZWNsYXJlcyBib3RoIGNvbnRleHRUeXBlcyBhbmQgY29udGV4dFR5cGUgc3RhdGljIHByb3BlcnRpZXMuICcgKyAnVGhlIGxlZ2FjeSBjb250ZXh0VHlwZXMgcHJvcGVydHkgd2lsbCBiZSBpZ25vcmVkLicsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50U2hvdWxkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudFNob3VsZFVwZGF0ZSgpLiBEaWQgeW91IG1lYW4gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk/ICcgKyAnVGhlIG5hbWUgaXMgcGhyYXNlZCBhcyBhIHF1ZXN0aW9uIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGlzICcgKyAnZXhwZWN0ZWQgdG8gcmV0dXJuIGEgdmFsdWUuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGN0b3IucHJvdG90eXBlICYmIGN0b3IucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ICYmIHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCBzaG91bGRDb21wb25lbnRVcGRhdGUoKS4gJyArICdzaG91bGRDb21wb25lbnRVcGRhdGUgc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4gZXh0ZW5kaW5nIFJlYWN0LlB1cmVDb21wb25lbnQuICcgKyAnUGxlYXNlIGV4dGVuZCBSZWFjdC5Db21wb25lbnQgaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIHVzZWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdBIHB1cmUgY29tcG9uZW50Jyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudERpZFVubW91bnQoKS4gQnV0IHRoZXJlIGlzIG5vIHN1Y2ggbGlmZWN5Y2xlIG1ldGhvZC4gJyArICdEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFVubW91bnQoKT8nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnREaWRSZWNlaXZlUHJvcHMoKS4gQnV0IHRoZXJlIGlzIG5vIHN1Y2ggbGlmZWN5Y2xlIG1ldGhvZC4gJyArICdJZiB5b3UgbWVhbnQgdG8gdXBkYXRlIHRoZSBzdGF0ZSBpbiByZXNwb25zZSB0byBjaGFuZ2luZyBwcm9wcywgJyArICd1c2UgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpLiBJZiB5b3UgbWVhbnQgdG8gZmV0Y2ggZGF0YSBvciAnICsgJ3J1biBzaWRlLWVmZmVjdHMgb3IgbXV0YXRpb25zIGFmdGVyIFJlYWN0IGhhcyB1cGRhdGVkIHRoZSBVSSwgdXNlIGNvbXBvbmVudERpZFVwZGF0ZSgpLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzKCkuIERpZCB5b3UgbWVhbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdVTlNBRkVfY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKT8nLCBuYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgaGFzTXV0YXRlZFByb3BzID0gaW5zdGFuY2UucHJvcHMgIT09IG5ld1Byb3BzO1xuXG4gICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSB1bmRlZmluZWQgJiYgaGFzTXV0YXRlZFByb3BzKSB7XG4gICAgICBlcnJvcignJXMoLi4uKTogV2hlbiBjYWxsaW5nIHN1cGVyKCkgaW4gYCVzYCwgbWFrZSBzdXJlIHRvIHBhc3MgJyArIFwidXAgdGhlIHNhbWUgcHJvcHMgdGhhdCB5b3VyIGNvbXBvbmVudCdzIGNvbnN0cnVjdG9yIHdhcyBwYXNzZWQuXCIsIG5hbWUsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIGVycm9yKCdTZXR0aW5nIGRlZmF1bHRQcm9wcyBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcyBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIGlnbm9yZWQuJyArICcgSW5zdGVhZCwgZGVmaW5lIGRlZmF1bHRQcm9wcyBhcyBhIHN0YXRpYyBwcm9wZXJ0eSBvbiAlcy4nLCBuYW1lLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgIT09ICdmdW5jdGlvbicgJiYgIWRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZS5oYXMoY3RvcikpIHtcbiAgICAgIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZS5hZGQoY3Rvcik7XG5cbiAgICAgIGVycm9yKCclczogZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBzaG91bGQgYmUgdXNlZCB3aXRoIGNvbXBvbmVudERpZFVwZGF0ZSgpLiAnICsgJ1RoaXMgY29tcG9uZW50IGRlZmluZXMgZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBvbmx5LicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclczogZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCkgaXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBtZXRob2QgJyArICdhbmQgd2lsbCBiZSBpZ25vcmVkLiBJbnN0ZWFkLCBkZWNsYXJlIGl0IGFzIGEgc3RhdGljIG1ldGhvZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzOiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoKSBpcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIG1ldGhvZCAnICsgJ2FuZCB3aWxsIGJlIGlnbm9yZWQuIEluc3RlYWQsIGRlY2xhcmUgaXQgYXMgYSBzdGF0aWMgbWV0aG9kLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY3Rvci5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzOiBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIGlzIGRlZmluZWQgYXMgYSBzdGF0aWMgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhbiBpbnN0YW5jZSBtZXRob2QuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIF9zdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gICAgaWYgKF9zdGF0ZSAmJiAodHlwZW9mIF9zdGF0ZSAhPT0gJ29iamVjdCcgfHwgaXNBcnJheShfc3RhdGUpKSkge1xuICAgICAgZXJyb3IoJyVzLnN0YXRlOiBtdXN0IGJlIHNldCB0byBhbiBvYmplY3Qgb3IgbnVsbCcsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBjdG9yLmNoaWxkQ29udGV4dFR5cGVzICE9PSAnb2JqZWN0Jykge1xuICAgICAgZXJyb3IoJyVzLmdldENoaWxkQ29udGV4dCgpOiBjaGlsZENvbnRleHRUeXBlcyBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgdG8gJyArICd1c2UgZ2V0Q2hpbGRDb250ZXh0KCkuJywgbmFtZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkb3B0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UudXBkYXRlciA9IGNsYXNzQ29tcG9uZW50VXBkYXRlcjtcbiAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gaW5zdGFuY2U7IC8vIFRoZSBpbnN0YW5jZSBuZWVkcyBhY2Nlc3MgdG8gdGhlIGZpYmVyIHNvIHRoYXQgaXQgY2FuIHNjaGVkdWxlIHVwZGF0ZXNcblxuICBzZXQoaW5zdGFuY2UsIHdvcmtJblByb2dyZXNzKTtcblxuICB7XG4gICAgaW5zdGFuY2UuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSA9IGZha2VJbnRlcm5hbEluc3RhbmNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHByb3BzKSB7XG4gIHZhciBpc0xlZ2FjeUNvbnRleHRDb25zdW1lciA9IGZhbHNlO1xuICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuICB2YXIgY29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcblxuICB7XG4gICAgaWYgKCdjb250ZXh0VHlwZScgaW4gY3Rvcikge1xuICAgICAgdmFyIGlzVmFsaWQgPSAvLyBBbGxvdyBudWxsIGZvciBjb25kaXRpb25hbCBkZWNsYXJhdGlvblxuICAgICAgY29udGV4dFR5cGUgPT09IG51bGwgfHwgY29udGV4dFR5cGUgIT09IHVuZGVmaW5lZCAmJiBjb250ZXh0VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFICYmIGNvbnRleHRUeXBlLl9jb250ZXh0ID09PSB1bmRlZmluZWQ7IC8vIE5vdCBhIDxDb250ZXh0LkNvbnN1bWVyPlxuXG4gICAgICBpZiAoIWlzVmFsaWQgJiYgIWRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZS5oYXMoY3RvcikpIHtcbiAgICAgICAgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlLmFkZChjdG9yKTtcbiAgICAgICAgdmFyIGFkZGVuZHVtID0gJyc7XG5cbiAgICAgICAgaWYgKGNvbnRleHRUeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIHVuZGVmaW5lZC4gJyArICdUaGlzIGNhbiBiZSBjYXVzZWQgYnkgYSB0eXBvIG9yIGJ5IG1peGluZyB1cCBuYW1lZCBhbmQgZGVmYXVsdCBpbXBvcnRzLiAnICsgJ1RoaXMgY2FuIGFsc28gaGFwcGVuIGR1ZSB0byBhIGNpcmN1bGFyIGRlcGVuZGVuY3ksIHNvICcgKyAndHJ5IG1vdmluZyB0aGUgY3JlYXRlQ29udGV4dCgpIGNhbGwgdG8gYSBzZXBhcmF0ZSBmaWxlLic7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRleHRUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBIb3dldmVyLCBpdCBpcyBzZXQgdG8gYSAnICsgdHlwZW9mIGNvbnRleHRUeXBlICsgJy4nO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFKSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIERpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgdGhlIENvbnRleHQuUHJvdmlkZXIgaW5zdGVhZD8nO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlLl9jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyA8Q29udGV4dC5Db25zdW1lcj5cbiAgICAgICAgICBhZGRlbmR1bSA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyB0aGUgQ29udGV4dC5Db25zdW1lciBpbnN0ZWFkPyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIEhvd2V2ZXIsIGl0IGlzIHNldCB0byBhbiBvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY29udGV4dFR5cGUpLmpvaW4oJywgJykgKyAnfS4nO1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3IoJyVzIGRlZmluZXMgYW4gaW52YWxpZCBjb250ZXh0VHlwZS4gJyArICdjb250ZXh0VHlwZSBzaG91bGQgcG9pbnQgdG8gdGhlIENvbnRleHQgb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZUNvbnRleHQoKS4lcycsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JywgYWRkZW5kdW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgY29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIHZhciBjb250ZXh0VHlwZXMgPSBjdG9yLmNvbnRleHRUeXBlcztcbiAgICBpc0xlZ2FjeUNvbnRleHRDb25zdW1lciA9IGNvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjb250ZXh0VHlwZXMgIT09IHVuZGVmaW5lZDtcbiAgICBjb250ZXh0ID0gaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPyBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpIDogZW1wdHlDb250ZXh0T2JqZWN0O1xuICB9XG5cbiAgdmFyIGluc3RhbmNlID0gbmV3IGN0b3IocHJvcHMsIGNvbnRleHQpOyAvLyBJbnN0YW50aWF0ZSB0d2ljZSB0byBoZWxwIGRldGVjdCBzaWRlLWVmZmVjdHMuXG5cbiAge1xuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpbnN0YW5jZSA9IG5ldyBjdG9yKHByb3BzLCBjb250ZXh0KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGUgIT09IG51bGwgJiYgaW5zdGFuY2Uuc3RhdGUgIT09IHVuZGVmaW5lZCA/IGluc3RhbmNlLnN0YXRlIDogbnVsbDtcbiAgYWRvcHRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7XG5cbiAge1xuICAgIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgc3RhdGUgPT09IG51bGwpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlLmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignYCVzYCB1c2VzIGBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNgIGJ1dCBpdHMgaW5pdGlhbCBzdGF0ZSBpcyAnICsgJyVzLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZC4gSW5zdGVhZCwgZGVmaW5lIHRoZSBpbml0aWFsIHN0YXRlIGJ5ICcgKyAnYXNzaWduaW5nIGFuIG9iamVjdCB0byBgdGhpcy5zdGF0ZWAgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIGAlc2AuICcgKyAnVGhpcyBlbnN1cmVzIHRoYXQgYGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc2AgYXJndW1lbnRzIGhhdmUgYSBjb25zaXN0ZW50IHNoYXBlLicsIGNvbXBvbmVudE5hbWUsIGluc3RhbmNlLnN0YXRlID09PSBudWxsID8gJ251bGwnIDogJ3VuZGVmaW5lZCcsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH0gLy8gSWYgbmV3IGNvbXBvbmVudCBBUElzIGFyZSBkZWZpbmVkLCBcInVuc2FmZVwiIGxpZmVjeWNsZXMgd29uJ3QgYmUgY2FsbGVkLlxuICAgIC8vIFdhcm4gYWJvdXQgdGhlc2UgbGlmZWN5Y2xlcyBpZiB0aGV5IGFyZSBwcmVzZW50LlxuICAgIC8vIERvbid0IHdhcm4gYWJvdXQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBtZXRob2RzIHRob3VnaC5cblxuXG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBmb3VuZFdpbGxNb3VudE5hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSBudWxsO1xuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxNb3VudE5hbWUgPSAnY29tcG9uZW50V2lsbE1vdW50JztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsTW91bnROYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsTW91bnQnO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICAgIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSAnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJztcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxVcGRhdGVOYW1lID0gJ2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsVXBkYXRlTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSc7XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3VuZFdpbGxNb3VudE5hbWUgIT09IG51bGwgfHwgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSAhPT0gbnVsbCB8fCBmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBfY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgICB2YXIgbmV3QXBpTmFtZSA9IHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/ICdnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKScgOiAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSc7XG5cbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlLmhhcyhfY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgICBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlLmFkZChfY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgICBlcnJvcignVW5zYWZlIGxlZ2FjeSBsaWZlY3ljbGVzIHdpbGwgbm90IGJlIGNhbGxlZCBmb3IgY29tcG9uZW50cyB1c2luZyBuZXcgY29tcG9uZW50IEFQSXMuXFxuXFxuJyArICclcyB1c2VzICVzIGJ1dCBhbHNvIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbGVnYWN5IGxpZmVjeWNsZXM6JXMlcyVzXFxuXFxuJyArICdUaGUgYWJvdmUgbGlmZWN5Y2xlcyBzaG91bGQgYmUgcmVtb3ZlZC4gTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTpcXG4nICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMnLCBfY29tcG9uZW50TmFtZSwgbmV3QXBpTmFtZSwgZm91bmRXaWxsTW91bnROYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsTW91bnROYW1lIDogJycsIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgIT09IG51bGwgPyBcIlxcbiAgXCIgKyBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lIDogJycsIGZvdW5kV2lsbFVwZGF0ZU5hbWUgIT09IG51bGwgPyBcIlxcbiAgXCIgKyBmb3VuZFdpbGxVcGRhdGVOYW1lIDogJycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENhY2hlIHVubWFza2VkIGNvbnRleHQgc28gd2UgY2FuIGF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIG5lY2Vzc2FyeS5cbiAgLy8gUmVhY3RGaWJlckNvbnRleHQgdXN1YWxseSB1cGRhdGVzIHRoaXMgY2FjaGUgYnV0IGNhbid0IGZvciBuZXdseS1jcmVhdGVkIGluc3RhbmNlcy5cblxuXG4gIGlmIChpc0xlZ2FjeUNvbnRleHRDb25zdW1lcikge1xuICAgIGNhY2hlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0LCBjb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cblxuZnVuY3Rpb24gY2FsbENvbXBvbmVudFdpbGxNb3VudCh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpIHtcbiAgdmFyIG9sZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgfVxuXG4gIGlmIChvbGRTdGF0ZSAhPT0gaW5zdGFuY2Uuc3RhdGUpIHtcbiAgICB7XG4gICAgICBlcnJvcignJXMuY29tcG9uZW50V2lsbE1vdW50KCk6IEFzc2lnbmluZyBkaXJlY3RseSB0byB0aGlzLnN0YXRlIGlzICcgKyBcImRlcHJlY2F0ZWQgKGV4Y2VwdCBpbnNpZGUgYSBjb21wb25lbnQncyBcIiArICdjb25zdHJ1Y3RvcikuIFVzZSBzZXRTdGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdDb21wb25lbnQnKTtcbiAgICB9XG5cbiAgICBjbGFzc0NvbXBvbmVudFVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZShpbnN0YW5jZSwgaW5zdGFuY2Uuc3RhdGUsIG51bGwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KSB7XG4gIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICB9XG5cbiAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBvbGRTdGF0ZSkge1xuICAgIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50Lmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclcy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk6IEFzc2lnbmluZyBkaXJlY3RseSB0byAnICsgXCJ0aGlzLnN0YXRlIGlzIGRlcHJlY2F0ZWQgKGV4Y2VwdCBpbnNpZGUgYSBjb21wb25lbnQncyBcIiArICdjb25zdHJ1Y3RvcikuIFVzZSBzZXRTdGF0ZSBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNsYXNzQ29tcG9uZW50VXBkYXRlci5lbnF1ZXVlUmVwbGFjZVN0YXRlKGluc3RhbmNlLCBpbnN0YW5jZS5zdGF0ZSwgbnVsbCk7XG4gIH1cbn0gLy8gSW52b2tlcyB0aGUgbW91bnQgbGlmZS1jeWNsZXMgb24gYSBwcmV2aW91c2x5IG5ldmVyIHJlbmRlcmVkIGluc3RhbmNlLlxuXG5cbmZ1bmN0aW9uIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICBjaGVja0NsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzKTtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICBpbnN0YW5jZS5yZWZzID0gZW1wdHlSZWZzT2JqZWN0O1xuICBpbml0aWFsaXplVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgaW5zdGFuY2UuY29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICBpbnN0YW5jZS5jb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHtcbiAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgPT09IG5ld1Byb3BzKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclczogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFzc2lnbiBwcm9wcyBkaXJlY3RseSB0byBzdGF0ZSAnICsgXCJiZWNhdXNlIHVwZGF0ZXMgdG8gcHJvcHMgd29uJ3QgYmUgcmVmbGVjdGVkIGluIHN0YXRlLiBcIiArICdJbiBtb3N0IGNhc2VzLCBpdCBpcyBiZXR0ZXIgdG8gdXNlIHByb3BzIGRpcmVjdGx5LicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmcod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuXG4gIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfSAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuXG4gIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTsgLy8gSWYgd2UgaGFkIGFkZGl0aW9uYWwgc3RhdGUgdXBkYXRlcyBkdXJpbmcgdGhpcyBsaWZlLWN5Y2xlLCBsZXQnc1xuICAgIC8vIHByb2Nlc3MgdGhlbSBub3cuXG5cbiAgICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICAgIHtcbiAgICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICAgIH1cblxuICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBmaWJlckZsYWdzO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3VtZU1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcztcbiAgaW5zdGFuY2UucHJvcHMgPSBvbGRQcm9wcztcbiAgdmFyIG9sZENvbnRleHQgPSBpbnN0YW5jZS5jb250ZXh0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuICB2YXIgbmV4dENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBuZXh0Q29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmV4dExlZ2FjeVVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgbmV4dENvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBuZXh0TGVnYWN5VW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgdmFyIGhhc05ld0xpZmVjeWNsZXMgPSB0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJzsgLy8gTm90ZTogRHVyaW5nIHRoZXNlIGxpZmUtY3ljbGVzLCBpbnN0YW5jZS5wcm9wcy9pbnN0YW5jZS5zdGF0ZSBhcmUgd2hhdFxuICAvLyBldmVyIHRoZSBwcmV2aW91c2x5IGF0dGVtcHRlZCB0byByZW5kZXIgLSBub3QgdGhlIFwiY3VycmVudFwiLiBIb3dldmVyLFxuICAvLyBkdXJpbmcgY29tcG9uZW50RGlkVXBkYXRlIHdlIHBhc3MgdGhlIFwiY3VycmVudFwiIHByb3BzLlxuICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzIHx8IG9sZENvbnRleHQgIT09IG5leHRDb250ZXh0KSB7XG4gICAgICBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKTtcbiAgdmFyIG9sZFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIG5ld1N0YXRlID0gaW5zdGFuY2Uuc3RhdGUgPSBvbGRTdGF0ZTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKTtcbiAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChvbGRQcm9wcyA9PT0gbmV3UHJvcHMgJiYgb2xkU3RhdGUgPT09IG5ld1N0YXRlICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpICYmICFjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkpIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBmaWJlckZsYWdzID0gVXBkYXRlO1xuXG4gICAgICB7XG4gICAgICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICAgICAgfVxuXG4gICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFwcGx5RGVyaXZlZFN0YXRlRnJvbVByb3BzKHdvcmtJblByb2dyZXNzLCBjdG9yLCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIG5ld1Byb3BzKTtcbiAgICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIH1cblxuICB2YXIgc2hvdWxkVXBkYXRlID0gY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpIHx8IGNoZWNrU2hvdWxkQ29tcG9uZW50VXBkYXRlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBvbGRQcm9wcywgbmV3UHJvcHMsIG9sZFN0YXRlLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuXG4gIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuICAgIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICAgICAge1xuICAgICAgICBfZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gICAgICB9XG5cbiAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICBfZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gX2ZpYmVyRmxhZ3M7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIF9maWJlckZsYWdzMiA9IFVwZGF0ZTtcblxuICAgICAge1xuICAgICAgICBfZmliZXJGbGFnczIgfD0gTGF5b3V0U3RhdGljO1xuICAgICAgfVxuXG4gICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgX2ZpYmVyRmxhZ3MyIHw9IE1vdW50TGF5b3V0RGV2O1xuICAgICAgfVxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBfZmliZXJGbGFnczI7XG4gICAgfSAvLyBJZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJuZWQgZmFsc2UsIHdlIHNob3VsZCBzdGlsbCB1cGRhdGUgdGhlXG4gICAgLy8gbWVtb2l6ZWQgc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHdvcmsgY2FuIGJlIHJldXNlZC5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5ld1Byb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfSAvLyBVcGRhdGUgdGhlIGV4aXN0aW5nIGluc3RhbmNlJ3Mgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCBwb2ludGVycyBldmVuXG4gIC8vIGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5zIGZhbHNlLlxuXG5cbiAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgaW5zdGFuY2UuY29udGV4dCA9IG5leHRDb250ZXh0O1xuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufSAvLyBJbnZva2VzIHRoZSB1cGRhdGUgbGlmZS1jeWNsZXMgYW5kIHJldHVybnMgZmFsc2UgaWYgaXQgc2hvdWxkbid0IHJlcmVuZGVyLlxuXG5cbmZ1bmN0aW9uIHVwZGF0ZUNsYXNzSW5zdGFuY2UoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzLCByZW5kZXJMYW5lcykge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgdW5yZXNvbHZlZE9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcztcbiAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MudHlwZSA9PT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPyB1bnJlc29sdmVkT2xkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKHdvcmtJblByb2dyZXNzLnR5cGUsIHVucmVzb2x2ZWRPbGRQcm9wcyk7XG4gIGluc3RhbmNlLnByb3BzID0gb2xkUHJvcHM7XG4gIHZhciB1bnJlc29sdmVkTmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBvbGRDb250ZXh0ID0gaW5zdGFuY2UuY29udGV4dDtcbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcbiAgdmFyIG5leHRDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgbmV4dENvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5leHRVbm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIG5leHRDb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgbmV4dFVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XG4gIHZhciBoYXNOZXdMaWZlY3ljbGVzID0gdHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbic7IC8vIE5vdGU6IER1cmluZyB0aGVzZSBsaWZlLWN5Y2xlcywgaW5zdGFuY2UucHJvcHMvaW5zdGFuY2Uuc3RhdGUgYXJlIHdoYXRcbiAgLy8gZXZlciB0aGUgcHJldmlvdXNseSBhdHRlbXB0ZWQgdG8gcmVuZGVyIC0gbm90IHRoZSBcImN1cnJlbnRcIi4gSG93ZXZlcixcbiAgLy8gZHVyaW5nIGNvbXBvbmVudERpZFVwZGF0ZSB3ZSBwYXNzIHRoZSBcImN1cnJlbnRcIiBwcm9wcy5cbiAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG5cbiAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gdW5yZXNvbHZlZE5ld1Byb3BzIHx8IG9sZENvbnRleHQgIT09IG5leHRDb250ZXh0KSB7XG4gICAgICBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKTtcbiAgdmFyIG9sZFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIG5ld1N0YXRlID0gaW5zdGFuY2Uuc3RhdGUgPSBvbGRTdGF0ZTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKTtcbiAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgPT09IHVucmVzb2x2ZWROZXdQcm9wcyAmJiBvbGRTdGF0ZSA9PT0gbmV3U3RhdGUgJiYgIWhhc0NvbnRleHRDaGFuZ2VkKCkgJiYgIWNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSAmJiAhKGVuYWJsZUxhenlDb250ZXh0UHJvcGFnYXRpb24gICApKSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCkgfHwgLy8gVE9ETzogSW4gc29tZSBjYXNlcywgd2UnbGwgZW5kIHVwIGNoZWNraW5nIGlmIGNvbnRleHQgaGFzIGNoYW5nZWQgdHdpY2UsXG4gIC8vIGJvdGggYmVmb3JlIGFuZCBhZnRlciBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCBoYXMgYmVlbiBjYWxsZWQuIE5vdCBpZGVhbCxcbiAgLy8gYnV0IEknbSBsb2F0aCB0byByZWZhY3RvciB0aGlzIGZ1bmN0aW9uLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgbWVtb2l6ZWRcbiAgLy8gY29tcG9uZW50cyBzbyBpdCdzIG5vdCB0aGF0IGNvbW1vbi5cbiAgZW5hYmxlTGF6eUNvbnRleHRQcm9wYWdhdGlvbiAgIDtcblxuICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gICAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cbiAgICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDtcbiAgICAgIH1cbiAgICB9IC8vIElmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5lZCBmYWxzZSwgd2Ugc2hvdWxkIHN0aWxsIHVwZGF0ZSB0aGVcbiAgICAvLyBtZW1vaXplZCBwcm9wcy9zdGF0ZSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgd29yayBjYW4gYmUgcmV1c2VkLlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gbmV3UHJvcHM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UncyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHBvaW50ZXJzIGV2ZW5cbiAgLy8gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2UuXG5cblxuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IG5ld1N0YXRlO1xuICBpbnN0YW5jZS5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59XG5cbnZhciBkaWRXYXJuQWJvdXRNYXBzO1xudmFyIGRpZFdhcm5BYm91dEdlbmVyYXRvcnM7XG52YXIgZGlkV2FybkFib3V0U3RyaW5nUmVmcztcbnZhciBvd25lckhhc0tleVVzZVdhcm5pbmc7XG52YXIgb3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nO1xuXG52YXIgd2FybkZvck1pc3NpbmdLZXkgPSBmdW5jdGlvbiAoY2hpbGQsIHJldHVybkZpYmVyKSB7fTtcblxue1xuICBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dEdlbmVyYXRvcnMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0U3RyaW5nUmVmcyA9IHt9O1xuICAvKipcbiAgICogV2FybiBpZiB0aGVyZSdzIG5vIGtleSBleHBsaWNpdGx5IHNldCBvbiBkeW5hbWljIGFycmF5cyBvZiBjaGlsZHJlbiBvclxuICAgKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAgICogdXBkYXRlcy5cbiAgICovXG5cbiAgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG4gIG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZyA9IHt9O1xuXG4gIHdhcm5Gb3JNaXNzaW5nS2V5ID0gZnVuY3Rpb24gKGNoaWxkLCByZXR1cm5GaWJlcikge1xuICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFjaGlsZC5fc3RvcmUgfHwgY2hpbGQuX3N0b3JlLnZhbGlkYXRlZCB8fCBjaGlsZC5rZXkgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2hpbGQuX3N0b3JlICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdCBDb21wb25lbnQgaW4gd2FybkZvck1pc3NpbmdLZXkgc2hvdWxkIGhhdmUgYSBfc3RvcmUuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBjaGlsZC5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIocmV0dXJuRmliZXIpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjb21wb25lbnROYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG93bmVySGFzS2V5VXNlV2FybmluZ1tjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgJyArICdcImtleVwiIHByb3AuIFNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd2FybmluZy1rZXlzIGZvciAnICsgJ21vcmUgaW5mb3JtYXRpb24uJyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudCkge1xuICB2YXIgbWl4ZWRSZWYgPSBlbGVtZW50LnJlZjtcblxuICBpZiAobWl4ZWRSZWYgIT09IG51bGwgJiYgdHlwZW9mIG1peGVkUmVmICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtaXhlZFJlZiAhPT0gJ29iamVjdCcpIHtcbiAgICB7XG4gICAgICAvLyBUT0RPOiBDbGVhbiB0aGlzIHVwIG9uY2Ugd2UgdHVybiBvbiB0aGUgc3RyaW5nIHJlZiB3YXJuaW5nIGZvclxuICAgICAgLy8gZXZlcnlvbmUsIGJlY2F1c2UgdGhlIHN0cmljdCBtb2RlIGNhc2Ugd2lsbCBubyBsb25nZXIgYmUgcmVsZXZhbnRcbiAgICAgIGlmICgocmV0dXJuRmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgfHwgd2FybkFib3V0U3RyaW5nUmVmcykgJiYgLy8gV2Ugd2FybiBpbiBSZWFjdEVsZW1lbnQuanMgaWYgb3duZXIgYW5kIHNlbGYgYXJlIGVxdWFsIGZvciBzdHJpbmcgcmVmc1xuICAgICAgLy8gYmVjYXVzZSB0aGVzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb25cbiAgICAgIC8vIHVzaW5nIGEgY29kZW1vZC4gVGhlcmVmb3JlLCB3ZSBkb24ndCBoYXZlIHRvIHdhcm4gYWJvdXQgc3RyaW5nIHJlZnMgYWdhaW4uXG4gICAgICAhKGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX3NlbGYgJiYgZWxlbWVudC5fb3duZXIuc3RhdGVOb2RlICE9PSBlbGVtZW50Ll9zZWxmKSkge1xuICAgICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIocmV0dXJuRmliZXIpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVycm9yKCdBIHN0cmluZyByZWYsIFwiJXNcIiwgaGFzIGJlZW4gZm91bmQgd2l0aGluIGEgc3RyaWN0IG1vZGUgdHJlZS4gJyArICdTdHJpbmcgcmVmcyBhcmUgYSBzb3VyY2Ugb2YgcG90ZW50aWFsIGJ1Z3MgYW5kIHNob3VsZCBiZSBhdm9pZGVkLiAnICsgJ1dlIHJlY29tbWVuZCB1c2luZyB1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIG1peGVkUmVmKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbGVtZW50Ll9vd25lcikge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgaW5zdDtcblxuICAgICAgaWYgKG93bmVyKSB7XG4gICAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7XG5cbiAgICAgICAgaWYgKG93bmVyRmliZXIudGFnICE9PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgaGF2ZSBzdHJpbmcgcmVmcy4gJyArICdXZSByZWNvbW1lbmQgdXNpbmcgdXNlUmVmKCkgaW5zdGVhZC4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLXN0cmluZy1yZWYnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluc3QgPSBvd25lckZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpbnN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3Npbmcgb3duZXIgZm9yIHN0cmluZyByZWYgXCIgKyBtaXhlZFJlZiArIFwiLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBcIiArICdidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgfSAvLyBBc3NpZ25pbmcgdGhpcyB0byBhIGNvbnN0IHNvIEZsb3cga25vd3MgaXQgd29uJ3QgY2hhbmdlIGluIHRoZSBjbG9zdXJlXG5cblxuICAgICAgdmFyIHJlc29sdmVkSW5zdCA9IGluc3Q7XG5cbiAgICAgIHtcbiAgICAgICAgY2hlY2tQcm9wU3RyaW5nQ29lcmNpb24obWl4ZWRSZWYsICdyZWYnKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0cmluZ1JlZiA9ICcnICsgbWl4ZWRSZWY7IC8vIENoZWNrIGlmIHByZXZpb3VzIHN0cmluZyByZWYgbWF0Y2hlcyBuZXcgc3RyaW5nIHJlZlxuXG4gICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnJlZiAhPT0gbnVsbCAmJiB0eXBlb2YgY3VycmVudC5yZWYgPT09ICdmdW5jdGlvbicgJiYgY3VycmVudC5yZWYuX3N0cmluZ1JlZiA9PT0gc3RyaW5nUmVmKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50LnJlZjtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlZiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgcmVmcyA9IHJlc29sdmVkSW5zdC5yZWZzO1xuXG4gICAgICAgIGlmIChyZWZzID09PSBlbXB0eVJlZnNPYmplY3QpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgbGF6eSBwb29sZWQgZnJvemVuIG9iamVjdCwgc28gd2UgbmVlZCB0byBpbml0aWFsaXplLlxuICAgICAgICAgIHJlZnMgPSByZXNvbHZlZEluc3QucmVmcyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgZGVsZXRlIHJlZnNbc3RyaW5nUmVmXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWZzW3N0cmluZ1JlZl0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmVmLl9zdHJpbmdSZWYgPSBzdHJpbmdSZWY7XG4gICAgICByZXR1cm4gcmVmO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIG1peGVkUmVmICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHJlZiB0byBiZSBhIGZ1bmN0aW9uLCBhIHN0cmluZywgYW4gb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZVJlZigpLCBvciBudWxsLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVsZW1lbnQuX293bmVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVsZW1lbnQgcmVmIHdhcyBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgKFwiICsgbWl4ZWRSZWYgKyBcIikgYnV0IG5vIG93bmVyIHdhcyBzZXQuIFRoaXMgY291bGQgaGFwcGVuIGZvciBvbmUgb2ZcIiArICcgdGhlIGZvbGxvd2luZyByZWFzb25zOlxcbicgKyAnMS4gWW91IG1heSBiZSBhZGRpbmcgYSByZWYgdG8gYSBmdW5jdGlvbiBjb21wb25lbnRcXG4nICsgXCIyLiBZb3UgbWF5IGJlIGFkZGluZyBhIHJlZiB0byBhIGNvbXBvbmVudCB0aGF0IHdhcyBub3QgY3JlYXRlZCBpbnNpZGUgYSBjb21wb25lbnQncyByZW5kZXIgbWV0aG9kXFxuXCIgKyAnMy4gWW91IGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IGxvYWRlZFxcbicgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWZzLW11c3QtaGF2ZS1vd25lciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWl4ZWRSZWY7XG59XG5cbmZ1bmN0aW9uIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpIHtcbiAgdmFyIGNoaWxkU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG5ld0NoaWxkKTtcbiAgdGhyb3cgbmV3IEVycm9yKFwiT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiBcIiArIChjaGlsZFN0cmluZyA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKG5ld0NoaWxkKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRTdHJpbmcpICsgXCIpLiBcIiArICdJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5ICcgKyAnaW5zdGVhZC4nKTtcbn1cblxuZnVuY3Rpb24gd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKSB7XG4gIHtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIocmV0dXJuRmliZXIpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgaWYgKG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZ1tjb21wb25lbnROYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZ1tjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignRnVuY3Rpb25zIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZC4gVGhpcyBtYXkgaGFwcGVuIGlmICcgKyAneW91IHJldHVybiBhIENvbXBvbmVudCBpbnN0ZWFkIG9mIDxDb21wb25lbnQgLz4gZnJvbSByZW5kZXIuICcgKyAnT3IgbWF5YmUgeW91IG1lYW50IHRvIGNhbGwgdGhpcyBmdW5jdGlvbiByYXRoZXIgdGhhbiByZXR1cm4gaXQuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUxhenkobGF6eVR5cGUpIHtcbiAgdmFyIHBheWxvYWQgPSBsYXp5VHlwZS5fcGF5bG9hZDtcbiAgdmFyIGluaXQgPSBsYXp5VHlwZS5faW5pdDtcbiAgcmV0dXJuIGluaXQocGF5bG9hZCk7XG59IC8vIFRoaXMgd3JhcHBlciBmdW5jdGlvbiBleGlzdHMgYmVjYXVzZSBJIGV4cGVjdCB0byBjbG9uZSB0aGUgY29kZSBpbiBlYWNoIHBhdGhcbi8vIHRvIGJlIGFibGUgdG8gb3B0aW1pemUgZWFjaCBwYXRoIGluZGl2aWR1YWxseSBieSBicmFuY2hpbmcgZWFybHkuIFRoaXMgbmVlZHNcbi8vIGEgY29tcGlsZXIgb3Igd2UgY2FuIGRvIGl0IG1hbnVhbGx5LiBIZWxwZXJzIHRoYXQgZG9uJ3QgbmVlZCB0aGlzIGJyYW5jaGluZ1xuLy8gbGl2ZSBvdXRzaWRlIG9mIHRoaXMgZnVuY3Rpb24uXG5cblxuZnVuY3Rpb24gQ2hpbGRSZWNvbmNpbGVyKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgZnVuY3Rpb24gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkVG9EZWxldGUpIHtcbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIE5vb3AuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGRlbGV0aW9ucyA9IHJldHVybkZpYmVyLmRlbGV0aW9ucztcblxuICAgIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjaGlsZFRvRGVsZXRlXTtcbiAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IENoaWxkRGVsZXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0aW9ucy5wdXNoKGNoaWxkVG9EZWxldGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCkge1xuICAgIGlmICghc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gTm9vcC5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gLy8gVE9ETzogRm9yIHRoZSBzaG91bGRDbG9uZSBjYXNlLCB0aGlzIGNvdWxkIGJlIG1pY3JvLW9wdGltaXplZCBhIGJpdCBieVxuICAgIC8vIGFzc3VtaW5nIHRoYXQgYWZ0ZXIgdGhlIGZpcnN0IGNoaWxkIHdlJ3ZlIGFscmVhZHkgYWRkZWQgZXZlcnl0aGluZy5cblxuXG4gICAgdmFyIGNoaWxkVG9EZWxldGUgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZFRvRGVsZXRlICE9PSBudWxsKSB7XG4gICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGRUb0RlbGV0ZSk7XG4gICAgICBjaGlsZFRvRGVsZXRlID0gY2hpbGRUb0RlbGV0ZS5zaWJsaW5nO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKSB7XG4gICAgLy8gQWRkIHRoZSByZW1haW5pbmcgY2hpbGRyZW4gdG8gYSB0ZW1wb3JhcnkgbWFwIHNvIHRoYXQgd2UgY2FuIGZpbmQgdGhlbSBieVxuICAgIC8vIGtleXMgcXVpY2tseS4gSW1wbGljaXQgKG51bGwpIGtleXMgZ2V0IGFkZGVkIHRvIHRoaXMgc2V0IHdpdGggdGhlaXIgaW5kZXhcbiAgICAvLyBpbnN0ZWFkLlxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbmV3IE1hcCgpO1xuICAgIHZhciBleGlzdGluZ0NoaWxkID0gY3VycmVudEZpcnN0Q2hpbGQ7XG5cbiAgICB3aGlsZSAoZXhpc3RpbmdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGV4aXN0aW5nQ2hpbGQua2V5ICE9PSBudWxsKSB7XG4gICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uc2V0KGV4aXN0aW5nQ2hpbGQua2V5LCBleGlzdGluZ0NoaWxkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uc2V0KGV4aXN0aW5nQ2hpbGQuaW5kZXgsIGV4aXN0aW5nQ2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBleGlzdGluZ0NoaWxkID0gZXhpc3RpbmdDaGlsZC5zaWJsaW5nO1xuICAgIH1cblxuICAgIHJldHVybiBleGlzdGluZ0NoaWxkcmVuO1xuICB9XG5cbiAgZnVuY3Rpb24gdXNlRmliZXIoZmliZXIsIHBlbmRpbmdQcm9wcykge1xuICAgIC8vIFdlIGN1cnJlbnRseSBzZXQgc2libGluZyB0byBudWxsIGFuZCBpbmRleCB0byAwIGhlcmUgYmVjYXVzZSBpdCBpcyBlYXN5XG4gICAgLy8gdG8gZm9yZ2V0IHRvIGRvIGJlZm9yZSByZXR1cm5pbmcgaXQuIEUuZy4gZm9yIHRoZSBzaW5nbGUgY2hpbGQgY2FzZS5cbiAgICB2YXIgY2xvbmUgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhmaWJlciwgcGVuZGluZ1Byb3BzKTtcbiAgICBjbG9uZS5pbmRleCA9IDA7XG4gICAgY2xvbmUuc2libGluZyA9IG51bGw7XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgZnVuY3Rpb24gcGxhY2VDaGlsZChuZXdGaWJlciwgbGFzdFBsYWNlZEluZGV4LCBuZXdJbmRleCkge1xuICAgIG5ld0ZpYmVyLmluZGV4ID0gbmV3SW5kZXg7XG5cbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIER1cmluZyBoeWRyYXRpb24sIHRoZSB1c2VJZCBhbGdvcml0aG0gbmVlZHMgdG8ga25vdyB3aGljaCBmaWJlcnMgYXJlXG4gICAgICAvLyBwYXJ0IG9mIGEgbGlzdCBvZiBjaGlsZHJlbiAoYXJyYXlzLCBpdGVyYXRvcnMpLlxuICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gRm9ya2VkO1xuICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICB9XG5cbiAgICB2YXIgY3VycmVudCA9IG5ld0ZpYmVyLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICB2YXIgb2xkSW5kZXggPSBjdXJyZW50LmluZGV4O1xuXG4gICAgICBpZiAob2xkSW5kZXggPCBsYXN0UGxhY2VkSW5kZXgpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIG1vdmUuXG4gICAgICAgIG5ld0ZpYmVyLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgaXRlbSBjYW4gc3RheSBpbiBwbGFjZS5cbiAgICAgICAgcmV0dXJuIG9sZEluZGV4O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIGFuIGluc2VydGlvbi5cbiAgICAgIG5ld0ZpYmVyLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGxhY2VTaW5nbGVDaGlsZChuZXdGaWJlcikge1xuICAgIC8vIFRoaXMgaXMgc2ltcGxlciBmb3IgdGhlIHNpbmdsZSBjaGlsZCBjYXNlLiBXZSBvbmx5IG5lZWQgdG8gZG8gYVxuICAgIC8vIHBsYWNlbWVudCBmb3IgaW5zZXJ0aW5nIG5ldyBjaGlsZHJlbi5cbiAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cyAmJiBuZXdGaWJlci5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgIG5ld0ZpYmVyLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3RmliZXI7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudCwgdGV4dENvbnRlbnQsIGxhbmVzKSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC50YWcgIT09IEhvc3RUZXh0KSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tVGV4dCh0ZXh0Q29udGVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIHRleHRDb250ZW50KTtcbiAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUVsZW1lbnQocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQsIGxhbmVzKSB7XG4gICAgdmFyIGVsZW1lbnRUeXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgaWYgKGVsZW1lbnRUeXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sIGxhbmVzLCBlbGVtZW50LmtleSk7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIGlmIChjdXJyZW50LmVsZW1lbnRUeXBlID09PSBlbGVtZW50VHlwZSB8fCAoIC8vIEtlZXAgdGhpcyBjaGVjayBpbmxpbmUgc28gaXQgb25seSBydW5zIG9uIHRoZSBmYWxzZSBwYXRoOlxuICAgICAgIGlzQ29tcGF0aWJsZUZhbWlseUZvckhvdFJlbG9hZGluZyhjdXJyZW50LCBlbGVtZW50KSApIHx8IC8vIExhenkgdHlwZXMgc2hvdWxkIHJlY29uY2lsZSB0aGVpciByZXNvbHZlZCB0eXBlLlxuICAgICAgLy8gV2UgbmVlZCB0byBkbyB0aGlzIGFmdGVyIHRoZSBIb3QgUmVsb2FkaW5nIGNoZWNrIGFib3ZlLFxuICAgICAgLy8gYmVjYXVzZSBob3QgcmVsb2FkaW5nIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIHRoYW4gcHJvZCBiZWNhdXNlXG4gICAgICAvLyBpdCBkb2Vzbid0IHJlc3VzcGVuZC4gU28gd2UgY2FuJ3QgbGV0IHRoZSBjYWxsIGJlbG93IHN1c3BlbmQuXG4gICAgICB0eXBlb2YgZWxlbWVudFR5cGUgPT09ICdvYmplY3QnICYmIGVsZW1lbnRUeXBlICE9PSBudWxsICYmIGVsZW1lbnRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgJiYgcmVzb2x2ZUxhenkoZWxlbWVudFR5cGUpID09PSBjdXJyZW50LnR5cGUpIHtcbiAgICAgICAgLy8gTW92ZSBiYXNlZCBvbiBpbmRleFxuICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCBlbGVtZW50LnByb3BzKTtcbiAgICAgICAgZXhpc3RpbmcucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50KTtcbiAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAge1xuICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICAgICAgICBleGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgfVxuICAgIH0gLy8gSW5zZXJ0XG5cblxuICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQpO1xuICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnQsIHBvcnRhbCwgbGFuZXMpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gSG9zdFBvcnRhbCB8fCBjdXJyZW50LnN0YXRlTm9kZS5jb250YWluZXJJbmZvICE9PSBwb3J0YWwuY29udGFpbmVySW5mbyB8fCBjdXJyZW50LnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiAhPT0gcG9ydGFsLmltcGxlbWVudGF0aW9uKSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIHBvcnRhbC5jaGlsZHJlbiB8fCBbXSk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgY3VycmVudCwgZnJhZ21lbnQsIGxhbmVzLCBrZXkpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gRnJhZ21lbnQpIHtcbiAgICAgIC8vIEluc2VydFxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmcmFnbWVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIGtleSk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZVxuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgZnJhZ21lbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnICYmIG5ld0NoaWxkICE9PSAnJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cy4gSWYgdGhlIHByZXZpb3VzIG5vZGUgaXMgaW1wbGljaXRseSBrZXllZFxuICAgICAgLy8gd2UgY2FuIGNvbnRpbnVlIHRvIHJlcGxhY2UgaXQgd2l0aG91dCBhYm9ydGluZyBldmVuIGlmIGl0IGlzIG5vdCBhIHRleHRcbiAgICAgIC8vIG5vZGUuXG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVRleHQoJycgKyBuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQobmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcblxuICAgICAgICAgICAgX2NyZWF0ZWQucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBudWxsLCBuZXdDaGlsZCk7XG4gICAgICAgICAgICBfY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgICAgIHJldHVybiBfY3JlYXRlZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX2NyZWF0ZWQyID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG5cbiAgICAgICAgICAgIF9jcmVhdGVkMi5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgICAgIHJldHVybiBfY3JlYXRlZDI7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwYXlsb2FkID0gbmV3Q2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgICB2YXIgaW5pdCA9IG5ld0NoaWxkLl9pbml0O1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBpbml0KHBheWxvYWQpLCBsYW5lcyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgdmFyIF9jcmVhdGVkMyA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcywgbnVsbCk7XG5cbiAgICAgICAgX2NyZWF0ZWQzLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICByZXR1cm4gX2NyZWF0ZWQzO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgLy8gVXBkYXRlIHRoZSBmaWJlciBpZiB0aGUga2V5cyBtYXRjaCwgb3RoZXJ3aXNlIHJldHVybiBudWxsLlxuICAgIHZhciBrZXkgPSBvbGRGaWJlciAhPT0gbnVsbCA/IG9sZEZpYmVyLmtleSA6IG51bGw7XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyAmJiBuZXdDaGlsZCAhPT0gJycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVGV4dCBub2RlcyBkb24ndCBoYXZlIGtleXMuIElmIHRoZSBwcmV2aW91cyBub2RlIGlzIGltcGxpY2l0bHkga2V5ZWRcbiAgICAgIC8vIHdlIGNhbiBjb250aW51ZSB0byByZXBsYWNlIGl0IHdpdGhvdXQgYWJvcnRpbmcgZXZlbiBpZiBpdCBpcyBub3QgYSB0ZXh0XG4gICAgICAvLyBub2RlLlxuICAgICAgaWYgKGtleSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZVRleHROb2RlKHJldHVybkZpYmVyLCBvbGRGaWJlciwgJycgKyBuZXdDaGlsZCwgbGFuZXMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChuZXdDaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlRWxlbWVudChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAobmV3Q2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBheWxvYWQgPSBuZXdDaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIGluaXQocGF5bG9hZCksIGxhbmVzKTtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICBpZiAoa2V5ICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMsIG51bGwpO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVGcm9tTWFwKGV4aXN0aW5nQ2hpbGRyZW4sIHJldHVybkZpYmVyLCBuZXdJZHgsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnICYmIG5ld0NoaWxkICE9PSAnJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cywgc28gd2UgbmVpdGhlciBoYXZlIHRvIGNoZWNrIHRoZSBvbGQgbm9yXG4gICAgICAvLyBuZXcgbm9kZSBmb3IgdGhlIGtleS4gSWYgYm90aCBhcmUgdGV4dCBub2RlcywgdGhleSBtYXRjaC5cbiAgICAgIHZhciBtYXRjaGVkRmliZXIgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdJZHgpIHx8IG51bGw7XG4gICAgICByZXR1cm4gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIG1hdGNoZWRGaWJlciwgJycgKyBuZXdDaGlsZCwgbGFuZXMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfbWF0Y2hlZEZpYmVyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3Q2hpbGQua2V5ID09PSBudWxsID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5KSB8fCBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlRWxlbWVudChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX21hdGNoZWRGaWJlcjIgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdDaGlsZC5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBuZXdDaGlsZC5rZXkpIHx8IG51bGw7XG5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIyLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgaW5pdChwYXlsb2FkKSwgbGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIzID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3SWR4KSB8fCBudWxsO1xuXG4gICAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlcjMsIG5ld0NoaWxkLCBsYW5lcywgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogV2FybnMgaWYgdGhlcmUgaXMgYSBkdXBsaWNhdGUgb3IgbWlzc2luZyBrZXlcbiAgICovXG5cblxuICBmdW5jdGlvbiB3YXJuT25JbnZhbGlkS2V5KGNoaWxkLCBrbm93bktleXMsIHJldHVybkZpYmVyKSB7XG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcgfHwgY2hpbGQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGtub3duS2V5cztcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChjaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB3YXJuRm9yTWlzc2luZ0tleShjaGlsZCwgcmV0dXJuRmliZXIpO1xuICAgICAgICAgIHZhciBrZXkgPSBjaGlsZC5rZXk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChrbm93bktleXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGtub3duS2V5cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIGtub3duS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgha25vd25LZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBrbm93bktleXMuYWRkKGtleSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvcignRW5jb3VudGVyZWQgdHdvIGNoaWxkcmVuIHdpdGggdGhlIHNhbWUga2V5LCBgJXNgLiAnICsgJ0tleXMgc2hvdWxkIGJlIHVuaXF1ZSBzbyB0aGF0IGNvbXBvbmVudHMgbWFpbnRhaW4gdGhlaXIgaWRlbnRpdHkgJyArICdhY3Jvc3MgdXBkYXRlcy4gTm9uLXVuaXF1ZSBrZXlzIG1heSBjYXVzZSBjaGlsZHJlbiB0byBiZSAnICsgJ2R1cGxpY2F0ZWQgYW5kL29yIG9taXR0ZWQg4oCUIHRoZSBiZWhhdmlvciBpcyB1bnN1cHBvcnRlZCBhbmQgJyArICdjb3VsZCBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbi4nLCBrZXkpO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBjaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGNoaWxkLl9pbml0O1xuICAgICAgICAgIHdhcm5PbkludmFsaWRLZXkoaW5pdChwYXlsb2FkKSwga25vd25LZXlzLCByZXR1cm5GaWJlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGtub3duS2V5cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZHJlbiwgbGFuZXMpIHtcbiAgICAvLyBUaGlzIGFsZ29yaXRobSBjYW4ndCBvcHRpbWl6ZSBieSBzZWFyY2hpbmcgZnJvbSBib3RoIGVuZHMgc2luY2Ugd2VcbiAgICAvLyBkb24ndCBoYXZlIGJhY2twb2ludGVycyBvbiBmaWJlcnMuIEknbSB0cnlpbmcgdG8gc2VlIGhvdyBmYXIgd2UgY2FuIGdldFxuICAgIC8vIHdpdGggdGhhdCBtb2RlbC4gSWYgaXQgZW5kcyB1cCBub3QgYmVpbmcgd29ydGggdGhlIHRyYWRlb2Zmcywgd2UgY2FuXG4gICAgLy8gYWRkIGl0IGxhdGVyLlxuICAgIC8vIEV2ZW4gd2l0aCBhIHR3byBlbmRlZCBvcHRpbWl6YXRpb24sIHdlJ2Qgd2FudCB0byBvcHRpbWl6ZSBmb3IgdGhlIGNhc2VcbiAgICAvLyB3aGVyZSB0aGVyZSBhcmUgZmV3IGNoYW5nZXMgYW5kIGJydXRlIGZvcmNlIHRoZSBjb21wYXJpc29uIGluc3RlYWQgb2ZcbiAgICAvLyBnb2luZyBmb3IgdGhlIE1hcC4gSXQnZCBsaWtlIHRvIGV4cGxvcmUgaGl0dGluZyB0aGF0IHBhdGggZmlyc3QgaW5cbiAgICAvLyBmb3J3YXJkLW9ubHkgbW9kZSBhbmQgb25seSBnbyBmb3IgdGhlIE1hcCBvbmNlIHdlIG5vdGljZSB0aGF0IHdlIG5lZWRcbiAgICAvLyBsb3RzIG9mIGxvb2sgYWhlYWQuIFRoaXMgZG9lc24ndCBoYW5kbGUgcmV2ZXJzYWwgYXMgd2VsbCBhcyB0d28gZW5kZWRcbiAgICAvLyBzZWFyY2ggYnV0IHRoYXQncyB1bnVzdWFsLiBCZXNpZGVzLCBmb3IgdGhlIHR3byBlbmRlZCBvcHRpbWl6YXRpb24gdG9cbiAgICAvLyB3b3JrIG9uIEl0ZXJhYmxlcywgd2UnZCBuZWVkIHRvIGNvcHkgdGhlIHdob2xlIHNldC5cbiAgICAvLyBJbiB0aGlzIGZpcnN0IGl0ZXJhdGlvbiwgd2UnbGwganVzdCBsaXZlIHdpdGggaGl0dGluZyB0aGUgYmFkIGNhc2VcbiAgICAvLyAoYWRkaW5nIGV2ZXJ5dGhpbmcgdG8gYSBNYXApIGluIGZvciBldmVyeSBpbnNlcnQvbW92ZS5cbiAgICAvLyBJZiB5b3UgY2hhbmdlIHRoaXMgY29kZSwgYWxzbyB1cGRhdGUgcmVjb25jaWxlQ2hpbGRyZW5JdGVyYXRvcigpIHdoaWNoXG4gICAgLy8gdXNlcyB0aGUgc2FtZSBhbGdvcml0aG0uXG4gICAge1xuICAgICAgLy8gRmlyc3QsIHZhbGlkYXRlIGtleXMuXG4gICAgICB2YXIga25vd25LZXlzID0gbnVsbDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGQgPSBuZXdDaGlsZHJlbltpXTtcbiAgICAgICAga25vd25LZXlzID0gd2Fybk9uSW52YWxpZEtleShjaGlsZCwga25vd25LZXlzLCByZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91c05ld0ZpYmVyID0gbnVsbDtcbiAgICB2YXIgb2xkRmliZXIgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB2YXIgbGFzdFBsYWNlZEluZGV4ID0gMDtcbiAgICB2YXIgbmV3SWR4ID0gMDtcbiAgICB2YXIgbmV4dE9sZEZpYmVyID0gbnVsbDtcblxuICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICBpZiAob2xkRmliZXIuaW5kZXggPiBuZXdJZHgpIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXI7XG4gICAgICAgIG9sZEZpYmVyID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdGaWJlciA9IHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgIGlmIChuZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGJyZWFrcyBvbiBlbXB0eSBzbG90cyBsaWtlIG51bGwgY2hpbGRyZW4uIFRoYXQnc1xuICAgICAgICAvLyB1bmZvcnR1bmF0ZSBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBzbG93IHBhdGggYWxsIHRoZSB0aW1lLiBXZSBuZWVkXG4gICAgICAgIC8vIGEgYmV0dGVyIHdheSB0byBjb21tdW5pY2F0ZSB3aGV0aGVyIHRoaXMgd2FzIGEgbWlzcyBvciBudWxsLFxuICAgICAgICAvLyBib29sZWFuLCB1bmRlZmluZWQsIGV0Yy5cbiAgICAgICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgaWYgKG9sZEZpYmVyICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIG1hdGNoZWQgdGhlIHNsb3QsIGJ1dCB3ZSBkaWRuJ3QgcmV1c2UgdGhlIGV4aXN0aW5nIGZpYmVyLCBzbyB3ZVxuICAgICAgICAgIC8vIG5lZWQgdG8gZGVsZXRlIHRoZSBleGlzdGluZyBjaGlsZC5cbiAgICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQobmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gbmV3RmliZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPOiBEZWZlciBzaWJsaW5ncyBpZiB3ZSdyZSBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IGZvciB0aGlzIHNsb3QuXG4gICAgICAgIC8vIEkuZS4gaWYgd2UgaGFkIG51bGwgdmFsdWVzIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIGRlZmVyIHRoaXNcbiAgICAgICAgLy8gZm9yIGVhY2ggbnVsbCB2YWx1ZS4gSG93ZXZlciwgd2UgYWxzbyBkb24ndCB3YW50IHRvIGNhbGwgdXBkYXRlU2xvdFxuICAgICAgICAvLyB3aXRoIHRoZSBwcmV2aW91cyBvbmUuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5ld0ZpYmVyO1xuICAgICAgfVxuXG4gICAgICBwcmV2aW91c05ld0ZpYmVyID0gbmV3RmliZXI7XG4gICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICB9XG5cbiAgICBpZiAobmV3SWR4ID09PSBuZXdDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbmV3IGNoaWxkcmVuLiBXZSBjYW4gZGVsZXRlIHRoZSByZXN0LlxuICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcblxuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgICAgdmFyIG51bWJlck9mRm9ya3MgPSBuZXdJZHg7XG4gICAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgbnVtYmVyT2ZGb3Jrcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH1cblxuICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSBleGlzdGluZyBjaGlsZHJlbiB3ZSBjYW4gY2hvb3NlIGEgZmFzdCBwYXRoXG4gICAgICAvLyBzaW5jZSB0aGUgcmVzdCB3aWxsIGFsbCBiZSBpbnNlcnRpb25zLlxuICAgICAgZm9yICg7IG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgICAgdmFyIF9uZXdGaWJlciA9IGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgICAgaWYgKF9uZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICAgIHZhciBfbnVtYmVyT2ZGb3JrcyA9IG5ld0lkeDtcbiAgICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBfbnVtYmVyT2ZGb3Jrcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH0gLy8gQWRkIGFsbCBjaGlsZHJlbiB0byBhIGtleSBtYXAgZm9yIHF1aWNrIGxvb2t1cHMuXG5cblxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTsgLy8gS2VlcCBzY2FubmluZyBhbmQgdXNlIHRoZSBtYXAgdG8gcmVzdG9yZSBkZWxldGVkIGl0ZW1zIGFzIG1vdmVzLlxuXG4gICAgZm9yICg7IG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgIHZhciBfbmV3RmliZXIyID0gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgIGlmIChfbmV3RmliZXIyICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgICAgaWYgKF9uZXdGaWJlcjIuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgbmV3IGZpYmVyIGlzIGEgd29yayBpbiBwcm9ncmVzcywgYnV0IGlmIHRoZXJlIGV4aXN0cyBhXG4gICAgICAgICAgICAvLyBjdXJyZW50LCB0aGF0IG1lYW5zIHRoYXQgd2UgcmV1c2VkIHRoZSBmaWJlci4gV2UgbmVlZCB0byBkZWxldGVcbiAgICAgICAgICAgIC8vIGl0IGZyb20gdGhlIGNoaWxkIGxpc3Qgc28gdGhhdCB3ZSBkb24ndCBhZGQgaXQgdG8gdGhlIGRlbGV0aW9uXG4gICAgICAgICAgICAvLyBsaXN0LlxuICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5kZWxldGUoX25ld0ZpYmVyMi5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBfbmV3RmliZXIyLmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXIyO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIEFueSBleGlzdGluZyBjaGlsZHJlbiB0aGF0IHdlcmVuJ3QgY29uc3VtZWQgYWJvdmUgd2VyZSBkZWxldGVkLiBXZSBuZWVkXG4gICAgICAvLyB0byBhZGQgdGhlbSB0byB0aGUgZGVsZXRpb24gbGlzdC5cbiAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgdmFyIF9udW1iZXJPZkZvcmtzMiA9IG5ld0lkeDtcbiAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgX251bWJlck9mRm9ya3MyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZHJlbkl0ZXJhYmxlLCBsYW5lcykge1xuICAgIC8vIFRoaXMgaXMgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gYXMgcmVjb25jaWxlQ2hpbGRyZW5BcnJheSgpLFxuICAgIC8vIGJ1dCB1c2luZyB0aGUgaXRlcmF0b3IgaW5zdGVhZC5cbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQW4gb2JqZWN0IGlzIG5vdCBhbiBpdGVyYWJsZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluICcgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgcmVuZGVyaW5nIEdlbmVyYXRvcnMgYmVjYXVzZSBpdCdzIGEgbXV0YXRpb24uXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjk5NVxuICAgICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCB0b1N0cmluZ1RhZ1xuICAgICAgbmV3Q2hpbGRyZW5JdGVyYWJsZVtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnR2VuZXJhdG9yJykge1xuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dEdlbmVyYXRvcnMpIHtcbiAgICAgICAgICBlcnJvcignVXNpbmcgR2VuZXJhdG9ycyBhcyBjaGlsZHJlbiBpcyB1bnN1cHBvcnRlZCBhbmQgd2lsbCBsaWtlbHkgeWllbGQgJyArICd1bmV4cGVjdGVkIHJlc3VsdHMgYmVjYXVzZSBlbnVtZXJhdGluZyBhIGdlbmVyYXRvciBtdXRhdGVzIGl0LiAnICsgJ1lvdSBtYXkgY29udmVydCBpdCB0byBhbiBhcnJheSB3aXRoIGBBcnJheS5mcm9tKClgIG9yIHRoZSAnICsgJ2BbLi4uc3ByZWFkXWAgb3BlcmF0b3IgYmVmb3JlIHJlbmRlcmluZy4gS2VlcCBpbiBtaW5kICcgKyAneW91IG1pZ2h0IG5lZWQgdG8gcG9seWZpbGwgdGhlc2UgZmVhdHVyZXMgZm9yIG9sZGVyIGJyb3dzZXJzLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlkV2FybkFib3V0R2VuZXJhdG9ycyA9IHRydWU7XG4gICAgICB9IC8vIFdhcm4gYWJvdXQgdXNpbmcgTWFwcyBhcyBjaGlsZHJlblxuXG5cbiAgICAgIGlmIChuZXdDaGlsZHJlbkl0ZXJhYmxlLmVudHJpZXMgPT09IGl0ZXJhdG9yRm4pIHtcbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNYXBzKSB7XG4gICAgICAgICAgZXJyb3IoJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHN1cHBvcnRlZC4gJyArICdVc2UgYW4gYXJyYXkgb2Yga2V5ZWQgUmVhY3RFbGVtZW50cyBpbnN0ZWFkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICB9IC8vIEZpcnN0LCB2YWxpZGF0ZSBrZXlzLlxuICAgICAgLy8gV2UnbGwgZ2V0IGEgZGlmZmVyZW50IGl0ZXJhdG9yIGxhdGVyIGZvciB0aGUgbWFpbiBwYXNzLlxuXG5cbiAgICAgIHZhciBfbmV3Q2hpbGRyZW4gPSBpdGVyYXRvckZuLmNhbGwobmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICAgIGlmIChfbmV3Q2hpbGRyZW4pIHtcbiAgICAgICAgdmFyIGtub3duS2V5cyA9IG51bGw7XG5cbiAgICAgICAgdmFyIF9zdGVwID0gX25ld0NoaWxkcmVuLm5leHQoKTtcblxuICAgICAgICBmb3IgKDsgIV9zdGVwLmRvbmU7IF9zdGVwID0gX25ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgICAgIHZhciBjaGlsZCA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgIGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cywgcmV0dXJuRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG5ld0NoaWxkcmVuID0gaXRlcmF0b3JGbi5jYWxsKG5ld0NoaWxkcmVuSXRlcmFibGUpO1xuXG4gICAgaWYgKG5ld0NoaWxkcmVuID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQW4gaXRlcmFibGUgb2JqZWN0IHByb3ZpZGVkIG5vIGl0ZXJhdG9yLicpO1xuICAgIH1cblxuICAgIHZhciByZXN1bHRpbmdGaXJzdENoaWxkID0gbnVsbDtcbiAgICB2YXIgcHJldmlvdXNOZXdGaWJlciA9IG51bGw7XG4gICAgdmFyIG9sZEZpYmVyID0gY3VycmVudEZpcnN0Q2hpbGQ7XG4gICAgdmFyIGxhc3RQbGFjZWRJbmRleCA9IDA7XG4gICAgdmFyIG5ld0lkeCA9IDA7XG4gICAgdmFyIG5leHRPbGRGaWJlciA9IG51bGw7XG4gICAgdmFyIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCk7XG5cbiAgICBmb3IgKDsgb2xkRmliZXIgIT09IG51bGwgJiYgIXN0ZXAuZG9uZTsgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgIGlmIChvbGRGaWJlci5pbmRleCA+IG5ld0lkeCkge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlcjtcbiAgICAgICAgb2xkRmliZXIgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXIuc2libGluZztcbiAgICAgIH1cblxuICAgICAgdmFyIG5ld0ZpYmVyID0gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIHN0ZXAudmFsdWUsIGxhbmVzKTtcblxuICAgICAgaWYgKG5ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgYnJlYWtzIG9uIGVtcHR5IHNsb3RzIGxpa2UgbnVsbCBjaGlsZHJlbi4gVGhhdCdzXG4gICAgICAgIC8vIHVuZm9ydHVuYXRlIGJlY2F1c2UgaXQgdHJpZ2dlcnMgdGhlIHNsb3cgcGF0aCBhbGwgdGhlIHRpbWUuIFdlIG5lZWRcbiAgICAgICAgLy8gYSBiZXR0ZXIgd2F5IHRvIGNvbW11bmljYXRlIHdoZXRoZXIgdGhpcyB3YXMgYSBtaXNzIG9yIG51bGwsXG4gICAgICAgIC8vIGJvb2xlYW4sIHVuZGVmaW5lZCwgZXRjLlxuICAgICAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICBpZiAob2xkRmliZXIgJiYgbmV3RmliZXIuYWx0ZXJuYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgbWF0Y2hlZCB0aGUgc2xvdCwgYnV0IHdlIGRpZG4ndCByZXVzZSB0aGUgZXhpc3RpbmcgZmliZXIsIHNvIHdlXG4gICAgICAgICAgLy8gbmVlZCB0byBkZWxldGUgdGhlIGV4aXN0aW5nIGNoaWxkLlxuICAgICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChuZXdGaWJlciwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uXG4gICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBuZXdGaWJlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IERlZmVyIHNpYmxpbmdzIGlmIHdlJ3JlIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXggZm9yIHRoaXMgc2xvdC5cbiAgICAgICAgLy8gSS5lLiBpZiB3ZSBoYWQgbnVsbCB2YWx1ZXMgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gZGVmZXIgdGhpc1xuICAgICAgICAvLyBmb3IgZWFjaCBudWxsIHZhbHVlLiBIb3dldmVyLCB3ZSBhbHNvIGRvbid0IHdhbnQgdG8gY2FsbCB1cGRhdGVTbG90XG4gICAgICAgIC8vIHdpdGggdGhlIHByZXZpb3VzIG9uZS5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gbmV3RmliZXI7XG4gICAgICB9XG5cbiAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBuZXdGaWJlcjtcbiAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgIH1cblxuICAgIGlmIChzdGVwLmRvbmUpIHtcbiAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbmV3IGNoaWxkcmVuLiBXZSBjYW4gZGVsZXRlIHRoZSByZXN0LlxuICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcblxuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgICAgdmFyIG51bWJlck9mRm9ya3MgPSBuZXdJZHg7XG4gICAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgbnVtYmVyT2ZGb3Jrcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH1cblxuICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSBleGlzdGluZyBjaGlsZHJlbiB3ZSBjYW4gY2hvb3NlIGEgZmFzdCBwYXRoXG4gICAgICAvLyBzaW5jZSB0aGUgcmVzdCB3aWxsIGFsbCBiZSBpbnNlcnRpb25zLlxuICAgICAgZm9yICg7ICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICAgIHZhciBfbmV3RmliZXIzID0gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIHN0ZXAudmFsdWUsIGxhbmVzKTtcblxuICAgICAgICBpZiAoX25ld0ZpYmVyMyA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIzLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uXG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyMztcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXIzO1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgICB2YXIgX251bWJlck9mRm9ya3MzID0gbmV3SWR4O1xuICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIF9udW1iZXJPZkZvcmtzMyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH0gLy8gQWRkIGFsbCBjaGlsZHJlbiB0byBhIGtleSBtYXAgZm9yIHF1aWNrIGxvb2t1cHMuXG5cblxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTsgLy8gS2VlcCBzY2FubmluZyBhbmQgdXNlIHRoZSBtYXAgdG8gcmVzdG9yZSBkZWxldGVkIGl0ZW1zIGFzIG1vdmVzLlxuXG4gICAgZm9yICg7ICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICB2YXIgX25ld0ZpYmVyNCA9IHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICBpZiAoX25ld0ZpYmVyNCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICAgIGlmIChfbmV3RmliZXI0LmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlIG5ldyBmaWJlciBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MsIGJ1dCBpZiB0aGVyZSBleGlzdHMgYVxuICAgICAgICAgICAgLy8gY3VycmVudCwgdGhhdCBtZWFucyB0aGF0IHdlIHJldXNlZCB0aGUgZmliZXIuIFdlIG5lZWQgdG8gZGVsZXRlXG4gICAgICAgICAgICAvLyBpdCBmcm9tIHRoZSBjaGlsZCBsaXN0IHNvIHRoYXQgd2UgZG9uJ3QgYWRkIGl0IHRvIHRoZSBkZWxldGlvblxuICAgICAgICAgICAgLy8gbGlzdC5cbiAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZGVsZXRlKF9uZXdGaWJlcjQua2V5ID09PSBudWxsID8gbmV3SWR4IDogX25ld0ZpYmVyNC5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyNCwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyNDtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXI0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBBbnkgZXhpc3RpbmcgY2hpbGRyZW4gdGhhdCB3ZXJlbid0IGNvbnN1bWVkIGFib3ZlIHdlcmUgZGVsZXRlZC4gV2UgbmVlZFxuICAgICAgLy8gdG8gYWRkIHRoZW0gdG8gdGhlIGRlbGV0aW9uIGxpc3QuXG4gICAgICBleGlzdGluZ0NoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgIHZhciBfbnVtYmVyT2ZGb3JrczQgPSBuZXdJZHg7XG4gICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIF9udW1iZXJPZkZvcmtzNCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVTaW5nbGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIHRleHRDb250ZW50LCBsYW5lcykge1xuICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBjaGVjayBmb3Iga2V5cyBvbiB0ZXh0IG5vZGVzIHNpbmNlIHdlIGRvbid0IGhhdmUgYVxuICAgIC8vIHdheSB0byBkZWZpbmUgdGhlbS5cbiAgICBpZiAoY3VycmVudEZpcnN0Q2hpbGQgIT09IG51bGwgJiYgY3VycmVudEZpcnN0Q2hpbGQudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG5vZGUgc28gbGV0J3MganVzdCB1cGRhdGUgaXQgYW5kIGRlbGV0ZVxuICAgICAgLy8gdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQuc2libGluZyk7XG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50Rmlyc3RDaGlsZCwgdGV4dENvbnRlbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfSAvLyBUaGUgZXhpc3RpbmcgZmlyc3QgY2hpbGQgaXMgbm90IGEgdGV4dCBub2RlIHNvIHdlIG5lZWQgdG8gY3JlYXRlIG9uZVxuICAgIC8vIGFuZCBkZWxldGUgdGhlIGV4aXN0aW5nIG9uZXMuXG5cblxuICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KHRleHRDb250ZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZUVsZW1lbnQocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBlbGVtZW50LCBsYW5lcykge1xuICAgIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgICB2YXIgY2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgLy8gVE9ETzogSWYga2V5ID09PSBudWxsIGFuZCBjaGlsZC5rZXkgPT09IG51bGwsIHRoZW4gdGhpcyBvbmx5IGFwcGxpZXMgdG9cbiAgICAgIC8vIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LlxuICAgICAgaWYgKGNoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIHZhciBlbGVtZW50VHlwZSA9IGVsZW1lbnQudHlwZTtcblxuICAgICAgICBpZiAoZWxlbWVudFR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICAgICAgICBpZiAoY2hpbGQudGFnID09PSBGcmFnbWVudCkge1xuICAgICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkLnNpYmxpbmcpO1xuICAgICAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY2hpbGQsIGVsZW1lbnQucHJvcHMuY2hpbGRyZW4pO1xuICAgICAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXhpc3RpbmcuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgICAgICAgICAgICBleGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChjaGlsZC5lbGVtZW50VHlwZSA9PT0gZWxlbWVudFR5cGUgfHwgKCAvLyBLZWVwIHRoaXMgY2hlY2sgaW5saW5lIHNvIGl0IG9ubHkgcnVucyBvbiB0aGUgZmFsc2UgcGF0aDpcbiAgICAgICAgICAgaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGNoaWxkLCBlbGVtZW50KSApIHx8IC8vIExhenkgdHlwZXMgc2hvdWxkIHJlY29uY2lsZSB0aGVpciByZXNvbHZlZCB0eXBlLlxuICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZG8gdGhpcyBhZnRlciB0aGUgSG90IFJlbG9hZGluZyBjaGVjayBhYm92ZSxcbiAgICAgICAgICAvLyBiZWNhdXNlIGhvdCByZWxvYWRpbmcgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgdGhhbiBwcm9kIGJlY2F1c2VcbiAgICAgICAgICAvLyBpdCBkb2Vzbid0IHJlc3VzcGVuZC4gU28gd2UgY2FuJ3QgbGV0IHRoZSBjYWxsIGJlbG93IHN1c3BlbmQuXG4gICAgICAgICAgdHlwZW9mIGVsZW1lbnRUeXBlID09PSAnb2JqZWN0JyAmJiBlbGVtZW50VHlwZSAhPT0gbnVsbCAmJiBlbGVtZW50VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFICYmIHJlc29sdmVMYXp5KGVsZW1lbnRUeXBlKSA9PT0gY2hpbGQudHlwZSkge1xuICAgICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkLnNpYmxpbmcpO1xuXG4gICAgICAgICAgICB2YXIgX2V4aXN0aW5nID0gdXNlRmliZXIoY2hpbGQsIGVsZW1lbnQucHJvcHMpO1xuXG4gICAgICAgICAgICBfZXhpc3RpbmcucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjaGlsZCwgZWxlbWVudCk7XG4gICAgICAgICAgICBfZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgX2V4aXN0aW5nLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICAgICAgICAgICAgX2V4aXN0aW5nLl9kZWJ1Z093bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfZXhpc3Rpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIERpZG4ndCBtYXRjaC5cblxuXG4gICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH1cblxuICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZWxlbWVudC5wcm9wcy5jaGlsZHJlbiwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIGVsZW1lbnQua2V5KTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9jcmVhdGVkNCA9IGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoZWxlbWVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuXG4gICAgICBfY3JlYXRlZDQucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgZWxlbWVudCk7XG4gICAgICBfY3JlYXRlZDQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gX2NyZWF0ZWQ0O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZVBvcnRhbChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIHBvcnRhbCwgbGFuZXMpIHtcbiAgICB2YXIga2V5ID0gcG9ydGFsLmtleTtcbiAgICB2YXIgY2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgLy8gVE9ETzogSWYga2V5ID09PSBudWxsIGFuZCBjaGlsZC5rZXkgPT09IG51bGwsIHRoZW4gdGhpcyBvbmx5IGFwcGxpZXMgdG9cbiAgICAgIC8vIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LlxuICAgICAgaWYgKGNoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIGlmIChjaGlsZC50YWcgPT09IEhvc3RQb3J0YWwgJiYgY2hpbGQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8gPT09IHBvcnRhbC5jb250YWluZXJJbmZvICYmIGNoaWxkLnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiA9PT0gcG9ydGFsLmltcGxlbWVudGF0aW9uKSB7XG4gICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkLnNpYmxpbmcpO1xuICAgICAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGNoaWxkLCBwb3J0YWwuY2hpbGRyZW4gfHwgW10pO1xuICAgICAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwocG9ydGFsLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfSAvLyBUaGlzIEFQSSB3aWxsIHRhZyB0aGUgY2hpbGRyZW4gd2l0aCB0aGUgc2lkZS1lZmZlY3Qgb2YgdGhlIHJlY29uY2lsaWF0aW9uXG4gIC8vIGl0c2VsZi4gVGhleSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBzaWRlLWVmZmVjdCBsaXN0IGFzIHdlIHBhc3MgdGhyb3VnaCB0aGVcbiAgLy8gY2hpbGRyZW4gYW5kIHRoZSBwYXJlbnQuXG5cblxuICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZEZpYmVycyhyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlY3Vyc2l2ZS5cbiAgICAvLyBJZiB0aGUgdG9wIGxldmVsIGl0ZW0gaXMgYW4gYXJyYXksIHdlIHRyZWF0IGl0IGFzIGEgc2V0IG9mIGNoaWxkcmVuLFxuICAgIC8vIG5vdCBhcyBhIGZyYWdtZW50LiBOZXN0ZWQgYXJyYXlzIG9uIHRoZSBvdGhlciBoYW5kIHdpbGwgYmUgdHJlYXRlZCBhc1xuICAgIC8vIGZyYWdtZW50IG5vZGVzLiBSZWN1cnNpb24gaGFwcGVucyBhdCB0aGUgbm9ybWFsIGZsb3cuXG4gICAgLy8gSGFuZGxlIHRvcCBsZXZlbCB1bmtleWVkIGZyYWdtZW50cyBhcyBpZiB0aGV5IHdlcmUgYXJyYXlzLlxuICAgIC8vIFRoaXMgbGVhZHMgdG8gYW4gYW1iaWd1aXR5IGJldHdlZW4gPD57Wy4uLl19PC8+IGFuZCA8Pi4uLjwvPi5cbiAgICAvLyBXZSB0cmVhdCB0aGUgYW1iaWd1b3VzIGNhc2VzIGFib3ZlIHRoZSBzYW1lLlxuICAgIHZhciBpc1Vua2V5ZWRUb3BMZXZlbEZyYWdtZW50ID0gdHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCAmJiBuZXdDaGlsZC50eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFICYmIG5ld0NoaWxkLmtleSA9PT0gbnVsbDtcblxuICAgIGlmIChpc1Vua2V5ZWRUb3BMZXZlbEZyYWdtZW50KSB7XG4gICAgICBuZXdDaGlsZCA9IG5ld0NoaWxkLnByb3BzLmNoaWxkcmVuO1xuICAgIH0gLy8gSGFuZGxlIG9iamVjdCB0eXBlc1xuXG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZWNvbmNpbGVTaW5nbGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSk7XG5cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZWNvbmNpbGVTaW5nbGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpKTtcblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7IC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gYmUgbm9uLXJlY3Vyc2l2ZS5cblxuICAgICAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZEZpYmVycyhyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIGluaXQocGF5bG9hZCksIGxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpKSB7XG4gICAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZHJlbkFycmF5KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBwbGFjZVNpbmdsZUNoaWxkKHJlY29uY2lsZVNpbmdsZVRleHROb2RlKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgJycgKyBuZXdDaGlsZCwgbGFuZXMpKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfSAvLyBSZW1haW5pbmcgY2FzZXMgYXJlIGFsbCB0cmVhdGVkIGFzIGVtcHR5LlxuXG5cbiAgICByZXR1cm4gZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKTtcbiAgfVxuXG4gIHJldHVybiByZWNvbmNpbGVDaGlsZEZpYmVycztcbn1cblxudmFyIHJlY29uY2lsZUNoaWxkRmliZXJzID0gQ2hpbGRSZWNvbmNpbGVyKHRydWUpO1xudmFyIG1vdW50Q2hpbGRGaWJlcnMgPSBDaGlsZFJlY29uY2lsZXIoZmFsc2UpO1xuZnVuY3Rpb24gY2xvbmVDaGlsZEZpYmVycyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzcy5jaGlsZCAhPT0gY3VycmVudC5jaGlsZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVzdW1pbmcgd29yayBub3QgeWV0IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzLmNoaWxkID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRDaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB2YXIgbmV3Q2hpbGQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIGN1cnJlbnRDaGlsZC5wZW5kaW5nUHJvcHMpO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG5ld0NoaWxkO1xuICBuZXdDaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcblxuICB3aGlsZSAoY3VycmVudENoaWxkLnNpYmxpbmcgIT09IG51bGwpIHtcbiAgICBjdXJyZW50Q2hpbGQgPSBjdXJyZW50Q2hpbGQuc2libGluZztcbiAgICBuZXdDaGlsZCA9IG5ld0NoaWxkLnNpYmxpbmcgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIGN1cnJlbnRDaGlsZC5wZW5kaW5nUHJvcHMpO1xuICAgIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB9XG5cbiAgbmV3Q2hpbGQuc2libGluZyA9IG51bGw7XG59IC8vIFJlc2V0IGEgd29ya0luUHJvZ3Jlc3MgY2hpbGQgc2V0IHRvIHByZXBhcmUgaXQgZm9yIGEgc2Vjb25kIHBhc3MuXG5cbmZ1bmN0aW9uIHJlc2V0Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGxhbmVzKSB7XG4gIHZhciBjaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgIHJlc2V0V29ya0luUHJvZ3Jlc3MoY2hpbGQsIGxhbmVzKTtcbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cbn1cblxudmFyIE5PX0NPTlRFWFQgPSB7fTtcbnZhciBjb250ZXh0U3RhY2tDdXJzb3IkMSA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcbnZhciBjb250ZXh0RmliZXJTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcbnZhciByb290SW5zdGFuY2VTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcblxuZnVuY3Rpb24gcmVxdWlyZWRDb250ZXh0KGMpIHtcbiAgaWYgKGMgPT09IE5PX0NPTlRFWFQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGhvc3QgY29udGV4dCB0byBleGlzdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnICcgKyAnaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcmV0dXJuIGM7XG59XG5cbmZ1bmN0aW9uIGdldFJvb3RIb3N0Q29udGFpbmVyKCkge1xuICB2YXIgcm9vdEluc3RhbmNlID0gcmVxdWlyZWRDb250ZXh0KHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLmN1cnJlbnQpO1xuICByZXR1cm4gcm9vdEluc3RhbmNlO1xufVxuXG5mdW5jdGlvbiBwdXNoSG9zdENvbnRhaW5lcihmaWJlciwgbmV4dFJvb3RJbnN0YW5jZSkge1xuICAvLyBQdXNoIGN1cnJlbnQgcm9vdCBpbnN0YW5jZSBvbnRvIHRoZSBzdGFjaztcbiAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gcmVzZXQgcm9vdCB3aGVuIHBvcnRhbHMgYXJlIHBvcHBlZC5cbiAgcHVzaChyb290SW5zdGFuY2VTdGFja0N1cnNvciwgbmV4dFJvb3RJbnN0YW5jZSwgZmliZXIpOyAvLyBUcmFjayB0aGUgY29udGV4dCBhbmQgdGhlIEZpYmVyIHRoYXQgcHJvdmlkZWQgaXQuXG4gIC8vIFRoaXMgZW5hYmxlcyB1cyB0byBwb3Agb25seSBGaWJlcnMgdGhhdCBwcm92aWRlIHVuaXF1ZSBjb250ZXh0cy5cblxuICBwdXNoKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlciwgZmliZXIpOyAvLyBGaW5hbGx5LCB3ZSBuZWVkIHRvIHB1c2ggdGhlIGhvc3QgY29udGV4dCB0byB0aGUgc3RhY2suXG4gIC8vIEhvd2V2ZXIsIHdlIGNhbid0IGp1c3QgY2FsbCBnZXRSb290SG9zdENvbnRleHQoKSBhbmQgcHVzaCBpdCBiZWNhdXNlXG4gIC8vIHdlJ2QgaGF2ZSBhIGRpZmZlcmVudCBudW1iZXIgb2YgZW50cmllcyBvbiB0aGUgc3RhY2sgZGVwZW5kaW5nIG9uXG4gIC8vIHdoZXRoZXIgZ2V0Um9vdEhvc3RDb250ZXh0KCkgdGhyb3dzIHNvbWV3aGVyZSBpbiByZW5kZXJlciBjb2RlIG9yIG5vdC5cbiAgLy8gU28gd2UgcHVzaCBhbiBlbXB0eSB2YWx1ZSBmaXJzdC4gVGhpcyBsZXRzIHVzIHNhZmVseSB1bndpbmQgb24gZXJyb3JzLlxuXG4gIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yJDEsIE5PX0NPTlRFWFQsIGZpYmVyKTtcbiAgdmFyIG5leHRSb290Q29udGV4dCA9IGdldFJvb3RIb3N0Q29udGV4dChuZXh0Um9vdEluc3RhbmNlKTsgLy8gTm93IHRoYXQgd2Uga25vdyB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgdGhyb3csIHJlcGxhY2UgaXQuXG5cbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7XG4gIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yJDEsIG5leHRSb290Q29udGV4dCwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwb3BIb3N0Q29udGFpbmVyKGZpYmVyKSB7XG4gIHBvcChjb250ZXh0U3RhY2tDdXJzb3IkMSwgZmliZXIpO1xuICBwb3AoY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgcG9wKHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIGdldEhvc3RDb250ZXh0KCkge1xuICB2YXIgY29udGV4dCA9IHJlcXVpcmVkQ29udGV4dChjb250ZXh0U3RhY2tDdXJzb3IkMS5jdXJyZW50KTtcbiAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Q29udGV4dChmaWJlcikge1xuICB2YXIgcm9vdEluc3RhbmNlID0gcmVxdWlyZWRDb250ZXh0KHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLmN1cnJlbnQpO1xuICB2YXIgY29udGV4dCA9IHJlcXVpcmVkQ29udGV4dChjb250ZXh0U3RhY2tDdXJzb3IkMS5jdXJyZW50KTtcbiAgdmFyIG5leHRDb250ZXh0ID0gZ2V0Q2hpbGRIb3N0Q29udGV4dChjb250ZXh0LCBmaWJlci50eXBlKTsgLy8gRG9uJ3QgcHVzaCB0aGlzIEZpYmVyJ3MgY29udGV4dCB1bmxlc3MgaXQncyB1bmlxdWUuXG5cbiAgaWYgKGNvbnRleHQgPT09IG5leHRDb250ZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIFRyYWNrIHRoZSBjb250ZXh0IGFuZCB0aGUgRmliZXIgdGhhdCBwcm92aWRlZCBpdC5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIHBvcCBvbmx5IEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuXG5cbiAgcHVzaChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIsIGZpYmVyKTtcbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgbmV4dENvbnRleHQsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gcG9wSG9zdENvbnRleHQoZmliZXIpIHtcbiAgLy8gRG8gbm90IHBvcCB1bmxlc3MgdGhpcyBGaWJlciBwcm92aWRlZCB0aGUgY3VycmVudCBjb250ZXh0LlxuICAvLyBwdXNoSG9zdENvbnRleHQoKSBvbmx5IHB1c2hlcyBGaWJlcnMgdGhhdCBwcm92aWRlIHVuaXF1ZSBjb250ZXh0cy5cbiAgaWYgKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLmN1cnJlbnQgIT09IGZpYmVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7XG4gIHBvcChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIpO1xufVxuXG52YXIgRGVmYXVsdFN1c3BlbnNlQ29udGV4dCA9IDA7IC8vIFRoZSBTdXNwZW5zZSBDb250ZXh0IGlzIHNwbGl0IGludG8gdHdvIHBhcnRzLiBUaGUgbG93ZXIgYml0cyBpc1xuLy8gaW5oZXJpdGVkIGRlZXBseSBkb3duIHRoZSBzdWJ0cmVlLiBUaGUgdXBwZXIgYml0cyBvbmx5IGFmZmVjdFxuLy8gdGhpcyBpbW1lZGlhdGUgc3VzcGVuc2UgYm91bmRhcnkgYW5kIGdldHMgcmVzZXQgZWFjaCBuZXdcbi8vIGJvdW5kYXJ5IG9yIHN1c3BlbnNlIGxpc3QuXG5cbnZhciBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzayA9IDE7IC8vIFN1YnRyZWUgRmxhZ3M6XG4vLyBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQgaW5kaWNhdGVzIHRoYXQgb25lIG9mIG91ciBwYXJlbnQgU3VzcGVuc2Vcbi8vIGJvdW5kYXJpZXMgaXMgbm90IGN1cnJlbnRseSBzaG93aW5nIHZpc2libGUgbWFpbiBjb250ZW50LlxuLy8gRWl0aGVyIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2sgb3IgaXMgbm90IG1vdW50ZWQgYXQgYWxsLlxuLy8gV2UgY2FuIHVzZSB0aGlzIHRvIGRldGVybWluZSBpZiBpdCBpcyBkZXNpcmFibGUgdG8gdHJpZ2dlciBhIGZhbGxiYWNrIGF0XG4vLyB0aGUgcGFyZW50LiBJZiBub3QsIHRoZW4gd2UgbWlnaHQgbmVlZCB0byB0cmlnZ2VyIHVuZGVzaXJhYmxlIGJvdW5kYXJpZXNcbi8vIGFuZC9vciBzdXNwZW5kIHRoZSBjb21taXQgdG8gYXZvaWQgaGlkaW5nIHRoZSBwYXJlbnQgY29udGVudC5cblxudmFyIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCA9IDE7IC8vIFNoYWxsb3cgRmxhZ3M6XG4vLyBGb3JjZVN1c3BlbnNlRmFsbGJhY2sgY2FuIGJlIHVzZWQgYnkgU3VzcGVuc2VMaXN0IHRvIGZvcmNlIG5ld2x5IGFkZGVkXG4vLyBpdGVtcyBpbnRvIHRoZWlyIGZhbGxiYWNrIHN0YXRlIGR1cmluZyBvbmUgb2YgdGhlIHJlbmRlciBwYXNzZXMuXG5cbnZhciBGb3JjZVN1c3BlbnNlRmFsbGJhY2sgPSAyO1xudmFyIHN1c3BlbnNlU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoRGVmYXVsdFN1c3BlbnNlQ29udGV4dCk7XG5mdW5jdGlvbiBoYXNTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCwgZmxhZykge1xuICByZXR1cm4gKHBhcmVudENvbnRleHQgJiBmbGFnKSAhPT0gMDtcbn1cbmZ1bmN0aW9uIHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQpIHtcbiAgcmV0dXJuIHBhcmVudENvbnRleHQgJiBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzaztcbn1cbmZ1bmN0aW9uIHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCwgc2hhbGxvd0NvbnRleHQpIHtcbiAgcmV0dXJuIHBhcmVudENvbnRleHQgJiBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzayB8IHNoYWxsb3dDb250ZXh0O1xufVxuZnVuY3Rpb24gYWRkU3VidHJlZVN1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBzdWJ0cmVlQ29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCB8IHN1YnRyZWVDb250ZXh0O1xufVxuZnVuY3Rpb24gcHVzaFN1c3BlbnNlQ29udGV4dChmaWJlciwgbmV3Q29udGV4dCkge1xuICBwdXNoKHN1c3BlbnNlU3RhY2tDdXJzb3IsIG5ld0NvbnRleHQsIGZpYmVyKTtcbn1cbmZ1bmN0aW9uIHBvcFN1c3BlbnNlQ29udGV4dChmaWJlcikge1xuICBwb3Aoc3VzcGVuc2VTdGFja0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRDYXB0dXJlU3VzcGVuc2Uod29ya0luUHJvZ3Jlc3MsIGhhc0ludmlzaWJsZVBhcmVudCkge1xuICAvLyBJZiBpdCB3YXMgdGhlIHByaW1hcnkgY2hpbGRyZW4gdGhhdCBqdXN0IHN1c3BlbmRlZCwgY2FwdHVyZSBhbmQgcmVuZGVyIHRoZVxuICAvLyBmYWxsYmFjay4gT3RoZXJ3aXNlLCBkb24ndCBjYXB0dXJlIGFuZCBidWJibGUgdG8gdGhlIG5leHQgYm91bmRhcnkuXG4gIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChuZXh0U3RhdGUgIT09IG51bGwpIHtcbiAgICBpZiAobmV4dFN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgIC8vIEEgZGVoeWRyYXRlZCBib3VuZGFyeSBhbHdheXMgY2FwdHVyZXMuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgcHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzOyAvLyBSZWd1bGFyIGJvdW5kYXJpZXMgYWx3YXlzIGNhcHR1cmUuXG5cbiAge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIElmIGl0J3MgYSBib3VuZGFyeSB3ZSBzaG91bGQgYXZvaWQsIHRoZW4gd2UgcHJlZmVyIHRvIGJ1YmJsZSB1cCB0byB0aGVcbn1cbmZ1bmN0aW9uIGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpIHtcbiAgdmFyIG5vZGUgPSByb3c7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICB2YXIgc3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgZGVoeWRyYXRlZCA9IHN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgICAgaWYgKGRlaHlkcmF0ZWQgPT09IG51bGwgfHwgaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhkZWh5ZHJhdGVkKSB8fCBpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhkZWh5ZHJhdGVkKSkge1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VMaXN0Q29tcG9uZW50ICYmIC8vIHJldmVhbE9yZGVyIHVuZGVmaW5lZCBjYW4ndCBiZSB0cnVzdGVkIGJlY2F1c2UgaXQgZG9uJ3RcbiAgICAvLyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgaXQgc3VzcGVuZGVkIG9yIG5vdC5cbiAgICBub2RlLm1lbW9pemVkUHJvcHMucmV2ZWFsT3JkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGRpZFN1c3BlbmQgPSAobm9kZS5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gICAgICBpZiAoZGlkU3VzcGVuZCkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IHJvdykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSByb3cpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgTm9GbGFncyQxID1cbi8qICAgKi9cbjA7IC8vIFJlcHJlc2VudHMgd2hldGhlciBlZmZlY3Qgc2hvdWxkIGZpcmUuXG5cbnZhciBIYXNFZmZlY3QgPVxuLyogKi9cbjE7IC8vIFJlcHJlc2VudHMgdGhlIHBoYXNlIGluIHdoaWNoIHRoZSBlZmZlY3QgKG5vdCB0aGUgY2xlYW4tdXApIGZpcmVzLlxuXG52YXIgSW5zZXJ0aW9uID1cbi8qICAqL1xuMjtcbnZhciBMYXlvdXQgPVxuLyogICAgKi9cbjQ7XG52YXIgUGFzc2l2ZSQxID1cbi8qICAgKi9cbjg7XG5cbi8vIGFuZCBzaG91bGQgYmUgcmVzZXQgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3IHJlbmRlci5cbi8vIFRoaXMgdHJhY2tzIHdoaWNoIG11dGFibGUgc291cmNlcyBuZWVkIHRvIGJlIHJlc2V0IGFmdGVyIGEgcmVuZGVyLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NTb3VyY2VzID0gW107XG5mdW5jdGlvbiByZXNldFdvcmtJblByb2dyZXNzVmVyc2lvbnMoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgd29ya0luUHJvZ3Jlc3NTb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG11dGFibGVTb3VyY2UgPSB3b3JrSW5Qcm9ncmVzc1NvdXJjZXNbaV07XG5cbiAgICB7XG4gICAgICBtdXRhYmxlU291cmNlLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzc1NvdXJjZXMubGVuZ3RoID0gMDtcbn1cbi8vIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSB2ZXJzaW9uIHVzZWQgZm9yIHNlcnZlciByZW5kZXJpbmcgbWF0Y2hlcyB0aGUgb25lXG4vLyB0aGF0IGlzIGV2ZW50dWFsbHkgcmVhZCBkdXJpbmcgaHlkcmF0aW9uLlxuLy8gSWYgdGhleSBkb24ndCBtYXRjaCB0aGVyZSdzIGEgcG90ZW50aWFsIHRlYXIgYW5kIGEgZnVsbCBkZW9wdCByZW5kZXIgaXMgcmVxdWlyZWQuXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyTXV0YWJsZVNvdXJjZUZvckh5ZHJhdGlvbihyb290LCBtdXRhYmxlU291cmNlKSB7XG4gIHZhciBnZXRWZXJzaW9uID0gbXV0YWJsZVNvdXJjZS5fZ2V0VmVyc2lvbjtcbiAgdmFyIHZlcnNpb24gPSBnZXRWZXJzaW9uKG11dGFibGVTb3VyY2UuX3NvdXJjZSk7IC8vIFRPRE8gQ2xlYXIgdGhpcyBkYXRhIG9uY2UgYWxsIHBlbmRpbmcgaHlkcmF0aW9uIHdvcmsgaXMgZmluaXNoZWQuXG4gIC8vIFJldGFpbmluZyBpdCBmb3JldmVyIG1heSBpbnRlcmZlcmUgd2l0aCBHQy5cblxuICBpZiAocm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID09IG51bGwpIHtcbiAgICByb290Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEgPSBbbXV0YWJsZVNvdXJjZSwgdmVyc2lvbl07XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhLnB1c2gobXV0YWJsZVNvdXJjZSwgdmVyc2lvbik7XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO1xudmFyIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudDtcbnZhciBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdDtcblxue1xuICBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQgPSBuZXcgU2V0KCk7XG59XG5cbi8vIFRoZXNlIGFyZSBzZXQgcmlnaHQgYmVmb3JlIGNhbGxpbmcgdGhlIGNvbXBvbmVudC5cbnZhciByZW5kZXJMYW5lcyA9IE5vTGFuZXM7IC8vIFRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLiBJJ3ZlIG5hbWVkIGl0IGRpZmZlcmVudGx5IHRvIGRpc3Rpbmd1aXNoIGl0IGZyb21cbi8vIHRoZSB3b3JrLWluLXByb2dyZXNzIGhvb2suXG5cbnZhciBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDsgLy8gSG9va3MgYXJlIHN0b3JlZCBhcyBhIGxpbmtlZCBsaXN0IG9uIHRoZSBmaWJlcidzIG1lbW9pemVkU3RhdGUgZmllbGQuIFRoZVxuLy8gY3VycmVudCBob29rIGxpc3QgaXMgdGhlIGxpc3QgdGhhdCBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IGZpYmVyLiBUaGVcbi8vIHdvcmstaW4tcHJvZ3Jlc3MgaG9vayBsaXN0IGlzIGEgbmV3IGxpc3QgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZVxuLy8gd29yay1pbi1wcm9ncmVzcyBmaWJlci5cblxudmFyIGN1cnJlbnRIb29rID0gbnVsbDtcbnZhciB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsOyAvLyBXaGV0aGVyIGFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIGF0IGFueSBwb2ludCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS4gVGhpc1xuLy8gZG9lcyBub3QgZ2V0IHJlc2V0IGlmIHdlIGRvIGFub3RoZXIgcmVuZGVyIHBhc3M7IG9ubHkgd2hlbiB3ZSdyZSBjb21wbGV0ZWx5XG4vLyBmaW5pc2hlZCBldmFsdWF0aW5nIHRoaXMgY29tcG9uZW50LiBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBzbyB3ZSBrbm93XG4vLyB3aGV0aGVyIHdlIG5lZWQgdG8gY2xlYXIgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgYWZ0ZXIgYSB0aHJvdy5cblxudmFyIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTsgLy8gV2hlcmUgYW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgb25seSBkdXJpbmcgdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MuIFRoaXNcbi8vIGdldHMgcmVzZXQgYWZ0ZXIgZWFjaCBhdHRlbXB0LlxuLy8gVE9ETzogTWF5YmUgdGhlcmUncyBzb21lIHdheSB0byBjb25zb2xpZGF0ZSB0aGlzIHdpdGhcbi8vIGBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlYC4gT3Igd2l0aCBgbnVtYmVyT2ZSZVJlbmRlcnNgLlxuXG52YXIgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZmFsc2U7IC8vIENvdW50cyB0aGUgbnVtYmVyIG9mIHVzZUlkIGhvb2tzIGluIHRoaXMgY29tcG9uZW50LlxuXG52YXIgbG9jYWxJZENvdW50ZXIgPSAwOyAvLyBVc2VkIGZvciBpZHMgdGhhdCBhcmUgZ2VuZXJhdGVkIGNvbXBsZXRlbHkgY2xpZW50LXNpZGUgKGkuZS4gbm90IGR1cmluZ1xuLy8gaHlkcmF0aW9uKS4gVGhpcyBjb3VudGVyIGlzIGdsb2JhbCwgc28gY2xpZW50IGlkcyBhcmUgbm90IHN0YWJsZSBhY3Jvc3Ncbi8vIHJlbmRlciBhdHRlbXB0cy5cblxudmFyIGdsb2JhbENsaWVudElkQ291bnRlciA9IDA7XG52YXIgUkVfUkVOREVSX0xJTUlUID0gMjU7IC8vIEluIERFViwgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBwcmltaXRpdmUgaG9va1xuXG52YXIgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBudWxsOyAvLyBJbiBERVYsIHRoaXMgbGlzdCBlbnN1cmVzIHRoYXQgaG9va3MgYXJlIGNhbGxlZCBpbiB0aGUgc2FtZSBvcmRlciBiZXR3ZWVuIHJlbmRlcnMuXG4vLyBUaGUgbGlzdCBzdG9yZXMgdGhlIG9yZGVyIG9mIGhvb2tzIHVzZWQgZHVyaW5nIHRoZSBpbml0aWFsIHJlbmRlciAobW91bnQpLlxuLy8gU3Vic2VxdWVudCByZW5kZXJzICh1cGRhdGVzKSByZWZlcmVuY2UgdGhpcyBsaXN0LlxuXG52YXIgaG9va1R5cGVzRGV2ID0gbnVsbDtcbnZhciBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xOyAvLyBJbiBERVYsIHRoaXMgdHJhY2tzIHdoZXRoZXIgY3VycmVudGx5IHJlbmRlcmluZyBjb21wb25lbnQgbmVlZHMgdG8gaWdub3JlXG4vLyB0aGUgZGVwZW5kZW5jaWVzIGZvciBIb29rcyB0aGF0IG5lZWQgdGhlbSAoZS5nLiB1c2VFZmZlY3Qgb3IgdXNlTWVtbykuXG4vLyBXaGVuIHRydWUsIHN1Y2ggSG9va3Mgd2lsbCBhbHdheXMgYmUgXCJyZW1vdW50ZWRcIi4gT25seSB1c2VkIGR1cmluZyBob3QgcmVsb2FkLlxuXG52YXIgaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMgPSBmYWxzZTtcblxuZnVuY3Rpb24gbW91bnRIb29rVHlwZXNEZXYoKSB7XG4gIHtcbiAgICB2YXIgaG9va05hbWUgPSBjdXJyZW50SG9va05hbWVJbkRldjtcblxuICAgIGlmIChob29rVHlwZXNEZXYgPT09IG51bGwpIHtcbiAgICAgIGhvb2tUeXBlc0RldiA9IFtob29rTmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGhvb2tUeXBlc0Rldi5wdXNoKGhvb2tOYW1lKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9va1R5cGVzRGV2KCkge1xuICB7XG4gICAgdmFyIGhvb2tOYW1lID0gY3VycmVudEhvb2tOYW1lSW5EZXY7XG5cbiAgICBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICBob29rVHlwZXNVcGRhdGVJbmRleERldisrO1xuXG4gICAgICBpZiAoaG9va1R5cGVzRGV2W2hvb2tUeXBlc1VwZGF0ZUluZGV4RGV2XSAhPT0gaG9va05hbWUpIHtcbiAgICAgICAgd2Fybk9uSG9va01pc21hdGNoSW5EZXYoaG9va05hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKSB7XG4gIHtcbiAgICBpZiAoZGVwcyAhPT0gdW5kZWZpbmVkICYmIGRlcHMgIT09IG51bGwgJiYgIWlzQXJyYXkoZGVwcykpIHtcbiAgICAgIC8vIFZlcmlmeSBkZXBzLCBidXQgb25seSBvbiBtb3VudCB0byBhdm9pZCBleHRyYSBjaGVja3MuXG4gICAgICAvLyBJdCdzIHVubGlrZWx5IHRoZWlyIHR5cGUgd291bGQgY2hhbmdlIGFzIHVzdWFsbHkgeW91IGRlZmluZSB0aGVtIGlubGluZS5cbiAgICAgIGVycm9yKCclcyByZWNlaXZlZCBhIGZpbmFsIGFyZ3VtZW50IHRoYXQgaXMgbm90IGFuIGFycmF5IChpbnN0ZWFkLCByZWNlaXZlZCBgJXNgKS4gV2hlbiAnICsgJ3NwZWNpZmllZCwgdGhlIGZpbmFsIGFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXkuJywgY3VycmVudEhvb2tOYW1lSW5EZXYsIHR5cGVvZiBkZXBzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd2Fybk9uSG9va01pc21hdGNoSW5EZXYoY3VycmVudEhvb2tOYW1lKSB7XG4gIHtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSk7XG5cbiAgICBpZiAoIWRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHRhYmxlID0gJyc7XG4gICAgICAgIHZhciBzZWNvbmRDb2x1bW5TdGFydCA9IDMwO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2OyBpKyspIHtcbiAgICAgICAgICB2YXIgb2xkSG9va05hbWUgPSBob29rVHlwZXNEZXZbaV07XG4gICAgICAgICAgdmFyIG5ld0hvb2tOYW1lID0gaSA9PT0gaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPyBjdXJyZW50SG9va05hbWUgOiBvbGRIb29rTmFtZTtcbiAgICAgICAgICB2YXIgcm93ID0gaSArIDEgKyBcIi4gXCIgKyBvbGRIb29rTmFtZTsgLy8gRXh0cmEgc3BhY2Ugc28gc2Vjb25kIGNvbHVtbiBsaW5lcyB1cFxuICAgICAgICAgIC8vIGxvbCBAIElFIG5vdCBzdXBwb3J0aW5nIFN0cmluZyNyZXBlYXRcblxuICAgICAgICAgIHdoaWxlIChyb3cubGVuZ3RoIDwgc2Vjb25kQ29sdW1uU3RhcnQpIHtcbiAgICAgICAgICAgIHJvdyArPSAnICc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcm93ICs9IG5ld0hvb2tOYW1lICsgJ1xcbic7XG4gICAgICAgICAgdGFibGUgKz0gcm93O1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3IoJ1JlYWN0IGhhcyBkZXRlY3RlZCBhIGNoYW5nZSBpbiB0aGUgb3JkZXIgb2YgSG9va3MgY2FsbGVkIGJ5ICVzLiAnICsgJ1RoaXMgd2lsbCBsZWFkIHRvIGJ1Z3MgYW5kIGVycm9ycyBpZiBub3QgZml4ZWQuICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlYWQgdGhlIFJ1bGVzIG9mIEhvb2tzOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcnVsZXMtb2YtaG9va3NcXG5cXG4nICsgJyAgIFByZXZpb3VzIHJlbmRlciAgICAgICAgICAgIE5leHQgcmVuZGVyXFxuJyArICcgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4nICsgJyVzJyArICcgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cXG4nLCBjb21wb25lbnROYW1lLCB0YWJsZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRocm93SW52YWxpZEhvb2tFcnJvcigpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yJyArICcgb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4nICsgJzEuIFlvdSBtaWdodCBoYXZlIG1pc21hdGNoaW5nIHZlcnNpb25zIG9mIFJlYWN0IGFuZCB0aGUgcmVuZGVyZXIgKHN1Y2ggYXMgUmVhY3QgRE9NKVxcbicgKyAnMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbicgKyAnMy4gWW91IG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0IGluIHRoZSBzYW1lIGFwcFxcbicgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uJyk7XG59XG5cbmZ1bmN0aW9uIGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpIHtcbiAge1xuICAgIGlmIChpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcykge1xuICAgICAgLy8gT25seSB0cnVlIHdoZW4gdGhpcyBjb21wb25lbnQgaXMgYmVpbmcgaG90IHJlbG9hZGVkLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcmV2RGVwcyA9PT0gbnVsbCkge1xuICAgIHtcbiAgICAgIGVycm9yKCclcyByZWNlaXZlZCBhIGZpbmFsIGFyZ3VtZW50IGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IG5vdCBkdXJpbmcgJyArICd0aGUgcHJldmlvdXMgcmVuZGVyLiBFdmVuIHRob3VnaCB0aGUgZmluYWwgYXJndW1lbnQgaXMgb3B0aW9uYWwsICcgKyAnaXRzIHR5cGUgY2Fubm90IGNoYW5nZSBiZXR3ZWVuIHJlbmRlcnMuJywgY3VycmVudEhvb2tOYW1lSW5EZXYpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHtcbiAgICAvLyBEb24ndCBib3RoZXIgY29tcGFyaW5nIGxlbmd0aHMgaW4gcHJvZCBiZWNhdXNlIHRoZXNlIGFycmF5cyBzaG91bGQgYmVcbiAgICAvLyBwYXNzZWQgaW5saW5lLlxuICAgIGlmIChuZXh0RGVwcy5sZW5ndGggIT09IHByZXZEZXBzLmxlbmd0aCkge1xuICAgICAgZXJyb3IoJ1RoZSBmaW5hbCBhcmd1bWVudCBwYXNzZWQgdG8gJXMgY2hhbmdlZCBzaXplIGJldHdlZW4gcmVuZGVycy4gVGhlICcgKyAnb3JkZXIgYW5kIHNpemUgb2YgdGhpcyBhcnJheSBtdXN0IHJlbWFpbiBjb25zdGFudC5cXG5cXG4nICsgJ1ByZXZpb3VzOiAlc1xcbicgKyAnSW5jb21pbmc6ICVzJywgY3VycmVudEhvb2tOYW1lSW5EZXYsIFwiW1wiICsgcHJldkRlcHMuam9pbignLCAnKSArIFwiXVwiLCBcIltcIiArIG5leHREZXBzLmpvaW4oJywgJykgKyBcIl1cIik7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmV2RGVwcy5sZW5ndGggJiYgaSA8IG5leHREZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG9iamVjdElzKG5leHREZXBzW2ldLCBwcmV2RGVwc1tpXSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHNlY29uZEFyZywgbmV4dFJlbmRlckxhbmVzKSB7XG4gIHJlbmRlckxhbmVzID0gbmV4dFJlbmRlckxhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gd29ya0luUHJvZ3Jlc3M7XG5cbiAge1xuICAgIGhvb2tUeXBlc0RldiA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Ll9kZWJ1Z0hvb2tUeXBlcyA6IG51bGw7XG4gICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTsgLy8gVXNlZCBmb3IgaG90IHJlbG9hZGluZzpcblxuICAgIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnR5cGUgIT09IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7IC8vIFRoZSBmb2xsb3dpbmcgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHJlc2V0XG4gIC8vIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgLy8gd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgLy8gZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlO1xuICAvLyBsb2NhbElkQ291bnRlciA9IDA7XG4gIC8vIFRPRE8gV2FybiBpZiBubyBob29rcyBhcmUgdXNlZCBhdCBhbGwgZHVyaW5nIG1vdW50LCB0aGVuIHNvbWUgYXJlIHVzZWQgZHVyaW5nIHVwZGF0ZS5cbiAgLy8gQ3VycmVudGx5IHdlIHdpbGwgaWRlbnRpZnkgdGhlIHVwZGF0ZSByZW5kZXIgYXMgYSBtb3VudCBiZWNhdXNlIG1lbW9pemVkU3RhdGUgPT09IG51bGwuXG4gIC8vIFRoaXMgaXMgdHJpY2t5IGJlY2F1c2UgaXQncyB2YWxpZCBmb3IgY2VydGFpbiB0eXBlcyBvZiBjb21wb25lbnRzIChlLmcuIFJlYWN0LmxhenkpXG4gIC8vIFVzaW5nIG1lbW9pemVkU3RhdGUgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG1vdW50L3VwZGF0ZSBvbmx5IHdvcmtzIGlmIGF0IGxlYXN0IG9uZSBzdGF0ZWZ1bCBob29rIGlzIHVzZWQuXG4gIC8vIE5vbi1zdGF0ZWZ1bCBob29rcyAoZS5nLiBjb250ZXh0KSBkb24ndCBnZXQgYWRkZWQgdG8gbWVtb2l6ZWRTdGF0ZSxcbiAgLy8gc28gbWVtb2l6ZWRTdGF0ZSB3b3VsZCBiZSBudWxsIGR1cmluZyB1cGRhdGVzIGFuZCBtb3VudHMuXG5cbiAge1xuICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuICAgIH0gZWxzZSBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGRpc3BhdGNoZXIgaGFuZGxlcyBhbiBlZGdlIGNhc2Ugd2hlcmUgYSBjb21wb25lbnQgaXMgdXBkYXRpbmcsXG4gICAgICAvLyBidXQgbm8gc3RhdGVmdWwgaG9va3MgaGF2ZSBiZWVuIHVzZWQuXG4gICAgICAvLyBXZSB3YW50IHRvIG1hdGNoIHRoZSBwcm9kdWN0aW9uIGNvZGUgYmVoYXZpb3IgKHdoaWNoIHdpbGwgdXNlIEhvb2tzRGlzcGF0Y2hlck9uTW91bnQpLFxuICAgICAgLy8gYnV0IHdpdGggdGhlIGV4dHJhIERFViB2YWxpZGF0aW9uIHRvIGVuc3VyZSBob29rcyBvcmRlcmluZyBoYXNuJ3QgY2hhbmdlZC5cbiAgICAgIC8vIFRoaXMgZGlzcGF0Y2hlciBkb2VzIHRoYXQuXG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEhvb2tzRGlzcGF0Y2hlck9uTW91bnRXaXRoSG9va1R5cGVzSW5ERVY7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjaGlsZHJlbiA9IENvbXBvbmVudChwcm9wcywgc2Vjb25kQXJnKTsgLy8gQ2hlY2sgaWYgdGhlcmUgd2FzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZVxuXG4gIGlmIChkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MpIHtcbiAgICAvLyBLZWVwIHJlbmRlcmluZyBpbiBhIGxvb3AgZm9yIGFzIGxvbmcgYXMgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgY29udGludWUgdG9cbiAgICAvLyBiZSBzY2hlZHVsZWQuIFVzZSBhIGNvdW50ZXIgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wcy5cbiAgICB2YXIgbnVtYmVyT2ZSZVJlbmRlcnMgPSAwO1xuXG4gICAgZG8ge1xuICAgICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZmFsc2U7XG4gICAgICBsb2NhbElkQ291bnRlciA9IDA7XG5cbiAgICAgIGlmIChudW1iZXJPZlJlUmVuZGVycyA+PSBSRV9SRU5ERVJfTElNSVQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb28gbWFueSByZS1yZW5kZXJzLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiByZW5kZXJzIHRvIHByZXZlbnQgJyArICdhbiBpbmZpbml0ZSBsb29wLicpO1xuICAgICAgfVxuXG4gICAgICBudW1iZXJPZlJlUmVuZGVycyArPSAxO1xuXG4gICAgICB7XG4gICAgICAgIC8vIEV2ZW4gd2hlbiBob3QgcmVsb2FkaW5nLCBhbGxvdyBkZXBlbmRlbmNpZXMgdG8gc3RhYmlsaXplXG4gICAgICAgIC8vIGFmdGVyIGZpcnN0IHJlbmRlciB0byBwcmV2ZW50IGluZmluaXRlIHJlbmRlciBwaGFzZSB1cGRhdGVzLlxuICAgICAgICBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGZhbHNlO1xuICAgICAgfSAvLyBTdGFydCBvdmVyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdFxuXG5cbiAgICAgIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7XG5cbiAgICAgIHtcbiAgICAgICAgLy8gQWxzbyB2YWxpZGF0ZSBob29rIG9yZGVyIGZvciBjYXNjYWRpbmcgdXBkYXRlcy5cbiAgICAgICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTtcbiAgICAgIH1cblxuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSAgSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWIDtcbiAgICAgIGNoaWxkcmVuID0gQ29tcG9uZW50KHByb3BzLCBzZWNvbmRBcmcpO1xuICAgIH0gd2hpbGUgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyk7XG4gIH0gLy8gV2UgY2FuIGFzc3VtZSB0aGUgcHJldmlvdXMgZGlzcGF0Y2hlciBpcyBhbHdheXMgdGhpcyBvbmUsIHNpbmNlIHdlIHNldCBpdFxuICAvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZW5kZXIgcGhhc2UgYW5kIHRoZXJlJ3Mgbm8gcmUtZW50cmFuY2UuXG5cblxuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSG9va1R5cGVzID0gaG9va1R5cGVzRGV2O1xuICB9IC8vIFRoaXMgY2hlY2sgdXNlcyBjdXJyZW50SG9vayBzbyB0aGF0IGl0IHdvcmtzIHRoZSBzYW1lIGluIERFViBhbmQgcHJvZCBidW5kbGVzLlxuICAvLyBob29rVHlwZXNEZXYgY291bGQgY2F0Y2ggbW9yZSBjYXNlcyAoZS5nLiBjb250ZXh0KSBidXQgb25seSBpbiBERVYgYnVuZGxlcy5cblxuXG4gIHZhciBkaWRSZW5kZXJUb29GZXdIb29rcyA9IGN1cnJlbnRIb29rICE9PSBudWxsICYmIGN1cnJlbnRIb29rLm5leHQgIT09IG51bGw7XG4gIHJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IG51bGw7XG4gIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcblxuICB7XG4gICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBudWxsO1xuICAgIGhvb2tUeXBlc0RldiA9IG51bGw7XG4gICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTsgLy8gQ29uZmlybSB0aGF0IGEgc3RhdGljIGZsYWcgd2FzIG5vdCBhZGRlZCBvciByZW1vdmVkIHNpbmNlIHRoZSBsYXN0XG4gICAgLy8gcmVuZGVyLiBJZiB0aGlzIGZpcmVzLCBpdCBzdWdnZXN0cyB0aGF0IHdlIGluY29ycmVjdGx5IHJlc2V0IHRoZSBzdGF0aWNcbiAgICAvLyBmbGFncyBpbiBzb21lIG90aGVyIHBhcnQgb2YgdGhlIGNvZGViYXNlLiBUaGlzIGhhcyBoYXBwZW5lZCBiZWZvcmUsIGZvclxuICAgIC8vIGV4YW1wbGUsIGluIHRoZSBTdXNwZW5zZUxpc3QgaW1wbGVtZW50YXRpb24uXG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAoY3VycmVudC5mbGFncyAmIFN0YXRpY01hc2spICE9PSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBTdGF0aWNNYXNrKSAmJiAvLyBEaXNhYmxlIHRoaXMgd2FybmluZyBpbiBsZWdhY3kgbW9kZSwgYmVjYXVzZSBsZWdhY3kgU3VzcGVuc2UgaXMgd2VpcmRcbiAgICAvLyBhbmQgY3JlYXRlcyBmYWxzZSBwb3NpdGl2ZXMuIFRvIG1ha2UgdGhpcyB3b3JrIGluIGxlZ2FjeSBtb2RlLCB3ZSdkXG4gICAgLy8gbmVlZCB0byBtYXJrIGZpYmVycyB0aGF0IGNvbW1pdCBpbiBhbiBpbmNvbXBsZXRlIHN0YXRlLCBzb21laG93LiBGb3JcbiAgICAvLyBub3cgSSdsbCBkaXNhYmxlIHRoZSB3YXJuaW5nIHRoYXQgbW9zdCBvZiB0aGUgYnVncyB0aGF0IHdvdWxkIHRyaWdnZXJcbiAgICAvLyBpdCBhcmUgZWl0aGVyIGV4Y2x1c2l2ZSB0byBjb25jdXJyZW50IG1vZGUgb3IgZXhpc3QgaW4gYm90aC5cbiAgICAoY3VycmVudC5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgIGVycm9yKCdJbnRlcm5hbCBSZWFjdCBlcnJvcjogRXhwZWN0ZWQgc3RhdGljIGZsYWcgd2FzIG1pc3NpbmcuIFBsZWFzZSAnICsgJ25vdGlmeSB0aGUgUmVhY3QgdGVhbS4nKTtcbiAgICB9XG4gIH1cblxuICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7IC8vIFRoaXMgaXMgcmVzZXQgYnkgY2hlY2tEaWRSZW5kZXJJZEhvb2tcbiAgLy8gbG9jYWxJZENvdW50ZXIgPSAwO1xuXG4gIGlmIChkaWRSZW5kZXJUb29GZXdIb29rcykge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVuZGVyZWQgZmV3ZXIgaG9va3MgdGhhbiBleHBlY3RlZC4gVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IGFuIGFjY2lkZW50YWwgJyArICdlYXJseSByZXR1cm4gc3RhdGVtZW50LicpO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuZnVuY3Rpb24gY2hlY2tEaWRSZW5kZXJJZEhvb2soKSB7XG4gIC8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBldmVyeSByZW5kZXJXaXRoSG9va3MgY2FsbC5cbiAgLy8gQ29uY2VwdHVhbGx5LCBpdCdzIHBhcnQgb2YgdGhlIHJldHVybiB2YWx1ZSBvZiByZW5kZXJXaXRoSG9va3M7IGl0J3Mgb25seSBhXG4gIC8vIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGF2b2lkIHVzaW5nIGFuIGFycmF5IHR1cGxlLlxuICB2YXIgZGlkUmVuZGVySWRIb29rID0gbG9jYWxJZENvdW50ZXIgIT09IDA7XG4gIGxvY2FsSWRDb3VudGVyID0gMDtcbiAgcmV0dXJuIGRpZFJlbmRlcklkSG9vaztcbn1cbmZ1bmN0aW9uIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbGFuZXMpIHtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlOyAvLyBUT0RPOiBEb24ndCBuZWVkIHRvIHJlc2V0IHRoZSBmbGFncyBoZXJlLCBiZWNhdXNlIHRoZXkncmUgcmVzZXQgaW4gdGhlXG4gIC8vIGNvbXBsZXRlIHBoYXNlIChidWJibGVQcm9wZXJ0aWVzKS5cblxuICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+KE1vdW50UGFzc2l2ZURldiB8IE1vdW50TGF5b3V0RGV2IHwgUGFzc2l2ZSB8IFVwZGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gfihQYXNzaXZlIHwgVXBkYXRlKTtcbiAgfVxuXG4gIGN1cnJlbnQubGFuZXMgPSByZW1vdmVMYW5lcyhjdXJyZW50LmxhbmVzLCBsYW5lcyk7XG59XG5mdW5jdGlvbiByZXNldEhvb2tzQWZ0ZXJUaHJvdygpIHtcbiAgLy8gV2UgY2FuIGFzc3VtZSB0aGUgcHJldmlvdXMgZGlzcGF0Y2hlciBpcyBhbHdheXMgdGhpcyBvbmUsIHNpbmNlIHdlIHNldCBpdFxuICAvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZW5kZXIgcGhhc2UgYW5kIHRoZXJlJ3Mgbm8gcmUtZW50cmFuY2UuXG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIGlmIChkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlKSB7XG4gICAgLy8gVGhlcmUgd2VyZSByZW5kZXIgcGhhc2UgdXBkYXRlcy4gVGhlc2UgYXJlIG9ubHkgdmFsaWQgZm9yIHRoaXMgcmVuZGVyXG4gICAgLy8gcGhhc2UsIHdoaWNoIHdlIGFyZSBub3cgYWJvcnRpbmcuIFJlbW92ZSB0aGUgdXBkYXRlcyBmcm9tIHRoZSBxdWV1ZXMgc29cbiAgICAvLyB0aGV5IGRvIG5vdCBwZXJzaXN0IHRvIHRoZSBuZXh0IHJlbmRlci4gRG8gbm90IHJlbW92ZSB1cGRhdGVzIGZyb20gaG9va3NcbiAgICAvLyB0aGF0IHdlcmVuJ3QgcHJvY2Vzc2VkLlxuICAgIC8vXG4gICAgLy8gT25seSByZXNldCB0aGUgdXBkYXRlcyBmcm9tIHRoZSBxdWV1ZSBpZiBpdCBoYXMgYSBjbG9uZS4gSWYgaXQgZG9lc1xuICAgIC8vIG5vdCBoYXZlIGEgY2xvbmUsIHRoYXQgbWVhbnMgaXQgd2Fzbid0IHByb2Nlc3NlZCwgYW5kIHRoZSB1cGRhdGVzIHdlcmVcbiAgICAvLyBzY2hlZHVsZWQgYmVmb3JlIHdlIGVudGVyZWQgdGhlIHJlbmRlciBwaGFzZS5cbiAgICB2YXIgaG9vayA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZTtcblxuICAgIHdoaWxlIChob29rICE9PSBudWxsKSB7XG4gICAgICB2YXIgcXVldWUgPSBob29rLnF1ZXVlO1xuXG4gICAgICBpZiAocXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgcXVldWUucGVuZGluZyA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGhvb2sgPSBob29rLm5leHQ7XG4gICAgfVxuXG4gICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlO1xuICB9XG5cbiAgcmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcbiAgY3VycmVudEhvb2sgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuXG4gIHtcbiAgICBob29rVHlwZXNEZXYgPSBudWxsO1xuICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7XG4gICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBudWxsO1xuICAgIGlzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2UgPSBmYWxzZTtcbiAgfVxuXG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGZhbHNlO1xuICBsb2NhbElkQ291bnRlciA9IDA7XG59XG5cbmZ1bmN0aW9uIG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCkge1xuICB2YXIgaG9vayA9IHtcbiAgICBtZW1vaXplZFN0YXRlOiBudWxsLFxuICAgIGJhc2VTdGF0ZTogbnVsbCxcbiAgICBiYXNlUXVldWU6IG51bGwsXG4gICAgcXVldWU6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBob29rIGluIHRoZSBsaXN0XG4gICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlID0gd29ya0luUHJvZ3Jlc3NIb29rID0gaG9vaztcbiAgfSBlbHNlIHtcbiAgICAvLyBBcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdFxuICAgIHdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0ID0gaG9vaztcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc0hvb2s7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpIHtcbiAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJvdGggZm9yIHVwZGF0ZXMgYW5kIGZvciByZS1yZW5kZXJzIHRyaWdnZXJlZCBieSBhXG4gIC8vIHJlbmRlciBwaGFzZSB1cGRhdGUuIEl0IGFzc3VtZXMgdGhlcmUgaXMgZWl0aGVyIGEgY3VycmVudCBob29rIHdlIGNhblxuICAvLyBjbG9uZSwgb3IgYSB3b3JrLWluLXByb2dyZXNzIGhvb2sgZnJvbSBhIHByZXZpb3VzIHJlbmRlciBwYXNzIHRoYXQgd2UgY2FuXG4gIC8vIHVzZSBhcyBhIGJhc2UuIFdoZW4gd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgYmFzZSBsaXN0LCB3ZSBtdXN0IHN3aXRjaCB0b1xuICAvLyB0aGUgZGlzcGF0Y2hlciB1c2VkIGZvciBtb3VudHMuXG4gIHZhciBuZXh0Q3VycmVudEhvb2s7XG5cbiAgaWYgKGN1cnJlbnRIb29rID09PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICBuZXh0Q3VycmVudEhvb2sgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRDdXJyZW50SG9vayA9IG51bGw7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5leHRDdXJyZW50SG9vayA9IGN1cnJlbnRIb29rLm5leHQ7XG4gIH1cblxuICB2YXIgbmV4dFdvcmtJblByb2dyZXNzSG9vaztcblxuICBpZiAod29ya0luUHJvZ3Jlc3NIb29rID09PSBudWxsKSB7XG4gICAgbmV4dFdvcmtJblByb2dyZXNzSG9vayA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQ7XG4gIH1cblxuICBpZiAobmV4dFdvcmtJblByb2dyZXNzSG9vayAhPT0gbnVsbCkge1xuICAgIC8vIFRoZXJlJ3MgYWxyZWFkeSBhIHdvcmstaW4tcHJvZ3Jlc3MuIFJldXNlIGl0LlxuICAgIHdvcmtJblByb2dyZXNzSG9vayA9IG5leHRXb3JrSW5Qcm9ncmVzc0hvb2s7XG4gICAgbmV4dFdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0O1xuICAgIGN1cnJlbnRIb29rID0gbmV4dEN1cnJlbnRIb29rO1xuICB9IGVsc2Uge1xuICAgIC8vIENsb25lIGZyb20gdGhlIGN1cnJlbnQgaG9vay5cbiAgICBpZiAobmV4dEN1cnJlbnRIb29rID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbmRlcmVkIG1vcmUgaG9va3MgdGhhbiBkdXJpbmcgdGhlIHByZXZpb3VzIHJlbmRlci4nKTtcbiAgICB9XG5cbiAgICBjdXJyZW50SG9vayA9IG5leHRDdXJyZW50SG9vaztcbiAgICB2YXIgbmV3SG9vayA9IHtcbiAgICAgIG1lbW9pemVkU3RhdGU6IGN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGUsXG4gICAgICBiYXNlU3RhdGU6IGN1cnJlbnRIb29rLmJhc2VTdGF0ZSxcbiAgICAgIGJhc2VRdWV1ZTogY3VycmVudEhvb2suYmFzZVF1ZXVlLFxuICAgICAgcXVldWU6IGN1cnJlbnRIb29rLnF1ZXVlLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3NIb29rID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBob29rIGluIHRoZSBsaXN0LlxuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlID0gd29ya0luUHJvZ3Jlc3NIb29rID0gbmV3SG9vaztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuXG4gICAgICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dCA9IG5ld0hvb2s7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzSG9vaztcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpIHtcbiAgcmV0dXJuIHtcbiAgICBsYXN0RWZmZWN0OiBudWxsLFxuICAgIHN0b3JlczogbnVsbFxuICB9O1xufVxuXG5mdW5jdGlvbiBiYXNpY1N0YXRlUmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gIC8vICRGbG93Rml4TWU6IEZsb3cgZG9lc24ndCBsaWtlIG1peGVkIHR5cGVzXG4gIHJldHVybiB0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nID8gYWN0aW9uKHN0YXRlKSA6IGFjdGlvbjtcbn1cblxuZnVuY3Rpb24gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgaW5pdGlhbFN0YXRlO1xuXG4gIGlmIChpbml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpbml0aWFsU3RhdGUgPSBpbml0KGluaXRpYWxBcmcpO1xuICB9IGVsc2Uge1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxBcmc7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBob29rLmJhc2VTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgdmFyIHF1ZXVlID0ge1xuICAgIHBlbmRpbmc6IG51bGwsXG4gICAgaW50ZXJsZWF2ZWQ6IG51bGwsXG4gICAgbGFuZXM6IE5vTGFuZXMsXG4gICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogcmVkdWNlcixcbiAgICBsYXN0UmVuZGVyZWRTdGF0ZTogaW5pdGlhbFN0YXRlXG4gIH07XG4gIGhvb2sucXVldWUgPSBxdWV1ZTtcbiAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2ggPSBkaXNwYXRjaFJlZHVjZXJBY3Rpb24uYmluZChudWxsLCBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBxdWV1ZSk7XG4gIHJldHVybiBbaG9vay5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcXVldWUgPSBob29rLnF1ZXVlO1xuXG4gIGlmIChxdWV1ZSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIGhhdmUgYSBxdWV1ZS4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlciA9IHJlZHVjZXI7XG4gIHZhciBjdXJyZW50ID0gY3VycmVudEhvb2s7IC8vIFRoZSBsYXN0IHJlYmFzZSB1cGRhdGUgdGhhdCBpcyBOT1QgcGFydCBvZiB0aGUgYmFzZSBzdGF0ZS5cblxuICB2YXIgYmFzZVF1ZXVlID0gY3VycmVudC5iYXNlUXVldWU7IC8vIFRoZSBsYXN0IHBlbmRpbmcgdXBkYXRlIHRoYXQgaGFzbid0IGJlZW4gcHJvY2Vzc2VkIHlldC5cblxuICB2YXIgcGVuZGluZ1F1ZXVlID0gcXVldWUucGVuZGluZztcblxuICBpZiAocGVuZGluZ1F1ZXVlICE9PSBudWxsKSB7XG4gICAgLy8gV2UgaGF2ZSBuZXcgdXBkYXRlcyB0aGF0IGhhdmVuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LlxuICAgIC8vIFdlJ2xsIGFkZCB0aGVtIHRvIHRoZSBiYXNlIHF1ZXVlLlxuICAgIGlmIChiYXNlUXVldWUgIT09IG51bGwpIHtcbiAgICAgIC8vIE1lcmdlIHRoZSBwZW5kaW5nIHF1ZXVlIGFuZCB0aGUgYmFzZSBxdWV1ZS5cbiAgICAgIHZhciBiYXNlRmlyc3QgPSBiYXNlUXVldWUubmV4dDtcbiAgICAgIHZhciBwZW5kaW5nRmlyc3QgPSBwZW5kaW5nUXVldWUubmV4dDtcbiAgICAgIGJhc2VRdWV1ZS5uZXh0ID0gcGVuZGluZ0ZpcnN0O1xuICAgICAgcGVuZGluZ1F1ZXVlLm5leHQgPSBiYXNlRmlyc3Q7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGN1cnJlbnQuYmFzZVF1ZXVlICE9PSBiYXNlUXVldWUpIHtcbiAgICAgICAgLy8gSW50ZXJuYWwgaW52YXJpYW50IHRoYXQgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IGZlYXNpYmx5IGNvdWxkIGluXG4gICAgICAgIC8vIHRoZSBmdXR1cmUgaWYgd2UgaW1wbGVtZW50IHJlc3VtaW5nLCBvciBzb21lIGZvcm0gb2YgdGhhdC5cbiAgICAgICAgZXJyb3IoJ0ludGVybmFsIGVycm9yOiBFeHBlY3RlZCB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIHRvIGJlIGEgY2xvbmUuICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjdXJyZW50LmJhc2VRdWV1ZSA9IGJhc2VRdWV1ZSA9IHBlbmRpbmdRdWV1ZTtcbiAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChiYXNlUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBXZSBoYXZlIGEgcXVldWUgdG8gcHJvY2Vzcy5cbiAgICB2YXIgZmlyc3QgPSBiYXNlUXVldWUubmV4dDtcbiAgICB2YXIgbmV3U3RhdGUgPSBjdXJyZW50LmJhc2VTdGF0ZTtcbiAgICB2YXIgbmV3QmFzZVN0YXRlID0gbnVsbDtcbiAgICB2YXIgbmV3QmFzZVF1ZXVlRmlyc3QgPSBudWxsO1xuICAgIHZhciBuZXdCYXNlUXVldWVMYXN0ID0gbnVsbDtcbiAgICB2YXIgdXBkYXRlID0gZmlyc3Q7XG5cbiAgICBkbyB7XG4gICAgICB2YXIgdXBkYXRlTGFuZSA9IHVwZGF0ZS5sYW5lO1xuXG4gICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhyZW5kZXJMYW5lcywgdXBkYXRlTGFuZSkpIHtcbiAgICAgICAgLy8gUHJpb3JpdHkgaXMgaW5zdWZmaWNpZW50LiBTa2lwIHRoaXMgdXBkYXRlLiBJZiB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAvLyBza2lwcGVkIHVwZGF0ZSwgdGhlIHByZXZpb3VzIHVwZGF0ZS9zdGF0ZSBpcyB0aGUgbmV3IGJhc2VcbiAgICAgICAgLy8gdXBkYXRlL3N0YXRlLlxuICAgICAgICB2YXIgY2xvbmUgPSB7XG4gICAgICAgICAgbGFuZTogdXBkYXRlTGFuZSxcbiAgICAgICAgICBhY3Rpb246IHVwZGF0ZS5hY3Rpb24sXG4gICAgICAgICAgaGFzRWFnZXJTdGF0ZTogdXBkYXRlLmhhc0VhZ2VyU3RhdGUsXG4gICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsXG4gICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlRmlyc3QgPSBuZXdCYXNlUXVldWVMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlTGFzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IGNsb25lO1xuICAgICAgICB9IC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIHByaW9yaXR5IGluIHRoZSBxdWV1ZS5cbiAgICAgICAgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byBhY2N1bXVsYXRlIHRoaXMuIEluc3RlYWQsIHdlIGNhbiByZW1vdmVcbiAgICAgICAgLy8gcmVuZGVyTGFuZXMgZnJvbSB0aGUgb3JpZ2luYWwgbGFuZXMuXG5cblxuICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCB1cGRhdGVMYW5lKTtcbiAgICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyh1cGRhdGVMYW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgdXBkYXRlIGRvZXMgaGF2ZSBzdWZmaWNpZW50IHByaW9yaXR5LlxuICAgICAgICBpZiAobmV3QmFzZVF1ZXVlTGFzdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfY2xvbmUgPSB7XG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZSBpcyBnb2luZyB0byBiZSBjb21taXR0ZWQgc28gd2UgbmV2ZXIgd2FudCB1bmNvbW1pdFxuICAgICAgICAgICAgLy8gaXQuIFVzaW5nIE5vTGFuZSB3b3JrcyBiZWNhdXNlIDAgaXMgYSBzdWJzZXQgb2YgYWxsIGJpdG1hc2tzLCBzb1xuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5ldmVyIGJlIHNraXBwZWQgYnkgdGhlIGNoZWNrIGFib3ZlLlxuICAgICAgICAgICAgbGFuZTogTm9MYW5lLFxuICAgICAgICAgICAgYWN0aW9uOiB1cGRhdGUuYWN0aW9uLFxuICAgICAgICAgICAgaGFzRWFnZXJTdGF0ZTogdXBkYXRlLmhhc0VhZ2VyU3RhdGUsXG4gICAgICAgICAgICBlYWdlclN0YXRlOiB1cGRhdGUuZWFnZXJTdGF0ZSxcbiAgICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgICB9O1xuICAgICAgICAgIG5ld0Jhc2VRdWV1ZUxhc3QgPSBuZXdCYXNlUXVldWVMYXN0Lm5leHQgPSBfY2xvbmU7XG4gICAgICAgIH0gLy8gUHJvY2VzcyB0aGlzIHVwZGF0ZS5cblxuXG4gICAgICAgIGlmICh1cGRhdGUuaGFzRWFnZXJTdGF0ZSkge1xuICAgICAgICAgIC8vIElmIHRoaXMgdXBkYXRlIGlzIGEgc3RhdGUgdXBkYXRlIChub3QgYSByZWR1Y2VyKSBhbmQgd2FzIHByb2Nlc3NlZCBlYWdlcmx5LFxuICAgICAgICAgIC8vIHdlIGNhbiB1c2UgdGhlIGVhZ2VybHkgY29tcHV0ZWQgc3RhdGVcbiAgICAgICAgICBuZXdTdGF0ZSA9IHVwZGF0ZS5lYWdlclN0YXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBhY3Rpb24gPSB1cGRhdGUuYWN0aW9uO1xuICAgICAgICAgIG5ld1N0YXRlID0gcmVkdWNlcihuZXdTdGF0ZSwgYWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcbiAgICB9IHdoaWxlICh1cGRhdGUgIT09IG51bGwgJiYgdXBkYXRlICE9PSBmaXJzdCk7XG5cbiAgICBpZiAobmV3QmFzZVF1ZXVlTGFzdCA9PT0gbnVsbCkge1xuICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IG5ld0Jhc2VRdWV1ZUZpcnN0O1xuICAgIH0gLy8gTWFyayB0aGF0IHRoZSBmaWJlciBwZXJmb3JtZWQgd29yaywgYnV0IG9ubHkgaWYgdGhlIG5ldyBzdGF0ZSBpc1xuICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHN0YXRlLlxuXG5cbiAgICBpZiAoIW9iamVjdElzKG5ld1N0YXRlLCBob29rLm1lbW9pemVkU3RhdGUpKSB7XG4gICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIGhvb2suYmFzZVN0YXRlID0gbmV3QmFzZVN0YXRlO1xuICAgIGhvb2suYmFzZVF1ZXVlID0gbmV3QmFzZVF1ZXVlTGFzdDtcbiAgICBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIEludGVybGVhdmVkIHVwZGF0ZXMgYXJlIHN0b3JlZCBvbiBhIHNlcGFyYXRlIHF1ZXVlLiBXZSBhcmVuJ3QgZ29pbmcgdG9cbiAgLy8gcHJvY2VzcyB0aGVtIGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IHdlIGRvIG5lZWQgdG8gdHJhY2sgd2hpY2ggbGFuZXNcbiAgLy8gYXJlIHJlbWFpbmluZy5cblxuXG4gIHZhciBsYXN0SW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICBpZiAobGFzdEludGVybGVhdmVkICE9PSBudWxsKSB7XG4gICAgdmFyIGludGVybGVhdmVkID0gbGFzdEludGVybGVhdmVkO1xuXG4gICAgZG8ge1xuICAgICAgdmFyIGludGVybGVhdmVkTGFuZSA9IGludGVybGVhdmVkLmxhbmU7XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCBpbnRlcmxlYXZlZExhbmUpO1xuICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyhpbnRlcmxlYXZlZExhbmUpO1xuICAgICAgaW50ZXJsZWF2ZWQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgIH0gd2hpbGUgKGludGVybGVhdmVkICE9PSBsYXN0SW50ZXJsZWF2ZWQpO1xuICB9IGVsc2UgaWYgKGJhc2VRdWV1ZSA9PT0gbnVsbCkge1xuICAgIC8vIGBxdWV1ZS5sYW5lc2AgaXMgdXNlZCBmb3IgZW50YW5nbGluZyB0cmFuc2l0aW9ucy4gV2UgY2FuIHNldCBpdCBiYWNrIHRvXG4gICAgLy8gemVybyBvbmNlIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICBxdWV1ZS5sYW5lcyA9IE5vTGFuZXM7XG4gIH1cblxuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaDtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICBpZiAocXVldWUgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBoYXZlIGEgcXVldWUuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHF1ZXVlLmxhc3RSZW5kZXJlZFJlZHVjZXIgPSByZWR1Y2VyOyAvLyBUaGlzIGlzIGEgcmUtcmVuZGVyLiBBcHBseSB0aGUgbmV3IHJlbmRlciBwaGFzZSB1cGRhdGVzIHRvIHRoZSBwcmV2aW91c1xuICAvLyB3b3JrLWluLXByb2dyZXNzIGhvb2suXG5cbiAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2g7XG4gIHZhciBsYXN0UmVuZGVyUGhhc2VVcGRhdGUgPSBxdWV1ZS5wZW5kaW5nO1xuICB2YXIgbmV3U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKGxhc3RSZW5kZXJQaGFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgIC8vIFRoZSBxdWV1ZSBkb2Vzbid0IHBlcnNpc3QgcGFzdCB0aGlzIHJlbmRlciBwYXNzLlxuICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICAgIHZhciBmaXJzdFJlbmRlclBoYXNlVXBkYXRlID0gbGFzdFJlbmRlclBoYXNlVXBkYXRlLm5leHQ7XG4gICAgdmFyIHVwZGF0ZSA9IGZpcnN0UmVuZGVyUGhhc2VVcGRhdGU7XG5cbiAgICBkbyB7XG4gICAgICAvLyBQcm9jZXNzIHRoaXMgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gV2UgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGVcbiAgICAgIC8vIHByaW9yaXR5IGJlY2F1c2UgaXQgd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnRcbiAgICAgIC8vIHJlbmRlcidzLlxuICAgICAgdmFyIGFjdGlvbiA9IHVwZGF0ZS5hY3Rpb247XG4gICAgICBuZXdTdGF0ZSA9IHJlZHVjZXIobmV3U3RhdGUsIGFjdGlvbik7XG4gICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcbiAgICB9IHdoaWxlICh1cGRhdGUgIT09IGZpcnN0UmVuZGVyUGhhc2VVcGRhdGUpOyAvLyBNYXJrIHRoYXQgdGhlIGZpYmVyIHBlcmZvcm1lZCB3b3JrLCBidXQgb25seSBpZiB0aGUgbmV3IHN0YXRlIGlzXG4gICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgc3RhdGUuXG5cblxuICAgIGlmICghb2JqZWN0SXMobmV3U3RhdGUsIGhvb2subWVtb2l6ZWRTdGF0ZSkpIHtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7IC8vIERvbid0IHBlcnNpc3QgdGhlIHN0YXRlIGFjY3VtdWxhdGVkIGZyb20gdGhlIHJlbmRlciBwaGFzZSB1cGRhdGVzIHRvXG4gICAgLy8gdGhlIGJhc2Ugc3RhdGUgdW5sZXNzIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICAvLyBUT0RPOiBOb3Qgc3VyZSBpZiB0aGlzIGlzIHRoZSBkZXNpcmVkIHNlbWFudGljcywgYnV0IGl0J3Mgd2hhdCB3ZVxuICAgIC8vIGRvIGZvciBnRFNGUC4gSSBjYW4ndCByZW1lbWJlciB3aHkuXG5cbiAgICBpZiAoaG9vay5iYXNlUXVldWUgPT09IG51bGwpIHtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgfVxuXG4gICAgcXVldWUubGFzdFJlbmRlcmVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfVxuXG4gIHJldHVybiBbbmV3U3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gbW91bnRNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gIHZhciBmaWJlciA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDE7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHRTbmFwc2hvdDtcbiAgdmFyIGlzSHlkcmF0aW5nID0gZ2V0SXNIeWRyYXRpbmcoKTtcblxuICBpZiAoaXNIeWRyYXRpbmcpIHtcbiAgICBpZiAoZ2V0U2VydmVyU25hcHNob3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGdldFNlcnZlclNuYXBzaG90LCB3aGljaCBpcyByZXF1aXJlZCBmb3IgJyArICdzZXJ2ZXItcmVuZGVyZWQgY29udGVudC4gV2lsbCByZXZlcnQgdG8gY2xpZW50IHJlbmRlcmluZy4nKTtcbiAgICB9XG5cbiAgICBuZXh0U25hcHNob3QgPSBnZXRTZXJ2ZXJTbmFwc2hvdCgpO1xuXG4gICAge1xuICAgICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgICBpZiAobmV4dFNuYXBzaG90ICE9PSBnZXRTZXJ2ZXJTbmFwc2hvdCgpKSB7XG4gICAgICAgICAgZXJyb3IoJ1RoZSByZXN1bHQgb2YgZ2V0U2VydmVyU25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wJyk7XG5cbiAgICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV4dFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICAgIHtcbiAgICAgIGlmICghZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QpIHtcbiAgICAgICAgdmFyIGNhY2hlZFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICAgICAgICBpZiAoIW9iamVjdElzKG5leHRTbmFwc2hvdCwgY2FjaGVkU25hcHNob3QpKSB7XG4gICAgICAgICAgZXJyb3IoJ1RoZSByZXN1bHQgb2YgZ2V0U25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wJyk7XG5cbiAgICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIFVubGVzcyB3ZSdyZSByZW5kZXJpbmcgYSBibG9ja2luZyBsYW5lLCBzY2hlZHVsZSBhIGNvbnNpc3RlbmN5IGNoZWNrLlxuICAgIC8vIFJpZ2h0IGJlZm9yZSBjb21taXR0aW5nLCB3ZSB3aWxsIHdhbGsgdGhlIHRyZWUgYW5kIGNoZWNrIGlmIGFueSBvZiB0aGVcbiAgICAvLyBzdG9yZXMgd2VyZSBtdXRhdGVkLlxuICAgIC8vXG4gICAgLy8gV2Ugd29uJ3QgZG8gdGhpcyBpZiB3ZSdyZSBoeWRyYXRpbmcgc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQsIGJlY2F1c2UgaWZcbiAgICAvLyB0aGUgY29udGVudCBpcyBzdGFsZSwgaXQncyBhbHJlYWR5IHZpc2libGUgYW55d2F5LiBJbnN0ZWFkIHdlJ2xsIHBhdGNoXG4gICAgLy8gaXQgdXAgaW4gYSBwYXNzaXZlIGVmZmVjdC5cblxuXG4gICAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTtcblxuICAgIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIHJlbmRlckxhbmVzKSkge1xuICAgICAgcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIG5leHRTbmFwc2hvdCk7XG4gICAgfVxuICB9IC8vIFJlYWQgdGhlIGN1cnJlbnQgc25hcHNob3QgZnJvbSB0aGUgc3RvcmUgb24gZXZlcnkgcmVuZGVyLiBUaGlzIGJyZWFrcyB0aGVcbiAgLy8gbm9ybWFsIHJ1bGVzIG9mIFJlYWN0LCBhbmQgb25seSB3b3JrcyBiZWNhdXNlIHN0b3JlIHVwZGF0ZXMgYXJlXG4gIC8vIGFsd2F5cyBzeW5jaHJvbm91cy5cblxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5leHRTbmFwc2hvdDtcbiAgdmFyIGluc3QgPSB7XG4gICAgdmFsdWU6IG5leHRTbmFwc2hvdCxcbiAgICBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3RcbiAgfTtcbiAgaG9vay5xdWV1ZSA9IGluc3Q7IC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlLlxuXG4gIG1vdW50RWZmZWN0KHN1YnNjcmliZVRvU3RvcmUuYmluZChudWxsLCBmaWJlciwgaW5zdCwgc3Vic2NyaWJlKSwgW3N1YnNjcmliZV0pOyAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gdXBkYXRlIHRoZSBtdXRhYmxlIGluc3RhbmNlIGZpZWxkcy4gV2Ugd2lsbCB1cGRhdGVcbiAgLy8gdGhpcyB3aGVuZXZlciBzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBvciB2YWx1ZSBjaGFuZ2VzLiBCZWNhdXNlIHRoZXJlJ3Mgbm9cbiAgLy8gY2xlYW4tdXAgZnVuY3Rpb24sIGFuZCB3ZSB0cmFjayB0aGUgZGVwcyBjb3JyZWN0bHksIHdlIGNhbiBjYWxsIHB1c2hFZmZlY3RcbiAgLy8gZGlyZWN0bHksIHdpdGhvdXQgc3RvcmluZyBhbnkgYWRkaXRpb25hbCBzdGF0ZS4gRm9yIHRoZSBzYW1lIHJlYXNvbiwgd2VcbiAgLy8gZG9uJ3QgbmVlZCB0byBzZXQgYSBzdGF0aWMgZmxhZywgZWl0aGVyLlxuICAvLyBUT0RPOiBXZSBjYW4gbW92ZSB0aGlzIHRvIHRoZSBwYXNzaXZlIHBoYXNlIG9uY2Ugd2UgYWRkIGEgcHJlLWNvbW1pdFxuICAvLyBjb25zaXN0ZW5jeSBjaGVjay4gU2VlIHRoZSBuZXh0IGNvbW1lbnQuXG5cbiAgZmliZXIuZmxhZ3MgfD0gUGFzc2l2ZTtcbiAgcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBQYXNzaXZlJDEsIHVwZGF0ZVN0b3JlSW5zdGFuY2UuYmluZChudWxsLCBmaWJlciwgaW5zdCwgbmV4dFNuYXBzaG90LCBnZXRTbmFwc2hvdCksIHVuZGVmaW5lZCwgbnVsbCk7XG4gIHJldHVybiBuZXh0U25hcHNob3Q7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gIHZhciBmaWJlciA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDE7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7IC8vIFJlYWQgdGhlIGN1cnJlbnQgc25hcHNob3QgZnJvbSB0aGUgc3RvcmUgb24gZXZlcnkgcmVuZGVyLiBUaGlzIGJyZWFrcyB0aGVcbiAgLy8gbm9ybWFsIHJ1bGVzIG9mIFJlYWN0LCBhbmQgb25seSB3b3JrcyBiZWNhdXNlIHN0b3JlIHVwZGF0ZXMgYXJlXG4gIC8vIGFsd2F5cyBzeW5jaHJvbm91cy5cblxuICB2YXIgbmV4dFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICB7XG4gICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgdmFyIGNhY2hlZFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICAgICAgaWYgKCFvYmplY3RJcyhuZXh0U25hcHNob3QsIGNhY2hlZFNuYXBzaG90KSkge1xuICAgICAgICBlcnJvcignVGhlIHJlc3VsdCBvZiBnZXRTbmFwc2hvdCBzaG91bGQgYmUgY2FjaGVkIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AnKTtcblxuICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHByZXZTbmFwc2hvdCA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHNuYXBzaG90Q2hhbmdlZCA9ICFvYmplY3RJcyhwcmV2U25hcHNob3QsIG5leHRTbmFwc2hvdCk7XG5cbiAgaWYgKHNuYXBzaG90Q2hhbmdlZCkge1xuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5leHRTbmFwc2hvdDtcbiAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICB9XG5cbiAgdmFyIGluc3QgPSBob29rLnF1ZXVlO1xuICB1cGRhdGVFZmZlY3Qoc3Vic2NyaWJlVG9TdG9yZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBzdWJzY3JpYmUpLCBbc3Vic2NyaWJlXSk7IC8vIFdoZW5ldmVyIGdldFNuYXBzaG90IG9yIHN1YnNjcmliZSBjaGFuZ2VzLCB3ZSBuZWVkIHRvIGNoZWNrIGluIHRoZVxuICAvLyBjb21taXQgcGhhc2UgaWYgdGhlcmUgd2FzIGFuIGludGVybGVhdmVkIG11dGF0aW9uLiBJbiBjb25jdXJyZW50IG1vZGVcbiAgLy8gdGhpcyBjYW4gaGFwcGVuIGFsbCB0aGUgdGltZSwgYnV0IGV2ZW4gaW4gc3luY2hyb25vdXMgbW9kZSwgYW4gZWFybGllclxuICAvLyBlZmZlY3QgbWF5IGhhdmUgbXV0YXRlZCB0aGUgc3RvcmUuXG5cbiAgaWYgKGluc3QuZ2V0U25hcHNob3QgIT09IGdldFNuYXBzaG90IHx8IHNuYXBzaG90Q2hhbmdlZCB8fCAvLyBDaGVjayBpZiB0aGUgc3VzYmNyaWJlIGZ1bmN0aW9uIGNoYW5nZWQuIFdlIGNhbiBzYXZlIHNvbWUgbWVtb3J5IGJ5XG4gIC8vIGNoZWNraW5nIHdoZXRoZXIgd2Ugc2NoZWR1bGVkIGEgc3Vic2NyaXB0aW9uIGVmZmVjdCBhYm92ZS5cbiAgd29ya0luUHJvZ3Jlc3NIb29rICE9PSBudWxsICYmIHdvcmtJblByb2dyZXNzSG9vay5tZW1vaXplZFN0YXRlLnRhZyAmIEhhc0VmZmVjdCkge1xuICAgIGZpYmVyLmZsYWdzIHw9IFBhc3NpdmU7XG4gICAgcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBQYXNzaXZlJDEsIHVwZGF0ZVN0b3JlSW5zdGFuY2UuYmluZChudWxsLCBmaWJlciwgaW5zdCwgbmV4dFNuYXBzaG90LCBnZXRTbmFwc2hvdCksIHVuZGVmaW5lZCwgbnVsbCk7IC8vIFVubGVzcyB3ZSdyZSByZW5kZXJpbmcgYSBibG9ja2luZyBsYW5lLCBzY2hlZHVsZSBhIGNvbnNpc3RlbmN5IGNoZWNrLlxuICAgIC8vIFJpZ2h0IGJlZm9yZSBjb21taXR0aW5nLCB3ZSB3aWxsIHdhbGsgdGhlIHRyZWUgYW5kIGNoZWNrIGlmIGFueSBvZiB0aGVcbiAgICAvLyBzdG9yZXMgd2VyZSBtdXRhdGVkLlxuXG4gICAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTtcblxuICAgIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIHJlbmRlckxhbmVzKSkge1xuICAgICAgcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIG5leHRTbmFwc2hvdCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5leHRTbmFwc2hvdDtcbn1cblxuZnVuY3Rpb24gcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIHJlbmRlcmVkU25hcHNob3QpIHtcbiAgZmliZXIuZmxhZ3MgfD0gU3RvcmVDb25zaXN0ZW5jeTtcbiAgdmFyIGNoZWNrID0ge1xuICAgIGdldFNuYXBzaG90OiBnZXRTbmFwc2hvdCxcbiAgICB2YWx1ZTogcmVuZGVyZWRTbmFwc2hvdFxuICB9O1xuICB2YXIgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmIChjb21wb25lbnRVcGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpO1xuICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWUgPSBjb21wb25lbnRVcGRhdGVRdWV1ZTtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5zdG9yZXMgPSBbY2hlY2tdO1xuICB9IGVsc2Uge1xuICAgIHZhciBzdG9yZXMgPSBjb21wb25lbnRVcGRhdGVRdWV1ZS5zdG9yZXM7XG5cbiAgICBpZiAoc3RvcmVzID09PSBudWxsKSB7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5zdG9yZXMgPSBbY2hlY2tdO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG9yZXMucHVzaChjaGVjayk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN0b3JlSW5zdGFuY2UoZmliZXIsIGluc3QsIG5leHRTbmFwc2hvdCwgZ2V0U25hcHNob3QpIHtcbiAgLy8gVGhlc2UgYXJlIHVwZGF0ZWQgaW4gdGhlIHBhc3NpdmUgcGhhc2VcbiAgaW5zdC52YWx1ZSA9IG5leHRTbmFwc2hvdDtcbiAgaW5zdC5nZXRTbmFwc2hvdCA9IGdldFNuYXBzaG90OyAvLyBTb21ldGhpbmcgbWF5IGhhdmUgYmVlbiBtdXRhdGVkIGluIGJldHdlZW4gcmVuZGVyIGFuZCBjb21taXQuIFRoaXMgY291bGRcbiAgLy8gaGF2ZSBiZWVuIGluIGFuIGV2ZW50IHRoYXQgZmlyZWQgYmVmb3JlIHRoZSBwYXNzaXZlIGVmZmVjdHMsIG9yIGl0IGNvdWxkXG4gIC8vIGhhdmUgYmVlbiBpbiBhIGxheW91dCBlZmZlY3QuIEluIHRoYXQgY2FzZSwgd2Ugd291bGQgaGF2ZSB1c2VkIHRoZSBvbGRcbiAgLy8gc25hcHNobyBhbmQgZ2V0U25hcHNob3QgdmFsdWVzIHRvIGJhaWwgb3V0LiBXZSBuZWVkIHRvIGNoZWNrIG9uZSBtb3JlIHRpbWUuXG5cbiAgaWYgKGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkpIHtcbiAgICAvLyBGb3JjZSBhIHJlLXJlbmRlci5cbiAgICBmb3JjZVN0b3JlUmVyZW5kZXIoZmliZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN1YnNjcmliZVRvU3RvcmUoZmliZXIsIGluc3QsIHN1YnNjcmliZSkge1xuICB2YXIgaGFuZGxlU3RvcmVDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gVGhlIHN0b3JlIGNoYW5nZWQuIENoZWNrIGlmIHRoZSBzbmFwc2hvdCBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2VcbiAgICAvLyByZWFkIGZyb20gdGhlIHN0b3JlLlxuICAgIGlmIChjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpKSB7XG4gICAgICAvLyBGb3JjZSBhIHJlLXJlbmRlci5cbiAgICAgIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcik7XG4gICAgfVxuICB9OyAvLyBTdWJzY3JpYmUgdG8gdGhlIHN0b3JlIGFuZCByZXR1cm4gYSBjbGVhbi11cCBmdW5jdGlvbi5cblxuXG4gIHJldHVybiBzdWJzY3JpYmUoaGFuZGxlU3RvcmVDaGFuZ2UpO1xufVxuXG5mdW5jdGlvbiBjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpIHtcbiAgdmFyIGxhdGVzdEdldFNuYXBzaG90ID0gaW5zdC5nZXRTbmFwc2hvdDtcbiAgdmFyIHByZXZWYWx1ZSA9IGluc3QudmFsdWU7XG5cbiAgdHJ5IHtcbiAgICB2YXIgbmV4dFZhbHVlID0gbGF0ZXN0R2V0U25hcHNob3QoKTtcbiAgICByZXR1cm4gIW9iamVjdElzKHByZXZWYWx1ZSwgbmV4dFZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JjZVN0b3JlUmVyZW5kZXIoZmliZXIpIHtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG5cbiAgaWYgKHR5cGVvZiBpbml0aWFsU3RhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyAkRmxvd0ZpeE1lOiBGbG93IGRvZXNuJ3QgbGlrZSBtaXhlZCB0eXBlc1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxTdGF0ZSgpO1xuICB9XG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gaG9vay5iYXNlU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gIHZhciBxdWV1ZSA9IHtcbiAgICBwZW5kaW5nOiBudWxsLFxuICAgIGludGVybGVhdmVkOiBudWxsLFxuICAgIGxhbmVzOiBOb0xhbmVzLFxuICAgIGRpc3BhdGNoOiBudWxsLFxuICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IGJhc2ljU3RhdGVSZWR1Y2VyLFxuICAgIGxhc3RSZW5kZXJlZFN0YXRlOiBpbml0aWFsU3RhdGVcbiAgfTtcbiAgaG9vay5xdWV1ZSA9IHF1ZXVlO1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoU2V0U3RhdGUuYmluZChudWxsLCBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBxdWV1ZSk7XG4gIHJldHVybiBbaG9vay5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICByZXR1cm4gdXBkYXRlUmVkdWNlcihiYXNpY1N0YXRlUmVkdWNlcik7XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHJldHVybiByZXJlbmRlclJlZHVjZXIoYmFzaWNTdGF0ZVJlZHVjZXIpO1xufVxuXG5mdW5jdGlvbiBwdXNoRWZmZWN0KHRhZywgY3JlYXRlLCBkZXN0cm95LCBkZXBzKSB7XG4gIHZhciBlZmZlY3QgPSB7XG4gICAgdGFnOiB0YWcsXG4gICAgY3JlYXRlOiBjcmVhdGUsXG4gICAgZGVzdHJveTogZGVzdHJveSxcbiAgICBkZXBzOiBkZXBzLFxuICAgIC8vIENpcmN1bGFyXG4gICAgbmV4dDogbnVsbFxuICB9O1xuICB2YXIgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmIChjb21wb25lbnRVcGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpO1xuICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWUgPSBjb21wb25lbnRVcGRhdGVRdWV1ZTtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0Lm5leHQgPSBlZmZlY3Q7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxhc3RFZmZlY3QgPSBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0O1xuXG4gICAgaWYgKGxhc3RFZmZlY3QgPT09IG51bGwpIHtcbiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgPSBlZmZlY3QubmV4dCA9IGVmZmVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgICAgbGFzdEVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICAgICAgZWZmZWN0Lm5leHQgPSBmaXJzdEVmZmVjdDtcbiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgPSBlZmZlY3Q7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVmZmVjdDtcbn1cblxuZnVuY3Rpb24gbW91bnRSZWYoaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcblxuICB7XG4gICAgdmFyIF9yZWYyID0ge1xuICAgICAgY3VycmVudDogaW5pdGlhbFZhbHVlXG4gICAgfTtcbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSBfcmVmMjtcbiAgICByZXR1cm4gX3JlZjI7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlUmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICByZXR1cm4gaG9vay5tZW1vaXplZFN0YXRlO1xufVxuXG5mdW5jdGlvbiBtb3VudEVmZmVjdEltcGwoZmliZXJGbGFncywgaG9va0ZsYWdzLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5mbGFncyB8PSBmaWJlckZsYWdzO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IGhvb2tGbGFncywgY3JlYXRlLCB1bmRlZmluZWQsIG5leHREZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRWZmZWN0SW1wbChmaWJlckZsYWdzLCBob29rRmxhZ3MsIGNyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIGRlc3Ryb3kgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKGN1cnJlbnRIb29rICE9PSBudWxsKSB7XG4gICAgdmFyIHByZXZFZmZlY3QgPSBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlO1xuICAgIGRlc3Ryb3kgPSBwcmV2RWZmZWN0LmRlc3Ryb3k7XG5cbiAgICBpZiAobmV4dERlcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2RGVwcyA9IHByZXZFZmZlY3QuZGVwcztcblxuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHB1c2hFZmZlY3QoaG9va0ZsYWdzLCBjcmVhdGUsIGRlc3Ryb3ksIG5leHREZXBzKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBob29rRmxhZ3MsIGNyZWF0ZSwgZGVzdHJveSwgbmV4dERlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgaWYgKCAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKE1vdW50UGFzc2l2ZURldiB8IFBhc3NpdmUgfCBQYXNzaXZlU3RhdGljLCBQYXNzaXZlJDEsIGNyZWF0ZSwgZGVwcyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChQYXNzaXZlIHwgUGFzc2l2ZVN0YXRpYywgUGFzc2l2ZSQxLCBjcmVhdGUsIGRlcHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoUGFzc2l2ZSwgUGFzc2l2ZSQxLCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChVcGRhdGUsIEluc2VydGlvbiwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChVcGRhdGUsIEluc2VydGlvbiwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBmaWJlckZsYWdzID0gVXBkYXRlO1xuXG4gIHtcbiAgICBmaWJlckZsYWdzIHw9IExheW91dFN0YXRpYztcbiAgfVxuXG4gIGlmICggKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgfVxuXG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoZmliZXJGbGFncywgTGF5b3V0LCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSwgTGF5b3V0LCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0KGNyZWF0ZSwgcmVmKSB7XG4gIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIHJlZkNhbGxiYWNrID0gcmVmO1xuXG4gICAgdmFyIF9pbnN0ID0gY3JlYXRlKCk7XG5cbiAgICByZWZDYWxsYmFjayhfaW5zdCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlZkNhbGxiYWNrKG51bGwpO1xuICAgIH07XG4gIH0gZWxzZSBpZiAocmVmICE9PSBudWxsICYmIHJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIHJlZk9iamVjdCA9IHJlZjtcblxuICAgIHtcbiAgICAgIGlmICghcmVmT2JqZWN0Lmhhc093blByb3BlcnR5KCdjdXJyZW50JykpIHtcbiAgICAgICAgZXJyb3IoJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBmaXJzdCBhcmd1bWVudCB0byBlaXRoZXIgYmUgYSAnICsgJ3JlZiBjYWxsYmFjayBvciBSZWFjdC5jcmVhdGVSZWYoKSBvYmplY3QuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsICdhbiBvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMocmVmT2JqZWN0KS5qb2luKCcsICcpICsgJ30nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgX2luc3QyID0gY3JlYXRlKCk7XG5cbiAgICByZWZPYmplY3QuY3VycmVudCA9IF9pbnN0MjtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVmT2JqZWN0LmN1cnJlbnQgPSBudWxsO1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNyZWF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSBmdW5jdGlvbiAnICsgJ3RoYXQgY3JlYXRlcyBhIGhhbmRsZS4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY3JlYXRlICE9PSBudWxsID8gdHlwZW9mIGNyZWF0ZSA6ICdudWxsJyk7XG4gICAgfVxuICB9IC8vIFRPRE86IElmIGRlcHMgYXJlIHByb3ZpZGVkLCBzaG91bGQgd2Ugc2tpcCBjb21wYXJpbmcgdGhlIHJlZiBpdHNlbGY/XG5cblxuICB2YXIgZWZmZWN0RGVwcyA9IGRlcHMgIT09IG51bGwgJiYgZGVwcyAhPT0gdW5kZWZpbmVkID8gZGVwcy5jb25jYXQoW3JlZl0pIDogbnVsbDtcbiAgdmFyIGZpYmVyRmxhZ3MgPSBVcGRhdGU7XG5cbiAge1xuICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICB9XG5cbiAgaWYgKCAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICBmaWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICB9XG5cbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChmaWJlckZsYWdzLCBMYXlvdXQsIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QuYmluZChudWxsLCBjcmVhdGUsIHJlZiksIGVmZmVjdERlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNyZWF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSBmdW5jdGlvbiAnICsgJ3RoYXQgY3JlYXRlcyBhIGhhbmRsZS4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY3JlYXRlICE9PSBudWxsID8gdHlwZW9mIGNyZWF0ZSA6ICdudWxsJyk7XG4gICAgfVxuICB9IC8vIFRPRE86IElmIGRlcHMgYXJlIHByb3ZpZGVkLCBzaG91bGQgd2Ugc2tpcCBjb21wYXJpbmcgdGhlIHJlZiBpdHNlbGY/XG5cblxuICB2YXIgZWZmZWN0RGVwcyA9IGRlcHMgIT09IG51bGwgJiYgZGVwcyAhPT0gdW5kZWZpbmVkID8gZGVwcy5jb25jYXQoW3JlZl0pIDogbnVsbDtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoVXBkYXRlLCBMYXlvdXQsIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QuYmluZChudWxsLCBjcmVhdGUsIHJlZiksIGVmZmVjdERlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudERlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKSB7Ly8gVGhpcyBob29rIGlzIG5vcm1hbGx5IGEgbm8tb3AuXG4gIC8vIFRoZSByZWFjdC1kZWJ1Zy1ob29rcyBwYWNrYWdlIGluamVjdHMgaXRzIG93biBpbXBsZW1lbnRhdGlvblxuICAvLyBzbyB0aGF0IGUuZy4gRGV2VG9vbHMgY2FuIGRpc3BsYXkgY3VzdG9tIGhvb2sgdmFsdWVzLlxufVxuXG52YXIgdXBkYXRlRGVidWdWYWx1ZSA9IG1vdW50RGVidWdWYWx1ZTtcblxuZnVuY3Rpb24gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBbY2FsbGJhY2ssIG5leHREZXBzXTtcbiAgcmV0dXJuIGNhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIHByZXZTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgaWYgKG5leHREZXBzICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldkRlcHMgPSBwcmV2U3RhdGVbMV07XG5cbiAgICAgIGlmIChhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSkge1xuICAgICAgICByZXR1cm4gcHJldlN0YXRlWzBdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtjYWxsYmFjaywgbmV4dERlcHNdO1xuICByZXR1cm4gY2FsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIG1vdW50TWVtbyhuZXh0Q3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBuZXh0VmFsdWUgPSBuZXh0Q3JlYXRlKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtuZXh0VmFsdWUsIG5leHREZXBzXTtcbiAgcmV0dXJuIG5leHRWYWx1ZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTWVtbyhuZXh0Q3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgcHJldlN0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAvLyBBc3N1bWUgdGhlc2UgYXJlIGRlZmluZWQuIElmIHRoZXkncmUgbm90LCBhcmVIb29rSW5wdXRzRXF1YWwgd2lsbCB3YXJuLlxuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldlN0YXRlWzFdO1xuXG4gICAgICBpZiAoYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykpIHtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZVswXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgbmV4dFZhbHVlID0gbmV4dENyZWF0ZSgpO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBbbmV4dFZhbHVlLCBuZXh0RGVwc107XG4gIHJldHVybiBuZXh0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHZhbHVlO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHJlc29sdmVkQ3VycmVudEhvb2sgPSBjdXJyZW50SG9vaztcbiAgdmFyIHByZXZWYWx1ZSA9IHJlc29sdmVkQ3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHByZXZWYWx1ZSwgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcblxuICBpZiAoY3VycmVudEhvb2sgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVyZW5kZXIgZHVyaW5nIGEgbW91bnQuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYSByZXJlbmRlciBkdXJpbmcgYW4gdXBkYXRlLlxuICAgIHZhciBwcmV2VmFsdWUgPSBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlO1xuICAgIHJldHVybiB1cGRhdGVEZWZlcnJlZFZhbHVlSW1wbChob29rLCBwcmV2VmFsdWUsIHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVEZWZlcnJlZFZhbHVlSW1wbChob29rLCBwcmV2VmFsdWUsIHZhbHVlKSB7XG4gIHZhciBzaG91bGREZWZlclZhbHVlID0gIWluY2x1ZGVzT25seU5vblVyZ2VudExhbmVzKHJlbmRlckxhbmVzKTtcblxuICBpZiAoc2hvdWxkRGVmZXJWYWx1ZSkge1xuICAgIC8vIFRoaXMgaXMgYW4gdXJnZW50IHVwZGF0ZS4gSWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkLCBrZWVwIHVzaW5nIHRoZVxuICAgIC8vIHByZXZpb3VzIHZhbHVlIGFuZCBzcGF3biBhIGRlZmVycmVkIHJlbmRlciB0byB1cGRhdGUgaXQgbGF0ZXIuXG4gICAgaWYgKCFvYmplY3RJcyh2YWx1ZSwgcHJldlZhbHVlKSkge1xuICAgICAgLy8gU2NoZWR1bGUgYSBkZWZlcnJlZCByZW5kZXJcbiAgICAgIHZhciBkZWZlcnJlZExhbmUgPSBjbGFpbU5leHRUcmFuc2l0aW9uTGFuZSgpO1xuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcyA9IG1lcmdlTGFuZXMoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcywgZGVmZXJyZWRMYW5lKTtcbiAgICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMoZGVmZXJyZWRMYW5lKTsgLy8gU2V0IHRoaXMgdG8gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSByZW5kZXJlZCB2YWx1ZSBpcyBpbmNvbnNpc3RlbnRcbiAgICAgIC8vIGZyb20gdGhlIGxhdGVzdCB2YWx1ZS4gVGhlIG5hbWUgXCJiYXNlU3RhdGVcIiBkb2Vzbid0IHJlYWxseSBtYXRjaCBob3cgd2VcbiAgICAgIC8vIHVzZSBpdCBiZWNhdXNlIHdlJ3JlIHJldXNpbmcgYSBzdGF0ZSBob29rIGZpZWxkIGluc3RlYWQgb2YgY3JlYXRpbmcgYVxuICAgICAgLy8gbmV3IG9uZS5cblxuICAgICAgaG9vay5iYXNlU3RhdGUgPSB0cnVlO1xuICAgIH0gLy8gUmV1c2UgdGhlIHByZXZpb3VzIHZhbHVlXG5cblxuICAgIHJldHVybiBwcmV2VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBub3QgYW4gdXJnZW50IHVwZGF0ZSwgc28gd2UgY2FuIHVzZSB0aGUgbGF0ZXN0IHZhbHVlIHJlZ2FyZGxlc3NcbiAgICAvLyBvZiB3aGF0IGl0IGlzLiBObyBuZWVkIHRvIGRlZmVyIGl0LlxuICAgIC8vIEhvd2V2ZXIsIGlmIHdlJ3JlIGN1cnJlbnRseSBpbnNpZGUgYSBzcGF3bmVkIHJlbmRlciwgdGhlbiB3ZSBuZWVkIHRvIG1hcmtcbiAgICAvLyB0aGlzIGFzIGFuIHVwZGF0ZSB0byBwcmV2ZW50IHRoZSBmaWJlciBmcm9tIGJhaWxpbmcgb3V0LlxuICAgIC8vXG4gICAgLy8gYGJhc2VTdGF0ZWAgaXMgdHJ1ZSB3aGVuIHRoZSBjdXJyZW50IHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSByZW5kZXJlZFxuICAgIC8vIHZhbHVlLiBUaGUgbmFtZSBkb2Vzbid0IHJlYWxseSBtYXRjaCBob3cgd2UgdXNlIGl0IGJlY2F1c2Ugd2UncmUgcmV1c2luZ1xuICAgIC8vIGEgc3RhdGUgaG9vayBmaWVsZCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS5cbiAgICBpZiAoaG9vay5iYXNlU3RhdGUpIHtcbiAgICAgIC8vIEZsaXAgdGhpcyBiYWNrIHRvIGZhbHNlLlxuICAgICAgaG9vay5iYXNlU3RhdGUgPSBmYWxzZTtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0VHJhbnNpdGlvbihzZXRQZW5kaW5nLCBjYWxsYmFjaywgb3B0aW9ucykge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoaGlnaGVyRXZlbnRQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5LCBDb250aW51b3VzRXZlbnRQcmlvcml0eSkpO1xuICBzZXRQZW5kaW5nKHRydWUpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbiA9IHt9O1xuICB2YXIgY3VycmVudFRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb247XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgc2V0UGVuZGluZyhmYWxzZSk7XG4gICAgY2FsbGJhY2soKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG5cbiAgICB7XG4gICAgICBpZiAocHJldlRyYW5zaXRpb24gPT09IG51bGwgJiYgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMpIHtcbiAgICAgICAgdmFyIHVwZGF0ZWRGaWJlcnNDb3VudCA9IGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLnNpemU7XG5cbiAgICAgICAgaWYgKHVwZGF0ZWRGaWJlcnNDb3VudCA+IDEwKSB7XG4gICAgICAgICAgd2FybignRGV0ZWN0ZWQgYSBsYXJnZSBudW1iZXIgb2YgdXBkYXRlcyBpbnNpZGUgc3RhcnRUcmFuc2l0aW9uLiAnICsgJ0lmIHRoaXMgaXMgZHVlIHRvIGEgc3Vic2NyaXB0aW9uIHBsZWFzZSByZS13cml0ZSBpdCB0byB1c2UgUmVhY3QgcHJvdmlkZWQgaG9va3MuICcgKyAnT3RoZXJ3aXNlIGNvbmN1cnJlbnQgbW9kZSBndWFyYW50ZWVzIGFyZSBvZmYgdGhlIHRhYmxlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRUcmFuc2l0aW9uKCkge1xuICB2YXIgX21vdW50U3RhdGUgPSBtb3VudFN0YXRlKGZhbHNlKSxcbiAgICAgIGlzUGVuZGluZyA9IF9tb3VudFN0YXRlWzBdLFxuICAgICAgc2V0UGVuZGluZyA9IF9tb3VudFN0YXRlWzFdOyAvLyBUaGUgYHN0YXJ0YCBtZXRob2QgbmV2ZXIgY2hhbmdlcy5cblxuXG4gIHZhciBzdGFydCA9IHN0YXJ0VHJhbnNpdGlvbi5iaW5kKG51bGwsIHNldFBlbmRpbmcpO1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHN0YXJ0O1xuICByZXR1cm4gW2lzUGVuZGluZywgc3RhcnRdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVUcmFuc2l0aW9uKCkge1xuICB2YXIgX3VwZGF0ZVN0YXRlID0gdXBkYXRlU3RhdGUoKSxcbiAgICAgIGlzUGVuZGluZyA9IF91cGRhdGVTdGF0ZVswXTtcblxuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgc3RhcnQgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBbaXNQZW5kaW5nLCBzdGFydF07XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyVHJhbnNpdGlvbigpIHtcbiAgdmFyIF9yZXJlbmRlclN0YXRlID0gcmVyZW5kZXJTdGF0ZSgpLFxuICAgICAgaXNQZW5kaW5nID0gX3JlcmVuZGVyU3RhdGVbMF07XG5cbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHN0YXJ0ID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gW2lzUGVuZGluZywgc3RhcnRdO1xufVxuXG52YXIgaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZSA9IGZhbHNlO1xuZnVuY3Rpb24gZ2V0SXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZUluREVWKCkge1xuICB7XG4gICAgcmV0dXJuIGlzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRJZCgpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpOyAvLyBUT0RPOiBJbiBGaXp6LCBpZCBnZW5lcmF0aW9uIGlzIHNwZWNpZmljIHRvIGVhY2ggc2VydmVyIGNvbmZpZy4gTWF5YmUgd2VcbiAgLy8gc2hvdWxkIGRvIHRoaXMgaW4gRmliZXIsIHRvbz8gRGVmZXJyaW5nIHRoaXMgZGVjaXNpb24gZm9yIG5vdyBiZWNhdXNlXG4gIC8vIHRoZXJlJ3Mgbm8gb3RoZXIgcGxhY2UgdG8gc3RvcmUgdGhlIHByZWZpeCBleGNlcHQgZm9yIGFuIGludGVybmFsIGZpZWxkIG9uXG4gIC8vIHRoZSBwdWJsaWMgY3JlYXRlUm9vdCBvYmplY3QsIHdoaWNoIHRoZSBmaWJlciB0cmVlIGRvZXMgbm90IGN1cnJlbnRseSBoYXZlXG4gIC8vIGEgcmVmZXJlbmNlIHRvLlxuXG4gIHZhciBpZGVudGlmaWVyUHJlZml4ID0gcm9vdC5pZGVudGlmaWVyUHJlZml4O1xuICB2YXIgaWQ7XG5cbiAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICB2YXIgdHJlZUlkID0gZ2V0VHJlZUlkKCk7IC8vIFVzZSBhIGNhcHRpYWwgUiBwcmVmaXggZm9yIHNlcnZlci1nZW5lcmF0ZWQgaWRzLlxuXG4gICAgaWQgPSAnOicgKyBpZGVudGlmaWVyUHJlZml4ICsgJ1InICsgdHJlZUlkOyAvLyBVbmxlc3MgdGhpcyBpcyB0aGUgZmlyc3QgaWQgYXQgdGhpcyBsZXZlbCwgYXBwZW5kIGEgbnVtYmVyIGF0IHRoZSBlbmRcbiAgICAvLyB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uIG9mIHRoaXMgdXNlSWQgaG9vayBhbW9uZyBhbGwgdGhlIHVzZUlkXG4gICAgLy8gaG9va3MgZm9yIHRoaXMgZmliZXIuXG5cbiAgICB2YXIgbG9jYWxJZCA9IGxvY2FsSWRDb3VudGVyKys7XG5cbiAgICBpZiAobG9jYWxJZCA+IDApIHtcbiAgICAgIGlkICs9ICdIJyArIGxvY2FsSWQudG9TdHJpbmcoMzIpO1xuICAgIH1cblxuICAgIGlkICs9ICc6JztcbiAgfSBlbHNlIHtcbiAgICAvLyBVc2UgYSBsb3dlcmNhc2UgciBwcmVmaXggZm9yIGNsaWVudC1nZW5lcmF0ZWQgaWRzLlxuICAgIHZhciBnbG9iYWxDbGllbnRJZCA9IGdsb2JhbENsaWVudElkQ291bnRlcisrO1xuICAgIGlkID0gJzonICsgaWRlbnRpZmllclByZWZpeCArICdyJyArIGdsb2JhbENsaWVudElkLnRvU3RyaW5nKDMyKSArICc6JztcbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGlkO1xuICByZXR1cm4gaWQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUlkKCkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgaWQgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBpZDtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hSZWR1Y2VyQWN0aW9uKGZpYmVyLCBxdWV1ZSwgYWN0aW9uKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoXCJTdGF0ZSB1cGRhdGVzIGZyb20gdGhlIHVzZVN0YXRlKCkgYW5kIHVzZVJlZHVjZXIoKSBIb29rcyBkb24ndCBzdXBwb3J0IHRoZSBcIiArICdzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuIFRvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciAnICsgJ3JlbmRlcmluZywgZGVjbGFyZSBpdCBpbiB0aGUgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICBsYW5lOiBsYW5lLFxuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIGhhc0VhZ2VyU3RhdGU6IGZhbHNlLFxuICAgIGVhZ2VyU3RhdGU6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmIChpc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSkge1xuICAgIGVucXVldWVSZW5kZXJQaGFzZVVwZGF0ZShxdWV1ZSwgdXBkYXRlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvblVwZGF0ZShyb290LCBxdWV1ZSwgbGFuZSk7XG4gICAgfVxuICB9XG5cbiAgbWFya1VwZGF0ZUluRGV2VG9vbHMoZmliZXIsIGxhbmUpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaFNldFN0YXRlKGZpYmVyLCBxdWV1ZSwgYWN0aW9uKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoXCJTdGF0ZSB1cGRhdGVzIGZyb20gdGhlIHVzZVN0YXRlKCkgYW5kIHVzZVJlZHVjZXIoKSBIb29rcyBkb24ndCBzdXBwb3J0IHRoZSBcIiArICdzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuIFRvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciAnICsgJ3JlbmRlcmluZywgZGVjbGFyZSBpdCBpbiB0aGUgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICBsYW5lOiBsYW5lLFxuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIGhhc0VhZ2VyU3RhdGU6IGZhbHNlLFxuICAgIGVhZ2VyU3RhdGU6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmIChpc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSkge1xuICAgIGVucXVldWVSZW5kZXJQaGFzZVVwZGF0ZShxdWV1ZSwgdXBkYXRlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGZpYmVyLmxhbmVzID09PSBOb0xhbmVzICYmIChhbHRlcm5hdGUgPT09IG51bGwgfHwgYWx0ZXJuYXRlLmxhbmVzID09PSBOb0xhbmVzKSkge1xuICAgICAgLy8gVGhlIHF1ZXVlIGlzIGN1cnJlbnRseSBlbXB0eSwgd2hpY2ggbWVhbnMgd2UgY2FuIGVhZ2VybHkgY29tcHV0ZSB0aGVcbiAgICAgIC8vIG5leHQgc3RhdGUgYmVmb3JlIGVudGVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIElmIHRoZSBuZXcgc3RhdGUgaXMgdGhlXG4gICAgICAvLyBzYW1lIGFzIHRoZSBjdXJyZW50IHN0YXRlLCB3ZSBtYXkgYmUgYWJsZSB0byBiYWlsIG91dCBlbnRpcmVseS5cbiAgICAgIHZhciBsYXN0UmVuZGVyZWRSZWR1Y2VyID0gcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlcjtcblxuICAgICAgaWYgKGxhc3RSZW5kZXJlZFJlZHVjZXIgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgZWFnZXJTdGF0ZSA9IGxhc3RSZW5kZXJlZFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pOyAvLyBTdGFzaCB0aGUgZWFnZXJseSBjb21wdXRlZCBzdGF0ZSwgYW5kIHRoZSByZWR1Y2VyIHVzZWQgdG8gY29tcHV0ZVxuICAgICAgICAgIC8vIGl0LCBvbiB0aGUgdXBkYXRlIG9iamVjdC4gSWYgdGhlIHJlZHVjZXIgaGFzbid0IGNoYW5nZWQgYnkgdGhlXG4gICAgICAgICAgLy8gdGltZSB3ZSBlbnRlciB0aGUgcmVuZGVyIHBoYXNlLCB0aGVuIHRoZSBlYWdlciBzdGF0ZSBjYW4gYmUgdXNlZFxuICAgICAgICAgIC8vIHdpdGhvdXQgY2FsbGluZyB0aGUgcmVkdWNlciBhZ2Fpbi5cblxuICAgICAgICAgIHVwZGF0ZS5oYXNFYWdlclN0YXRlID0gdHJ1ZTtcbiAgICAgICAgICB1cGRhdGUuZWFnZXJTdGF0ZSA9IGVhZ2VyU3RhdGU7XG5cbiAgICAgICAgICBpZiAob2JqZWN0SXMoZWFnZXJTdGF0ZSwgY3VycmVudFN0YXRlKSkge1xuICAgICAgICAgICAgLy8gRmFzdCBwYXRoLiBXZSBjYW4gYmFpbCBvdXQgd2l0aG91dCBzY2hlZHVsaW5nIFJlYWN0IHRvIHJlLXJlbmRlci5cbiAgICAgICAgICAgIC8vIEl0J3Mgc3RpbGwgcG9zc2libGUgdGhhdCB3ZSdsbCBuZWVkIHRvIHJlYmFzZSB0aGlzIHVwZGF0ZSBsYXRlcixcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjb21wb25lbnQgcmUtcmVuZGVycyBmb3IgYSBkaWZmZXJlbnQgcmVhc29uIGFuZCBieSB0aGF0XG4gICAgICAgICAgICAvLyB0aW1lIHRoZSByZWR1Y2VyIGhhcyBjaGFuZ2VkLlxuICAgICAgICAgICAgLy8gVE9ETzogRG8gd2Ugc3RpbGwgbmVlZCB0byBlbnRhbmdsZSB0cmFuc2l0aW9ucyBpbiB0aGlzIGNhc2U/XG4gICAgICAgICAgICBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGVBbmRFYWdlcmx5QmFpbG91dChmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikgey8vIFN1cHByZXNzIHRoZSBlcnJvci4gSXQgd2lsbCB0aHJvdyBhZ2FpbiBpbiB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25VcGRhdGUocm9vdCwgcXVldWUsIGxhbmUpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtVcGRhdGVJbkRldlRvb2xzKGZpYmVyLCBsYW5lKTtcbn1cblxuZnVuY3Rpb24gaXNSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikge1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuICByZXR1cm4gZmliZXIgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZSA9PT0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTtcbn1cblxuZnVuY3Rpb24gZW5xdWV1ZVJlbmRlclBoYXNlVXBkYXRlKHF1ZXVlLCB1cGRhdGUpIHtcbiAgLy8gVGhpcyBpcyBhIHJlbmRlciBwaGFzZSB1cGRhdGUuIFN0YXNoIGl0IGluIGEgbGF6aWx5LWNyZWF0ZWQgbWFwIG9mXG4gIC8vIHF1ZXVlIC0+IGxpbmtlZCBsaXN0IG9mIHVwZGF0ZXMuIEFmdGVyIHRoaXMgcmVuZGVyIHBhc3MsIHdlJ2xsIHJlc3RhcnRcbiAgLy8gYW5kIGFwcGx5IHRoZSBzdGFzaGVkIHVwZGF0ZXMgb24gdG9wIG9mIHRoZSB3b3JrLWluLXByb2dyZXNzIGhvb2suXG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSB0cnVlO1xuICB2YXIgcGVuZGluZyA9IHF1ZXVlLnBlbmRpbmc7XG5cbiAgaWYgKHBlbmRpbmcgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlLm5leHQgPSBwZW5kaW5nLm5leHQ7XG4gICAgcGVuZGluZy5uZXh0ID0gdXBkYXRlO1xuICB9XG5cbiAgcXVldWUucGVuZGluZyA9IHVwZGF0ZTtcbn0gLy8gVE9ETzogTW92ZSB0byBSZWFjdEZpYmVyQ29uY3VycmVudFVwZGF0ZXM/XG5cblxuZnVuY3Rpb24gZW50YW5nbGVUcmFuc2l0aW9uVXBkYXRlKHJvb3QsIHF1ZXVlLCBsYW5lKSB7XG4gIGlmIChpc1RyYW5zaXRpb25MYW5lKGxhbmUpKSB7XG4gICAgdmFyIHF1ZXVlTGFuZXMgPSBxdWV1ZS5sYW5lczsgLy8gSWYgYW55IGVudGFuZ2xlZCBsYW5lcyBhcmUgbm8gbG9uZ2VyIHBlbmRpbmcgb24gdGhlIHJvb3QsIHRoZW4gdGhleVxuICAgIC8vIG11c3QgaGF2ZSBmaW5pc2hlZC4gV2UgY2FuIHJlbW92ZSB0aGVtIGZyb20gdGhlIHNoYXJlZCBxdWV1ZSwgd2hpY2hcbiAgICAvLyByZXByZXNlbnRzIGEgc3VwZXJzZXQgb2YgdGhlIGFjdHVhbGx5IHBlbmRpbmcgbGFuZXMuIEluIHNvbWUgY2FzZXMgd2VcbiAgICAvLyBtYXkgZW50YW5nbGUgbW9yZSB0aGFuIHdlIG5lZWQgdG8sIGJ1dCB0aGF0J3MgT0suIEluIGZhY3QgaXQncyB3b3JzZSBpZlxuICAgIC8vIHdlICpkb24ndCogZW50YW5nbGUgd2hlbiB3ZSBzaG91bGQuXG5cbiAgICBxdWV1ZUxhbmVzID0gaW50ZXJzZWN0TGFuZXMocXVldWVMYW5lcywgcm9vdC5wZW5kaW5nTGFuZXMpOyAvLyBFbnRhbmdsZSB0aGUgbmV3IHRyYW5zaXRpb24gbGFuZSB3aXRoIHRoZSBvdGhlciB0cmFuc2l0aW9uIGxhbmVzLlxuXG4gICAgdmFyIG5ld1F1ZXVlTGFuZXMgPSBtZXJnZUxhbmVzKHF1ZXVlTGFuZXMsIGxhbmUpO1xuICAgIHF1ZXVlLmxhbmVzID0gbmV3UXVldWVMYW5lczsgLy8gRXZlbiBpZiBxdWV1ZS5sYW5lcyBhbHJlYWR5IGluY2x1ZGUgbGFuZSwgd2UgZG9uJ3Qga25vdyBmb3IgY2VydGFpbiBpZlxuICAgIC8vIHRoZSBsYW5lIGZpbmlzaGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UgZW50YW5nbGVkIGl0LiBTbyB3ZSBuZWVkIHRvXG4gICAgLy8gZW50YW5nbGUgaXQgYWdhaW4sIGp1c3QgdG8gYmUgc3VyZS5cblxuICAgIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIG5ld1F1ZXVlTGFuZXMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGVJbkRldlRvb2xzKGZpYmVyLCBsYW5lLCBhY3Rpb24pIHtcblxuICB7XG4gICAgbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgfVxufVxuXG52YXIgQ29udGV4dE9ubHlEaXNwYXRjaGVyID0ge1xuICByZWFkQ29udGV4dDogcmVhZENvbnRleHQsXG4gIHVzZUNhbGxiYWNrOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUNvbnRleHQ6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUltcGVyYXRpdmVIYW5kbGU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlSW5zZXJ0aW9uRWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUxheW91dEVmZmVjdDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VNZW1vOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVJlZHVjZXI6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlUmVmOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVN0YXRlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZURlYnVnVmFsdWU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRGVmZXJyZWRWYWx1ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VUcmFuc2l0aW9uOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZU11dGFibGVTb3VyY2U6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlU3luY0V4dGVybmFsU3RvcmU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlSWQ6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG59O1xuXG52YXIgSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0gbnVsbDtcbnZhciBIb29rc0Rpc3BhdGNoZXJPbk1vdW50V2l0aEhvb2tUeXBlc0luREVWID0gbnVsbDtcbnZhciBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0gbnVsbDtcbnZhciBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0gbnVsbDtcbnZhciBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0gbnVsbDtcblxue1xuICB2YXIgd2FybkludmFsaWRDb250ZXh0QWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgfTtcblxuICB2YXIgd2FybkludmFsaWRIb29rQWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGVycm9yKCdEbyBub3QgY2FsbCBIb29rcyBpbnNpZGUgdXNlRWZmZWN0KC4uLiksIHVzZU1lbW8oLi4uKSwgb3Igb3RoZXIgYnVpbHQtaW4gSG9va3MuICcgKyAnWW91IGNhbiBvbmx5IGNhbGwgSG9va3MgYXQgdGhlIHRvcCBsZXZlbCBvZiB5b3VyIFJlYWN0IGZ1bmN0aW9uLiAnICsgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcnVsZXMtb2YtaG9va3MnKTtcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50TWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50UmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50TWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50UmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudElkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlVHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcbn1cblxudmFyIG5vdyQxID0gU2NoZWR1bGVyLnVuc3RhYmxlX25vdztcbnZhciBjb21taXRUaW1lID0gMDtcbnZhciBsYXlvdXRFZmZlY3RTdGFydFRpbWUgPSAtMTtcbnZhciBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xudmFyIHBhc3NpdmVFZmZlY3RTdGFydFRpbWUgPSAtMTtcbi8qKlxuICogVHJhY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdXBkYXRlIHdhcyBhIG5lc3RlZC9jYXNjYWRpbmcgdXBkYXRlIChzY2hlZHVsZWQgZnJvbSBhIGxheW91dCBlZmZlY3QpLlxuICpcbiAqIFRoZSBvdmVyYWxsIHNlcXVlbmNlIGlzOlxuICogICAxLiByZW5kZXJcbiAqICAgMi4gY29tbWl0IChhbmQgY2FsbCBgb25SZW5kZXJgLCBgb25Db21taXRgKVxuICogICAzLiBjaGVjayBmb3IgbmVzdGVkIHVwZGF0ZXNcbiAqICAgNC4gZmx1c2ggcGFzc2l2ZSBlZmZlY3RzIChhbmQgY2FsbCBgb25Qb3N0Q29tbWl0YClcbiAqXG4gKiBOZXN0ZWQgdXBkYXRlcyBhcmUgaWRlbnRpZmllZCBpbiBzdGVwIDMgYWJvdmUsXG4gKiBidXQgc3RlcCA0IHN0aWxsIGFwcGxpZXMgdG8gdGhlIHdvcmsgdGhhdCB3YXMganVzdCBjb21taXR0ZWQuXG4gKiBXZSB1c2UgdHdvIGZsYWdzIHRvIHRyYWNrIG5lc3RlZCB1cGRhdGVzIHRoZW46XG4gKiBvbmUgdHJhY2tzIHdoZXRoZXIgdGhlIHVwY29taW5nIHVwZGF0ZSBpcyBhIG5lc3RlZCB1cGRhdGUsXG4gKiBhbmQgdGhlIG90aGVyIHRyYWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVwZGF0ZSB3YXMgYSBuZXN0ZWQgdXBkYXRlLlxuICogVGhlIGZpcnN0IHZhbHVlIGdldHMgc3luY2VkIHRvIHRoZSBzZWNvbmQgYXQgdGhlIHN0YXJ0IG9mIHRoZSByZW5kZXIgcGhhc2UuXG4gKi9cblxudmFyIGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9IGZhbHNlO1xudmFyIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBpc0N1cnJlbnRVcGRhdGVOZXN0ZWQoKSB7XG4gIHJldHVybiBjdXJyZW50VXBkYXRlSXNOZXN0ZWQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtOZXN0ZWRVcGRhdGVTY2hlZHVsZWQoKSB7XG4gIHtcbiAgICBuZXN0ZWRVcGRhdGVTY2hlZHVsZWQgPSB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0TmVzdGVkVXBkYXRlRmxhZygpIHtcbiAge1xuICAgIGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9IGZhbHNlO1xuICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN5bmNOZXN0ZWRVcGRhdGVGbGFnKCkge1xuICB7XG4gICAgY3VycmVudFVwZGF0ZUlzTmVzdGVkID0gbmVzdGVkVXBkYXRlU2NoZWR1bGVkO1xuICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldENvbW1pdFRpbWUoKSB7XG4gIHJldHVybiBjb21taXRUaW1lO1xufVxuXG5mdW5jdGlvbiByZWNvcmRDb21taXRUaW1lKCkge1xuXG4gIGNvbW1pdFRpbWUgPSBub3ckMSgpO1xufVxuXG5mdW5jdGlvbiBzdGFydFByb2ZpbGVyVGltZXIoZmliZXIpIHtcblxuICBwcm9maWxlclN0YXJ0VGltZSA9IG5vdyQxKCk7XG5cbiAgaWYgKGZpYmVyLmFjdHVhbFN0YXJ0VGltZSA8IDApIHtcbiAgICBmaWJlci5hY3R1YWxTdGFydFRpbWUgPSBub3ckMSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nKGZpYmVyKSB7XG5cbiAgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcbn1cblxuZnVuY3Rpb24gc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShmaWJlciwgb3ZlcnJpZGVCYXNlVGltZSkge1xuXG4gIGlmIChwcm9maWxlclN0YXJ0VGltZSA+PSAwKSB7XG4gICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIHByb2ZpbGVyU3RhcnRUaW1lO1xuICAgIGZpYmVyLmFjdHVhbER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuXG4gICAgaWYgKG92ZXJyaWRlQmFzZVRpbWUpIHtcbiAgICAgIGZpYmVyLnNlbGZCYXNlRHVyYXRpb24gPSBlbGFwc2VkVGltZTtcbiAgICB9XG5cbiAgICBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpYmVyKSB7XG5cbiAgaWYgKGxheW91dEVmZmVjdFN0YXJ0VGltZSA+PSAwKSB7XG4gICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIGxheW91dEVmZmVjdFN0YXJ0VGltZTtcbiAgICBsYXlvdXRFZmZlY3RTdGFydFRpbWUgPSAtMTsgLy8gU3RvcmUgZHVyYXRpb24gb24gdGhlIG5leHQgbmVhcmVzdCBQcm9maWxlciBhbmNlc3RvclxuICAgIC8vIE9yIHRoZSByb290IChmb3IgdGhlIERldlRvb2xzIFByb2ZpbGVyIHRvIHJlYWQpXG5cbiAgICB2YXIgcGFyZW50RmliZXIgPSBmaWJlci5yZXR1cm47XG5cbiAgICB3aGlsZSAocGFyZW50RmliZXIgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgdmFyIHJvb3QgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgcm9vdC5lZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oZmliZXIpIHtcblxuICBpZiAocGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA+PSAwKSB7XG4gICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIHBhc3NpdmVFZmZlY3RTdGFydFRpbWU7XG4gICAgcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA9IC0xOyAvLyBTdG9yZSBkdXJhdGlvbiBvbiB0aGUgbmV4dCBuZWFyZXN0IFByb2ZpbGVyIGFuY2VzdG9yXG4gICAgLy8gT3IgdGhlIHJvb3QgKGZvciB0aGUgRGV2VG9vbHMgUHJvZmlsZXIgdG8gcmVhZClcblxuICAgIHZhciBwYXJlbnRGaWJlciA9IGZpYmVyLnJldHVybjtcblxuICAgIHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByb290LnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHBhcmVudFN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gRGV0YWNoZWQgZmliZXJzIGhhdmUgdGhlaXIgc3RhdGUgbm9kZSBjbGVhcmVkIG91dC5cbiAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIHJldHVybiBwb2ludGVyIGlzIGFsc28gY2xlYXJlZCBvdXQsXG4gICAgICAgICAgICAvLyBzbyB3ZSB3b24ndCBiZSBhYmxlIHRvIHJlcG9ydCB0aGUgdGltZSBzcGVudCBpbiB0aGlzIFByb2ZpbGVyJ3Mgc3VidHJlZS5cbiAgICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz0gZWxhcHNlZFRpbWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpIHtcblxuICBsYXlvdXRFZmZlY3RTdGFydFRpbWUgPSBub3ckMSgpO1xufVxuXG5mdW5jdGlvbiBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpIHtcblxuICBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID0gbm93JDEoKTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmZXJBY3R1YWxEdXJhdGlvbihmaWJlcikge1xuICAvLyBUcmFuc2ZlciB0aW1lIHNwZW50IHJlbmRlcmluZyB0aGVzZSBjaGlsZHJlbiBzbyB3ZSBkb24ndCBsb3NlIGl0XG4gIC8vIGFmdGVyIHdlIHJlcmVuZGVyLiBUaGlzIGlzIHVzZWQgYXMgYSBoZWxwZXIgaW4gc3BlY2lhbCBjYXNlc1xuICAvLyB3aGVyZSB3ZSBzaG91bGQgY291bnQgdGhlIHdvcmsgb2YgbXVsdGlwbGUgcGFzc2VzLlxuICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQpIHtcbiAgICBmaWJlci5hY3R1YWxEdXJhdGlvbiArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbjtcbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIodmFsdWUsIHNvdXJjZSkge1xuICAvLyBJZiB0aGUgdmFsdWUgaXMgYW4gZXJyb3IsIGNhbGwgdGhpcyBmdW5jdGlvbiBpbW1lZGlhdGVseSBhZnRlciBpdCBpcyB0aHJvd25cbiAgLy8gc28gdGhlIHN0YWNrIGlzIGFjY3VyYXRlLlxuICByZXR1cm4ge1xuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICBzdGFjazogZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHNvdXJjZSksXG4gICAgZGlnZXN0OiBudWxsXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDYXB0dXJlZFZhbHVlKHZhbHVlLCBkaWdlc3QsIHN0YWNrKSB7XG4gIHJldHVybiB7XG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIHNvdXJjZTogbnVsbCxcbiAgICBzdGFjazogc3RhY2sgIT0gbnVsbCA/IHN0YWNrIDogbnVsbCxcbiAgICBkaWdlc3Q6IGRpZ2VzdCAhPSBudWxsID8gZGlnZXN0IDogbnVsbFxuICB9O1xufVxuXG4vLyBUaGlzIG1vZHVsZSBpcyBmb3JrZWQgaW4gZGlmZmVyZW50IGVudmlyb25tZW50cy5cbi8vIEJ5IGRlZmF1bHQsIHJldHVybiBgdHJ1ZWAgdG8gbG9nIGVycm9ycyB0byB0aGUgY29uc29sZS5cbi8vIEZvcmtzIGNhbiByZXR1cm4gYGZhbHNlYCBpZiB0aGlzIGlzbid0IGRlc2lyYWJsZS5cbmZ1bmN0aW9uIHNob3dFcnJvckRpYWxvZyhib3VuZGFyeSwgZXJyb3JJbmZvKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBsb2dDYXB0dXJlZEVycm9yKGJvdW5kYXJ5LCBlcnJvckluZm8pIHtcbiAgdHJ5IHtcbiAgICB2YXIgbG9nRXJyb3IgPSBzaG93RXJyb3JEaWFsb2coYm91bmRhcnksIGVycm9ySW5mbyk7IC8vIEFsbG93IGluamVjdGVkIHNob3dFcnJvckRpYWxvZygpIHRvIHByZXZlbnQgZGVmYXVsdCBjb25zb2xlLmVycm9yIGxvZ2dpbmcuXG4gICAgLy8gVGhpcyBlbmFibGVzIHJlbmRlcmVycyBsaWtlIFJlYWN0TmF0aXZlIHRvIGJldHRlciBtYW5hZ2UgcmVkYm94IGJlaGF2aW9yLlxuXG4gICAgaWYgKGxvZ0Vycm9yID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBlcnJvciA9IGVycm9ySW5mby52YWx1ZTtcblxuICAgIGlmICh0cnVlKSB7XG4gICAgICB2YXIgc291cmNlID0gZXJyb3JJbmZvLnNvdXJjZTtcbiAgICAgIHZhciBzdGFjayA9IGVycm9ySW5mby5zdGFjaztcbiAgICAgIHZhciBjb21wb25lbnRTdGFjayA9IHN0YWNrICE9PSBudWxsID8gc3RhY2sgOiAnJzsgLy8gQnJvd3NlcnMgc3VwcG9ydCBzaWxlbmNpbmcgdW5jYXVnaHQgZXJyb3JzIGJ5IGNhbGxpbmdcbiAgICAgIC8vIGBwcmV2ZW50RGVmYXVsdCgpYCBpbiB3aW5kb3cgYGVycm9yYCBoYW5kbGVyLlxuICAgICAgLy8gV2UgcmVjb3JkIHRoaXMgaW5mb3JtYXRpb24gYXMgYW4gZXhwYW5kbyBvbiB0aGUgZXJyb3IuXG5cbiAgICAgIGlmIChlcnJvciAhPSBudWxsICYmIGVycm9yLl9zdXBwcmVzc0xvZ2dpbmcpIHtcbiAgICAgICAgaWYgKGJvdW5kYXJ5LnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAvLyBUaGUgZXJyb3IgaXMgcmVjb3ZlcmFibGUgYW5kIHdhcyBzaWxlbmNlZC5cbiAgICAgICAgICAvLyBJZ25vcmUgaXQgYW5kIGRvbid0IHByaW50IHRoZSBzdGFjayBhZGRlbmR1bS5cbiAgICAgICAgICAvLyBUaGlzIGlzIGhhbmR5IGZvciB0ZXN0aW5nIGVycm9yIGJvdW5kYXJpZXMgd2l0aG91dCBub2lzZS5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gLy8gVGhlIGVycm9yIGlzIGZhdGFsLiBTaW5jZSB0aGUgc2lsZW5jaW5nIG1pZ2h0IGhhdmVcbiAgICAgICAgLy8gYmVlbiBhY2NpZGVudGFsLCB3ZSdsbCBzdXJmYWNlIGl0IGFueXdheS5cbiAgICAgICAgLy8gSG93ZXZlciwgdGhlIGJyb3dzZXIgd291bGQgaGF2ZSBzaWxlbmNlZCB0aGUgb3JpZ2luYWwgZXJyb3JcbiAgICAgICAgLy8gc28gd2UnbGwgcHJpbnQgaXQgZmlyc3QsIGFuZCB0aGVuIHByaW50IHRoZSBzdGFjayBhZGRlbmR1bS5cblxuXG4gICAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oZXJyb3IpOyAvLyBEb24ndCB0cmFuc2Zvcm0gdG8gb3VyIHdyYXBwZXJcbiAgICAgICAgLy8gRm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGlzIGJsb2NrLCBzZWU6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzEzMzg0XG4gICAgICB9XG5cbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gc291cmNlID8gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihzb3VyY2UpIDogbnVsbDtcbiAgICAgIHZhciBjb21wb25lbnROYW1lTWVzc2FnZSA9IGNvbXBvbmVudE5hbWUgPyBcIlRoZSBhYm92ZSBlcnJvciBvY2N1cnJlZCBpbiB0aGUgPFwiICsgY29tcG9uZW50TmFtZSArIFwiPiBjb21wb25lbnQ6XCIgOiAnVGhlIGFib3ZlIGVycm9yIG9jY3VycmVkIGluIG9uZSBvZiB5b3VyIFJlYWN0IGNvbXBvbmVudHM6JztcbiAgICAgIHZhciBlcnJvckJvdW5kYXJ5TWVzc2FnZTtcblxuICAgICAgaWYgKGJvdW5kYXJ5LnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgICAgZXJyb3JCb3VuZGFyeU1lc3NhZ2UgPSAnQ29uc2lkZXIgYWRkaW5nIGFuIGVycm9yIGJvdW5kYXJ5IHRvIHlvdXIgdHJlZSB0byBjdXN0b21pemUgZXJyb3IgaGFuZGxpbmcgYmVoYXZpb3IuXFxuJyArICdWaXNpdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZXJyb3ItYm91bmRhcmllcyB0byBsZWFybiBtb3JlIGFib3V0IGVycm9yIGJvdW5kYXJpZXMuJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBlcnJvckJvdW5kYXJ5TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoYm91bmRhcnkpIHx8ICdBbm9ueW1vdXMnO1xuICAgICAgICBlcnJvckJvdW5kYXJ5TWVzc2FnZSA9IFwiUmVhY3Qgd2lsbCB0cnkgdG8gcmVjcmVhdGUgdGhpcyBjb21wb25lbnQgdHJlZSBmcm9tIHNjcmF0Y2ggXCIgKyAoXCJ1c2luZyB0aGUgZXJyb3IgYm91bmRhcnkgeW91IHByb3ZpZGVkLCBcIiArIGVycm9yQm91bmRhcnlOYW1lICsgXCIuXCIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29tYmluZWRNZXNzYWdlID0gY29tcG9uZW50TmFtZU1lc3NhZ2UgKyBcIlxcblwiICsgY29tcG9uZW50U3RhY2sgKyBcIlxcblxcblwiICsgKFwiXCIgKyBlcnJvckJvdW5kYXJ5TWVzc2FnZSk7IC8vIEluIGRldmVsb3BtZW50LCB3ZSBwcm92aWRlIG91ciBvd24gbWVzc2FnZSB3aXRoIGp1c3QgdGhlIGNvbXBvbmVudCBzdGFjay5cbiAgICAgIC8vIFdlIGRvbid0IGluY2x1ZGUgdGhlIG9yaWdpbmFsIGVycm9yIG1lc3NhZ2UgYW5kIEpTIHN0YWNrIGJlY2F1c2UgdGhlIGJyb3dzZXJcbiAgICAgIC8vIGhhcyBhbHJlYWR5IHByaW50ZWQgaXQuIEV2ZW4gaWYgdGhlIGFwcGxpY2F0aW9uIHN3YWxsb3dzIHRoZSBlcnJvciwgaXQgaXMgc3RpbGxcbiAgICAgIC8vIGRpc3BsYXllZCBieSB0aGUgYnJvd3NlciB0aGFua3MgdG8gdGhlIERFVi1vbmx5IGZha2UgZXZlbnQgdHJpY2sgaW4gUmVhY3RFcnJvclV0aWxzLlxuXG4gICAgICBjb25zb2xlWydlcnJvciddKGNvbWJpbmVkTWVzc2FnZSk7IC8vIERvbid0IHRyYW5zZm9ybSB0byBvdXIgd3JhcHBlclxuICAgIH0gZWxzZSB7fVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3csIG9yIFJlYWN0IGludGVybmFsIHN0YXRlIHdpbGwgZ2V0IG1lc3NlZCB1cC5cbiAgICAvLyBJZiBjb25zb2xlLmVycm9yIGlzIG92ZXJyaWRkZW4sIG9yIGxvZ0NhcHR1cmVkRXJyb3IoKSBzaG93cyBhIGRpYWxvZyB0aGF0IHRocm93cyxcbiAgICAvLyB3ZSB3YW50IHRvIHJlcG9ydCB0aGlzIGVycm9yIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBzdGFjayBhcyBhIGxhc3QgcmVzb3J0LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTMxODhcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG4gIH1cbn1cblxudmFyIFBvc3NpYmx5V2Vha01hcCQxID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwO1xuXG5mdW5jdGlvbiBjcmVhdGVSb290RXJyb3JVcGRhdGUoZmliZXIsIGVycm9ySW5mbywgbGFuZSkge1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBsYW5lKTsgLy8gVW5tb3VudCB0aGUgcm9vdCBieSByZW5kZXJpbmcgbnVsbC5cblxuICB1cGRhdGUudGFnID0gQ2FwdHVyZVVwZGF0ZTsgLy8gQ2F1dGlvbjogUmVhY3QgRGV2VG9vbHMgY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcm9wZXJ0eVxuICAvLyBiZWluZyBjYWxsZWQgXCJlbGVtZW50XCIuXG5cbiAgdXBkYXRlLnBheWxvYWQgPSB7XG4gICAgZWxlbWVudDogbnVsbFxuICB9O1xuICB2YXIgZXJyb3IgPSBlcnJvckluZm8udmFsdWU7XG5cbiAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgIG9uVW5jYXVnaHRFcnJvcihlcnJvcik7XG4gICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcbiAgfTtcblxuICByZXR1cm4gdXBkYXRlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShOb1RpbWVzdGFtcCwgbGFuZSk7XG4gIHVwZGF0ZS50YWcgPSBDYXB0dXJlVXBkYXRlO1xuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID0gZmliZXIudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I7XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZXJyb3IkMSA9IGVycm9ySW5mby52YWx1ZTtcblxuICAgIHVwZGF0ZS5wYXlsb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvciQxKTtcbiAgICB9O1xuXG4gICAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAge1xuICAgICAgICBtYXJrRmFpbGVkRXJyb3JCb3VuZGFyeUZvckhvdFJlbG9hZGluZyhmaWJlcik7XG4gICAgICB9XG5cbiAgICAgIGxvZ0NhcHR1cmVkRXJyb3IoZmliZXIsIGVycm9ySW5mbyk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBpbnN0ID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gIGlmIChpbnN0ICE9PSBudWxsICYmIHR5cGVvZiBpbnN0LmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgICB7XG4gICAgICAgIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKTtcbiAgICAgIH1cblxuICAgICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcblxuICAgICAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVG8gcHJlc2VydmUgdGhlIHByZWV4aXN0aW5nIHJldHJ5IGJlaGF2aW9yIG9mIGVycm9yIGJvdW5kYXJpZXMsXG4gICAgICAgIC8vIHdlIGtlZXAgdHJhY2sgb2Ygd2hpY2ggb25lcyBhbHJlYWR5IGZhaWxlZCBkdXJpbmcgdGhpcyBiYXRjaC5cbiAgICAgICAgLy8gVGhpcyBnZXRzIHJlc2V0IGJlZm9yZSB3ZSB5aWVsZCBiYWNrIHRvIHRoZSBicm93c2VyLlxuICAgICAgICAvLyBUT0RPOiBXYXJuIGluIHN0cmljdCBtb2RlIGlmIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciBpc1xuICAgICAgICAvLyBub3QgZGVmaW5lZC5cbiAgICAgICAgbWFya0xlZ2FjeUVycm9yQm91bmRhcnlBc0ZhaWxlZCh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGVycm9yJDEgPSBlcnJvckluZm8udmFsdWU7XG4gICAgICB2YXIgc3RhY2sgPSBlcnJvckluZm8uc3RhY2s7XG4gICAgICB0aGlzLmNvbXBvbmVudERpZENhdGNoKGVycm9yJDEsIHtcbiAgICAgICAgY29tcG9uZW50U3RhY2s6IHN0YWNrICE9PSBudWxsID8gc3RhY2sgOiAnJ1xuICAgICAgfSk7XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBJZiBjb21wb25lbnREaWRDYXRjaCBpcyB0aGUgb25seSBlcnJvciBib3VuZGFyeSBtZXRob2QgZGVmaW5lZCxcbiAgICAgICAgICAvLyB0aGVuIGl0IG5lZWRzIHRvIGNhbGwgc2V0U3RhdGUgdG8gcmVjb3ZlciBmcm9tIGVycm9ycy5cbiAgICAgICAgICAvLyBJZiBubyBzdGF0ZSB1cGRhdGUgaXMgc2NoZWR1bGVkIHRoZW4gdGhlIGJvdW5kYXJ5IHdpbGwgc3dhbGxvdyB0aGUgZXJyb3IuXG4gICAgICAgICAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKGZpYmVyLmxhbmVzLCBTeW5jTGFuZSkpIHtcbiAgICAgICAgICAgIGVycm9yKCclczogRXJyb3IgYm91bmRhcmllcyBzaG91bGQgaW1wbGVtZW50IGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcigpLiAnICsgJ0luIHRoYXQgbWV0aG9kLCByZXR1cm4gYSBzdGF0ZSB1cGRhdGUgdG8gZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIG9yIGZhbGxiYWNrIFVJLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGU7XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB3YWtlYWJsZSwgbGFuZXMpIHtcbiAgLy8gQXR0YWNoIGEgcGluZyBsaXN0ZW5lclxuICAvL1xuICAvLyBUaGUgZGF0YSBtaWdodCByZXNvbHZlIGJlZm9yZSB3ZSBoYXZlIGEgY2hhbmNlIHRvIGNvbW1pdCB0aGUgZmFsbGJhY2suIE9yLFxuICAvLyBpbiB0aGUgY2FzZSBvZiBhIHJlZnJlc2gsIHdlJ2xsIG5ldmVyIGNvbW1pdCBhIGZhbGxiYWNrLiBTbyB3ZSBuZWVkIHRvXG4gIC8vIGF0dGFjaCBhIGxpc3RlbmVyIG5vdy4gV2hlbiBpdCByZXNvbHZlcyAoXCJwaW5nc1wiKSwgd2UgY2FuIGRlY2lkZSB3aGV0aGVyIHRvXG4gIC8vIHRyeSByZW5kZXJpbmcgdGhlIHRyZWUgYWdhaW4uXG4gIC8vXG4gIC8vIE9ubHkgYXR0YWNoIGEgbGlzdGVuZXIgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgZm9yIHRoZSBsYW5lc1xuICAvLyB3ZSdyZSBjdXJyZW50bHkgcmVuZGVyaW5nICh3aGljaCBhY3RzIGxpa2UgYSBcInRocmVhZCBJRFwiIGhlcmUpLlxuICAvL1xuICAvLyBXZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBpbiBjb25jdXJyZW50IG1vZGUuIExlZ2FjeSBTdXNwZW5zZSBhbHdheXNcbiAgLy8gY29tbWl0cyBmYWxsYmFja3Mgc3luY2hyb25vdXNseSwgc28gdGhlcmUgYXJlIG5vIHBpbmdzLlxuICB2YXIgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGU7XG4gIHZhciB0aHJlYWRJRHM7XG5cbiAgaWYgKHBpbmdDYWNoZSA9PT0gbnVsbCkge1xuICAgIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlID0gbmV3IFBvc3NpYmx5V2Vha01hcCQxKCk7XG4gICAgdGhyZWFkSURzID0gbmV3IFNldCgpO1xuICAgIHBpbmdDYWNoZS5zZXQod2FrZWFibGUsIHRocmVhZElEcyk7XG4gIH0gZWxzZSB7XG4gICAgdGhyZWFkSURzID0gcGluZ0NhY2hlLmdldCh3YWtlYWJsZSk7XG5cbiAgICBpZiAodGhyZWFkSURzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocmVhZElEcyA9IG5ldyBTZXQoKTtcbiAgICAgIHBpbmdDYWNoZS5zZXQod2FrZWFibGUsIHRocmVhZElEcyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCF0aHJlYWRJRHMuaGFzKGxhbmVzKSkge1xuICAgIC8vIE1lbW9pemUgdXNpbmcgdGhlIHRocmVhZCBJRCB0byBwcmV2ZW50IHJlZHVuZGFudCBsaXN0ZW5lcnMuXG4gICAgdGhyZWFkSURzLmFkZChsYW5lcyk7XG4gICAgdmFyIHBpbmcgPSBwaW5nU3VzcGVuZGVkUm9vdC5iaW5kKG51bGwsIHJvb3QsIHdha2VhYmxlLCBsYW5lcyk7XG5cbiAgICB7XG4gICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHdvcmsgc3RpbGwsIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHVwZGF0ZXJzXG4gICAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgbGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdha2VhYmxlLnRoZW4ocGluZywgcGluZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXR0YWNoUmV0cnlMaXN0ZW5lcihzdXNwZW5zZUJvdW5kYXJ5LCByb290LCB3YWtlYWJsZSwgbGFuZXMpIHtcbiAgLy8gUmV0cnkgbGlzdGVuZXJcbiAgLy9cbiAgLy8gSWYgdGhlIGZhbGxiYWNrIGRvZXMgY29tbWl0LCB3ZSBuZWVkIHRvIGF0dGFjaCBhIGRpZmZlcmVudCB0eXBlIG9mXG4gIC8vIGxpc3RlbmVyLiBUaGlzIG9uZSBzY2hlZHVsZXMgYW4gdXBkYXRlIG9uIHRoZSBTdXNwZW5zZSBib3VuZGFyeSB0byB0dXJuXG4gIC8vIHRoZSBmYWxsYmFjayBzdGF0ZSBvZmYuXG4gIC8vXG4gIC8vIFN0YXNoIHRoZSB3YWtlYWJsZSBvbiB0aGUgYm91bmRhcnkgZmliZXIgc28gd2UgY2FuIGFjY2VzcyBpdCBpbiB0aGVcbiAgLy8gY29tbWl0IHBoYXNlLlxuICAvL1xuICAvLyBXaGVuIHRoZSB3YWtlYWJsZSByZXNvbHZlcywgd2UnbGwgYXR0ZW1wdCB0byByZW5kZXIgdGhlIGJvdW5kYXJ5XG4gIC8vIGFnYWluIChcInJldHJ5XCIpLlxuICB2YXIgd2FrZWFibGVzID0gc3VzcGVuc2VCb3VuZGFyeS51cGRhdGVRdWV1ZTtcblxuICBpZiAod2FrZWFibGVzID09PSBudWxsKSB7XG4gICAgdmFyIHVwZGF0ZVF1ZXVlID0gbmV3IFNldCgpO1xuICAgIHVwZGF0ZVF1ZXVlLmFkZCh3YWtlYWJsZSk7XG4gICAgc3VzcGVuc2VCb3VuZGFyeS51cGRhdGVRdWV1ZSA9IHVwZGF0ZVF1ZXVlO1xuICB9IGVsc2Uge1xuICAgIHdha2VhYmxlcy5hZGQod2FrZWFibGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0U3VzcGVuZGVkQ29tcG9uZW50KHNvdXJjZUZpYmVyLCByb290UmVuZGVyTGFuZXMpIHtcbiAgLy8gQSBsZWdhY3kgbW9kZSBTdXNwZW5zZSBxdWlyaywgb25seSByZWxldmFudCB0byBob29rIGNvbXBvbmVudHMuXG5cblxuICB2YXIgdGFnID0gc291cmNlRmliZXIudGFnO1xuXG4gIGlmICgoc291cmNlRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmICh0YWcgPT09IEZ1bmN0aW9uQ29tcG9uZW50IHx8IHRhZyA9PT0gRm9yd2FyZFJlZiB8fCB0YWcgPT09IFNpbXBsZU1lbW9Db21wb25lbnQpKSB7XG4gICAgdmFyIGN1cnJlbnRTb3VyY2UgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudFNvdXJjZSkge1xuICAgICAgc291cmNlRmliZXIudXBkYXRlUXVldWUgPSBjdXJyZW50U291cmNlLnVwZGF0ZVF1ZXVlO1xuICAgICAgc291cmNlRmliZXIubWVtb2l6ZWRTdGF0ZSA9IGN1cnJlbnRTb3VyY2UubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIHNvdXJjZUZpYmVyLmxhbmVzID0gY3VycmVudFNvdXJjZS5sYW5lcztcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRmliZXIudXBkYXRlUXVldWUgPSBudWxsO1xuICAgICAgc291cmNlRmliZXIubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE5lYXJlc3RTdXNwZW5zZUJvdW5kYXJ5VG9DYXB0dXJlKHJldHVybkZpYmVyKSB7XG4gIHZhciBub2RlID0gcmV0dXJuRmliZXI7XG5cbiAgZG8ge1xuICAgIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQgJiYgc2hvdWxkQ2FwdHVyZVN1c3BlbnNlKG5vZGUpKSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9IC8vIFRoaXMgYm91bmRhcnkgYWxyZWFkeSBjYXB0dXJlZCBkdXJpbmcgdGhpcyByZW5kZXIuIENvbnRpbnVlIHRvIHRoZSBuZXh0XG4gICAgLy8gYm91bmRhcnkuXG5cblxuICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgfSB3aGlsZSAobm9kZSAhPT0gbnVsbCk7XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIG1hcmtTdXNwZW5zZUJvdW5kYXJ5U2hvdWxkQ2FwdHVyZShzdXNwZW5zZUJvdW5kYXJ5LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHJvb3QsIHJvb3RSZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIG1hcmtzIGEgU3VzcGVuc2UgYm91bmRhcnkgc28gdGhhdCB3aGVuIHdlJ3JlIHVud2luZGluZyB0aGUgc3RhY2ssXG4gIC8vIGl0IGNhcHR1cmVzIHRoZSBzdXNwZW5kZWQgXCJleGNlcHRpb25cIiBhbmQgZG9lcyBhIHNlY29uZCAoZmFsbGJhY2spIHBhc3MuXG4gIGlmICgoc3VzcGVuc2VCb3VuZGFyeS5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICAvLyBMZWdhY3kgTW9kZSBTdXNwZW5zZVxuICAgIC8vXG4gICAgLy8gSWYgdGhlIGJvdW5kYXJ5IGlzIGluIGxlZ2FjeSBtb2RlLCB3ZSBzaG91bGQgKm5vdCpcbiAgICAvLyBzdXNwZW5kIHRoZSBjb21taXQuIFByZXRlbmQgYXMgaWYgdGhlIHN1c3BlbmRlZCBjb21wb25lbnQgcmVuZGVyZWRcbiAgICAvLyBudWxsIGFuZCBrZWVwIHJlbmRlcmluZy4gV2hlbiB0aGUgU3VzcGVuc2UgYm91bmRhcnkgY29tcGxldGVzLFxuICAgIC8vIHdlJ2xsIGRvIGEgc2Vjb25kIHBhc3MgdG8gcmVuZGVyIHRoZSBmYWxsYmFjay5cbiAgICBpZiAoc3VzcGVuc2VCb3VuZGFyeSA9PT0gcmV0dXJuRmliZXIpIHtcbiAgICAgIC8vIFNwZWNpYWwgY2FzZSB3aGVyZSB3ZSBzdXNwZW5kZWQgd2hpbGUgcmVjb25jaWxpbmcgdGhlIGNoaWxkcmVuIG9mXG4gICAgICAvLyBhIFN1c3BlbnNlIGJvdW5kYXJ5J3MgaW5uZXIgT2Zmc2NyZWVuIHdyYXBwZXIgZmliZXIuIFRoaXMgaGFwcGVuc1xuICAgICAgLy8gd2hlbiBhIFJlYWN0LmxhenkgY29tcG9uZW50IGlzIGEgZGlyZWN0IGNoaWxkIG9mIGFcbiAgICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJ5LlxuICAgICAgLy9cbiAgICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJpZXMgYXJlIGltcGxlbWVudGVkIGFzIG11bHRpcGxlIGZpYmVycywgYnV0IHRoZXlcbiAgICAgIC8vIGFyZSBhIHNpbmdsZSBjb25jZXB0dWFsIHVuaXQuIFRoZSBsZWdhY3kgbW9kZSBiZWhhdmlvciB3aGVyZSB3ZVxuICAgICAgLy8gcHJldGVuZCB0aGUgc3VzcGVuZGVkIGZpYmVyIGNvbW1pdHRlZCBhcyBgbnVsbGAgd29uJ3Qgd29yayxcbiAgICAgIC8vIGJlY2F1c2UgaW4gdGhpcyBjYXNlIHRoZSBcInN1c3BlbmRlZFwiIGZpYmVyIGlzIHRoZSBpbm5lclxuICAgICAgLy8gT2Zmc2NyZWVuIHdyYXBwZXIuXG4gICAgICAvL1xuICAgICAgLy8gQmVjYXVzZSB0aGUgY29udGVudHMgb2YgdGhlIGJvdW5kYXJ5IGhhdmVuJ3Qgc3RhcnRlZCByZW5kZXJpbmdcbiAgICAgIC8vIHlldCAoaS5lLiBub3RoaW5nIGluIHRoZSB0cmVlIGhhcyBwYXJ0aWFsbHkgcmVuZGVyZWQpIHdlIGNhblxuICAgICAgLy8gc3dpdGNoIHRvIHRoZSByZWd1bGFyLCBjb25jdXJyZW50IG1vZGUgYmVoYXZpb3I6IG1hcmsgdGhlXG4gICAgICAvLyBib3VuZGFyeSB3aXRoIFNob3VsZENhcHR1cmUgYW5kIGVudGVyIHRoZSB1bndpbmQgcGhhc2UuXG4gICAgICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IFNob3VsZENhcHR1cmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgIHNvdXJjZUZpYmVyLmZsYWdzIHw9IEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2U7IC8vIFdlJ3JlIGdvaW5nIHRvIGNvbW1pdCB0aGlzIGZpYmVyIGV2ZW4gdGhvdWdoIGl0IGRpZG4ndCBjb21wbGV0ZS5cbiAgICAgIC8vIEJ1dCB3ZSBzaG91bGRuJ3QgY2FsbCBhbnkgbGlmZWN5Y2xlIG1ldGhvZHMgb3IgY2FsbGJhY2tzLiBSZW1vdmVcbiAgICAgIC8vIGFsbCBsaWZlY3ljbGUgZWZmZWN0IHRhZ3MuXG5cbiAgICAgIHNvdXJjZUZpYmVyLmZsYWdzICY9IH4oTGlmZWN5Y2xlRWZmZWN0TWFzayB8IEluY29tcGxldGUpO1xuXG4gICAgICBpZiAoc291cmNlRmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICB2YXIgY3VycmVudFNvdXJjZUZpYmVyID0gc291cmNlRmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgIGlmIChjdXJyZW50U291cmNlRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgbmV3IG1vdW50LiBDaGFuZ2UgdGhlIHRhZyBzbyBpdCdzIG5vdCBtaXN0YWtlbiBmb3IgYVxuICAgICAgICAgIC8vIGNvbXBsZXRlZCBjbGFzcyBjb21wb25lbnQuIEZvciBleGFtcGxlLCB3ZSBzaG91bGQgbm90IGNhbGxcbiAgICAgICAgICAvLyBjb21wb25lbnRXaWxsVW5tb3VudCBpZiBpdCBpcyBkZWxldGVkLlxuICAgICAgICAgIHNvdXJjZUZpYmVyLnRhZyA9IEluY29tcGxldGVDbGFzc0NvbXBvbmVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXaGVuIHdlIHRyeSByZW5kZXJpbmcgYWdhaW4sIHdlIHNob3VsZCBub3QgcmV1c2UgdGhlIGN1cnJlbnQgZmliZXIsXG4gICAgICAgICAgLy8gc2luY2UgaXQncyBrbm93biB0byBiZSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFVzZSBhIGZvcmNlIHVwZGF0ZSB0b1xuICAgICAgICAgIC8vIHByZXZlbnQgYSBiYWlsIG91dC5cbiAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBTeW5jTGFuZSk7XG4gICAgICAgICAgdXBkYXRlLnRhZyA9IEZvcmNlVXBkYXRlO1xuICAgICAgICAgIGVucXVldWVVcGRhdGUoc291cmNlRmliZXIsIHVwZGF0ZSwgU3luY0xhbmUpO1xuICAgICAgICB9XG4gICAgICB9IC8vIFRoZSBzb3VyY2UgZmliZXIgZGlkIG5vdCBjb21wbGV0ZS4gTWFyayBpdCB3aXRoIFN5bmMgcHJpb3JpdHkgdG9cbiAgICAgIC8vIGluZGljYXRlIHRoYXQgaXQgc3RpbGwgaGFzIHBlbmRpbmcgd29yay5cblxuXG4gICAgICBzb3VyY2VGaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoc291cmNlRmliZXIubGFuZXMsIFN5bmNMYW5lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VzcGVuc2VCb3VuZGFyeTtcbiAgfSAvLyBDb25maXJtZWQgdGhhdCB0aGUgYm91bmRhcnkgaXMgaW4gYSBjb25jdXJyZW50IG1vZGUgdHJlZS4gQ29udGludWVcbiAgLy8gd2l0aCB0aGUgbm9ybWFsIHN1c3BlbmQgcGF0aC5cbiAgLy9cbiAgLy8gQWZ0ZXIgdGhpcyB3ZSdsbCB1c2UgYSBzZXQgb2YgaGV1cmlzdGljcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzXG4gIC8vIHJlbmRlciBwYXNzIHdpbGwgcnVuIHRvIGNvbXBsZXRpb24gb3IgcmVzdGFydCBvciBcInN1c3BlbmRcIiB0aGUgY29tbWl0LlxuICAvLyBUaGUgYWN0dWFsIGxvZ2ljIGZvciB0aGlzIGlzIHNwcmVhZCBvdXQgaW4gZGlmZmVyZW50IHBsYWNlcy5cbiAgLy9cbiAgLy8gVGhpcyBmaXJzdCBwcmluY2lwbGUgaXMgdGhhdCBpZiB3ZSdyZSBnb2luZyB0byBzdXNwZW5kIHdoZW4gd2UgY29tcGxldGVcbiAgLy8gYSByb290LCB0aGVuIHdlIHNob3VsZCBhbHNvIHJlc3RhcnQgaWYgd2UgZ2V0IGFuIHVwZGF0ZSBvciBwaW5nIHRoYXRcbiAgLy8gbWlnaHQgdW5zdXNwZW5kIGl0LCBhbmQgdmljZSB2ZXJzYS4gVGhlIG9ubHkgcmVhc29uIHRvIHN1c3BlbmQgaXNcbiAgLy8gYmVjYXVzZSB5b3UgdGhpbmsgeW91IG1pZ2h0IHdhbnQgdG8gcmVzdGFydCBiZWZvcmUgY29tbWl0dGluZy4gSG93ZXZlcixcbiAgLy8gaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIHJlc3RhcnQgb25seSB3aGlsZSBpbiB0aGUgcGVyaW9kIHdlJ3JlIHN1c3BlbmRlZC5cbiAgLy9cbiAgLy8gUmVzdGFydGluZyB0b28gYWdncmVzc2l2ZWx5IGlzIGFsc28gbm90IGdvb2QgYmVjYXVzZSBpdCBzdGFydmVzIG91dCBhbnlcbiAgLy8gaW50ZXJtZWRpYXRlIGxvYWRpbmcgc3RhdGUuIFNvIHdlIHVzZSBoZXVyaXN0aWNzIHRvIGRldGVybWluZSB3aGVuLlxuICAvLyBTdXNwZW5zZSBIZXVyaXN0aWNzXG4gIC8vXG4gIC8vIElmIG5vdGhpbmcgdGhyZXcgYSBQcm9taXNlIG9yIGFsbCB0aGUgc2FtZSBmYWxsYmFja3MgYXJlIGFscmVhZHkgc2hvd2luZyxcbiAgLy8gdGhlbiBkb24ndCBzdXNwZW5kL3Jlc3RhcnQuXG4gIC8vXG4gIC8vIElmIHRoaXMgaXMgYW4gaW5pdGlhbCByZW5kZXIgb2YgYSBuZXcgdHJlZSBvZiBTdXNwZW5zZSBib3VuZGFyaWVzIGFuZFxuICAvLyB0aG9zZSB0cmlnZ2VyIGEgZmFsbGJhY2ssIHRoZW4gZG9uJ3Qgc3VzcGVuZC9yZXN0YXJ0LiBXZSB3YW50IHRvIGVuc3VyZVxuICAvLyB0aGF0IHdlIGNhbiBzaG93IHRoZSBpbml0aWFsIGxvYWRpbmcgc3RhdGUgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS5cbiAgLy9cbiAgLy8gSWYgd2UgaGl0IGEgXCJEZWxheWVkXCIgY2FzZSwgc3VjaCBhcyB3aGVuIHdlJ2Qgc3dpdGNoIGZyb20gY29udGVudCBiYWNrIGludG9cbiAgLy8gYSBmYWxsYmFjaywgdGhlbiB3ZSBzaG91bGQgYWx3YXlzIHN1c3BlbmQvcmVzdGFydC4gVHJhbnNpdGlvbnMgYXBwbHlcbiAgLy8gdG8gdGhpcyBjYXNlLiBJZiBub25lIGlzIGRlZmluZWQsIEpORCBpcyB1c2VkIGluc3RlYWQuXG4gIC8vXG4gIC8vIElmIHdlJ3JlIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrIGFuZCBpdCBnZXRzIFwicmV0cmllZFwiLCBhbGxvd2luZyB1cyB0byBzaG93XG4gIC8vIGFub3RoZXIgbGV2ZWwsIGJ1dCB0aGVyZSdzIHN0aWxsIGFuIGlubmVyIGJvdW5kYXJ5IHRoYXQgd291bGQgc2hvdyBhIGZhbGxiYWNrLFxuICAvLyB0aGVuIHdlIHN1c3BlbmQvcmVzdGFydCBmb3IgNTAwbXMgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBzaG93ZWQgYSBmYWxsYmFja1xuICAvLyBhbnl3aGVyZSBpbiB0aGUgdHJlZS4gVGhpcyBlZmZlY3RpdmVseSB0aHJvdHRsZXMgcHJvZ3Jlc3NpdmUgbG9hZGluZyBpbnRvIGFcbiAgLy8gY29uc2lzdGVudCB0cmFpbiBvZiBjb21taXRzLiBUaGlzIGFsc28gZ2l2ZXMgdXMgYW4gb3Bwb3J0dW5pdHkgdG8gcmVzdGFydCB0b1xuICAvLyBnZXQgdG8gdGhlIGNvbXBsZXRlZCBzdGF0ZSBzbGlnaHRseSBlYXJsaWVyLlxuICAvL1xuICAvLyBJZiB0aGVyZSdzIGFtYmlndWl0eSBkdWUgdG8gYmF0Y2hpbmcgaXQncyByZXNvbHZlZCBpbiBwcmVmZXJlbmNlIG9mOlxuICAvLyAxKSBcImRlbGF5ZWRcIiwgMikgXCJpbml0aWFsIHJlbmRlclwiLCAzKSBcInJldHJ5XCIuXG4gIC8vXG4gIC8vIFdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgYSBcImJ1c3lcIiBzdGF0ZSBkb2Vzbid0IGdldCBmb3JjZSBjb21taXR0ZWQuIFdlIHdhbnQgdG9cbiAgLy8gZW5zdXJlIHRoYXQgbmV3IGluaXRpYWwgbG9hZGluZyBzdGF0ZXMgY2FuIGNvbW1pdCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuXG5cbiAgc3VzcGVuc2VCb3VuZGFyeS5mbGFncyB8PSBTaG91bGRDYXB0dXJlOyAvLyBUT0RPOiBJIHRoaW5rIHdlIGNhbiByZW1vdmUgdGhpcywgc2luY2Ugd2Ugbm93IHVzZSBgRGlkQ2FwdHVyZWAgaW5cbiAgLy8gdGhlIGJlZ2luIHBoYXNlIHRvIHByZXZlbnQgYW4gZWFybHkgYmFpbG91dC5cblxuICBzdXNwZW5zZUJvdW5kYXJ5LmxhbmVzID0gcm9vdFJlbmRlckxhbmVzO1xuICByZXR1cm4gc3VzcGVuc2VCb3VuZGFyeTtcbn1cblxuZnVuY3Rpb24gdGhyb3dFeGNlcHRpb24ocm9vdCwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCB2YWx1ZSwgcm9vdFJlbmRlckxhbmVzKSB7XG4gIC8vIFRoZSBzb3VyY2UgZmliZXIgZGlkIG5vdCBjb21wbGV0ZS5cbiAgc291cmNlRmliZXIuZmxhZ3MgfD0gSW5jb21wbGV0ZTtcblxuICB7XG4gICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgd29yayBzdGlsbCwgcmVzdG9yZSB0aGUgb3JpZ2luYWwgdXBkYXRlcnNcbiAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgcm9vdFJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH1cblxuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIFRoaXMgaXMgYSB3YWtlYWJsZS4gVGhlIGNvbXBvbmVudCBzdXNwZW5kZWQuXG4gICAgdmFyIHdha2VhYmxlID0gdmFsdWU7XG4gICAgcmVzZXRTdXNwZW5kZWRDb21wb25lbnQoc291cmNlRmliZXIpO1xuXG4gICAge1xuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgc291cmNlRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICAgIG1hcmtEaWRUaHJvd1doaWxlSHlkcmF0aW5nREVWKCk7XG4gICAgICB9XG4gICAgfVxuXG5cbiAgICB2YXIgc3VzcGVuc2VCb3VuZGFyeSA9IGdldE5lYXJlc3RTdXNwZW5zZUJvdW5kYXJ5VG9DYXB0dXJlKHJldHVybkZpYmVyKTtcblxuICAgIGlmIChzdXNwZW5zZUJvdW5kYXJ5ICE9PSBudWxsKSB7XG4gICAgICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzICY9IH5Gb3JjZUNsaWVudFJlbmRlcjtcbiAgICAgIG1hcmtTdXNwZW5zZUJvdW5kYXJ5U2hvdWxkQ2FwdHVyZShzdXNwZW5zZUJvdW5kYXJ5LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHJvb3QsIHJvb3RSZW5kZXJMYW5lcyk7IC8vIFdlIG9ubHkgYXR0YWNoIHBpbmcgbGlzdGVuZXJzIGluIGNvbmN1cnJlbnQgbW9kZS4gTGVnYWN5IFN1c3BlbnNlIGFsd2F5c1xuICAgICAgLy8gY29tbWl0cyBmYWxsYmFja3Mgc3luY2hyb25vdXNseSwgc28gdGhlcmUgYXJlIG5vIHBpbmdzLlxuXG4gICAgICBpZiAoc3VzcGVuc2VCb3VuZGFyeS5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgICAgYXR0YWNoUGluZ0xpc3RlbmVyKHJvb3QsIHdha2VhYmxlLCByb290UmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBhdHRhY2hSZXRyeUxpc3RlbmVyKHN1c3BlbnNlQm91bmRhcnksIHJvb3QsIHdha2VhYmxlKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gYm91bmRhcnkgd2FzIGZvdW5kLiBVbmxlc3MgdGhpcyBpcyBhIHN5bmMgdXBkYXRlLCB0aGlzIGlzIE9LLlxuICAgICAgLy8gV2UgY2FuIHN1c3BlbmQgYW5kIHdhaXQgZm9yIG1vcmUgZGF0YSB0byBhcnJpdmUuXG4gICAgICBpZiAoIWluY2x1ZGVzU3luY0xhbmUocm9vdFJlbmRlckxhbmVzKSkge1xuICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIHN5bmMgdXBkYXRlLiBTdXNwZW5kLiBTaW5jZSB3ZSdyZSBub3QgYWN0aXZhdGluZyBhXG4gICAgICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJ5LCB0aGlzIHdpbGwgdW53aW5kIGFsbCB0aGUgd2F5IHRvIHRoZSByb290IHdpdGhvdXRcbiAgICAgICAgLy8gcGVyZm9ybWluZyBhIHNlY29uZCBwYXNzIHRvIHJlbmRlciBhIGZhbGxiYWNrLiAoVGhpcyBpcyBhcmd1YWJseSBob3dcbiAgICAgICAgLy8gcmVmcmVzaCB0cmFuc2l0aW9ucyBzaG91bGQgd29yaywgdG9vLCBzaW5jZSB3ZSdyZSBub3QgZ29pbmcgdG8gY29tbWl0XG4gICAgICAgIC8vIHRoZSBmYWxsYmFja3MgYW55d2F5LilcbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhpcyBjYXNlIGFsc28gYXBwbGllcyB0byBpbml0aWFsIGh5ZHJhdGlvbi5cbiAgICAgICAgYXR0YWNoUGluZ0xpc3RlbmVyKHJvb3QsIHdha2VhYmxlLCByb290UmVuZGVyTGFuZXMpO1xuICAgICAgICByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gVGhpcyBpcyBhIHN5bmMvZGlzY3JldGUgdXBkYXRlLiBXZSB0cmVhdCB0aGlzIGNhc2UgbGlrZSBhbiBlcnJvclxuICAgICAgLy8gYmVjYXVzZSBkaXNjcmV0ZSByZW5kZXJzIGFyZSBleHBlY3RlZCB0byBwcm9kdWNlIGEgY29tcGxldGUgdHJlZVxuICAgICAgLy8gc3luY2hyb25vdXNseSB0byBtYWludGFpbiBjb25zaXN0ZW5jeSB3aXRoIGV4dGVybmFsIHN0YXRlLlxuXG5cbiAgICAgIHZhciB1bmNhdWdodFN1c3BlbnNlRXJyb3IgPSBuZXcgRXJyb3IoJ0EgY29tcG9uZW50IHN1c3BlbmRlZCB3aGlsZSByZXNwb25kaW5nIHRvIHN5bmNocm9ub3VzIGlucHV0LiBUaGlzICcgKyAnd2lsbCBjYXVzZSB0aGUgVUkgdG8gYmUgcmVwbGFjZWQgd2l0aCBhIGxvYWRpbmcgaW5kaWNhdG9yLiBUbyAnICsgJ2ZpeCwgdXBkYXRlcyB0aGF0IHN1c3BlbmQgc2hvdWxkIGJlIHdyYXBwZWQgJyArICd3aXRoIHN0YXJ0VHJhbnNpdGlvbi4nKTsgLy8gSWYgd2UncmUgb3V0c2lkZSBhIHRyYW5zaXRpb24sIGZhbGwgdGhyb3VnaCB0byB0aGUgcmVndWxhciBlcnJvciBwYXRoLlxuICAgICAgLy8gVGhlIGVycm9yIHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZSBuZWFyZXN0IHN1c3BlbnNlIGJvdW5kYXJ5LlxuXG4gICAgICB2YWx1ZSA9IHVuY2F1Z2h0U3VzcGVuc2VFcnJvcjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhIHJlZ3VsYXIgZXJyb3IsIG5vdCBhIFN1c3BlbnNlIHdha2VhYmxlLlxuICAgIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIHNvdXJjZUZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgbWFya0RpZFRocm93V2hpbGVIeWRyYXRpbmdERVYoKTtcblxuICAgICAgdmFyIF9zdXNwZW5zZUJvdW5kYXJ5ID0gZ2V0TmVhcmVzdFN1c3BlbnNlQm91bmRhcnlUb0NhcHR1cmUocmV0dXJuRmliZXIpOyAvLyBJZiB0aGUgZXJyb3Igd2FzIHRocm93biBkdXJpbmcgaHlkcmF0aW9uLCB3ZSBtYXkgYmUgYWJsZSB0byByZWNvdmVyIGJ5XG4gICAgICAvLyBkaXNjYXJkaW5nIHRoZSBkZWh5ZHJhdGVkIGNvbnRlbnQgYW5kIHN3aXRjaGluZyB0byBhIGNsaWVudCByZW5kZXIuXG4gICAgICAvLyBJbnN0ZWFkIG9mIHN1cmZhY2luZyB0aGUgZXJyb3IsIGZpbmQgdGhlIG5lYXJlc3QgU3VzcGVuc2UgYm91bmRhcnlcbiAgICAgIC8vIGFuZCByZW5kZXIgaXQgYWdhaW4gd2l0aG91dCBoeWRyYXRpb24uXG5cblxuICAgICAgaWYgKF9zdXNwZW5zZUJvdW5kYXJ5ICE9PSBudWxsKSB7XG4gICAgICAgIGlmICgoX3N1c3BlbnNlQm91bmRhcnkuZmxhZ3MgJiBTaG91bGRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAgIC8vIFNldCBhIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSBzaG91bGQgdHJ5IHJlbmRlcmluZyB0aGUgbm9ybWFsXG4gICAgICAgICAgLy8gY2hpbGRyZW4gYWdhaW4sIG5vdCB0aGUgZmFsbGJhY2suXG4gICAgICAgICAgX3N1c3BlbnNlQm91bmRhcnkuZmxhZ3MgfD0gRm9yY2VDbGllbnRSZW5kZXI7XG4gICAgICAgIH1cblxuICAgICAgICBtYXJrU3VzcGVuc2VCb3VuZGFyeVNob3VsZENhcHR1cmUoX3N1c3BlbnNlQm91bmRhcnksIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgcm9vdCwgcm9vdFJlbmRlckxhbmVzKTsgLy8gRXZlbiB0aG91Z2ggdGhlIHVzZXIgbWF5IG5vdCBiZSBhZmZlY3RlZCBieSB0aGlzIGVycm9yLCB3ZSBzaG91bGRcbiAgICAgICAgLy8gc3RpbGwgbG9nIGl0IHNvIGl0IGNhbiBiZSBmaXhlZC5cblxuICAgICAgICBxdWV1ZUh5ZHJhdGlvbkVycm9yKGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKHZhbHVlLCBzb3VyY2VGaWJlcikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFsdWUgPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcih2YWx1ZSwgc291cmNlRmliZXIpO1xuICByZW5kZXJEaWRFcnJvcih2YWx1ZSk7IC8vIFdlIGRpZG4ndCBmaW5kIGEgYm91bmRhcnkgdGhhdCBjb3VsZCBoYW5kbGUgdGhpcyB0eXBlIG9mIGV4Y2VwdGlvbi4gU3RhcnRcbiAgLy8gb3ZlciBhbmQgdHJhdmVyc2UgcGFyZW50IHBhdGggYWdhaW4sIHRoaXMgdGltZSB0cmVhdGluZyB0aGUgZXhjZXB0aW9uXG4gIC8vIGFzIGFuIGVycm9yLlxuXG4gIHZhciB3b3JrSW5Qcm9ncmVzcyA9IHJldHVybkZpYmVyO1xuXG4gIGRvIHtcbiAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfZXJyb3JJbmZvID0gdmFsdWU7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTtcbiAgICAgICAgICB2YXIgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBsYW5lKTtcbiAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlUm9vdEVycm9yVXBkYXRlKHdvcmtJblByb2dyZXNzLCBfZXJyb3JJbmZvLCBsYW5lKTtcbiAgICAgICAgICBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIHVwZGF0ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIC8vIENhcHR1cmUgYW5kIHJldHJ5XG4gICAgICAgIHZhciBlcnJvckluZm8gPSB2YWx1ZTtcbiAgICAgICAgdmFyIGN0b3IgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzICYmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicgfHwgaW5zdGFuY2UgIT09IG51bGwgJiYgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTaG91bGRDYXB0dXJlO1xuXG4gICAgICAgICAgdmFyIF9sYW5lID0gcGlja0FyYml0cmFyeUxhbmUocm9vdFJlbmRlckxhbmVzKTtcblxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcywgX2xhbmUpOyAvLyBTY2hlZHVsZSB0aGUgZXJyb3IgYm91bmRhcnkgdG8gcmUtcmVuZGVyIHVzaW5nIHVwZGF0ZWQgc3RhdGVcblxuICAgICAgICAgIHZhciBfdXBkYXRlID0gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgZXJyb3JJbmZvLCBfbGFuZSk7XG5cbiAgICAgICAgICBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIF91cGRhdGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzID0gd29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuICB9IHdoaWxlICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCk7XG59XG5cbmZ1bmN0aW9uIGdldFN1c3BlbmRlZENhY2hlKCkge1xuICB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIFN1c3BlbnNlIGJvdW5kYXJ5IHN1c3BlbmRzLiBJdCByZXR1cm5zIHRoZVxufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xudmFyIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbnZhciBkaWRXYXJuQWJvdXRCYWRDbGFzcztcbnZhciBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmcztcbnZhciBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzO1xudmFyIGRpZFdhcm5BYm91dFJldmVhbE9yZGVyO1xudmFyIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zO1xuXG57XG4gIGRpZFdhcm5BYm91dEJhZENsYXNzID0ge307XG4gIGRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnQgPSB7fTtcbiAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnQgPSB7fTtcbiAgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzID0ge307XG4gIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXIgPSB7fTtcbiAgZGlkV2FybkFib3V0VGFpbE9wdGlvbnMgPSB7fTtcbn1cblxuZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJZiB0aGlzIGlzIGEgZnJlc2ggbmV3IGNvbXBvbmVudCB0aGF0IGhhc24ndCBiZWVuIHJlbmRlcmVkIHlldCwgd2VcbiAgICAvLyB3b24ndCB1cGRhdGUgaXRzIGNoaWxkIHNldCBieSBhcHBseWluZyBtaW5pbWFsIHNpZGUtZWZmZWN0cy4gSW5zdGVhZCxcbiAgICAvLyB3ZSB3aWxsIGFkZCB0aGVtIGFsbCB0byB0aGUgY2hpbGQgYmVmb3JlIGl0IGdldHMgcmVuZGVyZWQuIFRoYXQgbWVhbnNcbiAgICAvLyB3ZSBjYW4gb3B0aW1pemUgdGhpcyByZWNvbmNpbGlhdGlvbiBwYXNzIGJ5IG5vdCB0cmFja2luZyBzaWRlLWVmZmVjdHMuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBtb3VudENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiB0aGUgY3VycmVudCBjaGlsZCBpcyB0aGUgc2FtZSBhcyB0aGUgd29yayBpbiBwcm9ncmVzcywgaXQgbWVhbnMgdGhhdFxuICAgIC8vIHdlIGhhdmVuJ3QgeWV0IHN0YXJ0ZWQgYW55IHdvcmsgb24gdGhlc2UgY2hpbGRyZW4uIFRoZXJlZm9yZSwgd2UgdXNlXG4gICAgLy8gdGhlIGNsb25lIGFsZ29yaXRobSB0byBjcmVhdGUgYSBjb3B5IG9mIGFsbCB0aGUgY3VycmVudCBjaGlsZHJlbi5cbiAgICAvLyBJZiB3ZSBoYWQgYW55IHByb2dyZXNzZWQgd29yayBhbHJlYWR5LCB0aGF0IGlzIGludmFsaWQgYXQgdGhpcyBwb2ludCBzb1xuICAgIC8vIGxldCdzIHRocm93IGl0IG91dC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JjZVVubW91bnRDdXJyZW50QW5kUmVjb25jaWxlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgZm9yayBvZiByZWNvbmNpbGVDaGlsZHJlbi4gSXQncyB1c2VkIGluIGNhc2VzIHdoZXJlIHdlXG4gIC8vIHdhbnQgdG8gcmVjb25jaWxlIHdpdGhvdXQgbWF0Y2hpbmcgYWdhaW5zdCB0aGUgZXhpc3Rpbmcgc2V0LiBUaGlzIGhhcyB0aGVcbiAgLy8gZWZmZWN0IG9mIGFsbCBjdXJyZW50IGNoaWxkcmVuIGJlaW5nIHVubW91bnRlZDsgZXZlbiBpZiB0aGUgdHlwZSBhbmQga2V5XG4gIC8vIGFyZSB0aGUgc2FtZSwgdGhlIG9sZCBjaGlsZCBpcyB1bm1vdW50ZWQgYW5kIGEgbmV3IGNoaWxkIGlzIGNyZWF0ZWQuXG4gIC8vXG4gIC8vIFRvIGRvIHRoaXMsIHdlJ3JlIGdvaW5nIHRvIGdvIHRocm91Z2ggdGhlIHJlY29uY2lsZSBhbGdvcml0aG0gdHdpY2UuIEluXG4gIC8vIHRoZSBmaXJzdCBwYXNzLCB3ZSBzY2hlZHVsZSBhIGRlbGV0aW9uIGZvciBhbGwgdGhlIGN1cnJlbnQgY2hpbGRyZW4gYnlcbiAgLy8gcGFzc2luZyBudWxsLlxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7IC8vIEluIHRoZSBzZWNvbmQgcGFzcywgd2UgbW91bnQgdGhlIG5ldyBjaGlsZHJlbi4gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZVxuICAvLyBwYXNzIG51bGwgaW4gcGxhY2Ugb2Ygd2hlcmUgd2UgdXN1YWxseSBwYXNzIHRoZSBjdXJyZW50IGNoaWxkIHNldC4gVGhpcyBoYXNcbiAgLy8gdGhlIGVmZmVjdCBvZiByZW1vdW50aW5nIGFsbCBjaGlsZHJlbiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlaXJcbiAgLy8gaWRlbnRpdGllcyBtYXRjaC5cblxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IGN1cnJlbnQgY2FuIGJlIG5vbi1udWxsIGhlcmUgZXZlbiBpZiB0aGUgY29tcG9uZW50XG4gIC8vIGhhc24ndCB5ZXQgbW91bnRlZC4gVGhpcyBoYXBwZW5zIGFmdGVyIHRoZSBmaXJzdCByZW5kZXIgc3VzcGVuZHMuXG4gIC8vIFdlJ2xsIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIGlzIGZpbmUgb3IgY2FuIGNhdXNlIGlzc3Vlcy5cbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgcmVuZGVyID0gQ29tcG9uZW50LnJlbmRlcjtcbiAgdmFyIHJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjsgLy8gVGhlIHJlc3QgaXMgYSBmb3JrIG9mIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50XG5cbiAgdmFyIG5leHRDaGlsZHJlbjtcbiAgdmFyIGhhc0lkO1xuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXIsIG5leHRQcm9wcywgcmVmLCByZW5kZXJMYW5lcyk7XG4gICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyLCBuZXh0UHJvcHMsIHJlZiwgcmVuZGVyTGFuZXMpO1xuICAgICAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICB9XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBoYXNJZCkge1xuICAgIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpO1xuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB2YXIgdHlwZSA9IENvbXBvbmVudC50eXBlO1xuXG4gICAgaWYgKGlzU2ltcGxlRnVuY3Rpb25Db21wb25lbnQodHlwZSkgJiYgQ29tcG9uZW50LmNvbXBhcmUgPT09IG51bGwgJiYgLy8gU2ltcGxlTWVtb0NvbXBvbmVudCBjb2RlcGF0aCBkb2Vzbid0IHJlc29sdmUgb3V0ZXIgcHJvcHMgZWl0aGVyLlxuICAgIENvbXBvbmVudC5kZWZhdWx0UHJvcHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJlc29sdmVkVHlwZSA9IHR5cGU7XG5cbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpO1xuICAgICAgfSAvLyBJZiB0aGlzIGlzIGEgcGxhaW4gZnVuY3Rpb24gY29tcG9uZW50IHdpdGhvdXQgZGVmYXVsdCBwcm9wcyxcbiAgICAgIC8vIGFuZCB3aXRoIG9ubHkgdGhlIGRlZmF1bHQgc2hhbGxvdyBjb21wYXJpc29uLCB3ZSB1cGdyYWRlIGl0XG4gICAgICAvLyB0byBhIFNpbXBsZU1lbW9Db21wb25lbnQgdG8gYWxsb3cgZmFzdCBwYXRoIHVwZGF0ZXMuXG5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MudGFnID0gU2ltcGxlTWVtb0NvbXBvbmVudDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlZFR5cGU7XG5cbiAgICAgIHtcbiAgICAgICAgdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCB0eXBlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlc29sdmVkVHlwZSwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAge1xuICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICAvLyBJbm5lciBtZW1vIGNvbXBvbmVudCBwcm9wcyBhcmVuJ3QgY3VycmVudGx5IHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50LlxuICAgICAgICAvLyBXZSBjb3VsZCBtb3ZlIGl0IHRoZXJlLCBidXQgd2UnZCBzdGlsbCBuZWVkIHRoaXMgZm9yIGxhenkgY29kZSBwYXRoLlxuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkID0gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKENvbXBvbmVudC50eXBlLCBudWxsLCBuZXh0UHJvcHMsIHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy5tb2RlLCByZW5kZXJMYW5lcyk7XG4gICAgY2hpbGQucmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuICAgIGNoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY2hpbGQ7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAge1xuICAgIHZhciBfdHlwZSA9IENvbXBvbmVudC50eXBlO1xuICAgIHZhciBfaW5uZXJQcm9wVHlwZXMgPSBfdHlwZS5wcm9wVHlwZXM7XG5cbiAgICBpZiAoX2lubmVyUHJvcFR5cGVzKSB7XG4gICAgICAvLyBJbm5lciBtZW1vIGNvbXBvbmVudCBwcm9wcyBhcmVuJ3QgY3VycmVudGx5IHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50LlxuICAgICAgLy8gV2UgY291bGQgbW92ZSBpdCB0aGVyZSwgYnV0IHdlJ2Qgc3RpbGwgbmVlZCB0aGlzIGZvciBsYXp5IGNvZGUgcGF0aC5cbiAgICAgIGNoZWNrUHJvcFR5cGVzKF9pbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoX3R5cGUpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgY3VycmVudENoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gVGhpcyBpcyBhbHdheXMgZXhhY3RseSBvbmUgY2hpbGRcblxuICB2YXIgaGFzU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0ID0gY2hlY2tTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQoY3VycmVudCwgcmVuZGVyTGFuZXMpO1xuXG4gIGlmICghaGFzU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KSB7XG4gICAgLy8gVGhpcyB3aWxsIGJlIHRoZSBwcm9wcyB3aXRoIHJlc29sdmVkIGRlZmF1bHRQcm9wcyxcbiAgICAvLyB1bmxpa2UgY3VycmVudC5tZW1vaXplZFByb3BzIHdoaWNoIHdpbGwgYmUgdGhlIHVucmVzb2x2ZWQgb25lcy5cbiAgICB2YXIgcHJldlByb3BzID0gY3VycmVudENoaWxkLm1lbW9pemVkUHJvcHM7IC8vIERlZmF1bHQgdG8gc2hhbGxvdyBjb21wYXJpc29uXG5cbiAgICB2YXIgY29tcGFyZSA9IENvbXBvbmVudC5jb21wYXJlO1xuICAgIGNvbXBhcmUgPSBjb21wYXJlICE9PSBudWxsID8gY29tcGFyZSA6IHNoYWxsb3dFcXVhbDtcblxuICAgIGlmIChjb21wYXJlKHByZXZQcm9wcywgbmV4dFByb3BzKSAmJiBjdXJyZW50LnJlZiA9PT0gd29ya0luUHJvZ3Jlc3MucmVmKSB7XG4gICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICB2YXIgbmV3Q2hpbGQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIG5leHRQcm9wcyk7XG4gIG5ld0NoaWxkLnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgbmV3Q2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV3Q2hpbGQ7XG4gIHJldHVybiBuZXdDaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IGN1cnJlbnQgY2FuIGJlIG5vbi1udWxsIGhlcmUgZXZlbiBpZiB0aGUgY29tcG9uZW50XG4gIC8vIGhhc24ndCB5ZXQgbW91bnRlZC4gVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGlubmVyIHJlbmRlciBzdXNwZW5kcy5cbiAgLy8gV2UnbGwgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHRoaXMgaXMgZmluZSBvciBjYW4gY2F1c2UgaXNzdWVzLlxuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIG91dGVyTWVtb1R5cGUgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZTtcblxuICAgICAgaWYgKG91dGVyTWVtb1R5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgICAvLyBXZSB3YXJuIHdoZW4geW91IGRlZmluZSBwcm9wVHlwZXMgb24gbGF6eSgpXG4gICAgICAgIC8vIHNvIGxldCdzIGp1c3Qgc2tpcCBvdmVyIGl0IHRvIGZpbmQgbWVtbygpIG91dGVyIHdyYXBwZXIuXG4gICAgICAgIC8vIElubmVyIHByb3BzIGZvciBtZW1vIGFyZSB2YWxpZGF0ZWQgbGF0ZXIuXG4gICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gb3V0ZXJNZW1vVHlwZTtcbiAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvdXRlck1lbW9UeXBlID0gaW5pdChwYXlsb2FkKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIG91dGVyTWVtb1R5cGUgPSBudWxsO1xuICAgICAgICB9IC8vIElubmVyIHByb3BUeXBlcyB3aWxsIGJlIHZhbGlkYXRlZCBpbiB0aGUgZnVuY3Rpb24gY29tcG9uZW50IHBhdGguXG5cblxuICAgICAgICB2YXIgb3V0ZXJQcm9wVHlwZXMgPSBvdXRlck1lbW9UeXBlICYmIG91dGVyTWVtb1R5cGUucHJvcFR5cGVzO1xuXG4gICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgIGNoZWNrUHJvcFR5cGVzKG91dGVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIChTaW1wbGVNZW1vQ29tcG9uZW50IGhhcyBubyBkZWZhdWx0UHJvcHMpXG4gICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUob3V0ZXJNZW1vVHlwZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgcHJldlByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuXG4gICAgaWYgKHNoYWxsb3dFcXVhbChwcmV2UHJvcHMsIG5leHRQcm9wcykgJiYgY3VycmVudC5yZWYgPT09IHdvcmtJblByb2dyZXNzLnJlZiAmJiAoIC8vIFByZXZlbnQgYmFpbG91dCBpZiB0aGUgaW1wbGVtZW50YXRpb24gY2hhbmdlZCBkdWUgdG8gaG90IHJlbG9hZC5cbiAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9PT0gY3VycmVudC50eXBlICkpIHtcbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTsgLy8gVGhlIHByb3BzIGFyZSBzaGFsbG93bHkgZXF1YWwuIFJldXNlIHRoZSBwcmV2aW91cyBwcm9wcyBvYmplY3QsIGxpa2Ugd2VcbiAgICAgIC8vIHdvdWxkIGR1cmluZyBhIG5vcm1hbCBmaWJlciBiYWlsb3V0LlxuICAgICAgLy9cbiAgICAgIC8vIFdlIGRvbid0IGhhdmUgc3Ryb25nIGd1YXJhbnRlZXMgdGhhdCB0aGUgcHJvcHMgb2JqZWN0IGlzIHJlZmVyZW50aWFsbHlcbiAgICAgIC8vIGVxdWFsIGR1cmluZyB1cGRhdGVzIHdoZXJlIHdlIGNhbid0IGJhaWwgb3V0IGFueXdheSDigJQgbGlrZSBpZiB0aGUgcHJvcHNcbiAgICAgIC8vIGFyZSBzaGFsbG93bHkgZXF1YWwsIGJ1dCB0aGVyZSdzIGEgbG9jYWwgc3RhdGUgb3IgY29udGV4dCB1cGRhdGUgaW4gdGhlXG4gICAgICAvLyBzYW1lIGJhdGNoLlxuICAgICAgLy9cbiAgICAgIC8vIEhvd2V2ZXIsIGFzIGEgcHJpbmNpcGxlLCB3ZSBzaG91bGQgYWltIHRvIG1ha2UgdGhlIGJlaGF2aW9yIGNvbnNpc3RlbnRcbiAgICAgIC8vIGFjcm9zcyBkaWZmZXJlbnQgd2F5cyBvZiBtZW1vaXppbmcgYSBjb21wb25lbnQuIEZvciBleGFtcGxlLCBSZWFjdC5tZW1vXG4gICAgICAvLyBoYXMgYSBkaWZmZXJlbnQgaW50ZXJuYWwgRmliZXIgbGF5b3V0IGlmIHlvdSBwYXNzIGEgbm9ybWFsIGZ1bmN0aW9uXG4gICAgICAvLyBjb21wb25lbnQgKFNpbXBsZU1lbW9Db21wb25lbnQpIHZlcnN1cyBpZiB5b3UgcGFzcyBhIGRpZmZlcmVudCB0eXBlXG4gICAgICAvLyBsaWtlIGZvcndhcmRSZWYgKE1lbW9Db21wb25lbnQpLiBCdXQgdGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuXG4gICAgICAvLyBXcmFwcGluZyBhIGNvbXBvbmVudCBpbiBmb3J3YXJkUmVmIChvciBSZWFjdC5sYXp5LCBldGMpIHNob3VsZG4ndFxuICAgICAgLy8gYWZmZWN0IHdoZXRoZXIgdGhlIHByb3BzIG9iamVjdCBpcyByZXVzZWQgZHVyaW5nIGEgYmFpbG91dC5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzID0gbmV4dFByb3BzID0gcHJldlByb3BzO1xuXG4gICAgICBpZiAoIWNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKSkge1xuICAgICAgICAvLyBUaGUgcGVuZGluZyBsYW5lcyB3ZXJlIGNsZWFyZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBiZWdpbldvcmsuIFdlJ3JlXG4gICAgICAgIC8vIGFib3V0IHRvIGJhaWwgb3V0LCBidXQgdGhlcmUgbWlnaHQgYmUgb3RoZXIgbGFuZXMgdGhhdCB3ZXJlbid0XG4gICAgICAgIC8vIGluY2x1ZGVkIGluIHRoZSBjdXJyZW50IHJlbmRlci4gVXN1YWxseSwgdGhlIHByaW9yaXR5IGxldmVsIG9mIHRoZVxuICAgICAgICAvLyByZW1haW5pbmcgdXBkYXRlcyBpcyBhY2N1bXVsYXRlZCBkdXJpbmcgdGhlIGV2YWx1YXRpb24gb2YgdGhlXG4gICAgICAgIC8vIGNvbXBvbmVudCAoaS5lLiB3aGVuIHByb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZSkuIEJ1dCBzaW5jZSBzaW5jZVxuICAgICAgICAvLyB3ZSdyZSBiYWlsaW5nIG91dCBlYXJseSAqd2l0aG91dCogZXZhbHVhdGluZyB0aGUgY29tcG9uZW50LCB3ZSBuZWVkXG4gICAgICAgIC8vIHRvIGFjY291bnQgZm9yIGl0IGhlcmUsIHRvby4gUmVzZXQgdG8gdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGZpYmVyLlxuICAgICAgICAvLyBOT1RFOiBUaGlzIG9ubHkgYXBwbGllcyB0byBTaW1wbGVNZW1vQ29tcG9uZW50LCBub3QgTWVtb0NvbXBvbmVudCxcbiAgICAgICAgLy8gYmVjYXVzZSBhIE1lbW9Db21wb25lbnQgZmliZXIgZG9lcyBub3QgaGF2ZSBob29rcyBvciBhbiB1cGRhdGUgcXVldWU7XG4gICAgICAgIC8vIHJhdGhlciwgaXQgd3JhcHMgYXJvdW5kIGFuIGlubmVyIGNvbXBvbmVudCwgd2hpY2ggbWF5IG9yIG1heSBub3RcbiAgICAgICAgLy8gY29udGFpbnMgaG9va3MuXG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhlIHJlc2V0IGF0IGluIGJlZ2luV29yayBvdXQgb2YgdGhlIGNvbW1vbiBwYXRoIHNvIHRoYXRcbiAgICAgICAgLy8gdGhpcyBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGN1cnJlbnQubGFuZXM7XG4gICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IGVsc2UgaWYgKChjdXJyZW50LmZsYWdzICYgRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSB0aGF0IG9ubHkgZXhpc3RzIGZvciBsZWdhY3kgbW9kZS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzE5MjE2LlxuICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkU3RhdGUgOiBudWxsO1xuXG4gIGlmIChuZXh0UHJvcHMubW9kZSA9PT0gJ2hpZGRlbicgfHwgZW5hYmxlTGVnYWN5SGlkZGVuICkge1xuICAgIC8vIFJlbmRlcmluZyBhIGhpZGRlbiB0cmVlLlxuICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICAvLyBJbiBsZWdhY3kgc3luYyBtb2RlLCBkb24ndCBkZWZlciB0aGUgc3VidHJlZS4gUmVuZGVyIGl0IG5vdy5cbiAgICAgIC8vIFRPRE86IENvbnNpZGVyIGhvdyBPZmZzY3JlZW4gc2hvdWxkIHdvcmsgd2l0aCB0cmFuc2l0aW9ucyBpbiB0aGUgZnV0dXJlXG4gICAgICB2YXIgbmV4dFN0YXRlID0ge1xuICAgICAgICBiYXNlTGFuZXM6IE5vTGFuZXMsXG4gICAgICAgIGNhY2hlUG9vbDogbnVsbCxcbiAgICAgICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV4dFN0YXRlO1xuXG4gICAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICB9IGVsc2UgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCBPZmZzY3JlZW5MYW5lKSkge1xuICAgICAgdmFyIHNwYXduZWRDYWNoZVBvb2wgPSBudWxsOyAvLyBXZSdyZSBoaWRkZW4sIGFuZCB3ZSdyZSBub3QgcmVuZGVyaW5nIGF0IE9mZnNjcmVlbi4gV2Ugd2lsbCBiYWlsIG91dFxuICAgICAgLy8gYW5kIHJlc3VtZSB0aGlzIHRyZWUgbGF0ZXIuXG5cbiAgICAgIHZhciBuZXh0QmFzZUxhbmVzO1xuXG4gICAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBwcmV2QmFzZUxhbmVzID0gcHJldlN0YXRlLmJhc2VMYW5lcztcbiAgICAgICAgbmV4dEJhc2VMYW5lcyA9IG1lcmdlTGFuZXMocHJldkJhc2VMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dEJhc2VMYW5lcyA9IHJlbmRlckxhbmVzO1xuICAgICAgfSAvLyBTY2hlZHVsZSB0aGlzIGZpYmVyIHRvIHJlLXJlbmRlciBhdCBvZmZzY3JlZW4gcHJpb3JpdHkuIFRoZW4gYmFpbG91dC5cblxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBsYW5lVG9MYW5lcyhPZmZzY3JlZW5MYW5lKTtcbiAgICAgIHZhciBfbmV4dFN0YXRlID0ge1xuICAgICAgICBiYXNlTGFuZXM6IG5leHRCYXNlTGFuZXMsXG4gICAgICAgIGNhY2hlUG9vbDogc3Bhd25lZENhY2hlUG9vbCxcbiAgICAgICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gX25leHRTdGF0ZTtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICAgIC8vIHRvIGF2b2lkIGEgcHVzaC9wb3AgbWlzYWxpZ25tZW50LlxuXG5cbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgbmV4dEJhc2VMYW5lcyk7XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBzZWNvbmQgcmVuZGVyLiBUaGUgc3Vycm91bmRpbmcgdmlzaWJsZSBjb250ZW50IGhhcyBhbHJlYWR5XG4gICAgICAvLyBjb21taXR0ZWQuIE5vdyB3ZSByZXN1bWUgcmVuZGVyaW5nIHRoZSBoaWRkZW4gdHJlZS5cbiAgICAgIC8vIFJlbmRlcmluZyBhdCBvZmZzY3JlZW4sIHNvIHdlIGNhbiBjbGVhciB0aGUgYmFzZSBsYW5lcy5cbiAgICAgIHZhciBfbmV4dFN0YXRlMiA9IHtcbiAgICAgICAgYmFzZUxhbmVzOiBOb0xhbmVzLFxuICAgICAgICBjYWNoZVBvb2w6IG51bGwsXG4gICAgICAgIHRyYW5zaXRpb25zOiBudWxsXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IF9uZXh0U3RhdGUyOyAvLyBQdXNoIHRoZSBsYW5lcyB0aGF0IHdlcmUgc2tpcHBlZCB3aGVuIHdlIGJhaWxlZCBvdXQuXG5cbiAgICAgIHZhciBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBwcmV2U3RhdGUgIT09IG51bGwgPyBwcmV2U3RhdGUuYmFzZUxhbmVzIDogcmVuZGVyTGFuZXM7XG5cbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVuZGVyaW5nIGEgdmlzaWJsZSB0cmVlLlxuICAgIHZhciBfc3VidHJlZVJlbmRlckxhbmVzO1xuXG4gICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgZ29pbmcgZnJvbSBoaWRkZW4gLT4gdmlzaWJsZS5cbiAgICAgIF9zdWJ0cmVlUmVuZGVyTGFuZXMgPSBtZXJnZUxhbmVzKHByZXZTdGF0ZS5iYXNlTGFuZXMsIHJlbmRlckxhbmVzKTtcblxuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIHdlcmVuJ3QgcHJldmlvdXNseSBoaWRkZW4sIGFuZCB3ZSBzdGlsbCBhcmVuJ3QsIHNvIHRoZXJlJ3Mgbm90aGluZ1xuICAgICAgLy8gc3BlY2lhbCB0byBkby4gTmVlZCB0byBwdXNoIHRvIHRoZSBzdGFjayByZWdhcmRsZXNzLCB0aG91Z2gsIHRvIGF2b2lkXG4gICAgICAvLyBhIHB1c2gvcG9wIG1pc2FsaWdubWVudC5cbiAgICAgIF9zdWJ0cmVlUmVuZGVyTGFuZXMgPSByZW5kZXJMYW5lcztcbiAgICB9XG5cbiAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIF9zdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59IC8vIE5vdGU6IFRoZXNlIGhhcHBlbiB0byBoYXZlIGlkZW50aWNhbCBiZWdpbiBwaGFzZXMsIGZvciBub3cuIFdlIHNob3VsZG4ndCBob2xkXG5cbmZ1bmN0aW9uIHVwZGF0ZUZyYWdtZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVByb2ZpbGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuXG4gICAge1xuICAgICAgLy8gUmVzZXQgZWZmZWN0IGR1cmF0aW9ucyBmb3IgdGhlIG5leHQgZXZlbnR1YWwgZWZmZWN0IHBoYXNlLlxuICAgICAgLy8gVGhlc2UgYXJlIHJlc2V0IGR1cmluZyByZW5kZXIgdG8gYWxsb3cgdGhlIERldlRvb2xzIGNvbW1pdCBob29rIGEgY2hhbmNlIHRvIHJlYWQgdGhlbSxcbiAgICAgIHZhciBzdGF0ZU5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgfVxuICB9XG5cbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgdmFyIHJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCAmJiByZWYgIT09IG51bGwgfHwgY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnJlZiAhPT0gcmVmKSB7XG4gICAgLy8gU2NoZWR1bGUgYSBSZWYgZWZmZWN0XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmO1xuXG4gICAge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmU3RhdGljO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSk7XG4gICAgY29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgbmV4dENoaWxkcmVuO1xuICB2YXIgaGFzSWQ7XG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgIWRpZFJlY2VpdmVVcGRhdGUpIHtcbiAgICBiYWlsb3V0SG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgaGFzSWQpIHtcbiAgICBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgLy8gVGhpcyBpcyB1c2VkIGJ5IERldlRvb2xzIHRvIGZvcmNlIGEgYm91bmRhcnkgdG8gZXJyb3IuXG4gICAgc3dpdGNoIChzaG91bGRFcnJvcih3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgIGNhc2UgZmFsc2U6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX2luc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICAgIHZhciBjdG9yID0gd29ya0luUHJvZ3Jlc3MudHlwZTsgLy8gVE9ETyBUaGlzIHdheSBvZiByZXNldHRpbmcgdGhlIGVycm9yIGJvdW5kYXJ5IHN0YXRlIGlzIGEgaGFjay5cbiAgICAgICAgICAvLyBJcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcz9cblxuICAgICAgICAgIHZhciB0ZW1wSW5zdGFuY2UgPSBuZXcgY3Rvcih3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLCBfaW5zdGFuY2UuY29udGV4dCk7XG4gICAgICAgICAgdmFyIHN0YXRlID0gdGVtcEluc3RhbmNlLnN0YXRlO1xuXG4gICAgICAgICAgX2luc3RhbmNlLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKF9pbnN0YW5jZSwgc3RhdGUsIG51bGwpO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSB0cnVlOlxuICAgICAgICB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTaG91bGRDYXB0dXJlOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuXG4gICAgICAgICAgdmFyIGVycm9yJDEgPSBuZXcgRXJyb3IoJ1NpbXVsYXRlZCBlcnJvciBjb21pbmcgZnJvbSBEZXZUb29scycpO1xuICAgICAgICAgIHZhciBsYW5lID0gcGlja0FyYml0cmFyeUxhbmUocmVuZGVyTGFuZXMpO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcywgbGFuZSk7IC8vIFNjaGVkdWxlIHRoZSBlcnJvciBib3VuZGFyeSB0byByZS1yZW5kZXIgdXNpbmcgdXBkYXRlZCBzdGF0ZVxuXG4gICAgICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKGVycm9yJDEsIHdvcmtJblByb2dyZXNzKSwgbGFuZSk7XG4gICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCB1cGRhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlcztcblxuICAgICAgaWYgKGlubmVyUHJvcFR5cGVzKSB7XG4gICAgICAgIGNoZWNrUHJvcFR5cGVzKGlubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBQdXNoIGNvbnRleHQgcHJvdmlkZXJzIGVhcmx5IHRvIHByZXZlbnQgY29udGV4dCBzdGFjayBtaXNtYXRjaGVzLlxuICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gIC8vIFdlIHdpbGwgaW52YWxpZGF0ZSB0aGUgY2hpbGQgY29udGV4dCBpbiBmaW5pc2hDbGFzc0NvbXBvbmVudCgpIHJpZ2h0IGFmdGVyIHJlbmRlcmluZy5cblxuXG4gIHZhciBoYXNDb250ZXh0O1xuXG4gIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgaGFzQ29udGV4dCA9IHRydWU7XG4gICAgcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gZWxzZSB7XG4gICAgaGFzQ29udGV4dCA9IGZhbHNlO1xuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICB2YXIgc2hvdWxkVXBkYXRlO1xuXG4gIGlmIChpbnN0YW5jZSA9PT0gbnVsbCkge1xuICAgIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpOyAvLyBJbiB0aGUgaW5pdGlhbCBwYXNzIHdlIG1pZ2h0IG5lZWQgdG8gY29uc3RydWN0IHRoZSBpbnN0YW5jZS5cblxuICAgIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgc2hvdWxkVXBkYXRlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gSW4gYSByZXN1bWUsIHdlJ2xsIGFscmVhZHkgaGF2ZSBhbiBpbnN0YW5jZSB3ZSBjYW4gcmV1c2UuXG4gICAgc2hvdWxkVXBkYXRlID0gcmVzdW1lTW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIHNob3VsZFVwZGF0ZSA9IHVwZGF0ZUNsYXNzSW5zdGFuY2UoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgbmV4dFVuaXRPZldvcmsgPSBmaW5pc2hDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBzaG91bGRVcGRhdGUsIGhhc0NvbnRleHQsIHJlbmRlckxhbmVzKTtcblxuICB7XG4gICAgdmFyIGluc3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoc2hvdWxkVXBkYXRlICYmIGluc3QucHJvcHMgIT09IG5leHRQcm9wcykge1xuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgIGVycm9yKCdJdCBsb29rcyBsaWtlICVzIGlzIHJlYXNzaWduaW5nIGl0cyBvd24gYHRoaXMucHJvcHNgIHdoaWxlIHJlbmRlcmluZy4gJyArICdUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGNhbiBsZWFkIHRvIGNvbmZ1c2luZyBidWdzLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdhIGNvbXBvbmVudCcpO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dFVuaXRPZldvcms7XG59XG5cbmZ1bmN0aW9uIGZpbmlzaENsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHNob3VsZFVwZGF0ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gUmVmcyBzaG91bGQgdXBkYXRlIGV2ZW4gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2VcbiAgbWFya1JlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBkaWRDYXB0dXJlRXJyb3IgPSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICBpZiAoIXNob3VsZFVwZGF0ZSAmJiAhZGlkQ2FwdHVyZUVycm9yKSB7XG4gICAgLy8gQ29udGV4dCBwcm92aWRlcnMgc2hvdWxkIGRlZmVyIHRvIHNDVSBmb3IgcmVuZGVyaW5nXG4gICAgaWYgKGhhc0NvbnRleHQpIHtcbiAgICAgIGludmFsaWRhdGVDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7IC8vIFJlcmVuZGVyXG5cbiAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gIHZhciBuZXh0Q2hpbGRyZW47XG5cbiAgaWYgKGRpZENhcHR1cmVFcnJvciAmJiB0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIElmIHdlIGNhcHR1cmVkIGFuIGVycm9yLCBidXQgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIGlzIG5vdCBkZWZpbmVkLFxuICAgIC8vIHVubW91bnQgYWxsIHRoZSBjaGlsZHJlbi4gY29tcG9uZW50RGlkQ2F0Y2ggd2lsbCBzY2hlZHVsZSBhbiB1cGRhdGUgdG9cbiAgICAvLyByZS1yZW5kZXIgYSBmYWxsYmFjay4gVGhpcyBpcyB0ZW1wb3JhcnkgdW50aWwgd2UgbWlncmF0ZSBldmVyeW9uZSB0b1xuICAgIC8vIHRoZSBuZXcgQVBJLlxuICAgIC8vIFRPRE86IFdhcm4gaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAgICBuZXh0Q2hpbGRyZW4gPSBudWxsO1xuXG4gICAge1xuICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgICAgbmV4dENoaWxkcmVuID0gaW5zdGFuY2UucmVuZGVyKCk7XG5cbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpbnN0YW5jZS5yZW5kZXIoKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gICAgfVxuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgZGlkQ2FwdHVyZUVycm9yKSB7XG4gICAgLy8gSWYgd2UncmUgcmVjb3ZlcmluZyBmcm9tIGFuIGVycm9yLCByZWNvbmNpbGUgd2l0aG91dCByZXVzaW5nIGFueSBvZlxuICAgIC8vIHRoZSBleGlzdGluZyBjaGlsZHJlbi4gQ29uY2VwdHVhbGx5LCB0aGUgbm9ybWFsIGNoaWxkcmVuIGFuZCB0aGUgY2hpbGRyZW5cbiAgICAvLyB0aGF0IGFyZSBzaG93biBvbiBlcnJvciBhcmUgdHdvIGRpZmZlcmVudCBzZXRzLCBzbyB3ZSBzaG91bGRuJ3QgcmV1c2VcbiAgICAvLyBub3JtYWwgY2hpbGRyZW4gZXZlbiBpZiB0aGVpciBpZGVudGl0aWVzIG1hdGNoLlxuICAgIGZvcmNlVW5tb3VudEN1cnJlbnRBbmRSZWNvbmNpbGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSAvLyBNZW1vaXplIHN0YXRlIHVzaW5nIHRoZSB2YWx1ZXMgd2UganVzdCB1c2VkIHRvIHJlbmRlci5cbiAgLy8gVE9ETzogUmVzdHJ1Y3R1cmUgc28gd2UgbmV2ZXIgcmVhZCB2YWx1ZXMgZnJvbSB0aGUgaW5zdGFuY2UuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGU7IC8vIFRoZSBjb250ZXh0IG1pZ2h0IGhhdmUgY2hhbmdlZCBzbyB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIGl0LlxuXG4gIGlmIChoYXNDb250ZXh0KSB7XG4gICAgaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcykge1xuICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICBpZiAocm9vdC5wZW5kaW5nQ29udGV4dCkge1xuICAgIHB1c2hUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MsIHJvb3QucGVuZGluZ0NvbnRleHQsIHJvb3QucGVuZGluZ0NvbnRleHQgIT09IHJvb3QuY29udGV4dCk7XG4gIH0gZWxzZSBpZiAocm9vdC5jb250ZXh0KSB7XG4gICAgLy8gU2hvdWxkIGFsd2F5cyBiZSBzZXRcbiAgICBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzLCByb290LmNvbnRleHQsIGZhbHNlKTtcbiAgfVxuXG4gIHB1c2hIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzLCByb290LmNvbnRhaW5lckluZm8pO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVIb3N0Um9vdChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBoYXZlIGEgY3VycmVudCBmaWJlci4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgfVxuXG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmV2U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgcHJldkNoaWxkcmVuID0gcHJldlN0YXRlLmVsZW1lbnQ7XG4gIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5leHRQcm9wcywgbnVsbCwgcmVuZGVyTGFuZXMpO1xuICB2YXIgbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIC8vIGJlaW5nIGNhbGxlZCBcImVsZW1lbnRcIi5cblxuXG4gIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0U3RhdGUuZWxlbWVudDtcblxuICBpZiAoIHByZXZTdGF0ZS5pc0RlaHlkcmF0ZWQpIHtcbiAgICAvLyBUaGlzIGlzIGEgaHlkcmF0aW9uIHJvb3Qgd2hvc2Ugc2hlbGwgaGFzIG5vdCB5ZXQgaHlkcmF0ZWQuIFdlIHNob3VsZFxuICAgIC8vIGF0dGVtcHQgdG8gaHlkcmF0ZS5cbiAgICAvLyBGbGlwIGlzRGVoeWRyYXRlZCB0byBmYWxzZSB0byBpbmRpY2F0ZSB0aGF0IHdoZW4gdGhpcyByZW5kZXJcbiAgICAvLyBmaW5pc2hlcywgdGhlIHJvb3Qgd2lsbCBubyBsb25nZXIgYmUgZGVoeWRyYXRlZC5cbiAgICB2YXIgb3ZlcnJpZGVTdGF0ZSA9IHtcbiAgICAgIGVsZW1lbnQ6IG5leHRDaGlsZHJlbixcbiAgICAgIGlzRGVoeWRyYXRlZDogZmFsc2UsXG4gICAgICBjYWNoZTogbmV4dFN0YXRlLmNhY2hlLFxuICAgICAgcGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczogbmV4dFN0YXRlLnBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXMsXG4gICAgICB0cmFuc2l0aW9uczogbmV4dFN0YXRlLnRyYW5zaXRpb25zXG4gICAgfTtcbiAgICB2YXIgdXBkYXRlUXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTsgLy8gYGJhc2VTdGF0ZWAgY2FuIGFsd2F5cyBiZSB0aGUgbGFzdCBzdGF0ZSBiZWNhdXNlIHRoZSByb290IGRvZXNuJ3RcbiAgICAvLyBoYXZlIHJlZHVjZXIgZnVuY3Rpb25zIHNvIGl0IGRvZXNuJ3QgbmVlZCByZWJhc2luZy5cblxuICAgIHVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IG92ZXJyaWRlU3RhdGU7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG92ZXJyaWRlU3RhdGU7XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JjZUNsaWVudFJlbmRlcikge1xuICAgICAgLy8gU29tZXRoaW5nIGVycm9yZWQgZHVyaW5nIGEgcHJldmlvdXMgYXR0ZW1wdCB0byBoeWRyYXRlIHRoZSBzaGVsbCwgc28gd2VcbiAgICAgIC8vIGZvcmNlZCBhIGNsaWVudCByZW5kZXIuXG4gICAgICB2YXIgcmVjb3ZlcmFibGVFcnJvciA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKG5ldyBFcnJvcignVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGh5ZHJhdGluZy4gQmVjYXVzZSB0aGUgZXJyb3IgaGFwcGVuZWQgb3V0c2lkZSAnICsgJ29mIGEgU3VzcGVuc2UgYm91bmRhcnksIHRoZSBlbnRpcmUgcm9vdCB3aWxsIHN3aXRjaCB0byAnICsgJ2NsaWVudCByZW5kZXJpbmcuJyksIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBtb3VudEhvc3RSb290V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcik7XG4gICAgfSBlbHNlIGlmIChuZXh0Q2hpbGRyZW4gIT09IHByZXZDaGlsZHJlbikge1xuICAgICAgdmFyIF9yZWNvdmVyYWJsZUVycm9yID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIobmV3IEVycm9yKCdUaGlzIHJvb3QgcmVjZWl2ZWQgYW4gZWFybHkgdXBkYXRlLCBiZWZvcmUgYW55dGhpbmcgd2FzIGFibGUgJyArICdoeWRyYXRlLiBTd2l0Y2hlZCB0aGUgZW50aXJlIHJvb3QgdG8gY2xpZW50IHJlbmRlcmluZy4nKSwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICByZXR1cm4gbW91bnRIb3N0Um9vdFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMsIF9yZWNvdmVyYWJsZUVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIG91dGVybW9zdCBzaGVsbCBoYXMgbm90IGh5ZHJhdGVkIHlldC4gU3RhcnQgaHlkcmF0aW5nLlxuICAgICAgZW50ZXJIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIHZhciBjaGlsZCA9IG1vdW50Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjaGlsZDtcbiAgICAgIHZhciBub2RlID0gY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIC8vIE1hcmsgZWFjaCBjaGlsZCBhcyBoeWRyYXRpbmcuIFRoaXMgaXMgYSBmYXN0IHBhdGggdG8ga25vdyB3aGV0aGVyIHRoaXNcbiAgICAgICAgLy8gdHJlZSBpcyBwYXJ0IG9mIGEgaHlkcmF0aW5nIHRyZWUuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBjaGlsZFxuICAgICAgICAvLyBub2RlIGhhcyBmdWxseSBtb3VudGVkIHlldCwgYW5kIGZvciBzY2hlZHVsaW5nIGV2ZW50IHJlcGxheWluZy5cbiAgICAgICAgLy8gQ29uY2VwdHVhbGx5IHRoaXMgaXMgc2ltaWxhciB0byBQbGFjZW1lbnQgaW4gdGhhdCBhIG5ldyBzdWJ0cmVlIGlzXG4gICAgICAgIC8vIGluc2VydGVkIGludG8gdGhlIFJlYWN0IHRyZWUgaGVyZS4gSXQganVzdCBoYXBwZW5zIHRvIG5vdCBuZWVkIERPTVxuICAgICAgICAvLyBtdXRhdGlvbnMgYmVjYXVzZSBpdCBhbHJlYWR5IGV4aXN0cy5cbiAgICAgICAgbm9kZS5mbGFncyA9IG5vZGUuZmxhZ3MgJiB+UGxhY2VtZW50IHwgSHlkcmF0aW5nO1xuICAgICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBSb290IGlzIG5vdCBkZWh5ZHJhdGVkLiBFaXRoZXIgdGhpcyBpcyBhIGNsaWVudC1vbmx5IHJvb3QsIG9yIGl0XG4gICAgLy8gYWxyZWFkeSBoeWRyYXRlZC5cbiAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG5cbiAgICBpZiAobmV4dENoaWxkcmVuID09PSBwcmV2Q2hpbGRyZW4pIHtcbiAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBtb3VudEhvc3RSb290V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcikge1xuICAvLyBSZXZlcnQgdG8gY2xpZW50IHJlbmRlcmluZy5cbiAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICBxdWV1ZUh5ZHJhdGlvbkVycm9yKHJlY292ZXJhYmxlRXJyb3IpO1xuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlcjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHB1c2hIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbnVsbDtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIGlzRGlyZWN0VGV4dENoaWxkID0gc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgbmV4dFByb3BzKTtcblxuICBpZiAoaXNEaXJlY3RUZXh0Q2hpbGQpIHtcbiAgICAvLyBXZSBzcGVjaWFsIGNhc2UgYSBkaXJlY3QgdGV4dCBjaGlsZCBvZiBhIGhvc3Qgbm9kZS4gVGhpcyBpcyBhIGNvbW1vblxuICAgIC8vIGNhc2UuIFdlIHdvbid0IGhhbmRsZSBpdCBhcyBhIHJlaWZpZWQgY2hpbGQuIFdlIHdpbGwgaW5zdGVhZCBoYW5kbGVcbiAgICAvLyB0aGlzIGluIHRoZSBob3N0IGVudmlyb25tZW50IHRoYXQgYWxzbyBoYXMgYWNjZXNzIHRvIHRoaXMgcHJvcC4gVGhhdFxuICAgIC8vIGF2b2lkcyBhbGxvY2F0aW5nIGFub3RoZXIgSG9zdFRleHQgZmliZXIgYW5kIHRyYXZlcnNpbmcgaXQuXG4gICAgbmV4dENoaWxkcmVuID0gbnVsbDtcbiAgfSBlbHNlIGlmIChwcmV2UHJvcHMgIT09IG51bGwgJiYgc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgcHJldlByb3BzKSkge1xuICAgIC8vIElmIHdlJ3JlIHN3aXRjaGluZyBmcm9tIGEgZGlyZWN0IHRleHQgY2hpbGQgdG8gYSBub3JtYWwgY2hpbGQsIG9yIHRvXG4gICAgLy8gZW1wdHksIHdlIG5lZWQgdG8gc2NoZWR1bGUgdGhlIHRleHQgY29udGVudCB0byBiZSByZXNldC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDb250ZW50UmVzZXQ7XG4gIH1cblxuICBtYXJrUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvc3RUZXh0KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpO1xuICB9IC8vIE5vdGhpbmcgdG8gZG8gaGVyZS4gVGhpcyBpcyB0ZXJtaW5hbC4gV2UnbGwgZG8gdGhlIGNvbXBsZXRpb24gc3RlcFxuICAvLyBpbW1lZGlhdGVseSBhZnRlci5cblxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBtb3VudExhenlDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBlbGVtZW50VHlwZSwgcmVuZGVyTGFuZXMpIHtcbiAgcmVzZXRTdXNwZW5kZWRDdXJyZW50T25Nb3VudEluTGVnYWN5TW9kZShfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgcHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBsYXp5Q29tcG9uZW50ID0gZWxlbWVudFR5cGU7XG4gIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuICB2YXIgQ29tcG9uZW50ID0gaW5pdChwYXlsb2FkKTsgLy8gU3RvcmUgdGhlIHVud3JhcHBlZCBjb21wb25lbnQgaW4gdGhlIHR5cGUuXG5cbiAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudDtcbiAgdmFyIHJlc29sdmVkVGFnID0gd29ya0luUHJvZ3Jlc3MudGFnID0gcmVzb2x2ZUxhenlDb21wb25lbnRUYWcoQ29tcG9uZW50KTtcbiAgdmFyIHJlc29sdmVkUHJvcHMgPSByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudCwgcHJvcHMpO1xuICB2YXIgY2hpbGQ7XG5cbiAgc3dpdGNoIChyZXNvbHZlZFRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50ID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUNsYXNzQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUZvcndhcmRSZWYobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG5cbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgcmVzb2x2ZWRQcm9wcywgLy8gUmVzb2x2ZWQgZm9yIG91dGVyIG9ubHlcbiAgICAgICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVNZW1vQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LnR5cGUsIHJlc29sdmVkUHJvcHMpLCAvLyBUaGUgaW5uZXIgdHlwZSBjYW4gaGF2ZSBkZWZhdWx0cyB0b29cbiAgICAgICAgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG4gIH1cblxuICB2YXIgaGludCA9ICcnO1xuXG4gIHtcbiAgICBpZiAoQ29tcG9uZW50ICE9PSBudWxsICYmIHR5cGVvZiBDb21wb25lbnQgPT09ICdvYmplY3QnICYmIENvbXBvbmVudC4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICBoaW50ID0gJyBEaWQgeW91IHdyYXAgYSBjb21wb25lbnQgaW4gUmVhY3QubGF6eSgpIG1vcmUgdGhhbiBvbmNlPyc7XG4gICAgfVxuICB9IC8vIFRoaXMgbWVzc2FnZSBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgbWVudGlvbiBGb3J3YXJkUmVmIG9yIE1lbW9Db21wb25lbnRcbiAgLy8gYmVjYXVzZSB0aGUgZmFjdCB0aGF0IGl0J3MgYSBzZXBhcmF0ZSB0eXBlIG9mIHdvcmsgaXMgYW5cbiAgLy8gaW1wbGVtZW50YXRpb24gZGV0YWlsLlxuXG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiRWxlbWVudCB0eXBlIGlzIGludmFsaWQuIFJlY2VpdmVkIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvOiBcIiArIENvbXBvbmVudCArIFwiLiBcIiArIChcIkxhenkgZWxlbWVudCB0eXBlIG11c3QgcmVzb2x2ZSB0byBhIGNsYXNzIG9yIGZ1bmN0aW9uLlwiICsgaGludCkpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluY29tcGxldGVDbGFzc0NvbXBvbmVudChfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7IC8vIFByb21vdGUgdGhlIGZpYmVyIHRvIGEgY2xhc3MgYW5kIHRyeSByZW5kZXJpbmcgYWdhaW4uXG5cbiAgd29ya0luUHJvZ3Jlc3MudGFnID0gQ2xhc3NDb21wb25lbnQ7IC8vIFRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gaXMgYSBmb3JrIG9mIGB1cGRhdGVDbGFzc0NvbXBvbmVudGBcbiAgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgLy8gRHVyaW5nIG1vdW50aW5nIHdlIGRvbid0IGtub3cgdGhlIGNoaWxkIGNvbnRleHQgeWV0IGFzIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGV4aXN0LlxuICAvLyBXZSB3aWxsIGludmFsaWRhdGUgdGhlIGNoaWxkIGNvbnRleHQgaW4gZmluaXNoQ2xhc3NDb21wb25lbnQoKSByaWdodCBhZnRlciByZW5kZXJpbmcuXG5cbiAgdmFyIGhhc0NvbnRleHQ7XG5cbiAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgfSBlbHNlIHtcbiAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICBjb25zdHJ1Y3RDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcyk7XG4gIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIGZpbmlzaENsYXNzQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHRydWUsIGhhc0NvbnRleHQsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRJbmRldGVybWluYXRlQ29tcG9uZW50KF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZW5kZXJMYW5lcykge1xuICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIGNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIHZhbHVlO1xuICB2YXIgaGFzSWQ7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAoQ29tcG9uZW50LnByb3RvdHlwZSAmJiB0eXBlb2YgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEJhZENsYXNzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKFwiVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBoYXZlIGEgcmVuZGVyIG1ldGhvZCwgYnV0IGRvZXNuJ3QgZXh0ZW5kIFJlYWN0LkNvbXBvbmVudC4gXCIgKyAnVGhpcyBpcyBsaWtlbHkgdG8gY2F1c2UgZXJyb3JzLiBDaGFuZ2UgJXMgdG8gZXh0ZW5kIFJlYWN0LkNvbXBvbmVudCBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dEJhZENsYXNzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nKHdvcmtJblByb2dyZXNzLCBudWxsKTtcbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICB2YWx1ZSA9IHJlbmRlcldpdGhIb29rcyhudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuXG4gIHtcbiAgICAvLyBTdXBwb3J0IGZvciBtb2R1bGUgY29tcG9uZW50cyBpcyBkZXByZWNhdGVkIGFuZCBpcyByZW1vdmVkIGJlaGluZCBhIGZsYWcuXG4gICAgLy8gV2hldGhlciBvciBub3QgaXQgd291bGQgY3Jhc2ggbGF0ZXIsIHdlIHdhbnQgdG8gc2hvdyBhIGdvb2QgbWVzc2FnZSBpbiBERVYgZmlyc3QuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJyAmJiB2YWx1ZS4kJHR5cGVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ1RoZSA8JXMgLz4gY29tcG9uZW50IGFwcGVhcnMgdG8gYmUgYSBmdW5jdGlvbiBjb21wb25lbnQgdGhhdCByZXR1cm5zIGEgY2xhc3MgaW5zdGFuY2UuICcgKyAnQ2hhbmdlICVzIHRvIGEgY2xhc3MgdGhhdCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCBpbnN0ZWFkLiAnICsgXCJJZiB5b3UgY2FuJ3QgdXNlIGEgY2xhc3MgdHJ5IGFzc2lnbmluZyB0aGUgcHJvdG90eXBlIG9uIHRoZSBmdW5jdGlvbiBhcyBhIHdvcmthcm91bmQuIFwiICsgXCJgJXMucHJvdG90eXBlID0gUmVhY3QuQ29tcG9uZW50LnByb3RvdHlwZWAuIERvbid0IHVzZSBhbiBhcnJvdyBmdW5jdGlvbiBzaW5jZSBpdCBcIiArICdjYW5ub3QgYmUgY2FsbGVkIHdpdGggYG5ld2AgYnkgUmVhY3QuJywgX2NvbXBvbmVudE5hbWUsIF9jb21wb25lbnROYW1lLCBfY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICggLy8gUnVuIHRoZXNlIGNoZWNrcyBpbiBwcm9kdWN0aW9uIG9ubHkgaWYgdGhlIGZsYWcgaXMgb2ZmLlxuICAvLyBFdmVudHVhbGx5IHdlJ2xsIGRlbGV0ZSB0aGlzIGJyYW5jaCBhbHRvZ2V0aGVyLlxuICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUucmVuZGVyID09PSAnZnVuY3Rpb24nICYmIHZhbHVlLiQkdHlwZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUyID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnRbX2NvbXBvbmVudE5hbWUyXSkge1xuICAgICAgICBlcnJvcignVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBiZSBhIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IHJldHVybnMgYSBjbGFzcyBpbnN0YW5jZS4gJyArICdDaGFuZ2UgJXMgdG8gYSBjbGFzcyB0aGF0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuICcgKyBcIklmIHlvdSBjYW4ndCB1c2UgYSBjbGFzcyB0cnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgb24gdGhlIGZ1bmN0aW9uIGFzIGEgd29ya2Fyb3VuZC4gXCIgKyBcImAlcy5wcm90b3R5cGUgPSBSZWFjdC5Db21wb25lbnQucHJvdG90eXBlYC4gRG9uJ3QgdXNlIGFuIGFycm93IGZ1bmN0aW9uIHNpbmNlIGl0IFwiICsgJ2Nhbm5vdCBiZSBjYWxsZWQgd2l0aCBgbmV3YCBieSBSZWFjdC4nLCBfY29tcG9uZW50TmFtZTIsIF9jb21wb25lbnROYW1lMiwgX2NvbXBvbmVudE5hbWUyKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lMl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gLy8gUHJvY2VlZCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYSBjbGFzcyBpbnN0YW5jZVxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhyb3cgb3V0IGFueSBob29rcyB0aGF0IHdlcmUgdXNlZC5cblxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDsgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gICAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG4gICAgdmFyIGhhc0NvbnRleHQgPSBmYWxzZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHZhbHVlLnN0YXRlICE9PSBudWxsICYmIHZhbHVlLnN0YXRlICE9PSB1bmRlZmluZWQgPyB2YWx1ZS5zdGF0ZSA6IG51bGw7XG4gICAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzKTtcbiAgICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHZhbHVlKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIC8vIFByb2NlZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzIGEgZnVuY3Rpb24gY29tcG9uZW50XG4gICAgd29ya0luUHJvZ3Jlc3MudGFnID0gRnVuY3Rpb25Db21wb25lbnQ7XG5cbiAgICB7XG5cbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YWx1ZSA9IHJlbmRlcldpdGhIb29rcyhudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBoYXNJZCkge1xuICAgICAgcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuXG4gICAgcmVjb25jaWxlQ2hpbGRyZW4obnVsbCwgd29ya0luUHJvZ3Jlc3MsIHZhbHVlLCByZW5kZXJMYW5lcyk7XG5cbiAgICB7XG4gICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KSB7XG4gIHtcbiAgICBpZiAoQ29tcG9uZW50KSB7XG4gICAgICBpZiAoQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzKSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBjaGlsZENvbnRleHRUeXBlcyBjYW5ub3QgYmUgZGVmaW5lZCBvbiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4nLCBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5yZWYgIT09IG51bGwpIHtcbiAgICAgIHZhciBpbmZvID0gJyc7XG4gICAgICB2YXIgb3duZXJOYW1lID0gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKTtcblxuICAgICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgICBpbmZvICs9ICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gICAgICB9XG5cbiAgICAgIHZhciB3YXJuaW5nS2V5ID0gb3duZXJOYW1lIHx8ICcnO1xuICAgICAgdmFyIGRlYnVnU291cmNlID0gd29ya0luUHJvZ3Jlc3MuX2RlYnVnU291cmNlO1xuXG4gICAgICBpZiAoZGVidWdTb3VyY2UpIHtcbiAgICAgICAgd2FybmluZ0tleSA9IGRlYnVnU291cmNlLmZpbGVOYW1lICsgJzonICsgZGVidWdTb3VyY2UubGluZU51bWJlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnNbd2FybmluZ0tleV0pIHtcbiAgICAgICAgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzW3dhcm5pbmdLZXldID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgYmUgZ2l2ZW4gcmVmcy4gJyArICdBdHRlbXB0cyB0byBhY2Nlc3MgdGhpcyByZWYgd2lsbCBmYWlsLiAnICsgJ0RpZCB5b3UgbWVhbiB0byB1c2UgUmVhY3QuZm9yd2FyZFJlZigpPyVzJywgaW5mbyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUzID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWUzXSkge1xuICAgICAgICBlcnJvcignJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLicsIF9jb21wb25lbnROYW1lMyk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTNdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIENvbXBvbmVudC5jb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LmNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWU0ID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTRdKSB7XG4gICAgICAgIGVycm9yKCclczogRnVuY3Rpb24gY29tcG9uZW50cyBkbyBub3Qgc3VwcG9ydCBjb250ZXh0VHlwZS4nLCBfY29tcG9uZW50TmFtZTQpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTRdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIFNVU1BFTkRFRF9NQVJLRVIgPSB7XG4gIGRlaHlkcmF0ZWQ6IG51bGwsXG4gIHRyZWVDb250ZXh0OiBudWxsLFxuICByZXRyeUxhbmU6IE5vTGFuZVxufTtcblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKSB7XG4gIHJldHVybiB7XG4gICAgYmFzZUxhbmVzOiByZW5kZXJMYW5lcyxcbiAgICBjYWNoZVBvb2w6IGdldFN1c3BlbmRlZENhY2hlKCksXG4gICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShwcmV2T2Zmc2NyZWVuU3RhdGUsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBjYWNoZVBvb2wgPSBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgYmFzZUxhbmVzOiBtZXJnZUxhbmVzKHByZXZPZmZzY3JlZW5TdGF0ZS5iYXNlTGFuZXMsIHJlbmRlckxhbmVzKSxcbiAgICBjYWNoZVBvb2w6IGNhY2hlUG9vbCxcbiAgICB0cmFuc2l0aW9uczogcHJldk9mZnNjcmVlblN0YXRlLnRyYW5zaXRpb25zXG4gIH07XG59IC8vIFRPRE86IFByb2JhYmx5IHNob3VsZCBpbmxpbmUgdGhpcyBiYWNrXG5cblxuZnVuY3Rpb24gc2hvdWxkUmVtYWluT25GYWxsYmFjayhzdXNwZW5zZUNvbnRleHQsIGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBJZiB3ZSdyZSBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjaywgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHdlIG5lZWQgdG9cbiAgLy8gcmVtYWluIG9uIHRoYXQgZmFsbGJhY2sgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjb250ZW50IGhhcyByZXNvbHZlZC5cbiAgLy8gRm9yIGV4YW1wbGUsIFN1c3BlbnNlTGlzdCBjb29yZGluYXRlcyB3aGVuIG5lc3RlZCBjb250ZW50IGFwcGVhcnMuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gQ3VycmVudGx5IHNob3dpbmcgY29udGVudC4gRG9uJ3QgaGlkZSBpdCwgZXZlbiBpZiBGb3JjZVN1c3BlbnNlRmFsbGJhY2tcbiAgICAgIC8vIGlzIHRydWUuIE1vcmUgcHJlY2lzZSBuYW1lIG1pZ2h0IGJlIFwiRm9yY2VSZW1haW5TdXNwZW5zZUZhbGxiYWNrXCIuXG4gICAgICAvLyBOb3RlOiBUaGlzIGlzIGEgZmFjdG9yaW5nIHNtZWxsLiBDYW4ndCByZW1haW4gb24gYSBmYWxsYmFjayBpZiB0aGVyZSdzXG4gICAgICAvLyBubyBmYWxsYmFjayB0byByZW1haW4gb24uXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IC8vIE5vdCBjdXJyZW50bHkgc2hvd2luZyBjb250ZW50LiBDb25zdWx0IHRoZSBTdXNwZW5zZSBjb250ZXh0LlxuXG5cbiAgcmV0dXJuIGhhc1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIGdldFJlbWFpbmluZ1dvcmtJblByaW1hcnlUcmVlKGN1cnJlbnQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IFNob3VsZCBub3QgcmVtb3ZlIHJlbmRlciBsYW5lcyB0aGF0IHdlcmUgcGluZ2VkIGR1cmluZyB0aGlzIHJlbmRlclxuICByZXR1cm4gcmVtb3ZlTGFuZXMoY3VycmVudC5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOyAvLyBUaGlzIGlzIHVzZWQgYnkgRGV2VG9vbHMgdG8gZm9yY2UgYSBib3VuZGFyeSB0byBzdXNwZW5kLlxuXG4gIHtcbiAgICBpZiAoc2hvdWxkU3VzcGVuZCh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgfVxuICB9XG5cbiAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgdmFyIHNob3dGYWxsYmFjayA9IGZhbHNlO1xuICB2YXIgZGlkU3VzcGVuZCA9ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gIGlmIChkaWRTdXNwZW5kIHx8IHNob3VsZFJlbWFpbk9uRmFsbGJhY2soc3VzcGVuc2VDb250ZXh0LCBjdXJyZW50KSkge1xuICAgIC8vIFNvbWV0aGluZyBpbiB0aGlzIGJvdW5kYXJ5J3Mgc3VidHJlZSBhbHJlYWR5IHN1c3BlbmRlZC4gU3dpdGNoIHRvXG4gICAgLy8gcmVuZGVyaW5nIHRoZSBmYWxsYmFjayBjaGlsZHJlbi5cbiAgICBzaG93RmFsbGJhY2sgPSB0cnVlO1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IH5EaWRDYXB0dXJlO1xuICB9IGVsc2Uge1xuICAgIC8vIEF0dGVtcHRpbmcgdGhlIG1haW4gY29udGVudFxuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyBhIG5ldyBtb3VudCBvciB0aGlzIGJvdW5kYXJ5IGlzIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrIHN0YXRlLlxuICAgICAgLy8gTWFyayB0aGlzIHN1YnRyZWUgY29udGV4dCBhcyBoYXZpbmcgYXQgbGVhc3Qgb25lIGludmlzaWJsZSBwYXJlbnQgdGhhdCBjb3VsZFxuICAgICAgLy8gaGFuZGxlIHRoZSBmYWxsYmFjayBzdGF0ZS5cbiAgICAgIC8vIEF2b2lkZWQgYm91bmRhcmllcyBhcmUgbm90IGNvbnNpZGVyZWQgc2luY2UgdGhleSBjYW5ub3QgaGFuZGxlIHByZWZlcnJlZCBmYWxsYmFjayBzdGF0ZXMuXG4gICAgICB7XG4gICAgICAgIHN1c3BlbnNlQ29udGV4dCA9IGFkZFN1YnRyZWVTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN1c3BlbnNlQ29udGV4dCA9IHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCk7XG4gIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlQ29udGV4dCk7IC8vIE9LLCB0aGUgbmV4dCBwYXJ0IGlzIGNvbmZ1c2luZy4gV2UncmUgYWJvdXQgdG8gcmVjb25jaWxlIHRoZSBTdXNwZW5zZVxuICAvLyBib3VuZGFyeSdzIGNoaWxkcmVuLiBUaGlzIGludm9sdmVzIHNvbWUgY3VzdG9tIHJlY29uY2lsaWF0aW9uIGxvZ2ljLiBUd29cbiAgLy8gbWFpbiByZWFzb25zIHRoaXMgaXMgc28gY29tcGxpY2F0ZWQuXG4gIC8vXG4gIC8vIEZpcnN0LCBMZWdhY3kgTW9kZSBoYXMgZGlmZmVyZW50IHNlbWFudGljcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFRoZVxuICAvLyBwcmltYXJ5IHRyZWUgd2lsbCBjb21taXQgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLCBzbyB3aGVuIHdlIGRvIHRoZVxuICAvLyBzZWNvbmQgcGFzcyB0byByZW5kZXIgdGhlIGZhbGxiYWNrLCB3ZSBkbyBzb21lIGV4Y2VlZGluZ2x5LCB1aCwgY2xldmVyXG4gIC8vIGhhY2tzIHRvIG1ha2UgdGhhdCBub3QgdG90YWxseSBicmVhay4gTGlrZSB0cmFuc2ZlcnJpbmcgZWZmZWN0cyBhbmRcbiAgLy8gZGVsZXRpb25zIGZyb20gaGlkZGVuIHRyZWUuIEluIENvbmN1cnJlbnQgTW9kZSwgaXQncyBtdWNoIHNpbXBsZXIsXG4gIC8vIGJlY2F1c2Ugd2UgYmFpbG91dCBvbiB0aGUgcHJpbWFyeSB0cmVlIGNvbXBsZXRlbHkgYW5kIGxlYXZlIGl0IGluIGl0cyBvbGRcbiAgLy8gc3RhdGUsIG5vIGVmZmVjdHMuIFNhbWUgYXMgd2hhdCB3ZSBkbyBmb3IgT2Zmc2NyZWVuIChleGNlcHQgdGhhdFxuICAvLyBPZmZzY3JlZW4gZG9lc24ndCBoYXZlIHRoZSBmaXJzdCByZW5kZXIgcGFzcykuXG4gIC8vXG4gIC8vIFNlY29uZCBpcyBoeWRyYXRpb24uIER1cmluZyBoeWRyYXRpb24sIHRoZSBTdXNwZW5zZSBmaWJlciBoYXMgYSBzbGlnaHRseVxuICAvLyBkaWZmZXJlbnQgbGF5b3V0LCB3aGVyZSB0aGUgY2hpbGQgcG9pbnRzIHRvIGEgZGVoeWRyYXRlZCBmcmFnbWVudCwgd2hpY2hcbiAgLy8gY29udGFpbnMgdGhlIERPTSByZW5kZXJlZCBieSB0aGUgc2VydmVyLlxuICAvL1xuICAvLyBUaGlyZCwgZXZlbiBpZiB5b3Ugc2V0IGFsbCB0aGF0IGFzaWRlLCBTdXNwZW5zZSBpcyBsaWtlIGVycm9yIGJvdW5kYXJpZXMgaW5cbiAgLy8gdGhhdCB3ZSBmaXJzdCB3ZSB0cnkgdG8gcmVuZGVyIG9uZSB0cmVlLCBhbmQgaWYgdGhhdCBmYWlscywgd2UgcmVuZGVyIGFnYWluXG4gIC8vIGFuZCBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgdHJlZS4gTGlrZSBhIHRyeS9jYXRjaCBibG9jay4gU28gd2UgaGF2ZSB0byB0cmFja1xuICAvLyB3aGljaCBicmFuY2ggd2UncmUgY3VycmVudGx5IHJlbmRlcmluZy4gSWRlYWxseSB3ZSB3b3VsZCBtb2RlbCB0aGlzIHVzaW5nXG4gIC8vIGEgc3RhY2suXG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJbml0aWFsIG1vdW50XG4gICAgLy8gU3BlY2lhbCBwYXRoIGZvciBoeWRyYXRpb25cbiAgICAvLyBJZiB3ZSdyZSBjdXJyZW50bHkgaHlkcmF0aW5nLCB0cnkgdG8gaHlkcmF0ZSB0aGlzIGJvdW5kYXJ5LlxuICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTsgLy8gVGhpcyBjb3VsZCd2ZSBiZWVuIGEgZGVoeWRyYXRlZCBzdXNwZW5zZSBjb21wb25lbnQuXG5cbiAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGRlaHlkcmF0ZWQgPSBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgIGlmIChkZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBtb3VudERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudCh3b3JrSW5Qcm9ncmVzcywgZGVoeWRyYXRlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG5leHRQcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gICAgdmFyIG5leHRGYWxsYmFja0NoaWxkcmVuID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuXG4gICAgaWYgKHNob3dGYWxsYmFjaykge1xuICAgICAgdmFyIGZhbGxiYWNrRnJhZ21lbnQgPSBtb3VudFN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgbmV4dFByaW1hcnlDaGlsZHJlbiwgbmV4dEZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQubWVtb2l6ZWRTdGF0ZSA9IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjtcblxuICAgICAgcmV0dXJuIGZhbGxiYWNrRnJhZ21lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBuZXh0UHJpbWFyeUNoaWxkcmVuKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhbiB1cGRhdGUuXG4gICAgLy8gU3BlY2lhbCBwYXRoIGZvciBoeWRyYXRpb25cbiAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIF9kZWh5ZHJhdGVkID0gcHJldlN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgIGlmIChfZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdXBkYXRlRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBkaWRTdXNwZW5kLCBuZXh0UHJvcHMsIF9kZWh5ZHJhdGVkLCBwcmV2U3RhdGUsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvd0ZhbGxiYWNrKSB7XG4gICAgICB2YXIgX25leHRGYWxsYmFja0NoaWxkcmVuID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuICAgICAgdmFyIF9uZXh0UHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IHVwZGF0ZVN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX25leHRQcmltYXJ5Q2hpbGRyZW4sIF9uZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3RhdGUgPSBjdXJyZW50LmNoaWxkLm1lbW9pemVkU3RhdGU7XG4gICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyLm1lbW9pemVkU3RhdGUgPSBwcmV2T2Zmc2NyZWVuU3RhdGUgPT09IG51bGwgPyBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpIDogdXBkYXRlU3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShwcmV2T2Zmc2NyZWVuU3RhdGUsIHJlbmRlckxhbmVzKTtcblxuICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50Mi5jaGlsZExhbmVzID0gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoY3VycmVudCwgcmVuZGVyTGFuZXMpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG4gICAgICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW4yID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuXG4gICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50MyA9IHVwZGF0ZVN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfbmV4dFByaW1hcnlDaGlsZHJlbjIsIHJlbmRlckxhbmVzKTtcblxuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gX3ByaW1hcnlDaGlsZEZyYWdtZW50MztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAndmlzaWJsZScsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIocHJpbWFyeUNoaWxkUHJvcHMsIG1vZGUpO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIHByaW1hcnlDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiBtb3VudFN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCBmYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAnaGlkZGVuJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcblxuICBpZiAoKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSAmJiBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgLy8gSW4gbGVnYWN5IG1vZGUsIHdlIGNvbW1pdCB0aGUgcHJpbWFyeSB0cmVlIGFzIGlmIGl0IHN1Y2Nlc3NmdWxseVxuICAgIC8vIGNvbXBsZXRlZCwgZXZlbiB0aG91Z2ggaXQncyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuXG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50O1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnBlbmRpbmdQcm9wcyA9IHByaW1hcnlDaGlsZFByb3BzO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgIC8vIFJlc2V0IHRoZSBkdXJhdGlvbnMgZnJvbSB0aGUgZmlyc3QgcGFzcyBzbyB0aGV5IGFyZW4ndCBpbmNsdWRlZCBpbiB0aGVcbiAgICAgIC8vIGZpbmFsIGFtb3VudHMuIFRoaXMgc2VlbXMgY291bnRlcmludHVpdGl2ZSwgc2luY2Ugd2UncmUgaW50ZW50aW9uYWxseVxuICAgICAgLy8gbm90IG1lYXN1cmluZyBwYXJ0IG9mIHRoZSByZW5kZXIgcGhhc2UsIGJ1dCB0aGlzIG1ha2VzIGl0IG1hdGNoIHdoYXQgd2VcbiAgICAgIC8vIGRvIGluIENvbmN1cnJlbnQgTW9kZS5cbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgICB9XG5cbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7XG4gIH0gZWxzZSB7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIocHJpbWFyeUNoaWxkUHJvcHMsIG1vZGUpO1xuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTtcbiAgfVxuXG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBmYWxsYmFja0NoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihvZmZzY3JlZW5Qcm9wcywgbW9kZSwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhlIHByb3BzIGFyZ3VtZW50IHRvIGBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW5gIGlzIGBhbnlgIHR5cGVkLCBzbyB3ZSB1c2VcbiAgLy8gdGhpcyB3cmFwcGVyIGZ1bmN0aW9uIHRvIGNvbnN0cmFpbiBpdC5cbiAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihvZmZzY3JlZW5Qcm9wcywgbW9kZSwgTm9MYW5lcywgbnVsbCk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIoY3VycmVudCwgb2Zmc2NyZWVuUHJvcHMpIHtcbiAgLy8gVGhlIHByb3BzIGFyZ3VtZW50IHRvIGBjcmVhdGVXb3JrSW5Qcm9ncmVzc2AgaXMgYGFueWAgdHlwZWQsIHNvIHdlIHVzZSB0aGlzXG4gIC8vIHdyYXBwZXIgZnVuY3Rpb24gdG8gY29uc3RyYWluIGl0LlxuICByZXR1cm4gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudCwgb2Zmc2NyZWVuUHJvcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZVByaW1hcnlDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50ID0gY3VycmVudC5jaGlsZDtcbiAgdmFyIGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZztcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQsIHtcbiAgICBtb2RlOiAndmlzaWJsZScsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9KTtcblxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmxhbmVzID0gcmVuZGVyTGFuZXM7XG4gIH1cblxuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IG51bGw7XG5cbiAgaWYgKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAvLyBEZWxldGUgdGhlIGZhbGxiYWNrIGNoaWxkIGZyYWdtZW50XG4gICAgdmFyIGRlbGV0aW9ucyA9IHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucztcblxuICAgIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IFtjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50XTtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IENoaWxkRGVsZXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0aW9ucy5wdXNoKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBtb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gIHZhciBjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmc7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAnaGlkZGVuJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcblxuICBpZiAoIC8vIEluIGxlZ2FjeSBtb2RlLCB3ZSBjb21taXQgdGhlIHByaW1hcnkgdHJlZSBhcyBpZiBpdCBzdWNjZXNzZnVsbHlcbiAgLy8gY29tcGxldGVkLCBldmVuIHRob3VnaCBpdCdzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS5cbiAgKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSAmJiAvLyBNYWtlIHN1cmUgd2UncmUgb24gdGhlIHNlY29uZCBwYXNzLCBpLmUuIHRoZSBwcmltYXJ5IGNoaWxkIGZyYWdtZW50IHdhc1xuICAvLyBhbHJlYWR5IGNsb25lZC4gSW4gbGVnYWN5IG1vZGUsIHRoZSBvbmx5IGNhc2Ugd2hlcmUgdGhpcyBpc24ndCB0cnVlIGlzXG4gIC8vIHdoZW4gRGV2VG9vbHMgZm9yY2VzIHVzIHRvIGRpc3BsYXkgYSBmYWxsYmFjazsgd2Ugc2tpcCB0aGUgZmlyc3QgcmVuZGVyXG4gIC8vIHBhc3MgZW50aXJlbHkgYW5kIGdvIHN0cmFpZ2h0IHRvIHJlbmRlcmluZyB0aGUgZmFsbGJhY2suIChJbiBDb25jdXJyZW50XG4gIC8vIE1vZGUsIFN1c3BlbnNlTGlzdCBjYW4gYWxzbyB0cmlnZ2VyIHRoaXMgc2NlbmFyaW8sIGJ1dCB0aGlzIGlzIGEgbGVnYWN5LVxuICAvLyBvbmx5IGNvZGVwYXRoLilcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgIT09IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCkge1xuICAgIHZhciBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50O1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnBlbmRpbmdQcm9wcyA9IHByaW1hcnlDaGlsZFByb3BzO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgIC8vIFJlc2V0IHRoZSBkdXJhdGlvbnMgZnJvbSB0aGUgZmlyc3QgcGFzcyBzbyB0aGV5IGFyZW4ndCBpbmNsdWRlZCBpbiB0aGVcbiAgICAgIC8vIGZpbmFsIGFtb3VudHMuIFRoaXMgc2VlbXMgY291bnRlcmludHVpdGl2ZSwgc2luY2Ugd2UncmUgaW50ZW50aW9uYWxseVxuICAgICAgLy8gbm90IG1lYXN1cmluZyBwYXJ0IG9mIHRoZSByZW5kZXIgcGhhc2UsIGJ1dCB0aGlzIG1ha2VzIGl0IG1hdGNoIHdoYXQgd2VcbiAgICAgIC8vIGRvIGluIENvbmN1cnJlbnQgTW9kZS5cbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbiA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgIH0gLy8gVGhlIGZhbGxiYWNrIGZpYmVyIHdhcyBhZGRlZCBhcyBhIGRlbGV0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGFzcy5cbiAgICAvLyBIb3dldmVyLCBzaW5jZSB3ZSdyZSBnb2luZyB0byByZW1haW4gb24gdGhlIGZhbGxiYWNrLCB3ZSBubyBsb25nZXIgd2FudFxuICAgIC8vIHRvIGRlbGV0ZSBpdC5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHVwZGF0ZVdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIoY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LCBwcmltYXJ5Q2hpbGRQcm9wcyk7IC8vIFNpbmNlIHdlJ3JlIHJldXNpbmcgYSBjdXJyZW50IHRyZWUsIHdlIG5lZWQgdG8gcmV1c2UgdGhlIGZsYWdzLCB0b28uXG4gICAgLy8gKFdlIGRvbid0IGRvIHRoaXMgaW4gbGVnYWN5IG1vZGUsIGJlY2F1c2UgaW4gbGVnYWN5IG1vZGUgd2UgZG9uJ3QgcmUtdXNlXG4gICAgLy8gdGhlIGN1cnJlbnQgdHJlZTsgc2VlIHByZXZpb3VzIGJyYW5jaC4pXG5cbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zdWJ0cmVlRmxhZ3MgPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc3VidHJlZUZsYWdzICYgU3RhdGljTWFzaztcbiAgfVxuXG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50LCBmYWxsYmFja0NoaWxkcmVuKTtcbiAgfSBlbHNlIHtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZSBib3VuZGFyeSkgYWxyZWFkeVxuICAgIC8vIG1vdW50ZWQgYnV0IHRoaXMgaXMgYSBuZXcgZmliZXIuXG5cbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICB9XG5cbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCByZWNvdmVyYWJsZUVycm9yKSB7XG4gIC8vIEZhbGxpbmcgYmFjayB0byBjbGllbnQgcmVuZGVyaW5nLiBCZWNhdXNlIHRoaXMgaGFzIHBlcmZvcm1hbmNlXG4gIC8vIGltcGxpY2F0aW9ucywgaXQncyBjb25zaWRlcmVkIGEgcmVjb3ZlcmFibGUgZXJyb3IsIGV2ZW4gdGhvdWdoIHRoZSB1c2VyXG4gIC8vIGxpa2VseSB3b24ndCBvYnNlcnZlIGFueXRoaW5nIHdyb25nIHdpdGggdGhlIFVJLlxuICAvL1xuICAvLyBUaGUgZXJyb3IgaXMgcGFzc2VkIGluIGFzIGFuIGFyZ3VtZW50IHRvIGVuZm9yY2UgdGhhdCBldmVyeSBjYWxsZXIgcHJvdmlkZVxuICAvLyBhIGN1c3RvbSBtZXNzYWdlLCBvciBleHBsaWNpdGx5IG9wdCBvdXQgKGN1cnJlbnRseSB0aGUgb25seSBwYXRoIHRoYXQgb3B0c1xuICAvLyBvdXQgaXMgbGVnYWN5IG1vZGU7IGV2ZXJ5IGNvbmN1cnJlbnQgcGF0aCBwcm92aWRlcyBhbiBlcnJvcikuXG4gIGlmIChyZWNvdmVyYWJsZUVycm9yICE9PSBudWxsKSB7XG4gICAgcXVldWVIeWRyYXRpb25FcnJvcihyZWNvdmVyYWJsZUVycm9yKTtcbiAgfSAvLyBUaGlzIHdpbGwgYWRkIHRoZSBvbGQgZmliZXIgdG8gdGhlIGRlbGV0aW9uIGxpc3RcblxuXG4gIHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7IC8vIFdlJ3JlIG5vdyBub3Qgc3VzcGVuZGVkIG5vciBkZWh5ZHJhdGVkLlxuXG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbik7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZSBib3VuZGFyeSkgYWxyZWFkeVxuICAvLyBtb3VudGVkIGJ1dCB0aGlzIGlzIGEgbmV3IGZpYmVyLlxuXG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZUZhbGxiYWNrQWZ0ZXJSZXRyeVdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgZmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGZpYmVyTW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAndmlzaWJsZScsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIocHJpbWFyeUNoaWxkUHJvcHMsIGZpYmVyTW9kZSk7XG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBmaWJlck1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTsgLy8gTmVlZHMgYSBwbGFjZW1lbnQgZWZmZWN0IGJlY2F1c2UgdGhlIHBhcmVudCAodGhlIFN1c3BlbnNlXG4gIC8vIGJvdW5kYXJ5KSBhbHJlYWR5IG1vdW50ZWQgYnV0IHRoaXMgaXMgYSBuZXcgZmliZXIuXG5cbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcblxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgIC8vIFdlIHdpbGwgaGF2ZSBkcm9wcGVkIHRoZSBlZmZlY3QgbGlzdCB3aGljaCBjb250YWlucyB0aGVcbiAgICAvLyBkZWxldGlvbi4gV2UgbmVlZCB0byByZWNvbmNpbGUgdG8gZGVsZXRlIHRoZSBjdXJyZW50IGNoaWxkLlxuICAgIHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiBtb3VudERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VJbnN0YW5jZSwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gRHVyaW5nIHRoZSBmaXJzdCBwYXNzLCB3ZSdsbCBiYWlsIG91dCBhbmQgbm90IGRyaWxsIGludG8gdGhlIGNoaWxkcmVuLlxuICAvLyBJbnN0ZWFkLCB3ZSdsbCBsZWF2ZSB0aGUgY29udGVudCBpbiBwbGFjZSBhbmQgdHJ5IHRvIGh5ZHJhdGUgaXQgbGF0ZXIuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAge1xuICAgICAgZXJyb3IoJ0Nhbm5vdCBoeWRyYXRlIFN1c3BlbnNlIGluIGxlZ2FjeSBtb2RlLiBTd2l0Y2ggZnJvbSAnICsgJ1JlYWN0RE9NLmh5ZHJhdGUoZWxlbWVudCwgY29udGFpbmVyKSB0byAnICsgJ1JlYWN0RE9NQ2xpZW50Lmh5ZHJhdGVSb290KGNvbnRhaW5lciwgPEFwcCAvPiknICsgJy5yZW5kZXIoZWxlbWVudCkgb3IgcmVtb3ZlIHRoZSBTdXNwZW5zZSBjb21wb25lbnRzIGZyb20gJyArICd0aGUgc2VydmVyIHJlbmRlcmVkIGNvbXBvbmVudHMuJyk7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBsYW5lVG9MYW5lcyhTeW5jTGFuZSk7XG4gIH0gZWxzZSBpZiAoaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soc3VzcGVuc2VJbnN0YW5jZSkpIHtcbiAgICAvLyBUaGlzIGlzIGEgY2xpZW50LW9ubHkgYm91bmRhcnkuIFNpbmNlIHdlIHdvbid0IGdldCBhbnkgY29udGVudCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAvLyBmb3IgdGhpcywgd2UgbmVlZCB0byBzY2hlZHVsZSB0aGF0IGF0IGEgaGlnaGVyIHByaW9yaXR5IGJhc2VkIG9uIHdoZW4gaXQgd291bGRcbiAgICAvLyBoYXZlIHRpbWVkIG91dC4gSW4gdGhlb3J5IHdlIGNvdWxkIHJlbmRlciBpdCBpbiB0aGlzIHBhc3MgYnV0IGl0IHdvdWxkIGhhdmUgdGhlXG4gICAgLy8gd3JvbmcgcHJpb3JpdHkgYXNzb2NpYXRlZCB3aXRoIGl0IGFuZCB3aWxsIHByZXZlbnQgaHlkcmF0aW9uIG9mIHBhcmVudCBwYXRoLlxuICAgIC8vIEluc3RlYWQsIHdlJ2xsIGxlYXZlIHdvcmsgbGVmdCBvbiBpdCB0byByZW5kZXIgaXQgaW4gYSBzZXBhcmF0ZSBjb21taXQuXG4gICAgLy8gVE9ETyBUaGlzIHRpbWUgc2hvdWxkIGJlIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBzZXJ2ZXIgcmVuZGVyZWQgcmVzcG9uc2UgdGhhdCBpc1xuICAgIC8vIGEgcGFyZW50IHRvIHRoaXMgYm91bmRhcnkgd2FzIGRpc3BsYXllZC4gSG93ZXZlciwgc2luY2Ugd2UgY3VycmVudGx5IGRvbid0IGhhdmVcbiAgICAvLyBhIHByb3RvY29sIHRvIHRyYW5zZmVyIHRoYXQgdGltZSwgd2UnbGwganVzdCBlc3RpbWF0ZSBpdCBieSB1c2luZyB0aGUgY3VycmVudFxuICAgIC8vIHRpbWUuIFRoaXMgd2lsbCBtZWFuIHRoYXQgU3VzcGVuc2UgdGltZW91dHMgYXJlIHNsaWdodGx5IHNoaWZ0ZWQgdG8gbGF0ZXIgdGhhblxuICAgIC8vIHRoZXkgc2hvdWxkIGJlLlxuICAgIC8vIFNjaGVkdWxlIGEgbm9ybWFsIHByaSB1cGRhdGUgdG8gcmVuZGVyIHRoaXMgY29udGVudC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGxhbmVUb0xhbmVzKERlZmF1bHRIeWRyYXRpb25MYW5lKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBXZSdsbCBjb250aW51ZSBoeWRyYXRpbmcgdGhlIHJlc3QgYXQgb2Zmc2NyZWVuIHByaW9yaXR5IHNpbmNlIHdlJ2xsIGFscmVhZHlcbiAgICAvLyBiZSBzaG93aW5nIHRoZSByaWdodCBjb250ZW50IGNvbWluZyBmcm9tIHRoZSBzZXJ2ZXIsIGl0IGlzIG5vIHJ1c2guXG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBsYW5lVG9MYW5lcyhPZmZzY3JlZW5MYW5lKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVEZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGRpZFN1c3BlbmQsIG5leHRQcm9wcywgc3VzcGVuc2VJbnN0YW5jZSwgc3VzcGVuc2VTdGF0ZSwgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKCFkaWRTdXNwZW5kKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgcmVuZGVyIHBhc3MuIEF0dGVtcHQgdG8gaHlkcmF0ZS5cbiAgICAvLyBXZSBzaG91bGQgbmV2ZXIgYmUgaHlkcmF0aW5nIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSBpdCBpcyB0aGUgZmlyc3QgcGFzcyxcbiAgICAvLyBidXQgYWZ0ZXIgd2UndmUgYWxyZWFkeSBjb21taXR0ZWQgb25jZS5cbiAgICB3YXJuSWZIeWRyYXRpbmcoKTtcblxuICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCAvLyBUT0RPOiBXaGVuIHdlIGRlbGV0ZSBsZWdhY3kgbW9kZSwgd2Ugc2hvdWxkIG1ha2UgdGhpcyBlcnJvciBhcmd1bWVudFxuICAgICAgLy8gcmVxdWlyZWQg4oCUIGV2ZXJ5IGNvbmN1cnJlbnQgbW9kZSBwYXRoIHRoYXQgY2F1c2VzIGh5ZHJhdGlvbiB0b1xuICAgICAgLy8gZGUtb3B0IHRvIGNsaWVudCByZW5kZXJpbmcgc2hvdWxkIGhhdmUgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICAgIG51bGwpO1xuICAgIH1cblxuICAgIGlmIChpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhzdXNwZW5zZUluc3RhbmNlKSkge1xuICAgICAgLy8gVGhpcyBib3VuZGFyeSBpcyBpbiBhIHBlcm1hbmVudCBmYWxsYmFjayBzdGF0ZS4gSW4gdGhpcyBjYXNlLCB3ZSdsbCBuZXZlclxuICAgICAgLy8gZ2V0IGFuIHVwZGF0ZSBhbmQgd2UnbGwgbmV2ZXIgYmUgYWJsZSB0byBoeWRyYXRlIHRoZSBmaW5hbCBjb250ZW50LiBMZXQncyBqdXN0IHRyeSB0aGVcbiAgICAgIC8vIGNsaWVudCBzaWRlIHJlbmRlciBpbnN0ZWFkLlxuICAgICAgdmFyIGRpZ2VzdCwgbWVzc2FnZSwgc3RhY2s7XG5cbiAgICAgIHtcbiAgICAgICAgdmFyIF9nZXRTdXNwZW5zZUluc3RhbmNlRiA9IGdldFN1c3BlbnNlSW5zdGFuY2VGYWxsYmFja0Vycm9yRGV0YWlscyhzdXNwZW5zZUluc3RhbmNlKTtcblxuICAgICAgICBkaWdlc3QgPSBfZ2V0U3VzcGVuc2VJbnN0YW5jZUYuZGlnZXN0O1xuICAgICAgICBtZXNzYWdlID0gX2dldFN1c3BlbnNlSW5zdGFuY2VGLm1lc3NhZ2U7XG4gICAgICAgIHN0YWNrID0gX2dldFN1c3BlbnNlSW5zdGFuY2VGLnN0YWNrO1xuICAgICAgfVxuXG4gICAgICB2YXIgZXJyb3I7XG5cbiAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ1RoZSBzZXJ2ZXIgY291bGQgbm90IGZpbmlzaCB0aGlzIFN1c3BlbnNlIGJvdW5kYXJ5LCBsaWtlbHkgJyArICdkdWUgdG8gYW4gZXJyb3IgZHVyaW5nIHNlcnZlciByZW5kZXJpbmcuIFN3aXRjaGVkIHRvICcgKyAnY2xpZW50IHJlbmRlcmluZy4nKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNhcHR1cmVkVmFsdWUgPSBjcmVhdGVDYXB0dXJlZFZhbHVlKGVycm9yLCBkaWdlc3QsIHN0YWNrKTtcbiAgICAgIHJldHVybiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMsIGNhcHR1cmVkVmFsdWUpO1xuICAgIH1cbiAgICAvLyBhbnkgY29udGV4dCBoYXMgY2hhbmdlZCwgd2UgbmVlZCB0byB0cmVhdCBpcyBhcyBpZiB0aGUgaW5wdXQgbWlnaHQgaGF2ZSBjaGFuZ2VkLlxuXG5cbiAgICB2YXIgaGFzQ29udGV4dENoYW5nZWQgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCBjdXJyZW50LmNoaWxkTGFuZXMpO1xuXG4gICAgaWYgKGRpZFJlY2VpdmVVcGRhdGUgfHwgaGFzQ29udGV4dENoYW5nZWQpIHtcbiAgICAgIC8vIFRoaXMgYm91bmRhcnkgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGZpcnN0IHJlbmRlci4gVGhpcyBtZWFucyB0aGF0IHdlIGFyZSBub3cgdW5hYmxlIHRvXG4gICAgICAvLyBoeWRyYXRlIGl0LiBXZSBtaWdodCBzdGlsbCBiZSBhYmxlIHRvIGh5ZHJhdGUgaXQgdXNpbmcgYSBoaWdoZXIgcHJpb3JpdHkgbGFuZS5cbiAgICAgIHZhciByb290ID0gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCk7XG5cbiAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lID0gZ2V0QnVtcGVkTGFuZUZvckh5ZHJhdGlvbihyb290LCByZW5kZXJMYW5lcyk7XG5cbiAgICAgICAgaWYgKGF0dGVtcHRIeWRyYXRpb25BdExhbmUgIT09IE5vTGFuZSAmJiBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lICE9PSBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSkge1xuICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgbXV0YXRpbmcgc2luY2UgdGhpcyByZW5kZXIgd2lsbCBnZXQgaW50ZXJydXB0ZWQuIFRoaXNcbiAgICAgICAgICAvLyBpcyBvbmUgb2YgdGhlIHZlcnkgcmFyZSB0aW1lcyB3aGVyZSB3ZSBtdXRhdGUgdGhlIGN1cnJlbnQgdHJlZVxuICAgICAgICAgIC8vIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgICAgIHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lID0gYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZTsgLy8gVE9ETzogSWRlYWxseSB0aGlzIHdvdWxkIGluaGVyaXQgdGhlIGV2ZW50IHRpbWUgb2YgdGhlIGN1cnJlbnQgcmVuZGVyXG5cbiAgICAgICAgICB2YXIgZXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG4gICAgICAgICAgZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGN1cnJlbnQsIGF0dGVtcHRIeWRyYXRpb25BdExhbmUpO1xuICAgICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBjdXJyZW50LCBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lLCBldmVudFRpbWUpO1xuICAgICAgICB9XG4gICAgICB9IC8vIElmIHdlIGhhdmUgc2NoZWR1bGVkIGhpZ2hlciBwcmkgd29yayBhYm92ZSwgdGhpcyB3aWxsIHByb2JhYmx5IGp1c3QgYWJvcnQgdGhlIHJlbmRlclxuICAgICAgLy8gc2luY2Ugd2Ugbm93IGhhdmUgaGlnaGVyIHByaW9yaXR5IHdvcmssIGJ1dCBpbiBjYXNlIGl0IGRvZXNuJ3QsIHdlIG5lZWQgdG8gcHJlcGFyZSB0b1xuICAgICAgLy8gcmVuZGVyIHNvbWV0aGluZywgaWYgd2UgdGltZSBvdXQuIEV2ZW4gaWYgdGhhdCByZXF1aXJlcyB1cyB0byBkZWxldGUgZXZlcnl0aGluZyBhbmRcbiAgICAgIC8vIHNraXAgaHlkcmF0aW9uLlxuICAgICAgLy8gRGVsYXkgaGF2aW5nIHRvIGRvIHRoaXMgYXMgbG9uZyBhcyB0aGUgc3VzcGVuc2UgdGltZW91dCBhbGxvd3MgdXMuXG5cblxuICAgICAgcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpO1xuXG4gICAgICB2YXIgX2NhcHR1cmVkVmFsdWUgPSBjcmVhdGVDYXB0dXJlZFZhbHVlKG5ldyBFcnJvcignVGhpcyBTdXNwZW5zZSBib3VuZGFyeSByZWNlaXZlZCBhbiB1cGRhdGUgYmVmb3JlIGl0IGZpbmlzaGVkICcgKyAnaHlkcmF0aW5nLiBUaGlzIGNhdXNlZCB0aGUgYm91bmRhcnkgdG8gc3dpdGNoIHRvIGNsaWVudCByZW5kZXJpbmcuICcgKyAnVGhlIHVzdWFsIHdheSB0byBmaXggdGhpcyBpcyB0byB3cmFwIHRoZSBvcmlnaW5hbCB1cGRhdGUgJyArICdpbiBzdGFydFRyYW5zaXRpb24uJykpO1xuXG4gICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCBfY2FwdHVyZWRWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKHN1c3BlbnNlSW5zdGFuY2UpKSB7XG4gICAgICAvLyBUaGlzIGNvbXBvbmVudCBpcyBzdGlsbCBwZW5kaW5nIG1vcmUgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIsIHNvIHdlIGNhbid0IGh5ZHJhdGUgaXRzXG4gICAgICAvLyBjb250ZW50LiBXZSB0cmVhdCBpdCBhcyBpZiB0aGlzIGNvbXBvbmVudCBzdXNwZW5kZWQgaXRzZWxmLiBJdCBtaWdodCBzZWVtIGFzIGlmXG4gICAgICAvLyB3ZSBjb3VsZCBqdXN0IHRyeSB0byByZW5kZXIgaXQgY2xpZW50LXNpZGUgaW5zdGVhZC4gSG93ZXZlciwgdGhpcyB3aWxsIHBlcmZvcm0gYVxuICAgICAgLy8gbG90IG9mIHVubmVjZXNzYXJ5IHdvcmsgYW5kIGlzIHVubGlrZWx5IHRvIGNvbXBsZXRlIHNpbmNlIGl0IG9mdGVuIHdpbGwgc3VzcGVuZFxuICAgICAgLy8gb24gbWlzc2luZyBkYXRhIGFueXdheS4gQWRkaXRpb25hbGx5LCB0aGUgc2VydmVyIG1pZ2h0IGJlIGFibGUgdG8gcmVuZGVyIG1vcmVcbiAgICAgIC8vIHRoYW4gd2UgY2FuIG9uIHRoZSBjbGllbnQgeWV0LiBJbiB0aGF0IGNhc2Ugd2UnZCBlbmQgdXAgd2l0aCBtb3JlIGZhbGxiYWNrIHN0YXRlc1xuICAgICAgLy8gb24gdGhlIGNsaWVudCB0aGFuIGlmIHdlIGp1c3QgbGVhdmUgaXQgYWxvbmUuIElmIHRoZSBzZXJ2ZXIgdGltZXMgb3V0IG9yIGVycm9yc1xuICAgICAgLy8gdGhlc2Ugc2hvdWxkIHVwZGF0ZSB0aGlzIGJvdW5kYXJ5IHRvIHRoZSBwZXJtYW5lbnQgRmFsbGJhY2sgc3RhdGUgaW5zdGVhZC5cbiAgICAgIC8vIE1hcmsgaXQgYXMgaGF2aW5nIGNhcHR1cmVkIChpLmUuIHN1c3BlbmRlZCkuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlOyAvLyBMZWF2ZSB0aGUgY2hpbGQgaW4gcGxhY2UuIEkuZS4gdGhlIGRlaHlkcmF0ZWQgZnJhZ21lbnQuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gUmVnaXN0ZXIgYSBjYWxsYmFjayB0byByZXRyeSB0aGlzIGJvdW5kYXJ5IG9uY2UgdGhlIHNlcnZlciBoYXMgc2VudCB0aGUgcmVzdWx0LlxuXG4gICAgICB2YXIgcmV0cnkgPSByZXRyeURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5LmJpbmQobnVsbCwgY3VycmVudCk7XG4gICAgICByZWdpc3RlclN1c3BlbnNlSW5zdGFuY2VSZXRyeShzdXNwZW5zZUluc3RhbmNlLCByZXRyeSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgYXR0ZW1wdC5cbiAgICAgIHJlZW50ZXJIeWRyYXRpb25TdGF0ZUZyb21EZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VJbnN0YW5jZSwgc3VzcGVuc2VTdGF0ZS50cmVlQ29udGV4dCk7XG4gICAgICB2YXIgcHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuKTsgLy8gTWFyayB0aGUgY2hpbGRyZW4gYXMgaHlkcmF0aW5nLiBUaGlzIGlzIGEgZmFzdCBwYXRoIHRvIGtub3cgd2hldGhlciB0aGlzXG4gICAgICAvLyB0cmVlIGlzIHBhcnQgb2YgYSBoeWRyYXRpbmcgdHJlZS4gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBhIGNoaWxkXG4gICAgICAvLyBub2RlIGhhcyBmdWxseSBtb3VudGVkIHlldCwgYW5kIGZvciBzY2hlZHVsaW5nIGV2ZW50IHJlcGxheWluZy5cbiAgICAgIC8vIENvbmNlcHR1YWxseSB0aGlzIGlzIHNpbWlsYXIgdG8gUGxhY2VtZW50IGluIHRoYXQgYSBuZXcgc3VidHJlZSBpc1xuICAgICAgLy8gaW5zZXJ0ZWQgaW50byB0aGUgUmVhY3QgdHJlZSBoZXJlLiBJdCBqdXN0IGhhcHBlbnMgdG8gbm90IG5lZWQgRE9NXG4gICAgICAvLyBtdXRhdGlvbnMgYmVjYXVzZSBpdCBhbHJlYWR5IGV4aXN0cy5cblxuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gSHlkcmF0aW5nO1xuICAgICAgcmV0dXJuIHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBzZWNvbmQgcmVuZGVyIHBhc3MuIFdlIGFscmVhZHkgYXR0ZW1wdGVkIHRvIGh5ZHJhdGVkLCBidXRcbiAgICAvLyBzb21ldGhpbmcgZWl0aGVyIHN1c3BlbmRlZCBvciBlcnJvcmVkLlxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmNlQ2xpZW50UmVuZGVyKSB7XG4gICAgICAvLyBTb21ldGhpbmcgZXJyb3JlZCBkdXJpbmcgaHlkcmF0aW9uLiBUcnkgYWdhaW4gd2l0aG91dCBoeWRyYXRpbmcuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+Rm9yY2VDbGllbnRSZW5kZXI7XG5cbiAgICAgIHZhciBfY2FwdHVyZWRWYWx1ZTIgPSBjcmVhdGVDYXB0dXJlZFZhbHVlKG5ldyBFcnJvcignVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGh5ZHJhdGluZyB0aGlzIFN1c3BlbnNlIGJvdW5kYXJ5LiAnICsgJ1N3aXRjaGVkIHRvIGNsaWVudCByZW5kZXJpbmcuJykpO1xuXG4gICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCBfY2FwdHVyZWRWYWx1ZTIpO1xuICAgIH0gZWxzZSBpZiAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gU29tZXRoaW5nIHN1c3BlbmRlZCBhbmQgd2Ugc2hvdWxkIHN0aWxsIGJlIGluIGRlaHlkcmF0ZWQgbW9kZS5cbiAgICAgIC8vIExlYXZlIHRoZSBleGlzdGluZyBjaGlsZCBpbiBwbGFjZS5cbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gVGhlIGRlaHlkcmF0ZWQgY29tcGxldGlvbiBwYXNzIGV4cGVjdHMgdGhpcyBmbGFnIHRvIGJlIHRoZXJlXG4gICAgICAvLyBidXQgdGhlIG5vcm1hbCBzdXNwZW5zZSBwYXNzIGRvZXNuJ3QuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3VzcGVuZGVkIGJ1dCB3ZSBzaG91bGQgbm8gbG9uZ2VyIGJlIGluIGRlaHlkcmF0ZWQgbW9kZS5cbiAgICAgIC8vIFRoZXJlZm9yZSB3ZSBub3cgaGF2ZSB0byByZW5kZXIgdGhlIGZhbGxiYWNrLlxuICAgICAgdmFyIG5leHRQcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgbmV4dEZhbGxiYWNrQ2hpbGRyZW4gPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gbW91bnRTdXNwZW5zZUZhbGxiYWNrQWZ0ZXJSZXRyeVdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRQcmltYXJ5Q2hpbGRyZW4sIG5leHRGYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50NCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50NC5tZW1vaXplZFN0YXRlID0gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBTVVNQRU5ERURfTUFSS0VSO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKGZpYmVyLCByZW5kZXJMYW5lcywgcHJvcGFnYXRpb25Sb290KSB7XG4gIGZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhmaWJlci5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICBhbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChmaWJlci5yZXR1cm4sIHJlbmRlckxhbmVzLCBwcm9wYWdhdGlvblJvb3QpO1xufVxuXG5mdW5jdGlvbiBwcm9wYWdhdGVTdXNwZW5zZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIGZpcnN0Q2hpbGQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIE1hcmsgYW55IFN1c3BlbnNlIGJvdW5kYXJpZXMgd2l0aCBmYWxsYmFja3MgYXMgaGF2aW5nIHdvcmsgdG8gZG8uXG4gIC8vIElmIHRoZXkgd2VyZSBwcmV2aW91c2x5IGZvcmNlZCBpbnRvIGZhbGxiYWNrcywgdGhleSBtYXkgbm93IGJlIGFibGVcbiAgLy8gdG8gdW5ibG9jay5cbiAgdmFyIG5vZGUgPSBmaXJzdENoaWxkO1xuXG4gIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgdmFyIHN0YXRlID0gbm9kZS5tZW1vaXplZFN0YXRlO1xuXG4gICAgICBpZiAoc3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKG5vZGUsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VMaXN0Q29tcG9uZW50KSB7XG4gICAgICAvLyBJZiB0aGUgdGFpbCBpcyBoaWRkZW4gdGhlcmUgbWlnaHQgbm90IGJlIGFuIFN1c3BlbnNlIGJvdW5kYXJpZXNcbiAgICAgIC8vIHRvIHNjaGVkdWxlIHdvcmsgb24uIEluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHNjaGVkdWxlIGl0IG9uIHRoZVxuICAgICAgLy8gbGlzdCBpdHNlbGYuXG4gICAgICAvLyBXZSBkb24ndCBoYXZlIHRvIHRyYXZlcnNlIHRvIHRoZSBjaGlsZHJlbiBvZiB0aGUgbGlzdCBzaW5jZVxuICAgICAgLy8gdGhlIGxpc3Qgd2lsbCBwcm9wYWdhdGUgdGhlIGNoYW5nZSB3aGVuIGl0IHJlcmVuZGVycy5cbiAgICAgIHNjaGVkdWxlU3VzcGVuc2VXb3JrT25GaWJlcihub2RlLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRMYXN0Q29udGVudFJvdyhmaXJzdENoaWxkKSB7XG4gIC8vIFRoaXMgaXMgZ29pbmcgdG8gZmluZCB0aGUgbGFzdCByb3cgYW1vbmcgdGhlc2UgY2hpbGRyZW4gdGhhdCBpcyBhbHJlYWR5XG4gIC8vIHNob3dpbmcgY29udGVudCBvbiB0aGUgc2NyZWVuLCBhcyBvcHBvc2VkIHRvIGJlaW5nIGluIGZhbGxiYWNrIHN0YXRlIG9yXG4gIC8vIG5ldy4gSWYgYSByb3cgaGFzIG11bHRpcGxlIFN1c3BlbnNlIGJvdW5kYXJpZXMsIGFueSBvZiB0aGVtIGJlaW5nIGluIHRoZVxuICAvLyBmYWxsYmFjayBzdGF0ZSwgY291bnRzIGFzIHRoZSB3aG9sZSByb3cgYmVpbmcgaW4gYSBmYWxsYmFjayBzdGF0ZS5cbiAgLy8gTm90ZSB0aGF0IHRoZSBcInJvd3NcIiB3aWxsIGJlIHdvcmtJblByb2dyZXNzLCBidXQgYW55IG5lc3RlZCBjaGlsZHJlblxuICAvLyB3aWxsIHN0aWxsIGJlIGN1cnJlbnQgc2luY2Ugd2UgaGF2ZW4ndCByZW5kZXJlZCB0aGVtIHlldC4gVGhlIG1vdW50ZWRcbiAgLy8gb3JkZXIgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgbmV3IG9yZGVyLiBXZSB1c2UgdGhlIG5ldyBvcmRlci5cbiAgdmFyIHJvdyA9IGZpcnN0Q2hpbGQ7XG4gIHZhciBsYXN0Q29udGVudFJvdyA9IG51bGw7XG5cbiAgd2hpbGUgKHJvdyAhPT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50Um93ID0gcm93LmFsdGVybmF0ZTsgLy8gTmV3IHJvd3MgY2FuJ3QgYmUgY29udGVudCByb3dzLlxuXG4gICAgaWYgKGN1cnJlbnRSb3cgIT09IG51bGwgJiYgZmluZEZpcnN0U3VzcGVuZGVkKGN1cnJlbnRSb3cpID09PSBudWxsKSB7XG4gICAgICBsYXN0Q29udGVudFJvdyA9IHJvdztcbiAgICB9XG5cbiAgICByb3cgPSByb3cuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBsYXN0Q29udGVudFJvdztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVSZXZlYWxPcmRlcihyZXZlYWxPcmRlcikge1xuICB7XG4gICAgaWYgKHJldmVhbE9yZGVyICE9PSB1bmRlZmluZWQgJiYgcmV2ZWFsT3JkZXIgIT09ICdmb3J3YXJkcycgJiYgcmV2ZWFsT3JkZXIgIT09ICdiYWNrd2FyZHMnICYmIHJldmVhbE9yZGVyICE9PSAndG9nZXRoZXInICYmICFkaWRXYXJuQWJvdXRSZXZlYWxPcmRlcltyZXZlYWxPcmRlcl0pIHtcbiAgICAgIGRpZFdhcm5BYm91dFJldmVhbE9yZGVyW3JldmVhbE9yZGVyXSA9IHRydWU7XG5cbiAgICAgIGlmICh0eXBlb2YgcmV2ZWFsT3JkZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHN3aXRjaCAocmV2ZWFsT3JkZXIudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGNhc2UgJ3RvZ2V0aGVyJzpcbiAgICAgICAgICBjYXNlICdmb3J3YXJkcyc6XG4gICAgICAgICAgY2FzZSAnYmFja3dhcmRzJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXJyb3IoJ1wiJXNcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdVc2UgbG93ZXJjYXNlIFwiJXNcIiBpbnN0ZWFkLicsIHJldmVhbE9yZGVyLCByZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgJ2ZvcndhcmQnOlxuICAgICAgICAgIGNhc2UgJ2JhY2t3YXJkJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXJyb3IoJ1wiJXNcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdSZWFjdCB1c2VzIHRoZSAtcyBzdWZmaXggaW4gdGhlIHNwZWxsaW5nLiBVc2UgXCIlc3NcIiBpbnN0ZWFkLicsIHJldmVhbE9yZGVyLCByZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHN1cHBvcnRlZCByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ0RpZCB5b3UgbWVhbiBcInRvZ2V0aGVyXCIsIFwiZm9yd2FyZHNcIiBvciBcImJhY2t3YXJkc1wiPycsIHJldmVhbE9yZGVyKTtcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCclcyBpcyBub3QgYSBzdXBwb3J0ZWQgdmFsdWUgZm9yIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwidG9nZXRoZXJcIiwgXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCI/JywgcmV2ZWFsT3JkZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVRhaWxPcHRpb25zKHRhaWxNb2RlLCByZXZlYWxPcmRlcikge1xuICB7XG4gICAgaWYgKHRhaWxNb2RlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5BYm91dFRhaWxPcHRpb25zW3RhaWxNb2RlXSkge1xuICAgICAgaWYgKHRhaWxNb2RlICE9PSAnY29sbGFwc2VkJyAmJiB0YWlsTW9kZSAhPT0gJ2hpZGRlbicpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VGFpbE9wdGlvbnNbdGFpbE1vZGVdID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHN1cHBvcnRlZCB2YWx1ZSBmb3IgdGFpbCBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ0RpZCB5b3UgbWVhbiBcImNvbGxhcHNlZFwiIG9yIFwiaGlkZGVuXCI/JywgdGFpbE1vZGUpO1xuICAgICAgfSBlbHNlIGlmIChyZXZlYWxPcmRlciAhPT0gJ2ZvcndhcmRzJyAmJiByZXZlYWxPcmRlciAhPT0gJ2JhY2t3YXJkcycpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VGFpbE9wdGlvbnNbdGFpbE1vZGVdID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignPFN1c3BlbnNlTGlzdCB0YWlsPVwiJXNcIiAvPiBpcyBvbmx5IHZhbGlkIGlmIHJldmVhbE9yZGVyIGlzICcgKyAnXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCIuICcgKyAnRGlkIHlvdSBtZWFuIHRvIHNwZWNpZnkgcmV2ZWFsT3JkZXI9XCJmb3J3YXJkc1wiPycsIHRhaWxNb2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChjaGlsZFNsb3QsIGluZGV4KSB7XG4gIHtcbiAgICB2YXIgaXNBbkFycmF5ID0gaXNBcnJheShjaGlsZFNsb3QpO1xuICAgIHZhciBpc0l0ZXJhYmxlID0gIWlzQW5BcnJheSAmJiB0eXBlb2YgZ2V0SXRlcmF0b3JGbihjaGlsZFNsb3QpID09PSAnZnVuY3Rpb24nO1xuXG4gICAgaWYgKGlzQW5BcnJheSB8fCBpc0l0ZXJhYmxlKSB7XG4gICAgICB2YXIgdHlwZSA9IGlzQW5BcnJheSA/ICdhcnJheScgOiAnaXRlcmFibGUnO1xuXG4gICAgICBlcnJvcignQSBuZXN0ZWQgJXMgd2FzIHBhc3NlZCB0byByb3cgIyVzIGluIDxTdXNwZW5zZUxpc3QgLz4uIFdyYXAgaXQgaW4gJyArICdhbiBhZGRpdGlvbmFsIFN1c3BlbnNlTGlzdCB0byBjb25maWd1cmUgaXRzIHJldmVhbE9yZGVyOiAnICsgJzxTdXNwZW5zZUxpc3QgcmV2ZWFsT3JkZXI9Li4uPiAuLi4gJyArICc8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPS4uLj57JXN9PC9TdXNwZW5zZUxpc3Q+IC4uLiAnICsgJzwvU3VzcGVuc2VMaXN0PicsIHR5cGUsIGluZGV4LCB0eXBlKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN1c3BlbnNlTGlzdENoaWxkcmVuKGNoaWxkcmVuLCByZXZlYWxPcmRlcikge1xuICB7XG4gICAgaWYgKChyZXZlYWxPcmRlciA9PT0gJ2ZvcndhcmRzJyB8fCByZXZlYWxPcmRlciA9PT0gJ2JhY2t3YXJkcycpICYmIGNoaWxkcmVuICE9PSB1bmRlZmluZWQgJiYgY2hpbGRyZW4gIT09IG51bGwgJiYgY2hpbGRyZW4gIT09IGZhbHNlKSB7XG4gICAgICBpZiAoaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChjaGlsZHJlbltpXSwgaSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFyIGNoaWxkcmVuSXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoY2hpbGRyZW4pO1xuXG4gICAgICAgICAgaWYgKGNoaWxkcmVuSXRlcmF0b3IpIHtcbiAgICAgICAgICAgIHZhciBzdGVwID0gY2hpbGRyZW5JdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICB2YXIgX2kgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgc3RlcCA9IGNoaWxkcmVuSXRlcmF0b3IubmV4dCgpKSB7XG4gICAgICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChzdGVwLnZhbHVlLCBfaSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBfaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvcignQSBzaW5nbGUgcm93IHdhcyBwYXNzZWQgdG8gYSA8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPVwiJXNcIiAvPi4gJyArICdUaGlzIGlzIG5vdCB1c2VmdWwgc2luY2UgaXQgbmVlZHMgbXVsdGlwbGUgcm93cy4gJyArICdEaWQgeW91IG1lYW4gdG8gcGFzcyBtdWx0aXBsZSBjaGlsZHJlbiBvciBhbiBhcnJheT8nLCByZXZlYWxPcmRlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBpc0JhY2t3YXJkcywgdGFpbCwgbGFzdENvbnRlbnRSb3csIHRhaWxNb2RlKSB7XG4gIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHJlbmRlclN0YXRlID09PSBudWxsKSB7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHtcbiAgICAgIGlzQmFja3dhcmRzOiBpc0JhY2t3YXJkcyxcbiAgICAgIHJlbmRlcmluZzogbnVsbCxcbiAgICAgIHJlbmRlcmluZ1N0YXJ0VGltZTogMCxcbiAgICAgIGxhc3Q6IGxhc3RDb250ZW50Um93LFxuICAgICAgdGFpbDogdGFpbCxcbiAgICAgIHRhaWxNb2RlOiB0YWlsTW9kZVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gV2UgY2FuIHJldXNlIHRoZSBleGlzdGluZyBvYmplY3QgZnJvbSBwcmV2aW91cyByZW5kZXJzLlxuICAgIHJlbmRlclN0YXRlLmlzQmFja3dhcmRzID0gaXNCYWNrd2FyZHM7XG4gICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbnVsbDtcbiAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmdTdGFydFRpbWUgPSAwO1xuICAgIHJlbmRlclN0YXRlLmxhc3QgPSBsYXN0Q29udGVudFJvdztcbiAgICByZW5kZXJTdGF0ZS50YWlsID0gdGFpbDtcbiAgICByZW5kZXJTdGF0ZS50YWlsTW9kZSA9IHRhaWxNb2RlO1xuICB9XG59IC8vIFRoaXMgY2FuIGVuZCB1cCByZW5kZXJpbmcgdGhpcyBjb21wb25lbnQgbXVsdGlwbGUgcGFzc2VzLlxuLy8gVGhlIGZpcnN0IHBhc3Mgc3BsaXRzIHRoZSBjaGlsZHJlbiBmaWJlcnMgaW50byB0d28gc2V0cy4gQSBoZWFkIGFuZCB0YWlsLlxuLy8gV2UgZmlyc3QgcmVuZGVyIHRoZSBoZWFkLiBJZiBhbnl0aGluZyBpcyBpbiBmYWxsYmFjayBzdGF0ZSwgd2UgZG8gYW5vdGhlclxuLy8gcGFzcyB0aHJvdWdoIGJlZ2luV29yayB0byByZXJlbmRlciBhbGwgY2hpbGRyZW4gKGluY2x1ZGluZyB0aGUgdGFpbCkgd2l0aFxuLy8gdGhlIGZvcmNlIHN1c3BlbmQgY29udGV4dC4gSWYgdGhlIGZpcnN0IHJlbmRlciBkaWRuJ3QgaGF2ZSBhbnl0aGluZyBpblxuLy8gaW4gZmFsbGJhY2sgc3RhdGUuIFRoZW4gd2UgcmVuZGVyIGVhY2ggcm93IGluIHRoZSB0YWlsIG9uZS1ieS1vbmUuXG4vLyBUaGF0IGhhcHBlbnMgaW4gdGhlIGNvbXBsZXRlV29yayBwaGFzZSB3aXRob3V0IGdvaW5nIGJhY2sgdG8gYmVnaW5Xb3JrLlxuXG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHJldmVhbE9yZGVyID0gbmV4dFByb3BzLnJldmVhbE9yZGVyO1xuICB2YXIgdGFpbE1vZGUgPSBuZXh0UHJvcHMudGFpbDtcbiAgdmFyIG5ld0NoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YWxpZGF0ZVJldmVhbE9yZGVyKHJldmVhbE9yZGVyKTtcbiAgdmFsaWRhdGVUYWlsT3B0aW9ucyh0YWlsTW9kZSwgcmV2ZWFsT3JkZXIpO1xuICB2YWxpZGF0ZVN1c3BlbnNlTGlzdENoaWxkcmVuKG5ld0NoaWxkcmVuLCByZXZlYWxPcmRlcik7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXdDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50O1xuICB2YXIgc2hvdWxkRm9yY2VGYWxsYmFjayA9IGhhc1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG5cbiAgaWYgKHNob3VsZEZvcmNlRmFsbGJhY2spIHtcbiAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICB9IGVsc2Uge1xuICAgIHZhciBkaWRTdXNwZW5kQmVmb3JlID0gY3VycmVudCAhPT0gbnVsbCAmJiAoY3VycmVudC5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gICAgaWYgKGRpZFN1c3BlbmRCZWZvcmUpIHtcbiAgICAgIC8vIElmIHdlIHByZXZpb3VzbHkgZm9yY2VkIGEgZmFsbGJhY2ssIHdlIG5lZWQgdG8gc2NoZWR1bGUgd29ya1xuICAgICAgLy8gb24gYW55IG5lc3RlZCBib3VuZGFyaWVzIHRvIGxldCB0aGVtIGtub3cgdG8gdHJ5IHRvIHJlbmRlclxuICAgICAgLy8gYWdhaW4uIFRoaXMgaXMgdGhlIHNhbWUgYXMgY29udGV4dCB1cGRhdGluZy5cbiAgICAgIHByb3BhZ2F0ZVN1c3BlbnNlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MuY2hpbGQsIHJlbmRlckxhbmVzKTtcbiAgICB9XG5cbiAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQpO1xuICB9XG5cbiAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VDb250ZXh0KTtcblxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIC8vIEluIGxlZ2FjeSBtb2RlLCBTdXNwZW5zZUxpc3QgZG9lc24ndCB3b3JrIHNvIHdlIGp1c3RcbiAgICAvLyB1c2UgbWFrZSBpdCBhIG5vb3AgYnkgdHJlYXRpbmcgaXQgYXMgdGhlIGRlZmF1bHQgcmV2ZWFsT3JkZXIuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoIChyZXZlYWxPcmRlcikge1xuICAgICAgY2FzZSAnZm9yd2FyZHMnOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhc3RDb250ZW50Um93ID0gZmluZExhc3RDb250ZW50Um93KHdvcmtJblByb2dyZXNzLmNoaWxkKTtcbiAgICAgICAgICB2YXIgdGFpbDtcblxuICAgICAgICAgIGlmIChsYXN0Q29udGVudFJvdyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlIHdob2xlIGxpc3QgaXMgcGFydCBvZiB0aGUgdGFpbC5cbiAgICAgICAgICAgIC8vIFRPRE86IFdlIGNvdWxkIGZhc3QgcGF0aCBieSBqdXN0IHJlbmRlcmluZyB0aGUgdGFpbCBub3cuXG4gICAgICAgICAgICB0YWlsID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIERpc2Nvbm5lY3QgdGhlIHRhaWwgcm93cyBhZnRlciB0aGUgY29udGVudCByb3cuXG4gICAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byByZW5kZXIgdGhlbSBzZXBhcmF0ZWx5IGxhdGVyLlxuICAgICAgICAgICAgdGFpbCA9IGxhc3RDb250ZW50Um93LnNpYmxpbmc7XG4gICAgICAgICAgICBsYXN0Q29udGVudFJvdy5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIGZhbHNlLCAvLyBpc0JhY2t3YXJkc1xuICAgICAgICAgIHRhaWwsIGxhc3RDb250ZW50Um93LCB0YWlsTW9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAnYmFja3dhcmRzJzpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGZpbmQgdGhlIGZpcnN0IHJvdyB0aGF0IGhhcyBleGlzdGluZyBjb250ZW50LlxuICAgICAgICAgIC8vIEF0IHRoZSBzYW1lIHRpbWUgd2UncmUgZ29pbmcgdG8gcmV2ZXJzZSB0aGUgbGlzdCBvZiBldmVyeXRoaW5nXG4gICAgICAgICAgLy8gd2UgcGFzcyBpbiB0aGUgbWVhbnRpbWUuIFRoYXQncyBnb2luZyB0byBiZSBvdXIgdGFpbCBpbiByZXZlcnNlXG4gICAgICAgICAgLy8gb3JkZXIuXG4gICAgICAgICAgdmFyIF90YWlsID0gbnVsbDtcbiAgICAgICAgICB2YXIgcm93ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsO1xuXG4gICAgICAgICAgd2hpbGUgKHJvdyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRSb3cgPSByb3cuYWx0ZXJuYXRlOyAvLyBOZXcgcm93cyBjYW4ndCBiZSBjb250ZW50IHJvd3MuXG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50Um93ICE9PSBudWxsICYmIGZpbmRGaXJzdFN1c3BlbmRlZChjdXJyZW50Um93KSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1haW4gY29udGVudC5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByb3c7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbmV4dFJvdyA9IHJvdy5zaWJsaW5nO1xuICAgICAgICAgICAgcm93LnNpYmxpbmcgPSBfdGFpbDtcbiAgICAgICAgICAgIF90YWlsID0gcm93O1xuICAgICAgICAgICAgcm93ID0gbmV4dFJvdztcbiAgICAgICAgICB9IC8vIFRPRE86IElmIHdvcmtJblByb2dyZXNzLmNoaWxkIGlzIG51bGwsIHdlIGNhbiBjb250aW51ZSBvbiB0aGUgdGFpbCBpbW1lZGlhdGVseS5cblxuXG4gICAgICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCB0cnVlLCAvLyBpc0JhY2t3YXJkc1xuICAgICAgICAgIF90YWlsLCBudWxsLCAvLyBsYXN0XG4gICAgICAgICAgdGFpbE1vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgJ3RvZ2V0aGVyJzpcbiAgICAgICAge1xuICAgICAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgZmFsc2UsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgbnVsbCwgLy8gdGFpbFxuICAgICAgICAgIG51bGwsIC8vIGxhc3RcbiAgICAgICAgICB1bmRlZmluZWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUaGUgZGVmYXVsdCByZXZlYWwgb3JkZXIgaXMgdGhlIHNhbWUgYXMgbm90IGhhdmluZ1xuICAgICAgICAgIC8vIGEgYm91bmRhcnkuXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVBvcnRhbENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIFBvcnRhbHMgYXJlIHNwZWNpYWwgYmVjYXVzZSB3ZSBkb24ndCBhcHBlbmQgdGhlIGNoaWxkcmVuIGR1cmluZyBtb3VudFxuICAgIC8vIGJ1dCBhdCBjb21taXQuIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIHRyYWNrIGluc2VydGlvbnMgd2hpY2ggdGhlIG5vcm1hbFxuICAgIC8vIGZsb3cgZG9lc24ndCBkbyBkdXJpbmcgbW91bnQuIFRoaXMgZG9lc24ndCBoYXBwZW4gYXQgdGhlIHJvb3QgYmVjYXVzZVxuICAgIC8vIHRoZSByb290IGFsd2F5cyBzdGFydHMgd2l0aCBhIFwiY3VycmVudFwiIHdpdGggYSBudWxsIGNoaWxkLlxuICAgIC8vIFRPRE86IENvbnNpZGVyIHVuaWZ5aW5nIHRoaXMgd2l0aCBob3cgdGhlIHJvb3Qgd29ya3MuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG52YXIgaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIgPSBmYWxzZTtcblxuZnVuY3Rpb24gdXBkYXRlQ29udGV4dFByb3ZpZGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgcHJvdmlkZXJUeXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgdmFyIGNvbnRleHQgPSBwcm92aWRlclR5cGUuX2NvbnRleHQ7XG4gIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcztcbiAgdmFyIG5ld1ZhbHVlID0gbmV3UHJvcHMudmFsdWU7XG5cbiAge1xuICAgIGlmICghKCd2YWx1ZScgaW4gbmV3UHJvcHMpKSB7XG4gICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdOb1ZhbHVlUHJvcE9uQ29udGV4dFByb3ZpZGVyKSB7XG4gICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdOb1ZhbHVlUHJvcE9uQ29udGV4dFByb3ZpZGVyID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignVGhlIGB2YWx1ZWAgcHJvcCBpcyByZXF1aXJlZCBmb3IgdGhlIGA8Q29udGV4dC5Qcm92aWRlcj5gLiBEaWQgeW91IG1pc3NwZWxsIGl0IG9yIGZvcmdldCB0byBwYXNzIGl0PycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcm92aWRlclByb3BUeXBlcyA9IHdvcmtJblByb2dyZXNzLnR5cGUucHJvcFR5cGVzO1xuXG4gICAgaWYgKHByb3ZpZGVyUHJvcFR5cGVzKSB7XG4gICAgICBjaGVja1Byb3BUeXBlcyhwcm92aWRlclByb3BUeXBlcywgbmV3UHJvcHMsICdwcm9wJywgJ0NvbnRleHQuUHJvdmlkZXInKTtcbiAgICB9XG4gIH1cblxuICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIG5ld1ZhbHVlKTtcblxuICB7XG4gICAgaWYgKG9sZFByb3BzICE9PSBudWxsKSB7XG4gICAgICB2YXIgb2xkVmFsdWUgPSBvbGRQcm9wcy52YWx1ZTtcblxuICAgICAgaWYgKG9iamVjdElzKG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAgICAgLy8gTm8gY2hhbmdlLiBCYWlsb3V0IGVhcmx5IGlmIGNoaWxkcmVuIGFyZSB0aGUgc2FtZS5cbiAgICAgICAgaWYgKG9sZFByb3BzLmNoaWxkcmVuID09PSBuZXdQcm9wcy5jaGlsZHJlbiAmJiAhaGFzQ29udGV4dENoYW5nZWQoKSkge1xuICAgICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZSBjb250ZXh0IHZhbHVlIGNoYW5nZWQuIFNlYXJjaCBmb3IgbWF0Y2hpbmcgY29uc3VtZXJzIGFuZCBzY2hlZHVsZVxuICAgICAgICAvLyB0aGVtIHRvIHVwZGF0ZS5cbiAgICAgICAgcHJvcGFnYXRlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBuZXdDaGlsZHJlbiA9IG5ld1Byb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG52YXIgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRleHRDb25zdW1lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlOyAvLyBUaGUgbG9naWMgYmVsb3cgZm9yIENvbnRleHQgZGlmZmVycyBkZXBlbmRpbmcgb24gUFJPRCBvciBERVYgbW9kZS4gSW5cbiAgLy8gREVWIG1vZGUsIHdlIGNyZWF0ZSBhIHNlcGFyYXRlIG9iamVjdCBmb3IgQ29udGV4dC5Db25zdW1lciB0aGF0IGFjdHNcbiAgLy8gbGlrZSBhIHByb3h5IHRvIENvbnRleHQuIFRoaXMgcHJveHkgb2JqZWN0IGFkZHMgdW5uZWNlc3NhcnkgY29kZSBpbiBQUk9EXG4gIC8vIHNvIHdlIHVzZSB0aGUgb2xkIGJlaGF2aW91ciAoQ29udGV4dC5Db25zdW1lciByZWZlcmVuY2VzIENvbnRleHQpIHRvXG4gIC8vIHJlZHVjZSBzaXplIGFuZCBvdmVyaGVhZC4gVGhlIHNlcGFyYXRlIG9iamVjdCByZWZlcmVuY2VzIGNvbnRleHQgdmlhXG4gIC8vIGEgcHJvcGVydHkgY2FsbGVkIFwiX2NvbnRleHRcIiwgd2hpY2ggYWxzbyBnaXZlcyB1cyB0aGUgYWJpbGl0eSB0byBjaGVja1xuICAvLyBpbiBERVYgbW9kZSBpZiB0aGlzIHByb3BlcnR5IGV4aXN0cyBvciBub3QgYW5kIHdhcm4gaWYgaXQgZG9lcyBub3QuXG5cbiAge1xuICAgIGlmIChjb250ZXh0Ll9jb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFRoaXMgbWF5IGJlIGJlY2F1c2UgaXQncyBhIENvbnRleHQgKHJhdGhlciB0aGFuIGEgQ29uc3VtZXIpLlxuICAgICAgLy8gT3IgaXQgbWF5IGJlIGJlY2F1c2UgaXQncyBvbGRlciBSZWFjdCB3aGVyZSB0aGV5J3JlIHRoZSBzYW1lIHRoaW5nLlxuICAgICAgLy8gV2Ugb25seSB3YW50IHRvIHdhcm4gaWYgd2UncmUgc3VyZSBpdCdzIGEgbmV3IFJlYWN0LlxuICAgICAgaWYgKGNvbnRleHQgIT09IGNvbnRleHQuQ29uc3VtZXIpIHtcbiAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIpIHtcbiAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dD4gZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Db25zdW1lcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0ID0gY29udGV4dC5fY29udGV4dDtcbiAgICB9XG4gIH1cblxuICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciByZW5kZXIgPSBuZXdQcm9wcy5jaGlsZHJlbjtcblxuICB7XG4gICAgaWYgKHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdBIGNvbnRleHQgY29uc3VtZXIgd2FzIHJlbmRlcmVkIHdpdGggbXVsdGlwbGUgY2hpbGRyZW4sIG9yIGEgY2hpbGQgJyArIFwidGhhdCBpc24ndCBhIGZ1bmN0aW9uLiBBIGNvbnRleHQgY29uc3VtZXIgZXhwZWN0cyBhIHNpbmdsZSBjaGlsZCBcIiArICd0aGF0IGlzIGEgZnVuY3Rpb24uIElmIHlvdSBkaWQgcGFzcyBhIGZ1bmN0aW9uLCBtYWtlIHN1cmUgdGhlcmUgJyArICdpcyBubyB0cmFpbGluZyBvciBsZWFkaW5nIHdoaXRlc3BhY2UgYXJvdW5kIGl0LicpO1xuICAgIH1cbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBuZXdWYWx1ZSA9IHJlYWRDb250ZXh0KGNvbnRleHQpO1xuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB2YXIgbmV3Q2hpbGRyZW47XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIG5ld0NoaWxkcmVuID0gcmVuZGVyKG5ld1ZhbHVlKTtcbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpIHtcbiAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gQSBsYXp5IGNvbXBvbmVudCBvbmx5IG1vdW50cyBpZiBpdCBzdXNwZW5kZWQgaW5zaWRlIGEgbm9uLVxuICAgICAgLy8gY29uY3VycmVudCB0cmVlLCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFdlIHdhbnQgdG8gdHJlYXQgaXQgbGlrZVxuICAgICAgLy8gYSBuZXcgbW91bnQsIGV2ZW4gdGhvdWdoIGFuIGVtcHR5IHZlcnNpb24gb2YgaXQgYWxyZWFkeSBjb21taXR0ZWQuXG4gICAgICAvLyBEaXNjb25uZWN0IHRoZSBhbHRlcm5hdGUgcG9pbnRlcnMuXG4gICAgICBjdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBTaW5jZSB0aGlzIGlzIGNvbmNlcHR1YWxseSBhIG5ldyBmaWJlciwgc2NoZWR1bGUgYSBQbGFjZW1lbnQgZWZmZWN0XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAvLyBSZXVzZSBwcmV2aW91cyBkZXBlbmRlbmNpZXNcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llcztcbiAgfVxuXG4gIHtcbiAgICAvLyBEb24ndCB1cGRhdGUgXCJiYXNlXCIgcmVuZGVyIHRpbWVzIGZvciBiYWlsb3V0cy5cbiAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZygpO1xuICB9XG5cbiAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcyk7IC8vIENoZWNrIGlmIHRoZSBjaGlsZHJlbiBoYXZlIGFueSBwZW5kaW5nIHdvcmsuXG5cbiAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKSkge1xuICAgIC8vIFRoZSBjaGlsZHJlbiBkb24ndCBoYXZlIGFueSB3b3JrIGVpdGhlci4gV2UgY2FuIHNraXAgdGhlbS5cbiAgICAvLyBUT0RPOiBPbmNlIHdlIGFkZCBiYWNrIHJlc3VtaW5nLCB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlIGNoaWxkcmVuIGFyZVxuICAgIC8vIGEgd29yay1pbi1wcm9ncmVzcyBzZXQuIElmIHNvLCB3ZSBuZWVkIHRvIHRyYW5zZmVyIHRoZWlyIGVmZmVjdHMuXG4gICAge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9IC8vIFRoaXMgZmliZXIgZG9lc24ndCBoYXZlIHdvcmssIGJ1dCBpdHMgc3VidHJlZSBkb2VzLiBDbG9uZSB0aGUgY2hpbGRcbiAgLy8gZmliZXJzIGFuZCBjb250aW51ZS5cblxuXG4gIGNsb25lQ2hpbGRGaWJlcnMoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHJlbW91bnRGaWJlcihjdXJyZW50LCBvbGRXb3JrSW5Qcm9ncmVzcywgbmV3V29ya0luUHJvZ3Jlc3MpIHtcbiAge1xuICAgIHZhciByZXR1cm5GaWJlciA9IG9sZFdvcmtJblByb2dyZXNzLnJldHVybjtcblxuICAgIGlmIChyZXR1cm5GaWJlciA9PT0gbnVsbCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHN3YXAgdGhlIHJvb3QgZmliZXIuJyk7XG4gICAgfSAvLyBEaXNjb25uZWN0IGZyb20gdGhlIG9sZCBjdXJyZW50LlxuICAgIC8vIEl0IHdpbGwgZ2V0IGRlbGV0ZWQuXG5cblxuICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICBvbGRXb3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBDb25uZWN0IHRvIHRoZSBuZXcgdHJlZS5cblxuICAgIG5ld1dvcmtJblByb2dyZXNzLmluZGV4ID0gb2xkV29ya0luUHJvZ3Jlc3MuaW5kZXg7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3Muc2libGluZyA9IG9sZFdvcmtJblByb2dyZXNzLnNpYmxpbmc7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3MucmV0dXJuID0gb2xkV29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuICAgIG5ld1dvcmtJblByb2dyZXNzLnJlZiA9IG9sZFdvcmtJblByb2dyZXNzLnJlZjsgLy8gUmVwbGFjZSB0aGUgY2hpbGQvc2libGluZyBwb2ludGVycyBhYm92ZSBpdC5cblxuICAgIGlmIChvbGRXb3JrSW5Qcm9ncmVzcyA9PT0gcmV0dXJuRmliZXIuY2hpbGQpIHtcbiAgICAgIHJldHVybkZpYmVyLmNoaWxkID0gbmV3V29ya0luUHJvZ3Jlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBwcmV2U2libGluZyA9IHJldHVybkZpYmVyLmNoaWxkO1xuXG4gICAgICBpZiAocHJldlNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBwYXJlbnQgdG8gaGF2ZSBhIGNoaWxkLicpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAocHJldlNpYmxpbmcuc2libGluZyAhPT0gb2xkV29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcHJldlNpYmxpbmcgPSBwcmV2U2libGluZy5zaWJsaW5nO1xuXG4gICAgICAgIGlmIChwcmV2U2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBmaW5kIHRoZSBwcmV2aW91cyBzaWJsaW5nLicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByZXZTaWJsaW5nLnNpYmxpbmcgPSBuZXdXb3JrSW5Qcm9ncmVzcztcbiAgICB9IC8vIERlbGV0ZSB0aGUgb2xkIGZpYmVyIGFuZCBwbGFjZSB0aGUgbmV3IG9uZS5cbiAgICAvLyBTaW5jZSB0aGUgb2xkIGZpYmVyIGlzIGRpc2Nvbm5lY3RlZCwgd2UgaGF2ZSB0byBzY2hlZHVsZSBpdCBtYW51YWxseS5cblxuXG4gICAgdmFyIGRlbGV0aW9ucyA9IHJldHVybkZpYmVyLmRlbGV0aW9ucztcblxuICAgIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjdXJyZW50XTtcbiAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IENoaWxkRGVsZXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0aW9ucy5wdXNoKGN1cnJlbnQpO1xuICAgIH1cblxuICAgIG5ld1dvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDsgLy8gUmVzdGFydCB3b3JrIGZyb20gdGhlIG5ldyBmaWJlci5cblxuICAgIHJldHVybiBuZXdXb3JrSW5Qcm9ncmVzcztcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcykge1xuICAvLyBCZWZvcmUgcGVyZm9ybWluZyBhbiBlYXJseSBiYWlsb3V0LCB3ZSBtdXN0IGNoZWNrIGlmIHRoZXJlIGFyZSBwZW5kaW5nXG4gIC8vIHVwZGF0ZXMgb3IgY29udGV4dC5cbiAgdmFyIHVwZGF0ZUxhbmVzID0gY3VycmVudC5sYW5lcztcblxuICBpZiAoaW5jbHVkZXNTb21lTGFuZSh1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm8gcGVuZGluZyB1cGRhdGUsIGJ1dCBiZWNhdXNlIGNvbnRleHQgaXMgcHJvcGFnYXRlZCBsYXppbHksIHdlIG5lZWRcblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRFYXJseUJhaWxvdXRJZk5vU2NoZWR1bGVkVXBkYXRlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIGZpYmVyIGRvZXMgbm90IGhhdmUgYW55IHBlbmRpbmcgd29yay4gQmFpbG91dCB3aXRob3V0IGVudGVyaW5nXG4gIC8vIHRoZSBiZWdpbiBwaGFzZS4gVGhlcmUncyBzdGlsbCBzb21lIGJvb2trZWVwaW5nIHdlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZVxuICAvLyBpbiB0aGlzIG9wdGltaXplZCBwYXRoLCBtb3N0bHkgcHVzaGluZyBzdHVmZiBvbnRvIHRoZSBzdGFjay5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAgcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICBwdXNoSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcy52YWx1ZTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLl9jb250ZXh0O1xuICAgICAgICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIG5ld1ZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAge1xuICAgICAgICAvLyBQcm9maWxlciBzaG91bGQgb25seSBjYWxsIG9uUmVuZGVyIHdoZW4gb25lIG9mIGl0cyBkZXNjZW5kYW50cyBhY3R1YWxseSByZW5kZXJlZC5cbiAgICAgICAgdmFyIGhhc0NoaWxkV29yayA9IGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMpO1xuXG4gICAgICAgIGlmIChoYXNDaGlsZFdvcmspIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgLy8gUmVzZXQgZWZmZWN0IGR1cmF0aW9ucyBmb3IgdGhlIG5leHQgZXZlbnR1YWwgZWZmZWN0IHBoYXNlLlxuICAgICAgICAgIC8vIFRoZXNlIGFyZSByZXNldCBkdXJpbmcgcmVuZGVyIHRvIGFsbG93IHRoZSBEZXZUb29scyBjb21taXQgaG9vayBhIGNoYW5jZSB0byByZWFkIHRoZW0sXG4gICAgICAgICAgdmFyIHN0YXRlTm9kZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgICAgIHN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAoc3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7IC8vIFdlIGtub3cgdGhhdCB0aGlzIGNvbXBvbmVudCB3aWxsIHN1c3BlbmQgYWdhaW4gYmVjYXVzZSBpZiBpdCBoYXNcbiAgICAgICAgICAgIC8vIGJlZW4gdW5zdXNwZW5kZWQgaXQgaGFzIGNvbW1pdHRlZCBhcyBhIHJlc29sdmVkIFN1c3BlbnNlIGNvbXBvbmVudC5cbiAgICAgICAgICAgIC8vIElmIGl0IG5lZWRzIHRvIGJlIHJldHJpZWQsIGl0IHNob3VsZCBoYXZlIHdvcmsgc2NoZWR1bGVkIG9uIGl0LlxuXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlOyAvLyBXZSBzaG91bGQgbmV2ZXIgcmVuZGVyIHRoZSBjaGlsZHJlbiBvZiBhIGRlaHlkcmF0ZWQgYm91bmRhcnkgdW50aWwgd2VcbiAgICAgICAgICAgIC8vIHVwZ3JhZGUgaXQuIFdlIHJldHVybiBudWxsIGluc3RlYWQgb2YgYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yay5cblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSAvLyBJZiB0aGlzIGJvdW5kYXJ5IGlzIGN1cnJlbnRseSB0aW1lZCBvdXQsIHdlIG5lZWQgdG8gZGVjaWRlXG4gICAgICAgICAgLy8gd2hldGhlciB0byByZXRyeSB0aGUgcHJpbWFyeSBjaGlsZHJlbiwgb3IgdG8gc2tpcCBvdmVyIGl0IGFuZFxuICAgICAgICAgIC8vIGdvIHN0cmFpZ2h0IHRvIHRoZSBmYWxsYmFjay4gQ2hlY2sgdGhlIHByaW9yaXR5IG9mIHRoZSBwcmltYXJ5XG4gICAgICAgICAgLy8gY2hpbGQgZnJhZ21lbnQuXG5cblxuICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRMYW5lcyA9IHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXM7XG5cbiAgICAgICAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgcHJpbWFyeUNoaWxkTGFuZXMpKSB7XG4gICAgICAgICAgICAvLyBUaGUgcHJpbWFyeSBjaGlsZHJlbiBoYXZlIHBlbmRpbmcgd29yay4gVXNlIHRoZSBub3JtYWwgcGF0aFxuICAgICAgICAgICAgLy8gdG8gYXR0ZW1wdCB0byByZW5kZXIgdGhlIHByaW1hcnkgY2hpbGRyZW4gYWdhaW4uXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhlIHByaW1hcnkgY2hpbGQgZnJhZ21lbnQgZG9lcyBub3QgaGF2ZSBwZW5kaW5nIHdvcmsgbWFya2VkXG4gICAgICAgICAgICAvLyBvbiBpdFxuICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7IC8vIFRoZSBwcmltYXJ5IGNoaWxkcmVuIGRvIG5vdCBoYXZlIHBlbmRpbmcgd29yayB3aXRoIHN1ZmZpY2llbnRcbiAgICAgICAgICAgIC8vIHByaW9yaXR5LiBCYWlsb3V0LlxuXG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgICAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBUaGUgZmFsbGJhY2sgY2hpbGRyZW4gaGF2ZSBwZW5kaW5nIHdvcmsuIFNraXAgb3ZlciB0aGVcbiAgICAgICAgICAgICAgLy8gcHJpbWFyeSBjaGlsZHJlbiBhbmQgd29yayBvbiB0aGUgZmFsbGJhY2suXG4gICAgICAgICAgICAgIHJldHVybiBjaGlsZC5zaWJsaW5nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTm90ZTogV2UgY2FuIHJldHVybiBgbnVsbGAgaGVyZSBiZWNhdXNlIHdlIGFscmVhZHkgY2hlY2tlZFxuICAgICAgICAgICAgICAvLyB3aGV0aGVyIHRoZXJlIHdlcmUgbmVzdGVkIGNvbnRleHQgY29uc3VtZXJzLCB2aWEgdGhlIGNhbGwgdG9cbiAgICAgICAgICAgICAgLy8gYGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmtgIGFib3ZlLlxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgZGlkU3VzcGVuZEJlZm9yZSA9IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgICAgICAgdmFyIF9oYXNDaGlsZFdvcmsgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKTtcblxuICAgICAgICBpZiAoZGlkU3VzcGVuZEJlZm9yZSkge1xuICAgICAgICAgIGlmIChfaGFzQ2hpbGRXb3JrKSB7XG4gICAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgd2FzIGluIGZhbGxiYWNrIHN0YXRlIGxhc3QgdGltZSwgYW5kIHdlIGhhdmUgYWxsIHRoZVxuICAgICAgICAgICAgLy8gc2FtZSBjaGlsZHJlbiB0aGVuIHdlJ3JlIHN0aWxsIGluIHByb2dyZXNzaXZlIGxvYWRpbmcgc3RhdGUuXG4gICAgICAgICAgICAvLyBTb21ldGhpbmcgbWlnaHQgZ2V0IHVuYmxvY2tlZCBieSBzdGF0ZSB1cGRhdGVzIG9yIHJldHJpZXMgaW4gdGhlXG4gICAgICAgICAgICAvLyB0cmVlIHdoaWNoIHdpbGwgYWZmZWN0IHRoZSB0YWlsLiBTbyB3ZSBuZWVkIHRvIHVzZSB0aGUgbm9ybWFsXG4gICAgICAgICAgICAvLyBwYXRoIHRvIGNvbXB1dGUgdGhlIGNvcnJlY3QgdGFpbC5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9IC8vIElmIG5vbmUgb2YgdGhlIGNoaWxkcmVuIGhhZCBhbnkgd29yaywgdGhhdCBtZWFucyB0aGF0IG5vbmUgb2ZcbiAgICAgICAgICAvLyB0aGVtIGdvdCByZXRyaWVkIHNvIHRoZXknbGwgc3RpbGwgYmUgYmxvY2tlZCBpbiB0aGUgc2FtZSB3YXlcbiAgICAgICAgICAvLyBhcyBiZWZvcmUuIFdlIGNhbiBmYXN0IGJhaWwgb3V0LlxuXG5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICB9IC8vIElmIG5vdGhpbmcgc3VzcGVuZGVkIGJlZm9yZSBhbmQgd2UncmUgcmVuZGVyaW5nIHRoZSBzYW1lIGNoaWxkcmVuLFxuICAgICAgICAvLyB0aGVuIHRoZSB0YWlsIGRvZXNuJ3QgbWF0dGVyLiBBbnl0aGluZyBuZXcgdGhhdCBzdXNwZW5kcyB3aWxsIHdvcmtcbiAgICAgICAgLy8gaW4gdGhlIFwidG9nZXRoZXJcIiBtb2RlLCBzbyB3ZSBjYW4gY29udGludWUgZnJvbSB0aGUgc3RhdGUgd2UgaGFkLlxuXG5cbiAgICAgICAgdmFyIHJlbmRlclN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAocmVuZGVyU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBSZXNldCB0byB0aGUgXCJ0b2dldGhlclwiIG1vZGUgaW4gY2FzZSB3ZSd2ZSBzdGFydGVkIGEgZGlmZmVyZW50XG4gICAgICAgICAgLy8gdXBkYXRlIGluIHRoZSBwYXN0IGJ1dCBkaWRuJ3QgY29tcGxldGUgaXQuXG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbnVsbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbnVsbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS5sYXN0RWZmZWN0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG5cbiAgICAgICAgaWYgKF9oYXNDaGlsZFdvcmspIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJZiBub25lIG9mIHRoZSBjaGlsZHJlbiBoYWQgYW55IHdvcmssIHRoYXQgbWVhbnMgdGhhdCBub25lIG9mXG4gICAgICAgICAgLy8gdGhlbSBnb3QgcmV0cmllZCBzbyB0aGV5J2xsIHN0aWxsIGJlIGJsb2NrZWQgaW4gdGhlIHNhbWUgd2F5XG4gICAgICAgICAgLy8gYXMgYmVmb3JlLiBXZSBjYW4gZmFzdCBiYWlsIG91dC5cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgaWYgdGhlIHRyZWUgc3RpbGwgbmVlZHMgdG8gYmUgZGVmZXJyZWQuIFRoaXMgaXNcbiAgICAgICAgLy8gYWxtb3N0IGlkZW50aWNhbCB0byB0aGUgbG9naWMgdXNlZCBpbiB0aGUgbm9ybWFsIHVwZGF0ZSBwYXRoLFxuICAgICAgICAvLyBzbyB3ZSdsbCBqdXN0IGVudGVyIHRoYXQuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgd2UnbGwgYmFpbCBvdXRcbiAgICAgICAgLy8gYXQgdGhlIG5leHQgbGV2ZWwgaW5zdGVhZCBvZiB0aGlzIG9uZSwgYmVjYXVzZSB0aGUgY2hpbGQgcHJvcHNcbiAgICAgICAgLy8gaGF2ZSBub3QgY2hhbmdlZC4gV2hpY2ggaXMgZmluZS5cbiAgICAgICAgLy8gVE9ETzogUHJvYmFibHkgc2hvdWxkIHJlZmFjdG9yIGBiZWdpbldvcmtgIHRvIHNwbGl0IHRoZSBiYWlsb3V0XG4gICAgICAgIC8vIHBhdGggZnJvbSB0aGUgbm9ybWFsIHBhdGguIEknbSB0ZW1wdGVkIHRvIGRvIGEgbGFiZWxlZCBicmVhayBoZXJlXG4gICAgICAgIC8vIGJ1dCBJIHdvbid0IDopXG4gICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gTm9MYW5lcztcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gYmVnaW5Xb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLl9kZWJ1Z05lZWRzUmVtb3VudCAmJiBjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIHdpbGwgcmVzdGFydCB0aGUgYmVnaW4gcGhhc2Ugd2l0aCBhIG5ldyBmaWJlci5cbiAgICAgIHJldHVybiByZW1vdW50RmliZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh3b3JrSW5Qcm9ncmVzcy50eXBlLCB3b3JrSW5Qcm9ncmVzcy5rZXksIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcywgd29ya0luUHJvZ3Jlc3MuX2RlYnVnT3duZXIgfHwgbnVsbCwgd29ya0luUHJvZ3Jlc3MubW9kZSwgd29ya0luUHJvZ3Jlc3MubGFuZXMpKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIHZhciBvbGRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzIHx8IGhhc0NvbnRleHRDaGFuZ2VkKCkgfHwgKCAvLyBGb3JjZSBhIHJlLXJlbmRlciBpZiB0aGUgaW1wbGVtZW50YXRpb24gY2hhbmdlZCBkdWUgdG8gaG90IHJlbG9hZDpcbiAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gY3VycmVudC50eXBlICkpIHtcbiAgICAgIC8vIElmIHByb3BzIG9yIGNvbnRleHQgY2hhbmdlZCwgbWFyayB0aGUgZmliZXIgYXMgaGF2aW5nIHBlcmZvcm1lZCB3b3JrLlxuICAgICAgLy8gVGhpcyBtYXkgYmUgdW5zZXQgaWYgdGhlIHByb3BzIGFyZSBkZXRlcm1pbmVkIHRvIGJlIGVxdWFsIGxhdGVyIChtZW1vKS5cbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZWl0aGVyIHByb3BzIG5vciBsZWdhY3kgY29udGV4dCBjaGFuZ2VzLiBDaGVjayBpZiB0aGVyZSdzIGEgcGVuZGluZ1xuICAgICAgLy8gdXBkYXRlIG9yIGNvbnRleHQgY2hhbmdlLlxuICAgICAgdmFyIGhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCA9IGNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKTtcblxuICAgICAgaWYgKCFoYXNTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQgJiYgLy8gSWYgdGhpcyBpcyB0aGUgc2Vjb25kIHBhc3Mgb2YgYW4gZXJyb3Igb3Igc3VzcGVuc2UgYm91bmRhcnksIHRoZXJlXG4gICAgICAvLyBtYXkgbm90IGJlIHdvcmsgc2NoZWR1bGVkIG9uIGBjdXJyZW50YCwgc28gd2UgY2hlY2sgZm9yIHRoaXMgZmxhZy5cbiAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIE5vIHBlbmRpbmcgdXBkYXRlcyBvciBjb250ZXh0LiBCYWlsIG91dCBub3cuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGF0dGVtcHRFYXJseUJhaWxvdXRJZk5vU2NoZWR1bGVkVXBkYXRlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICgoY3VycmVudC5mbGFncyAmIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBvbmx5IGV4aXN0cyBmb3IgbGVnYWN5IG1vZGUuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xOTIxNi5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBvbiB0aGlzIGZpYmVyLCBidXQgdGhlcmUgYXJlIG5vIG5ldyBwcm9wc1xuICAgICAgICAvLyBub3IgbGVnYWN5IGNvbnRleHQuIFNldCB0aGlzIHRvIGZhbHNlLiBJZiBhbiB1cGRhdGUgcXVldWUgb3IgY29udGV4dFxuICAgICAgICAvLyBjb25zdW1lciBwcm9kdWNlcyBhIGNoYW5nZWQgdmFsdWUsIGl0IHdpbGwgc2V0IHRoaXMgdG8gdHJ1ZS4gT3RoZXJ3aXNlLFxuICAgICAgICAvLyB0aGUgY29tcG9uZW50IHdpbGwgYXNzdW1lIHRoZSBjaGlsZHJlbiBoYXZlIG5vdCBjaGFuZ2VkIGFuZCBiYWlsIG91dC5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBpc0ZvcmtlZENoaWxkKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBjaGlsZCBiZWxvbmdzIHRvIGEgbGlzdCBvZiBtdWxpcGxlIGNoaWxkcmVuIGluXG4gICAgICAvLyBpdHMgcGFyZW50LlxuICAgICAgLy9cbiAgICAgIC8vIEluIGEgdHJ1ZSBtdWx0aS10aHJlYWRlZCBpbXBsZW1lbnRhdGlvbiwgd2Ugd291bGQgcmVuZGVyIGNoaWxkcmVuIG9uXG4gICAgICAvLyBwYXJhbGxlbCB0aHJlYWRzLiBUaGlzIHdvdWxkIHJlcHJlc2VudCB0aGUgYmVnaW5uaW5nIG9mIGEgbmV3IHJlbmRlclxuICAgICAgLy8gdGhyZWFkIGZvciB0aGlzIHN1YnRyZWUuXG4gICAgICAvL1xuICAgICAgLy8gV2Ugb25seSB1c2UgdGhpcyBmb3IgaWQgZ2VuZXJhdGlvbiBkdXJpbmcgaHlkcmF0aW9uLCB3aGljaCBpcyB3aHkgdGhlXG4gICAgICAvLyBsb2dpYyBpcyBsb2NhdGVkIGluIHRoaXMgc3BlY2lhbCBicmFuY2guXG4gICAgICB2YXIgc2xvdEluZGV4ID0gd29ya0luUHJvZ3Jlc3MuaW5kZXg7XG4gICAgICB2YXIgbnVtYmVyT2ZGb3JrcyA9IGdldEZvcmtzQXRMZXZlbCgpO1xuICAgICAgcHVzaFRyZWVJZCh3b3JrSW5Qcm9ncmVzcywgbnVtYmVyT2ZGb3Jrcywgc2xvdEluZGV4KTtcbiAgICB9XG4gIH0gLy8gQmVmb3JlIGVudGVyaW5nIHRoZSBiZWdpbiBwaGFzZSwgY2xlYXIgcGVuZGluZyB1cGRhdGUgcHJpb3JpdHkuXG4gIC8vIFRPRE86IFRoaXMgYXNzdW1lcyB0aGF0IHdlJ3JlIGFib3V0IHRvIGV2YWx1YXRlIHRoZSBjb21wb25lbnQgYW5kIHByb2Nlc3NcbiAgLy8gdGhlIHVwZGF0ZSBxdWV1ZS4gSG93ZXZlciwgdGhlcmUncyBhbiBleGNlcHRpb246IFNpbXBsZU1lbW9Db21wb25lbnRcbiAgLy8gc29tZXRpbWVzIGJhaWxzIG91dCBsYXRlciBpbiB0aGUgYmVnaW4gcGhhc2UuIFRoaXMgaW5kaWNhdGVzIHRoYXQgd2Ugc2hvdWxkXG4gIC8vIG1vdmUgdGhpcyBhc3NpZ25tZW50IG91dCBvZiB0aGUgY29tbW9uIHBhdGggYW5kIGludG8gZWFjaCBicmFuY2guXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7XG5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiBtb3VudEluZGV0ZXJtaW5hdGVDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnR5cGUsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGVsZW1lbnRUeXBlID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGU7XG4gICAgICAgIHJldHVybiBtb3VudExhenlDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGVsZW1lbnRUeXBlLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIHVucmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIHJlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gQ29tcG9uZW50ID8gdW5yZXNvbHZlZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIHVucmVzb2x2ZWRQcm9wcyk7XG4gICAgICAgIHJldHVybiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX0NvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSBfQ29tcG9uZW50ID8gX3VucmVzb2x2ZWRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoX0NvbXBvbmVudCwgX3VucmVzb2x2ZWRQcm9wcyk7XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50LCBfcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0Um9vdChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIHVwZGF0ZUhvc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICByZXR1cm4gdXBkYXRlSG9zdFRleHQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcmV0dXJuIHVwZGF0ZVBvcnRhbENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAge1xuICAgICAgICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzMiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMyID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IHR5cGUgPyBfdW5yZXNvbHZlZFByb3BzMiA6IHJlc29sdmVEZWZhdWx0UHJvcHModHlwZSwgX3VucmVzb2x2ZWRQcm9wczIpO1xuXG4gICAgICAgIHJldHVybiB1cGRhdGVGb3J3YXJkUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB0eXBlLCBfcmVzb2x2ZWRQcm9wczIsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgTW9kZTpcbiAgICAgIHJldHVybiB1cGRhdGVNb2RlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgcmV0dXJuIHVwZGF0ZVByb2ZpbGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHJldHVybiB1cGRhdGVDb250ZXh0UHJvdmlkZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgICAgcmV0dXJuIHVwZGF0ZUNvbnRleHRDb25zdW1lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX3R5cGUyID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIF91bnJlc29sdmVkUHJvcHMzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOyAvLyBSZXNvbHZlIG91dGVyIHByb3BzIGZpcnN0LCB0aGVuIHJlc29sdmUgaW5uZXIgcHJvcHMuXG5cbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzMyA9IHJlc29sdmVEZWZhdWx0UHJvcHMoX3R5cGUyLCBfdW5yZXNvbHZlZFByb3BzMyk7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgICAgICAgdmFyIG91dGVyUHJvcFR5cGVzID0gX3R5cGUyLnByb3BUeXBlcztcblxuICAgICAgICAgICAgaWYgKG91dGVyUHJvcFR5cGVzKSB7XG4gICAgICAgICAgICAgIGNoZWNrUHJvcFR5cGVzKG91dGVyUHJvcFR5cGVzLCBfcmVzb2x2ZWRQcm9wczMsIC8vIFJlc29sdmVkIGZvciBvdXRlciBvbmx5XG4gICAgICAgICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKF90eXBlMikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIF9yZXNvbHZlZFByb3BzMyA9IHJlc29sdmVEZWZhdWx0UHJvcHMoX3R5cGUyLnR5cGUsIF9yZXNvbHZlZFByb3BzMyk7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfdHlwZTIsIF9yZXNvbHZlZFByb3BzMywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MudHlwZSwgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9Db21wb25lbnQyID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIF91bnJlc29sdmVkUHJvcHM0ID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wczQgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gX0NvbXBvbmVudDIgPyBfdW5yZXNvbHZlZFByb3BzNCA6IHJlc29sdmVEZWZhdWx0UHJvcHMoX0NvbXBvbmVudDIsIF91bnJlc29sdmVkUHJvcHM0KTtcblxuICAgICAgICByZXR1cm4gbW91bnRJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9Db21wb25lbnQyLCBfcmVzb2x2ZWRQcm9wczQsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VMaXN0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdW5pdCBvZiB3b3JrIHRhZyAoXCIgKyB3b3JrSW5Qcm9ncmVzcy50YWcgKyBcIikuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBcIiArICdSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG59XG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpIHtcbiAgLy8gVGFnIHRoZSBmaWJlciB3aXRoIGFuIHVwZGF0ZSBlZmZlY3QuIFRoaXMgdHVybnMgYSBQbGFjZW1lbnQgaW50b1xuICAvLyBhIFBsYWNlbWVudEFuZFVwZGF0ZS5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBtYXJrUmVmJDEod29ya0luUHJvZ3Jlc3MpIHtcbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmO1xuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBSZWZTdGF0aWM7XG4gIH1cbn1cblxudmFyIGFwcGVuZEFsbENoaWxkcmVuO1xudmFyIHVwZGF0ZUhvc3RDb250YWluZXI7XG52YXIgdXBkYXRlSG9zdENvbXBvbmVudCQxO1xudmFyIHVwZGF0ZUhvc3RUZXh0JDE7XG5cbntcbiAgLy8gTXV0YXRpb24gbW9kZVxuICBhcHBlbmRBbGxDaGlsZHJlbiA9IGZ1bmN0aW9uIChwYXJlbnQsIHdvcmtJblByb2dyZXNzLCBuZWVkc1Zpc2liaWxpdHlUb2dnbGUsIGlzSGlkZGVuKSB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgY3JlYXRlZCBidXQgd2UgbmVlZCByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIHZhciBub2RlID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50LCBub2RlLnN0YXRlTm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH07XG5cbiAgdXBkYXRlSG9zdENvbnRhaW5lciA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykgey8vIE5vb3BcbiAgfTtcblxuICB1cGRhdGVIb3N0Q29tcG9uZW50JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGFuIGFsdGVybmF0ZSwgdGhhdCBtZWFucyB0aGlzIGlzIGFuIHVwZGF0ZSBhbmQgd2UgbmVlZCB0b1xuICAgIC8vIHNjaGVkdWxlIGEgc2lkZS1lZmZlY3QgdG8gZG8gdGhlIHVwZGF0ZXMuXG4gICAgdmFyIG9sZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuXG4gICAgaWYgKG9sZFByb3BzID09PSBuZXdQcm9wcykge1xuICAgICAgLy8gSW4gbXV0YXRpb24gbW9kZSwgdGhpcyBpcyBzdWZmaWNpZW50IGZvciBhIGJhaWxvdXQgYmVjYXVzZVxuICAgICAgLy8gd2Ugd29uJ3QgdG91Y2ggdGhpcyBub2RlIGV2ZW4gaWYgY2hpbGRyZW4gY2hhbmdlZC5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIElmIHdlIGdldCB1cGRhdGVkIGJlY2F1c2Ugb25lIG9mIG91ciBjaGlsZHJlbiB1cGRhdGVkLCB3ZSBkb24ndFxuICAgIC8vIGhhdmUgbmV3UHJvcHMgc28gd2UnbGwgaGF2ZSB0byByZXVzZSB0aGVtLlxuICAgIC8vIFRPRE86IFNwbGl0IHRoZSB1cGRhdGUgQVBJIGFzIHNlcGFyYXRlIGZvciB0aGUgcHJvcHMgdnMuIGNoaWxkcmVuLlxuICAgIC8vIEV2ZW4gYmV0dGVyIHdvdWxkIGJlIGlmIGNoaWxkcmVuIHdlcmVuJ3Qgc3BlY2lhbCBjYXNlZCBhdCBhbGwgdGhvLlxuXG5cbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7IC8vIFRPRE86IEV4cGVyaWVuY2luZyBhbiBlcnJvciB3aGVyZSBvbGRQcm9wcyBpcyBudWxsLiBTdWdnZXN0cyBhIGhvc3RcbiAgICAvLyBjb21wb25lbnQgaXMgaGl0dGluZyB0aGUgcmVzdW1lIHBhdGguIEZpZ3VyZSBvdXQgd2h5LiBQb3NzaWJseVxuICAgIC8vIHJlbGF0ZWQgdG8gYGhpZGRlbmAuXG5cbiAgICB2YXIgdXBkYXRlUGF5bG9hZCA9IHByZXBhcmVVcGRhdGUoaW5zdGFuY2UsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQpOyAvLyBUT0RPOiBUeXBlIHRoaXMgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGNvbXBvbmVudC5cblxuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gdXBkYXRlUGF5bG9hZDsgLy8gSWYgdGhlIHVwZGF0ZSBwYXlsb2FkIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEgY2hhbmdlIG9yIGlmIHRoZXJlXG4gICAgLy8gaXMgYSBuZXcgcmVmIHdlIG1hcmsgdGhpcyBhcyBhbiB1cGRhdGUuIEFsbCB0aGUgd29yayBpcyBkb25lIGluIGNvbW1pdFdvcmsuXG5cbiAgICBpZiAodXBkYXRlUGF5bG9hZCkge1xuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9O1xuXG4gIHVwZGF0ZUhvc3RUZXh0JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG9sZFRleHQsIG5ld1RleHQpIHtcbiAgICAvLyBJZiB0aGUgdGV4dCBkaWZmZXJzLCBtYXJrIGl0IGFzIGFuIHVwZGF0ZS4gQWxsIHRoZSB3b3JrIGluIGRvbmUgaW4gY29tbWl0V29yay5cbiAgICBpZiAob2xkVGV4dCAhPT0gbmV3VGV4dCkge1xuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGhhc1JlbmRlcmVkQVRhaWxGYWxsYmFjaykge1xuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgIC8vIElmIHdlJ3JlIGh5ZHJhdGluZywgd2Ugc2hvdWxkIGNvbnN1bWUgYXMgbWFueSBpdGVtcyBhcyB3ZSBjYW5cbiAgICAvLyBzbyB3ZSBkb24ndCBsZWF2ZSBhbnkgYmVoaW5kLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHN3aXRjaCAocmVuZGVyU3RhdGUudGFpbE1vZGUpIHtcbiAgICBjYXNlICdoaWRkZW4nOlxuICAgICAge1xuICAgICAgICAvLyBBbnkgaW5zZXJ0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSB0YWlsIGxpc3QgYWZ0ZXIgdGhpcyBwb2ludFxuICAgICAgICAvLyBzaG91bGQgYmUgaW52aXNpYmxlLiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBtb3VudGVkIGJvdW5kYXJpZXNcbiAgICAgICAgLy8gYW55dGhpbmcgYmVmb3JlIHRoZW0gYXJlIG5vdCBjb25zaWRlcmVkIGZvciBjb2xsYXBzaW5nLlxuICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSB3aG9sZSB0YWlsIHRvIGZpbmQgaWZcbiAgICAgICAgLy8gdGhlcmUgYXJlIGFueS5cbiAgICAgICAgdmFyIHRhaWxOb2RlID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgdmFyIGxhc3RUYWlsTm9kZSA9IG51bGw7XG5cbiAgICAgICAgd2hpbGUgKHRhaWxOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHRhaWxOb2RlLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGFzdFRhaWxOb2RlID0gdGFpbE5vZGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGFpbE5vZGUgPSB0YWlsTm9kZS5zaWJsaW5nO1xuICAgICAgICB9IC8vIE5leHQgd2UncmUgc2ltcGx5IGdvaW5nIHRvIGRlbGV0ZSBhbGwgaW5zZXJ0aW9ucyBhZnRlciB0aGVcbiAgICAgICAgLy8gbGFzdCByZW5kZXJlZCBpdGVtLlxuXG5cbiAgICAgICAgaWYgKGxhc3RUYWlsTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIEFsbCByZW1haW5pbmcgaXRlbXMgaW4gdGhlIHRhaWwgYXJlIGluc2VydGlvbnMuXG4gICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRGV0YWNoIHRoZSBpbnNlcnRpb24gYWZ0ZXIgdGhlIGxhc3Qgbm9kZSB0aGF0IHdhcyBhbHJlYWR5XG4gICAgICAgICAgLy8gaW5zZXJ0ZWQuXG4gICAgICAgICAgbGFzdFRhaWxOb2RlLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlICdjb2xsYXBzZWQnOlxuICAgICAge1xuICAgICAgICAvLyBBbnkgaW5zZXJ0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSB0YWlsIGxpc3QgYWZ0ZXIgdGhpcyBwb2ludFxuICAgICAgICAvLyBzaG91bGQgYmUgaW52aXNpYmxlLiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBtb3VudGVkIGJvdW5kYXJpZXNcbiAgICAgICAgLy8gYW55dGhpbmcgYmVmb3JlIHRoZW0gYXJlIG5vdCBjb25zaWRlcmVkIGZvciBjb2xsYXBzaW5nLlxuICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSB3aG9sZSB0YWlsIHRvIGZpbmQgaWZcbiAgICAgICAgLy8gdGhlcmUgYXJlIGFueS5cbiAgICAgICAgdmFyIF90YWlsTm9kZSA9IHJlbmRlclN0YXRlLnRhaWw7XG4gICAgICAgIHZhciBfbGFzdFRhaWxOb2RlID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoX3RhaWxOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKF90YWlsTm9kZS5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIF9sYXN0VGFpbE5vZGUgPSBfdGFpbE5vZGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RhaWxOb2RlID0gX3RhaWxOb2RlLnNpYmxpbmc7XG4gICAgICAgIH0gLy8gTmV4dCB3ZSdyZSBzaW1wbHkgZ29pbmcgdG8gZGVsZXRlIGFsbCBpbnNlcnRpb25zIGFmdGVyIHRoZVxuICAgICAgICAvLyBsYXN0IHJlbmRlcmVkIGl0ZW0uXG5cblxuICAgICAgICBpZiAoX2xhc3RUYWlsTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIEFsbCByZW1haW5pbmcgaXRlbXMgaW4gdGhlIHRhaWwgYXJlIGluc2VydGlvbnMuXG4gICAgICAgICAgaWYgKCFoYXNSZW5kZXJlZEFUYWlsRmFsbGJhY2sgJiYgcmVuZGVyU3RhdGUudGFpbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gV2Ugc3VzcGVuZGVkIGR1cmluZyB0aGUgaGVhZC4gV2Ugd2FudCB0byBzaG93IGF0IGxlYXN0IG9uZVxuICAgICAgICAgICAgLy8gcm93IGF0IHRoZSB0YWlsLiBTbyB3ZSdsbCBrZWVwIG9uIGFuZCBjdXQgb2ZmIHRoZSByZXN0LlxuICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbC5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERldGFjaCB0aGUgaW5zZXJ0aW9uIGFmdGVyIHRoZSBsYXN0IG5vZGUgdGhhdCB3YXMgYWxyZWFkeVxuICAgICAgICAgIC8vIGluc2VydGVkLlxuICAgICAgICAgIF9sYXN0VGFpbE5vZGUuc2libGluZyA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBidWJibGVQcm9wZXJ0aWVzKGNvbXBsZXRlZFdvcmspIHtcbiAgdmFyIGRpZEJhaWxvdXQgPSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZSAhPT0gbnVsbCAmJiBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZS5jaGlsZCA9PT0gY29tcGxldGVkV29yay5jaGlsZDtcbiAgdmFyIG5ld0NoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICB2YXIgc3VidHJlZUZsYWdzID0gTm9GbGFncztcblxuICBpZiAoIWRpZEJhaWxvdXQpIHtcbiAgICAvLyBCdWJibGUgdXAgdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZS5cbiAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgLy8gSW4gcHJvZmlsaW5nIG1vZGUsIHJlc2V0Q2hpbGRFeHBpcmF0aW9uVGltZSBpcyBhbHNvIHVzZWQgdG8gcmVzZXRcbiAgICAgIC8vIHByb2ZpbGVyIGR1cmF0aW9ucy5cbiAgICAgIHZhciBhY3R1YWxEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb247XG4gICAgICB2YXIgdHJlZUJhc2VEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHZhciBjaGlsZCA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKGNoaWxkLmxhbmVzLCBjaGlsZC5jaGlsZExhbmVzKSk7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBjaGlsZC5zdWJ0cmVlRmxhZ3M7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBjaGlsZC5mbGFnczsgLy8gV2hlbiBhIGZpYmVyIGlzIGNsb25lZCwgaXRzIGFjdHVhbER1cmF0aW9uIGlzIHJlc2V0IHRvIDAuIFRoaXMgdmFsdWUgd2lsbFxuICAgICAgICAvLyBvbmx5IGJlIHVwZGF0ZWQgaWYgd29yayBpcyBkb25lIG9uIHRoZSBmaWJlciAoaS5lLiBpdCBkb2Vzbid0IGJhaWxvdXQpLlxuICAgICAgICAvLyBXaGVuIHdvcmsgaXMgZG9uZSwgaXQgc2hvdWxkIGJ1YmJsZSB0byB0aGUgcGFyZW50J3MgYWN0dWFsRHVyYXRpb24uIElmXG4gICAgICAgIC8vIHRoZSBmaWJlciBoYXMgbm90IGJlZW4gY2xvbmVkIHRob3VnaCwgKG1lYW5pbmcgbm8gd29yayB3YXMgZG9uZSksIHRoZW5cbiAgICAgICAgLy8gdGhpcyB2YWx1ZSB3aWxsIHJlZmxlY3QgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IHdvcmtpbmcgb24gYSBwcmV2aW91c1xuICAgICAgICAvLyByZW5kZXIuIEluIHRoYXQgY2FzZSBpdCBzaG91bGQgbm90IGJ1YmJsZS4gV2UgZGV0ZXJtaW5lIHdoZXRoZXIgaXQgd2FzXG4gICAgICAgIC8vIGNsb25lZCBieSBjb21wYXJpbmcgdGhlIGNoaWxkIHBvaW50ZXIuXG5cbiAgICAgICAgYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247XG4gICAgICAgIHRyZWVCYXNlRHVyYXRpb24gKz0gY2hpbGQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uID0gYWN0dWFsRHVyYXRpb247XG4gICAgICBjb21wbGV0ZWRXb3JrLnRyZWVCYXNlRHVyYXRpb24gPSB0cmVlQmFzZUR1cmF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgd2hpbGUgKF9jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKF9jaGlsZC5sYW5lcywgX2NoaWxkLmNoaWxkTGFuZXMpKTtcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZC5zdWJ0cmVlRmxhZ3M7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQuZmxhZ3M7IC8vIFVwZGF0ZSB0aGUgcmV0dXJuIHBvaW50ZXIgc28gdGhlIHRyZWUgaXMgY29uc2lzdGVudC4gVGhpcyBpcyBhIGNvZGVcbiAgICAgICAgLy8gc21lbGwgYmVjYXVzZSBpdCBhc3N1bWVzIHRoZSBjb21taXQgcGhhc2UgaXMgbmV2ZXIgY29uY3VycmVudCB3aXRoXG4gICAgICAgIC8vIHRoZSByZW5kZXIgcGhhc2UuIFdpbGwgYWRkcmVzcyBkdXJpbmcgcmVmYWN0b3IgdG8gYWx0ZXJuYXRlIG1vZGVsLlxuXG4gICAgICAgIF9jaGlsZC5yZXR1cm4gPSBjb21wbGV0ZWRXb3JrO1xuICAgICAgICBfY2hpbGQgPSBfY2hpbGQuc2libGluZztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wbGV0ZWRXb3JrLnN1YnRyZWVGbGFncyB8PSBzdWJ0cmVlRmxhZ3M7XG4gIH0gZWxzZSB7XG4gICAgLy8gQnViYmxlIHVwIHRoZSBlYXJsaWVzdCBleHBpcmF0aW9uIHRpbWUuXG4gICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgIC8vIEluIHByb2ZpbGluZyBtb2RlLCByZXNldENoaWxkRXhwaXJhdGlvblRpbWUgaXMgYWxzbyB1c2VkIHRvIHJlc2V0XG4gICAgICAvLyBwcm9maWxlciBkdXJhdGlvbnMuXG4gICAgICB2YXIgX3RyZWVCYXNlRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLnNlbGZCYXNlRHVyYXRpb247XG4gICAgICB2YXIgX2NoaWxkMiA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChfY2hpbGQyICE9PSBudWxsKSB7XG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoX2NoaWxkMi5sYW5lcywgX2NoaWxkMi5jaGlsZExhbmVzKSk7IC8vIFwiU3RhdGljXCIgZmxhZ3Mgc2hhcmUgdGhlIGxpZmV0aW1lIG9mIHRoZSBmaWJlci9ob29rIHRoZXkgYmVsb25nIHRvLFxuICAgICAgICAvLyBzbyB3ZSBzaG91bGQgYnViYmxlIHRob3NlIHVwIGV2ZW4gZHVyaW5nIGEgYmFpbG91dC4gQWxsIHRoZSBvdGhlclxuICAgICAgICAvLyBmbGFncyBoYXZlIGEgbGlmZXRpbWUgb25seSBvZiBhIHNpbmdsZSByZW5kZXIgKyBjb21taXQsIHNvIHdlIHNob3VsZFxuICAgICAgICAvLyBpZ25vcmUgdGhlbS5cblxuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkMi5zdWJ0cmVlRmxhZ3MgJiBTdGF0aWNNYXNrO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkMi5mbGFncyAmIFN0YXRpY01hc2s7XG4gICAgICAgIF90cmVlQmFzZUR1cmF0aW9uICs9IF9jaGlsZDIudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgX2NoaWxkMiA9IF9jaGlsZDIuc2libGluZztcbiAgICAgIH1cblxuICAgICAgY29tcGxldGVkV29yay50cmVlQmFzZUR1cmF0aW9uID0gX3RyZWVCYXNlRHVyYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfY2hpbGQzID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgd2hpbGUgKF9jaGlsZDMgIT09IG51bGwpIHtcbiAgICAgICAgbmV3Q2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobmV3Q2hpbGRMYW5lcywgbWVyZ2VMYW5lcyhfY2hpbGQzLmxhbmVzLCBfY2hpbGQzLmNoaWxkTGFuZXMpKTsgLy8gXCJTdGF0aWNcIiBmbGFncyBzaGFyZSB0aGUgbGlmZXRpbWUgb2YgdGhlIGZpYmVyL2hvb2sgdGhleSBiZWxvbmcgdG8sXG4gICAgICAgIC8vIHNvIHdlIHNob3VsZCBidWJibGUgdGhvc2UgdXAgZXZlbiBkdXJpbmcgYSBiYWlsb3V0LiBBbGwgdGhlIG90aGVyXG4gICAgICAgIC8vIGZsYWdzIGhhdmUgYSBsaWZldGltZSBvbmx5IG9mIGEgc2luZ2xlIHJlbmRlciArIGNvbW1pdCwgc28gd2Ugc2hvdWxkXG4gICAgICAgIC8vIGlnbm9yZSB0aGVtLlxuXG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQzLnN1YnRyZWVGbGFncyAmIFN0YXRpY01hc2s7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQzLmZsYWdzICYgU3RhdGljTWFzazsgLy8gVXBkYXRlIHRoZSByZXR1cm4gcG9pbnRlciBzbyB0aGUgdHJlZSBpcyBjb25zaXN0ZW50LiBUaGlzIGlzIGEgY29kZVxuICAgICAgICAvLyBzbWVsbCBiZWNhdXNlIGl0IGFzc3VtZXMgdGhlIGNvbW1pdCBwaGFzZSBpcyBuZXZlciBjb25jdXJyZW50IHdpdGhcbiAgICAgICAgLy8gdGhlIHJlbmRlciBwaGFzZS4gV2lsbCBhZGRyZXNzIGR1cmluZyByZWZhY3RvciB0byBhbHRlcm5hdGUgbW9kZWwuXG5cbiAgICAgICAgX2NoaWxkMy5yZXR1cm4gPSBjb21wbGV0ZWRXb3JrO1xuICAgICAgICBfY2hpbGQzID0gX2NoaWxkMy5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBsZXRlZFdvcmsuc3VidHJlZUZsYWdzIHw9IHN1YnRyZWVGbGFncztcbiAgfVxuXG4gIGNvbXBsZXRlZFdvcmsuY2hpbGRMYW5lcyA9IG5ld0NoaWxkTGFuZXM7XG4gIHJldHVybiBkaWRCYWlsb3V0O1xufVxuXG5mdW5jdGlvbiBjb21wbGV0ZURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0U3RhdGUpIHtcbiAgaWYgKGhhc1VuaHlkcmF0ZWRUYWlsTm9kZXMoKSAmJiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlICYmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgd2FybklmVW5oeWRyYXRlZFRhaWxOb2Rlcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IEZvcmNlQ2xpZW50UmVuZGVyIHwgSW5jb21wbGV0ZSB8IFNob3VsZENhcHR1cmU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHdhc0h5ZHJhdGVkID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gIGlmIChuZXh0U3RhdGUgIT09IG51bGwgJiYgbmV4dFN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAvLyBXZSBtaWdodCBiZSBpbnNpZGUgYSBoeWRyYXRpb24gc3RhdGUgdGhlIGZpcnN0IHRpbWUgd2UncmUgcGlja2luZyB1cCB0aGlzXG4gICAgLy8gU3VzcGVuc2UgYm91bmRhcnksIGFuZCBhbHNvIGFmdGVyIHdlJ3ZlIHJlZW50ZXJlZCBpdCBmb3IgZnVydGhlciBoeWRyYXRpb24uXG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIGlmICghd2FzSHlkcmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIGRlaHlkcmF0ZWQgc3VzcGVuc2UgY29tcG9uZW50IHdhcyBjb21wbGV0ZWQgd2l0aG91dCBhIGh5ZHJhdGVkIG5vZGUuICcgKyAnVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cblxuICAgICAgcHJlcGFyZVRvSHlkcmF0ZUhvc3RTdXNwZW5zZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICB7XG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgdmFyIGlzVGltZWRPdXRTdXNwZW5zZSA9IG5leHRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIGlmIChpc1RpbWVkT3V0U3VzcGVuc2UpIHtcbiAgICAgICAgICAgIC8vIERvbid0IGNvdW50IHRpbWUgc3BlbnQgaW4gYSB0aW1lZCBvdXQgU3VzcGVuc2Ugc3VidHJlZSBhcyBwYXJ0IG9mIHRoZSBiYXNlIGR1cmF0aW9uLlxuICAgICAgICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgIGlmIChwcmltYXJ5Q2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgZG9lc24ndCBzdXBwb3J0IHR5cGUgY2FzdGluZyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSAtPSBvcGVyYXRvclxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uIC09IHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2UgbWlnaHQgaGF2ZSByZWVudGVyZWQgdGhpcyBib3VuZGFyeSB0byBoeWRyYXRlIGl0LiBJZiBzbywgd2UgbmVlZCB0byByZXNldCB0aGUgaHlkcmF0aW9uXG4gICAgICAvLyBzdGF0ZSBzaW5jZSB3ZSdyZSBub3cgZXhpdGluZyBvdXQgb2YgaXQuIHBvcEh5ZHJhdGlvblN0YXRlIGRvZXNuJ3QgZG8gdGhhdCBmb3IgdXMuXG4gICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG5cbiAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAvLyBUaGlzIGJvdW5kYXJ5IGRpZCBub3Qgc3VzcGVuZCBzbyBpdCdzIG5vdyBoeWRyYXRlZCBhbmQgdW5zdXNwZW5kZWQuXG4gICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgfSAvLyBJZiBub3RoaW5nIHN1c3BlbmRlZCwgd2UgbmVlZCB0byBzY2hlZHVsZSBhbiBlZmZlY3QgdG8gbWFyayB0aGlzIGJvdW5kYXJ5XG4gICAgICAvLyBhcyBoYXZpbmcgaHlkcmF0ZWQgc28gZXZlbnRzIGtub3cgdGhhdCB0aGV5J3JlIGZyZWUgdG8gYmUgaW52b2tlZC5cbiAgICAgIC8vIEl0J3MgYWxzbyBhIHNpZ25hbCB0byByZXBsYXkgZXZlbnRzIGFuZCB0aGUgc3VzcGVuc2UgY2FsbGJhY2suXG4gICAgICAvLyBJZiBzb21ldGhpbmcgc3VzcGVuZGVkLCBzY2hlZHVsZSBhbiBlZmZlY3QgdG8gYXR0YWNoIHJldHJ5IGxpc3RlbmVycy5cbiAgICAgIC8vIFNvIHdlIG1pZ2h0IGFzIHdlbGwgYWx3YXlzIG1hcmsgdGhpcy5cblxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAge1xuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgIHZhciBfaXNUaW1lZE91dFN1c3BlbnNlID0gbmV4dFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgaWYgKF9pc1RpbWVkT3V0U3VzcGVuc2UpIHtcbiAgICAgICAgICAgIC8vIERvbid0IGNvdW50IHRpbWUgc3BlbnQgaW4gYSB0aW1lZCBvdXQgU3VzcGVuc2Ugc3VidHJlZSBhcyBwYXJ0IG9mIHRoZSBiYXNlIGR1cmF0aW9uLlxuICAgICAgICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgICAgICAgICBpZiAoX3ByaW1hcnlDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vICRGbG93Rml4TWUgRmxvdyBkb2Vzbid0IHN1cHBvcnQgdHlwZSBjYXN0aW5nIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIC09IG9wZXJhdG9yXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gLT0gX3ByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gU3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCB0aGlzIHRyZWUuIElmIHRoaXMgd2FzIGEgZm9yY2VkIGNsaWVudCByZW5kZXIsXG4gICAgLy8gdGhlcmUgbWF5IGhhdmUgYmVlbiByZWNvdmVyYWJsZSBlcnJvcnMgZHVyaW5nIGZpcnN0IGh5ZHJhdGlvblxuICAgIC8vIGF0dGVtcHQuIElmIHNvLCBhZGQgdGhlbSB0byBhIHF1ZXVlIHNvIHdlIGNhbiBsb2cgdGhlbSBpbiB0aGVcbiAgICAvLyBjb21taXQgcGhhc2UuXG4gICAgdXBncmFkZUh5ZHJhdGlvbkVycm9yc1RvUmVjb3ZlcmFibGUoKTsgLy8gRmFsbCB0aHJvdWdoIHRvIG5vcm1hbCBTdXNwZW5zZSBwYXRoXG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wbGV0ZVdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsgLy8gTm90ZTogVGhpcyBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgY2hlY2sgaWYgd2UncmUgaHlkcmF0aW5nIGJlY2F1c2UgY29tcGFyaW5nXG4gIC8vIHRvIHRoZSBjdXJyZW50IHRyZWUgcHJvdmlkZXIgZmliZXIgaXMganVzdCBhcyBmYXN0IGFuZCBsZXNzIGVycm9yLXByb25lLlxuICAvLyBJZGVhbGx5IHdlIHdvdWxkIGhhdmUgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIHdvcmsgbG9vcCBvbmx5XG4gIC8vIGZvciBoeWRyYXRpb24uXG5cbiAgcG9wVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBGcmFnbWVudDpcbiAgICBjYXNlIE1vZGU6XG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICBjYXNlIENvbnRleHRDb25zdW1lcjpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHZhciBmaWJlclJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBwb3BUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXNldFdvcmtJblByb2dyZXNzVmVyc2lvbnMoKTtcblxuICAgICAgICBpZiAoZmliZXJSb290LnBlbmRpbmdDb250ZXh0KSB7XG4gICAgICAgICAgZmliZXJSb290LmNvbnRleHQgPSBmaWJlclJvb3QucGVuZGluZ0NvbnRleHQ7XG4gICAgICAgICAgZmliZXJSb290LnBlbmRpbmdDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQuY2hpbGQgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBJZiB3ZSBoeWRyYXRlZCwgcG9wIHNvIHRoYXQgd2UgY2FuIGRlbGV0ZSBhbnkgcmVtYWluaW5nIGNoaWxkcmVuXG4gICAgICAgICAgLy8gdGhhdCB3ZXJlbid0IGh5ZHJhdGVkLlxuICAgICAgICAgIHZhciB3YXNIeWRyYXRlZCA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgIGlmICh3YXNIeWRyYXRlZCkge1xuICAgICAgICAgICAgLy8gSWYgd2UgaHlkcmF0ZWQsIHRoZW4gd2UnbGwgbmVlZCB0byBzY2hlZHVsZSBhbiB1cGRhdGUgZm9yXG4gICAgICAgICAgICAvLyB0aGUgY29tbWl0IHNpZGUtZWZmZWN0cyBvbiB0aGUgcm9vdC5cbiAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgICAgICAgIGlmICggLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGNsaWVudCByb290XG4gICAgICAgICAgICAgICFwcmV2U3RhdGUuaXNEZWh5ZHJhdGVkIHx8IC8vIENoZWNrIGlmIHdlIHJldmVydGVkIHRvIGNsaWVudCByZW5kZXJpbmcgKGUuZy4gZHVlIHRvIGFuIGVycm9yKVxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JjZUNsaWVudFJlbmRlcikgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAgICAgICAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gY2xlYXIgdGhpcyBjb250YWluZXIgYXQgdGhlIHN0YXJ0IG9mIHRoZVxuICAgICAgICAgICAgICAgIC8vIG5leHQgY29tbWl0LiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugb2YgUmVhY3QgcmVuZGVyaW5nIGludG8gYVxuICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5lciB3aXRoIHByZXZpb3VzIGNoaWxkcmVuLiBJdCdzIGFsc28gc2FmZSB0byBkbyBmb3JcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIHRvbywgYmVjYXVzZSBjdXJyZW50LmNoaWxkIHdvdWxkIG9ubHkgYmUgbnVsbCBpZiB0aGVcbiAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyByZW5kZXIgd2FzIG51bGwgKHNvIHRoZSBjb250YWluZXIgd291bGQgYWxyZWFkeVxuICAgICAgICAgICAgICAgIC8vIGJlIGVtcHR5KS5cbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDsgLy8gSWYgdGhpcyB3YXMgYSBmb3JjZWQgY2xpZW50IHJlbmRlciwgdGhlcmUgbWF5IGhhdmUgYmVlblxuICAgICAgICAgICAgICAgIC8vIHJlY292ZXJhYmxlIGVycm9ycyBkdXJpbmcgZmlyc3QgaHlkcmF0aW9uIGF0dGVtcHQuIElmIHNvLCBhZGRcbiAgICAgICAgICAgICAgICAvLyB0aGVtIHRvIGEgcXVldWUgc28gd2UgY2FuIGxvZyB0aGVtIGluIHRoZSBjb21taXQgcGhhc2UuXG5cbiAgICAgICAgICAgICAgICB1cGdyYWRlSHlkcmF0aW9uRXJyb3JzVG9SZWNvdmVyYWJsZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdXBkYXRlSG9zdENvbnRhaW5lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciByb290Q29udGFpbmVySW5zdGFuY2UgPSBnZXRSb290SG9zdENvbnRhaW5lcigpO1xuICAgICAgICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9IG51bGwpIHtcbiAgICAgICAgICB1cGRhdGVIb3N0Q29tcG9uZW50JDEoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpO1xuXG4gICAgICAgICAgaWYgKGN1cnJlbnQucmVmICE9PSB3b3JrSW5Qcm9ncmVzcy5yZWYpIHtcbiAgICAgICAgICAgIG1hcmtSZWYkMSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghbmV3UHJvcHMpIHtcbiAgICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZSBtdXN0IGhhdmUgbmV3IHByb3BzIGZvciBuZXcgbW91bnRzLiBUaGlzIGVycm9yIGlzIGxpa2VseSAnICsgJ2NhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgICAgICB9IC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFib3J0IHdvcmsuXG5cblxuICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgY3VycmVudEhvc3RDb250ZXh0ID0gZ2V0SG9zdENvbnRleHQoKTsgLy8gVE9ETzogTW92ZSBjcmVhdGVJbnN0YW5jZSB0byBiZWdpbldvcmsgYW5kIGtlZXAgaXQgb24gYSBjb250ZXh0XG4gICAgICAgICAgLy8gXCJzdGFja1wiIGFzIHRoZSBwYXJlbnQuIFRoZW4gYXBwZW5kIGNoaWxkcmVuIGFzIHdlIGdvIGluIGJlZ2luV29ya1xuICAgICAgICAgIC8vIG9yIGNvbXBsZXRlV29yayBkZXBlbmRpbmcgb24gd2hldGhlciB3ZSB3YW50IHRvIGFkZCB0aGVtIHRvcC0+ZG93biBvclxuICAgICAgICAgIC8vIGJvdHRvbS0+dXAuIFRvcC0+ZG93biBpcyBmYXN0ZXIgaW4gSUUxMS5cblxuICAgICAgICAgIHZhciBfd2FzSHlkcmF0ZWQgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgICBpZiAoX3dhc0h5ZHJhdGVkKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgYW5kIGNyZWF0ZUluc3RhbmNlIHN0ZXAgaW50byB0aGUgYmVnaW5QaGFzZVxuICAgICAgICAgICAgLy8gdG8gY29uc29saWRhdGUuXG4gICAgICAgICAgICBpZiAocHJlcGFyZVRvSHlkcmF0ZUhvc3RJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQpKSB7XG4gICAgICAgICAgICAgIC8vIElmIGNoYW5nZXMgdG8gdGhlIGh5ZHJhdGVkIG5vZGUgbmVlZCB0byBiZSBhcHBsaWVkIGF0IHRoZVxuICAgICAgICAgICAgICAvLyBjb21taXQtcGhhc2Ugd2UgbWFyayB0aGlzIGFzIHN1Y2guXG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBjcmVhdGVJbnN0YW5jZSh0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIGFwcGVuZEFsbENoaWxkcmVuKGluc3RhbmNlLCB3b3JrSW5Qcm9ncmVzcywgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGluc3RhbmNlOyAvLyBDZXJ0YWluIHJlbmRlcmVycyByZXF1aXJlIGNvbW1pdC10aW1lIGVmZmVjdHMgZm9yIGluaXRpYWwgbW91bnQuXG4gICAgICAgICAgICAvLyAoZWcgRE9NIHJlbmRlcmVyIHN1cHBvcnRzIGF1dG8tZm9jdXMgZm9yIGNlcnRhaW4gZWxlbWVudHMpLlxuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHN1Y2ggcmVuZGVyZXJzIGdldCBzY2hlZHVsZWQgZm9yIGxhdGVyIHdvcmsuXG5cbiAgICAgICAgICAgIGlmIChmaW5hbGl6ZUluaXRpYWxDaGlsZHJlbihpbnN0YW5jZSwgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSkpIHtcbiAgICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnJlZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSByZWYgb24gYSBob3N0IG5vZGUgd2UgbmVlZCB0byBzY2hlZHVsZSBhIGNhbGxiYWNrXG4gICAgICAgICAgICBtYXJrUmVmJDEod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIHZhciBuZXdUZXh0ID0gbmV3UHJvcHM7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgJiYgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9IG51bGwpIHtcbiAgICAgICAgICB2YXIgb2xkVGV4dCA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wczsgLy8gSWYgd2UgaGF2ZSBhbiBhbHRlcm5hdGUsIHRoYXQgbWVhbnMgdGhpcyBpcyBhbiB1cGRhdGUgYW5kIHdlIG5lZWRcbiAgICAgICAgICAvLyB0byBzY2hlZHVsZSBhIHNpZGUtZWZmZWN0IHRvIGRvIHRoZSB1cGRhdGVzLlxuXG4gICAgICAgICAgdXBkYXRlSG9zdFRleHQkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgb2xkVGV4dCwgbmV3VGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXdUZXh0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlIG11c3QgaGF2ZSBuZXcgcHJvcHMgZm9yIG5ldyBtb3VudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5ICcgKyAnY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgICAgIH0gLy8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYWJvcnQgd29yay5cblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfcm9vdENvbnRhaW5lckluc3RhbmNlID0gZ2V0Um9vdEhvc3RDb250YWluZXIoKTtcblxuICAgICAgICAgIHZhciBfY3VycmVudEhvc3RDb250ZXh0ID0gZ2V0SG9zdENvbnRleHQoKTtcblxuICAgICAgICAgIHZhciBfd2FzSHlkcmF0ZWQyID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKF93YXNIeWRyYXRlZDIpIHtcbiAgICAgICAgICAgIGlmIChwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGNyZWF0ZVRleHRJbnN0YW5jZShuZXdUZXh0LCBfcm9vdENvbnRhaW5lckluc3RhbmNlLCBfY3VycmVudEhvc3RDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7IC8vIFNwZWNpYWwgcGF0aCBmb3IgZGVoeWRyYXRlZCBib3VuZGFyaWVzLiBXZSBtYXkgZXZlbnR1YWxseSBtb3ZlIHRoaXNcbiAgICAgICAgLy8gdG8gaXRzIG93biBmaWJlciB0eXBlIHNvIHRoYXQgd2UgY2FuIGFkZCBvdGhlciBraW5kcyBvZiBoeWRyYXRpb25cbiAgICAgICAgLy8gYm91bmRhcmllcyB0aGF0IGFyZW4ndCBhc3NvY2lhdGVkIHdpdGggYSBTdXNwZW5zZSB0cmVlLiBJbiBhbnRpY2lwYXRpb25cbiAgICAgICAgLy8gb2Ygc3VjaCBhIHJlZmFjdG9yLCBhbGwgdGhlIGh5ZHJhdGlvbiBsb2dpYyBpcyBjb250YWluZWQgaW5cbiAgICAgICAgLy8gdGhpcyBicmFuY2guXG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGZhbGx0aHJvdWdoVG9Ob3JtYWxTdXNwZW5zZVBhdGggPSBjb21wbGV0ZURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0U3RhdGUpO1xuXG4gICAgICAgICAgaWYgKCFmYWxsdGhyb3VnaFRvTm9ybWFsU3VzcGVuc2VQYXRoKSB7XG4gICAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBTaG91bGRDYXB0dXJlKSB7XG4gICAgICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZS4gVGhlcmUgd2VyZSByZW1haW5pbmcgdW5oeWRyYXRlZCBub2Rlcy4gV2UgdHJlYXRcbiAgICAgICAgICAgICAgLy8gdGhpcyBhcyBhIG1pc21hdGNoLiBSZXZlcnQgdG8gY2xpZW50IHJlbmRlcmluZy5cbiAgICAgICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gRGlkIG5vdCBmaW5pc2ggaHlkcmF0aW5nLCBlaXRoZXIgYmVjYXVzZSB0aGlzIGlzIHRoZSBpbml0aWFsXG4gICAgICAgICAgICAgIC8vIHJlbmRlciBvciBiZWNhdXNlIHNvbWV0aGluZyBzdXNwZW5kZWQuXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gQ29udGludWUgd2l0aCB0aGUgbm9ybWFsIFN1c3BlbnNlIHBhdGguXG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgIC8vIFNvbWV0aGluZyBzdXNwZW5kZWQuIFJlLXJlbmRlciB3aXRoIHRoZSBmYWxsYmFjayBjaGlsZHJlbi5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IHJlbmRlckxhbmVzOyAvLyBEbyBub3QgcmVzZXQgdGhlIGVmZmVjdCBsaXN0LlxuXG4gICAgICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9IC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGluIHRoaXMgY2FzZS5cblxuXG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG5leHREaWRUaW1lb3V0ID0gbmV4dFN0YXRlICE9PSBudWxsO1xuICAgICAgICB2YXIgcHJldkRpZFRpbWVvdXQgPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgLy8gYSBwYXNzaXZlIGVmZmVjdCwgd2hpY2ggaXMgd2hlbiB3ZSBwcm9jZXNzIHRoZSB0cmFuc2l0aW9uc1xuXG5cbiAgICAgICAgaWYgKG5leHREaWRUaW1lb3V0ICE9PSBwcmV2RGlkVGltZW91dCkge1xuICAgICAgICAgIC8vIGFuIGVmZmVjdCB0byB0b2dnbGUgdGhlIHN1YnRyZWUncyB2aXNpYmlsaXR5LiBXaGVuIHdlIHN3aXRjaCBmcm9tXG4gICAgICAgICAgLy8gZmFsbGJhY2sgLT4gcHJpbWFyeSwgdGhlIGlubmVyIE9mZnNjcmVlbiBmaWJlciBzY2hlZHVsZXMgdGhpcyBlZmZlY3RcbiAgICAgICAgICAvLyBhcyBwYXJ0IG9mIGl0cyBub3JtYWwgY29tcGxldGUgcGhhc2UuIEJ1dCB3aGVuIHdlIHN3aXRjaCBmcm9tXG4gICAgICAgICAgLy8gcHJpbWFyeSAtPiBmYWxsYmFjaywgdGhlIGlubmVyIE9mZnNjcmVlbiBmaWJlciBkb2VzIG5vdCBoYXZlIGEgY29tcGxldGVcbiAgICAgICAgICAvLyBwaGFzZS4gU28gd2UgbmVlZCB0byBzY2hlZHVsZSBpdHMgZWZmZWN0IGhlcmUuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBXZSBhbHNvIHVzZSB0aGlzIGZsYWcgdG8gY29ubmVjdC9kaXNjb25uZWN0IHRoZSBlZmZlY3RzLCBidXQgdGhlIHNhbWVcbiAgICAgICAgICAvLyBsb2dpYyBhcHBsaWVzOiB3aGVuIHJlLWNvbm5lY3RpbmcsIHRoZSBPZmZzY3JlZW4gZmliZXIncyBjb21wbGV0ZVxuICAgICAgICAgIC8vIHBoYXNlIHdpbGwgaGFuZGxlIHNjaGVkdWxpbmcgdGhlIGVmZmVjdC4gSXQncyBvbmx5IHdoZW4gdGhlIGZhbGxiYWNrXG4gICAgICAgICAgLy8gaXMgYWN0aXZlIHRoYXQgd2UgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLlxuXG5cbiAgICAgICAgICBpZiAobmV4dERpZFRpbWVvdXQpIHtcbiAgICAgICAgICAgIHZhciBfb2Zmc2NyZWVuRmliZXIyID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICBfb2Zmc2NyZWVuRmliZXIyLmZsYWdzIHw9IFZpc2liaWxpdHk7IC8vIFRPRE86IFRoaXMgd2lsbCBzdGlsbCBzdXNwZW5kIGEgc3luY2hyb25vdXMgdHJlZSBpZiBhbnl0aGluZ1xuICAgICAgICAgICAgLy8gaW4gdGhlIGNvbmN1cnJlbnQgdHJlZSBhbHJlYWR5IHN1c3BlbmRlZCBkdXJpbmcgdGhpcyByZW5kZXIuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEga25vd24gYnVnLlxuXG4gICAgICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgYmFjayB0byB0aHJvd0V4Y2VwdGlvbiBiZWNhdXNlIHRoaXMgaXMgdG9vIGxhdGVcbiAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGxhcmdlIHRyZWUgd2hpY2ggaXMgY29tbW9uIGZvciBpbml0aWFsIGxvYWRzLiBXZVxuICAgICAgICAgICAgICAvLyBkb24ndCBrbm93IGlmIHdlIHNob3VsZCByZXN0YXJ0IGEgcmVuZGVyIG9yIG5vdCB1bnRpbCB3ZSBnZXRcbiAgICAgICAgICAgICAgLy8gdGhpcyBtYXJrZXIsIGFuZCB0aGlzIGlzIHRvbyBsYXRlLlxuICAgICAgICAgICAgICAvLyBJZiB0aGlzIHJlbmRlciBhbHJlYWR5IGhhZCBhIHBpbmcgb3IgbG93ZXIgcHJpIHVwZGF0ZXMsXG4gICAgICAgICAgICAgIC8vIGFuZCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGtub3cgd2UncmUgZ29pbmcgdG8gc3VzcGVuZCB3ZVxuICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgYWJsZSB0byBpbW1lZGlhdGVseSByZXN0YXJ0IGZyb20gd2l0aGluIHRocm93RXhjZXB0aW9uLlxuICAgICAgICAgICAgICB2YXIgaGFzSW52aXNpYmxlQ2hpbGRDb250ZXh0ID0gY3VycmVudCA9PT0gbnVsbCAmJiAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcy51bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayAhPT0gdHJ1ZSB8fCAhZW5hYmxlU3VzcGVuc2VBdm9pZFRoaXNGYWxsYmFjayk7XG5cbiAgICAgICAgICAgICAgaWYgKGhhc0ludmlzaWJsZUNoaWxkQ29udGV4dCB8fCBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50LCBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyB3YXMgaW4gYW4gaW52aXNpYmxlIHRyZWUgb3IgYSBuZXcgcmVuZGVyLCB0aGVuIHNob3dpbmdcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGJvdW5kYXJ5IGlzIG9rLlxuICAgICAgICAgICAgICAgIHJlbmRlckRpZFN1c3BlbmQoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlJ3JlIGdvaW5nIHRvIGhhdmUgdG8gaGlkZSBjb250ZW50IHNvIHdlIHNob3VsZFxuICAgICAgICAgICAgICAgIC8vIHN1c3BlbmQgZm9yIGxvbmdlciBpZiBwb3NzaWJsZS5cbiAgICAgICAgICAgICAgICByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgd2FrZWFibGVzID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG5cbiAgICAgICAgaWYgKHdha2VhYmxlcyAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byBhdHRhY2ggYSByZXRyeSBsaXN0ZW5lciB0byB0aGUgcHJvbWlzZS5cbiAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRvIHBhc3NpdmUgcGhhc2VcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIGlmIChuZXh0RGlkVGltZW91dCkge1xuICAgICAgICAgICAgICAvLyBEb24ndCBjb3VudCB0aW1lIHNwZW50IGluIGEgdGltZWQgb3V0IFN1c3BlbnNlIHN1YnRyZWUgYXMgcGFydCBvZiB0aGUgYmFzZSBkdXJhdGlvbi5cbiAgICAgICAgICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgICAgaWYgKHByaW1hcnlDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0eXBlIGNhc3RpbmcgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgLT0gb3BlcmF0b3JcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uIC09IHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgdXBkYXRlSG9zdENvbnRhaW5lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgIHByZXBhcmVQb3J0YWxNb3VudCh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gICAgICB9XG5cbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIC8vIFBvcCBwcm92aWRlciBmaWJlclxuICAgICAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLl9jb250ZXh0O1xuICAgICAgcG9wUHJvdmlkZXIoY29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICAvLyBTYW1lIGFzIGNsYXNzIGNvbXBvbmVudCBjYXNlLiBJIHB1dCBpdCBkb3duIGhlcmUgc28gdGhhdCB0aGUgdGFncyBhcmVcbiAgICAgICAgLy8gc2VxdWVudGlhbCB0byBlbnN1cmUgdGhpcyBzd2l0Y2ggaXMgY29tcGlsZWQgdG8gYSBqdW1wIHRhYmxlLlxuICAgICAgICB2YXIgX0NvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKF9Db21wb25lbnQpKSB7XG4gICAgICAgICAgcG9wQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIHJlbmRlclN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAocmVuZGVyU3RhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSdyZSBydW5uaW5nIGluIHRoZSBkZWZhdWx0LCBcImluZGVwZW5kZW50XCIgbW9kZS5cbiAgICAgICAgICAvLyBXZSBkb24ndCBkbyBhbnl0aGluZyBpbiB0aGlzIG1vZGUuXG4gICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGlkU3VzcGVuZEFscmVhZHkgPSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcbiAgICAgICAgdmFyIHJlbmRlcmVkVGFpbCA9IHJlbmRlclN0YXRlLnJlbmRlcmluZztcblxuICAgICAgICBpZiAocmVuZGVyZWRUYWlsID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UganVzdCByZW5kZXJlZCB0aGUgaGVhZC5cbiAgICAgICAgICBpZiAoIWRpZFN1c3BlbmRBbHJlYWR5KSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBwYXNzLiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgYW55dGhpbmcgaXMgc3RpbGxcbiAgICAgICAgICAgIC8vIHN1c3BlbmRlZCBpbiB0aGUgcmVuZGVyZWQgc2V0LlxuICAgICAgICAgICAgLy8gSWYgbmV3IGNvbnRlbnQgdW5zdXNwZW5kZWQsIGJ1dCB0aGVyZSdzIHN0aWxsIHNvbWUgY29udGVudCB0aGF0XG4gICAgICAgICAgICAvLyBkaWRuJ3QuIFRoZW4gd2UgbmVlZCB0byBkbyBhIHNlY29uZCBwYXNzIHRoYXQgZm9yY2VzIGV2ZXJ5dGhpbmdcbiAgICAgICAgICAgIC8vIHRvIGtlZXAgc2hvd2luZyB0aGVpciBmYWxsYmFja3MuXG4gICAgICAgICAgICAvLyBXZSBtaWdodCBiZSBzdXNwZW5kZWQgaWYgc29tZXRoaW5nIGluIHRoaXMgcmVuZGVyIHBhc3Mgc3VzcGVuZGVkLCBvclxuICAgICAgICAgICAgLy8gc29tZXRoaW5nIGluIHRoZSBwcmV2aW91cyBjb21taXR0ZWQgcGFzcyBzdXNwZW5kZWQuIE90aGVyd2lzZSxcbiAgICAgICAgICAgIC8vIHRoZXJlJ3Mgbm8gY2hhbmNlIHNvIHdlIGNhbiBza2lwIHRoZSBleHBlbnNpdmUgY2FsbCB0b1xuICAgICAgICAgICAgLy8gZmluZEZpcnN0U3VzcGVuZGVkLlxuICAgICAgICAgICAgdmFyIGNhbm5vdEJlU3VzcGVuZGVkID0gcmVuZGVySGFzTm90U3VzcGVuZGVkWWV0KCkgJiYgKGN1cnJlbnQgPT09IG51bGwgfHwgKGN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncyk7XG5cbiAgICAgICAgICAgIGlmICghY2Fubm90QmVTdXNwZW5kZWQpIHtcbiAgICAgICAgICAgICAgdmFyIHJvdyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgICAgICAgICAgIHdoaWxlIChyb3cgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3VzcGVuZGVkID0gZmluZEZpcnN0U3VzcGVuZGVkKHJvdyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc3VzcGVuZGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICBkaWRTdXNwZW5kQWxyZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7IC8vIElmIHRoaXMgaXMgYSBuZXdseSBzdXNwZW5kZWQgdHJlZSwgaXQgbWlnaHQgbm90IGdldCBjb21taXR0ZWQgYXNcbiAgICAgICAgICAgICAgICAgIC8vIHBhcnQgb2YgdGhlIHNlY29uZCBwYXNzLiBJbiB0aGF0IGNhc2Ugbm90aGluZyB3aWxsIHN1YnNjcmliZSB0b1xuICAgICAgICAgICAgICAgICAgLy8gaXRzIHRoZW5hYmxlcy4gSW5zdGVhZCwgd2UnbGwgdHJhbnNmZXIgaXRzIHRoZW5hYmxlcyB0byB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIFN1c3BlbnNlTGlzdCBzbyB0aGF0IGl0IGNhbiByZXRyeSBpZiB0aGV5IHJlc29sdmUuXG4gICAgICAgICAgICAgICAgICAvLyBUaGVyZSBtaWdodCBiZSBtdWx0aXBsZSBvZiB0aGVzZSBpbiB0aGUgbGlzdCBidXQgc2luY2Ugd2UncmVcbiAgICAgICAgICAgICAgICAgIC8vIGdvaW5nIHRvIHdhaXQgZm9yIGFsbCBvZiB0aGVtIGFueXdheSwgaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyXG4gICAgICAgICAgICAgICAgICAvLyB3aGljaCBvbmVzIGdldHMgdG8gcGluZy4gSW4gdGhlb3J5IHdlIGNvdWxkIGdldCBjbGV2ZXIgYW5kIGtlZXBcbiAgICAgICAgICAgICAgICAgIC8vIHRyYWNrIG9mIGhvdyBtYW55IGRlcGVuZGVuY2llcyByZW1haW4gYnV0IGl0IGdldHMgdHJpY2t5IGJlY2F1c2VcbiAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBtZWFudGltZSwgd2UgY2FuIGFkZC9yZW1vdmUvY2hhbmdlIGl0ZW1zIGFuZCBkZXBlbmRlbmNpZXMuXG4gICAgICAgICAgICAgICAgICAvLyBXZSBtaWdodCBiYWlsIG91dCBvZiB0aGUgbG9vcCBiZWZvcmUgZmluZGluZyBhbnkgYnV0IHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgbWF0dGVyIHNpbmNlIHRoYXQgbWVhbnMgdGhhdCB0aGUgb3RoZXIgYm91bmRhcmllcyB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyB3ZSBkaWQgZmluZCBhbHJlYWR5IGhhcyB0aGVpciBsaXN0ZW5lcnMgYXR0YWNoZWQuXG5cbiAgICAgICAgICAgICAgICAgIHZhciBuZXdUaGVuYWJsZXMgPSBzdXNwZW5kZWQudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChuZXdUaGVuYWJsZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBuZXdUaGVuYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICAgICAgICAgIH0gLy8gUmVyZW5kZXIgdGhlIHdob2xlIGxpc3QsIGJ1dCB0aGlzIHRpbWUsIHdlJ2xsIGZvcmNlIGZhbGxiYWNrc1xuICAgICAgICAgICAgICAgICAgLy8gdG8gc3RheSBpbiBwbGFjZS5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBlZmZlY3QgZmxhZ3MgYmVmb3JlIGRvaW5nIHRoZSBzZWNvbmQgcGFzcyBzaW5jZSB0aGF0J3Mgbm93IGludmFsaWQuXG4gICAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgY2hpbGQgZmliZXJzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlLlxuXG5cbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgICAgICAgICAgICAgICByZXNldENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7IC8vIFNldCB1cCB0aGUgU3VzcGVuc2UgQ29udGV4dCB0byBmb3JjZSBzdXNwZW5zZSBhbmQgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgIC8vIHJlcmVuZGVyIHRoZSBjaGlsZHJlbi5cblxuICAgICAgICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjaykpOyAvLyBEb24ndCBidWJibGUgcHJvcGVydGllcyBpbiB0aGlzIGNhc2UuXG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByb3cgPSByb3cuc2libGluZztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVuZGVyU3RhdGUudGFpbCAhPT0gbnVsbCAmJiBub3coKSA+IGdldFJlbmRlclRhcmdldFRpbWUoKSkge1xuICAgICAgICAgICAgICAvLyBXZSBoYXZlIGFscmVhZHkgcGFzc2VkIG91ciBDUFUgZGVhZGxpbmUgYnV0IHdlIHN0aWxsIGhhdmUgcm93c1xuICAgICAgICAgICAgICAvLyBsZWZ0IGluIHRoZSB0YWlsLiBXZSdsbCBqdXN0IGdpdmUgdXAgZnVydGhlciBhdHRlbXB0cyB0byByZW5kZXJcbiAgICAgICAgICAgICAgLy8gdGhlIG1haW4gY29udGVudCBhbmQgb25seSByZW5kZXIgZmFsbGJhY2tzLlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgICAgICBkaWRTdXNwZW5kQWxyZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBTaW5jZSBub3RoaW5nIGFjdHVhbGx5IHN1c3BlbmRlZCwgdGhlcmUgd2lsbCBub3RoaW5nIHRvIHBpbmcgdGhpc1xuICAgICAgICAgICAgICAvLyB0byBnZXQgaXQgc3RhcnRlZCBiYWNrIHVwIHRvIGF0dGVtcHQgdGhlIG5leHQgaXRlbS4gV2hpbGUgaW4gdGVybXNcbiAgICAgICAgICAgICAgLy8gb2YgcHJpb3JpdHkgdGhpcyB3b3JrIGhhcyB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGlzIGN1cnJlbnQgcmVuZGVyLFxuICAgICAgICAgICAgICAvLyBpdCdzIG5vdCBwYXJ0IG9mIHRoZSBzYW1lIHRyYW5zaXRpb24gb25jZSB0aGUgdHJhbnNpdGlvbiBoYXNcbiAgICAgICAgICAgICAgLy8gY29tbWl0dGVkLiBJZiBpdCdzIHN5bmMsIHdlIHN0aWxsIHdhbnQgdG8geWllbGQgc28gdGhhdCBpdCBjYW4gYmVcbiAgICAgICAgICAgICAgLy8gcGFpbnRlZC4gQ29uY2VwdHVhbGx5LCB0aGlzIGlzIHJlYWxseSB0aGUgc2FtZSBhcyBwaW5naW5nLlxuICAgICAgICAgICAgICAvLyBXZSBjYW4gdXNlIGFueSBSZXRyeUxhbmUgZXZlbiBpZiBpdCdzIHRoZSBvbmUgY3VycmVudGx5IHJlbmRlcmluZ1xuICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSdyZSBsZWF2aW5nIGl0IGJlaGluZCBvbiB0aGlzIG5vZGUuXG5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBTb21lUmV0cnlMYW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTtcbiAgICAgICAgICB9IC8vIE5leHQgd2UncmUgZ29pbmcgdG8gcmVuZGVyIHRoZSB0YWlsLlxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQXBwZW5kIHRoZSByZW5kZXJlZCByb3cgdG8gdGhlIGNoaWxkIGxpc3QuXG4gICAgICAgICAgaWYgKCFkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgdmFyIF9zdXNwZW5kZWQgPSBmaW5kRmlyc3RTdXNwZW5kZWQocmVuZGVyZWRUYWlsKTtcblxuICAgICAgICAgICAgaWYgKF9zdXNwZW5kZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlOyAvLyBFbnN1cmUgd2UgdHJhbnNmZXIgdGhlIHVwZGF0ZSBxdWV1ZSB0byB0aGUgcGFyZW50IHNvIHRoYXQgaXQgZG9lc24ndFxuICAgICAgICAgICAgICAvLyBnZXQgbG9zdCBpZiB0aGlzIHJvdyBlbmRzIHVwIGRyb3BwZWQgZHVyaW5nIGEgc2Vjb25kIHBhc3MuXG5cbiAgICAgICAgICAgICAgdmFyIF9uZXdUaGVuYWJsZXMgPSBfc3VzcGVuZGVkLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgICAgIGlmIChfbmV3VGhlbmFibGVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBfbmV3VGhlbmFibGVzO1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgdHJ1ZSk7IC8vIFRoaXMgbWlnaHQgaGF2ZSBiZWVuIG1vZGlmaWVkLlxuXG4gICAgICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsID09PSBudWxsICYmIHJlbmRlclN0YXRlLnRhaWxNb2RlID09PSAnaGlkZGVuJyAmJiAhcmVuZGVyZWRUYWlsLmFsdGVybmF0ZSAmJiAhZ2V0SXNIeWRyYXRpbmcoKSAvLyBXZSBkb24ndCBjdXQgaXQgaWYgd2UncmUgaHlkcmF0aW5nLlxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGRvbmUuXG4gICAgICAgICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIC8vIFRoZSB0aW1lIGl0IHRvb2sgdG8gcmVuZGVyIGxhc3Qgcm93IGlzIGdyZWF0ZXIgdGhhbiB0aGUgcmVtYWluaW5nXG4gICAgICAgICAgICAvLyB0aW1lIHdlIGhhdmUgdG8gcmVuZGVyLiBTbyByZW5kZXJpbmcgb25lIG1vcmUgcm93IHdvdWxkIGxpa2VseVxuICAgICAgICAgICAgLy8gZXhjZWVkIGl0LlxuICAgICAgICAgICAgbm93KCkgKiAyIC0gcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID4gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpICYmIHJlbmRlckxhbmVzICE9PSBPZmZzY3JlZW5MYW5lKSB7XG4gICAgICAgICAgICAgIC8vIFdlIGhhdmUgbm93IHBhc3NlZCBvdXIgQ1BVIGRlYWRsaW5lIGFuZCB3ZSdsbCBqdXN0IGdpdmUgdXAgZnVydGhlclxuICAgICAgICAgICAgICAvLyBhdHRlbXB0cyB0byByZW5kZXIgdGhlIG1haW4gY29udGVudCBhbmQgb25seSByZW5kZXIgZmFsbGJhY2tzLlxuICAgICAgICAgICAgICAvLyBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoaXMgaXMgdXN1YWxseSBmYXN0ZXIuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7IC8vIFNpbmNlIG5vdGhpbmcgYWN0dWFsbHkgc3VzcGVuZGVkLCB0aGVyZSB3aWxsIG5vdGhpbmcgdG8gcGluZyB0aGlzXG4gICAgICAgICAgICAgIC8vIHRvIGdldCBpdCBzdGFydGVkIGJhY2sgdXAgdG8gYXR0ZW1wdCB0aGUgbmV4dCBpdGVtLiBXaGlsZSBpbiB0ZXJtc1xuICAgICAgICAgICAgICAvLyBvZiBwcmlvcml0eSB0aGlzIHdvcmsgaGFzIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoaXMgY3VycmVudCByZW5kZXIsXG4gICAgICAgICAgICAgIC8vIGl0J3Mgbm90IHBhcnQgb2YgdGhlIHNhbWUgdHJhbnNpdGlvbiBvbmNlIHRoZSB0cmFuc2l0aW9uIGhhc1xuICAgICAgICAgICAgICAvLyBjb21taXR0ZWQuIElmIGl0J3Mgc3luYywgd2Ugc3RpbGwgd2FudCB0byB5aWVsZCBzbyB0aGF0IGl0IGNhbiBiZVxuICAgICAgICAgICAgICAvLyBwYWludGVkLiBDb25jZXB0dWFsbHksIHRoaXMgaXMgcmVhbGx5IHRoZSBzYW1lIGFzIHBpbmdpbmcuXG4gICAgICAgICAgICAgIC8vIFdlIGNhbiB1c2UgYW55IFJldHJ5TGFuZSBldmVuIGlmIGl0J3MgdGhlIG9uZSBjdXJyZW50bHkgcmVuZGVyaW5nXG4gICAgICAgICAgICAgIC8vIHNpbmNlIHdlJ3JlIGxlYXZpbmcgaXQgYmVoaW5kIG9uIHRoaXMgbm9kZS5cblxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IFNvbWVSZXRyeUxhbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlbmRlclN0YXRlLmlzQmFja3dhcmRzKSB7XG4gICAgICAgICAgICAvLyBUaGUgZWZmZWN0IGxpc3Qgb2YgdGhlIGJhY2t3YXJkcyB0YWlsIHdpbGwgaGF2ZSBiZWVuIGFkZGVkXG4gICAgICAgICAgICAvLyB0byB0aGUgZW5kLiBUaGlzIGJyZWFrcyB0aGUgZ3VhcmFudGVlIHRoYXQgbGlmZS1jeWNsZXMgZmlyZSBpblxuICAgICAgICAgICAgLy8gc2libGluZyBvcmRlciBidXQgdGhhdCBpc24ndCBhIHN0cm9uZyBndWFyYW50ZWUgcHJvbWlzZWQgYnkgUmVhY3QuXG4gICAgICAgICAgICAvLyBFc3BlY2lhbGx5IHNpbmNlIHRoZXNlIG1pZ2h0IGFsc28ganVzdCBwb3AgaW4gZHVyaW5nIGZ1dHVyZSBjb21taXRzLlxuICAgICAgICAgICAgLy8gQXBwZW5kIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QuXG4gICAgICAgICAgICByZW5kZXJlZFRhaWwuc2libGluZyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwcmV2aW91c1NpYmxpbmcgPSByZW5kZXJTdGF0ZS5sYXN0O1xuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNTaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHByZXZpb3VzU2libGluZy5zaWJsaW5nID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlbmRlclN0YXRlLmxhc3QgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBzdGlsbCBoYXZlIHRhaWwgcm93cyB0byByZW5kZXIuXG4gICAgICAgICAgLy8gUG9wIGEgcm93LlxuICAgICAgICAgIHZhciBuZXh0ID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmcgPSBuZXh0O1xuICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwgPSBuZXh0LnNpYmxpbmc7XG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID0gbm93KCk7XG4gICAgICAgICAgbmV4dC5zaWJsaW5nID0gbnVsbDsgLy8gUmVzdG9yZSB0aGUgY29udGV4dC5cbiAgICAgICAgICAvLyBUT0RPOiBXZSBjYW4gcHJvYmFibHkganVzdCBhdm9pZCBwb3BwaW5nIGl0IGluc3RlYWQgYW5kIG9ubHlcbiAgICAgICAgICAvLyBzZXR0aW5nIGl0IHRoZSBmaXJzdCB0aW1lIHdlIGdvIGZyb20gbm90IHN1c3BlbmRlZCB0byBzdXNwZW5kZWQuXG5cbiAgICAgICAgICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50O1xuXG4gICAgICAgICAgaWYgKGRpZFN1c3BlbmRBbHJlYWR5KSB7XG4gICAgICAgICAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpOyAvLyBEbyBhIHBhc3Mgb3ZlciB0aGUgbmV4dCByb3cuXG4gICAgICAgICAgLy8gRG9uJ3QgYnViYmxlIHByb3BlcnRpZXMgaW4gdGhpcyBjYXNlLlxuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIF9uZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICB2YXIgbmV4dElzSGlkZGVuID0gX25leHRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBwcmV2SXNIaWRkZW4gPSBfcHJldlN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgaWYgKHByZXZJc0hpZGRlbiAhPT0gbmV4dElzSGlkZGVuICYmICggLy8gTGVnYWN5SGlkZGVuIGRvZXNuJ3QgZG8gYW55IGhpZGluZyDigJQgaXQgb25seSBwcmUtcmVuZGVycy5cbiAgICAgICAgICAhZW5hYmxlTGVnYWN5SGlkZGVuICkpIHtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFZpc2liaWxpdHk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZXh0SXNIaWRkZW4gfHwgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGZvciBoaWRkZW4gY2hpbGRyZW4gdW5sZXNzIHdlJ3JlIHJlbmRlcmluZ1xuICAgICAgICAgIC8vIGF0IG9mZnNjcmVlbiBwcmlvcml0eS5cbiAgICAgICAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShzdWJ0cmVlUmVuZGVyTGFuZXMsIE9mZnNjcmVlbkxhbmUpKSB7XG4gICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSB3YXMgYW4gaW5zZXJ0aW9uIG9yIHVwZGF0ZSBpbiB0aGUgaGlkZGVuIHN1YnRyZWUuXG4gICAgICAgICAgICAgIC8vIElmIHNvLCB3ZSBuZWVkIHRvIGhpZGUgdGhvc2Ugbm9kZXMgaW4gdGhlIGNvbW1pdCBwaGFzZSwgc29cbiAgICAgICAgICAgICAgLy8gc2NoZWR1bGUgYSB2aXNpYmlsaXR5IGVmZmVjdC5cbiAgICAgICAgICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgJiAoUGxhY2VtZW50IHwgVXBkYXRlKSkge1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFZpc2liaWxpdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIENhY2hlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBUcmFjaW5nTWFya2VyQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biB1bml0IG9mIHdvcmsgdGFnIChcIiArIHdvcmtJblByb2dyZXNzLnRhZyArIFwiKS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFwiICsgJ1JlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbn1cblxuZnVuY3Rpb24gdW53aW5kV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gTm90ZTogVGhpcyBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgY2hlY2sgaWYgd2UncmUgaHlkcmF0aW5nIGJlY2F1c2UgY29tcGFyaW5nXG4gIC8vIHRvIHRoZSBjdXJyZW50IHRyZWUgcHJvdmlkZXIgZmliZXIgaXMganVzdCBhcyBmYXN0IGFuZCBsZXNzIGVycm9yLXByb25lLlxuICAvLyBJZGVhbGx5IHdlIHdvdWxkIGhhdmUgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIHdvcmsgbG9vcCBvbmx5XG4gIC8vIGZvciBoeWRyYXRpb24uXG4gIHBvcFRyZWVDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAgICAgcG9wQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZmxhZ3MgPSB3b3JrSW5Qcm9ncmVzcy5mbGFncztcblxuICAgICAgICBpZiAoZmxhZ3MgJiBTaG91bGRDYXB0dXJlKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBmbGFncyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcblxuICAgICAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuICAgICAgICB2YXIgX2ZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKChfZmxhZ3MgJiBTaG91bGRDYXB0dXJlKSAhPT0gTm9GbGFncyAmJiAoX2ZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAvLyBUaGVyZSB3YXMgYW4gZXJyb3IgZHVyaW5nIHJlbmRlciB0aGF0IHdhc24ndCBjYXB0dXJlZCBieSBhIHN1c3BlbnNlXG4gICAgICAgICAgLy8gYm91bmRhcnkuIERvIGEgc2Vjb25kIHBhc3Mgb24gdGhlIHJvb3QgdG8gdW5tb3VudCB0aGUgY2hpbGRyZW4uXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBfZmxhZ3MgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9IC8vIFdlIHVud291bmQgdG8gdGhlIHJvb3Qgd2l0aG91dCBjb21wbGV0aW5nIGl0LiBFeGl0LlxuXG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIFRPRE86IHBvcEh5ZHJhdGlvblN0YXRlXG4gICAgICAgIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwgJiYgc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaHJldyBpbiBuZXdseSBtb3VudGVkIGRlaHlkcmF0ZWQgY29tcG9uZW50LiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiAnICsgJ1JlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX2ZsYWdzMiA9IHdvcmtJblByb2dyZXNzLmZsYWdzO1xuXG4gICAgICAgIGlmIChfZmxhZ3MyICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gX2ZsYWdzMiAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTsgLy8gQ2FwdHVyZWQgYSBzdXNwZW5zZSBlZmZlY3QuIFJlLXJlbmRlciB0aGUgYm91bmRhcnkuXG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7IC8vIFN1c3BlbnNlTGlzdCBkb2Vzbid0IGFjdHVhbGx5IGNhdGNoIGFueXRoaW5nLiBJdCBzaG91bGQndmUgYmVlblxuICAgICAgICAvLyBjYXVnaHQgYnkgYSBuZXN0ZWQgYm91bmRhcnkuIElmIG5vdCwgaXQgc2hvdWxkIGJ1YmJsZSB0aHJvdWdoLlxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLl9jb250ZXh0O1xuICAgICAgcG9wUHJvdmlkZXIoY29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHBvcFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDYWNoZUNvbXBvbmVudDpcblxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW53aW5kSW50ZXJydXB0ZWRXb3JrKGN1cnJlbnQsIGludGVycnVwdGVkV29yaywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gTm90ZTogVGhpcyBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgY2hlY2sgaWYgd2UncmUgaHlkcmF0aW5nIGJlY2F1c2UgY29tcGFyaW5nXG4gIC8vIHRvIHRoZSBjdXJyZW50IHRyZWUgcHJvdmlkZXIgZmliZXIgaXMganVzdCBhcyBmYXN0IGFuZCBsZXNzIGVycm9yLXByb25lLlxuICAvLyBJZGVhbGx5IHdlIHdvdWxkIGhhdmUgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIHdvcmsgbG9vcCBvbmx5XG4gIC8vIGZvciBoeWRyYXRpb24uXG4gIHBvcFRyZWVDb250ZXh0KGludGVycnVwdGVkV29yayk7XG5cbiAgc3dpdGNoIChpbnRlcnJ1cHRlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gaW50ZXJydXB0ZWRXb3JrLnR5cGUuY2hpbGRDb250ZXh0VHlwZXM7XG5cbiAgICAgICAgaWYgKGNoaWxkQ29udGV4dFR5cGVzICE9PSBudWxsICYmIGNoaWxkQ29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHZhciByb290ID0gaW50ZXJydXB0ZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcihpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICBwb3BUb3BMZXZlbENvbnRleHRPYmplY3QoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BIb3N0Q29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHBvcEhvc3RDb250YWluZXIoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHBvcFN1c3BlbnNlQ29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHBvcFN1c3BlbnNlQ29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHZhciBjb250ZXh0ID0gaW50ZXJydXB0ZWRXb3JrLnR5cGUuX2NvbnRleHQ7XG4gICAgICBwb3BQcm92aWRlcihjb250ZXh0LCBpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHBvcFJlbmRlckxhbmVzKGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG52YXIgZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGUgPSBudWxsO1xuXG57XG4gIGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlID0gbmV3IFNldCgpO1xufSAvLyBVc2VkIGR1cmluZyB0aGUgY29tbWl0IHBoYXNlIHRvIHRyYWNrIHRoZSBzdGF0ZSBvZiB0aGUgT2Zmc2NyZWVuIGNvbXBvbmVudCBzdGFjay5cbi8vIEFsbG93cyB1cyB0byBhdm9pZCB0cmF2ZXJzaW5nIHRoZSByZXR1cm4gcGF0aCB0byBmaW5kIHRoZSBuZWFyZXN0IE9mZnNjcmVlbiBhbmNlc3Rvci5cbi8vIE9ubHkgdXNlZCB3aGVuIGVuYWJsZVN1c3BlbnNlTGF5b3V0RWZmZWN0U2VtYW50aWNzIGlzIGVuYWJsZWQuXG5cblxudmFyIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IGZhbHNlO1xudmFyIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBmYWxzZTtcbnZhciBQb3NzaWJseVdlYWtTZXQgPSB0eXBlb2YgV2Vha1NldCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtTZXQgOiBTZXQ7XG52YXIgbmV4dEVmZmVjdCA9IG51bGw7IC8vIFVzZWQgZm9yIFByb2ZpbGluZyBidWlsZHMgdG8gdHJhY2sgdXBkYXRlcnMuXG5cbnZhciBpblByb2dyZXNzTGFuZXMgPSBudWxsO1xudmFyIGluUHJvZ3Jlc3NSb290ID0gbnVsbDtcbmZ1bmN0aW9uIHJlcG9ydFVuY2F1Z2h0RXJyb3JJbkRFVihlcnJvcikge1xuICAvLyBXcmFwcGluZyBlYWNoIHNtYWxsIHBhcnQgb2YgdGhlIGNvbW1pdCBwaGFzZSBpbnRvIGEgZ3VhcmRlZFxuICAvLyBjYWxsYmFjayBpcyBhIGJpdCB0b28gc2xvdyAoaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMjE2NjYpLlxuICAvLyBCdXQgd2UgcmVseSBvbiBpdCB0byBzdXJmYWNlIGVycm9ycyB0byBERVYgdG9vbHMgbGlrZSBvdmVybGF5c1xuICAvLyAoaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8yMTcxMikuXG4gIC8vIEFzIGEgY29tcHJvbWlzZSwgcmV0aHJvdyBvbmx5IGNhdWdodCBlcnJvcnMgaW4gYSBndWFyZC5cbiAge1xuICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbiAgICBjbGVhckNhdWdodEVycm9yKCk7XG4gIH1cbn1cblxudmFyIGNhbGxDb21wb25lbnRXaWxsVW5tb3VudFdpdGhUaW1lciA9IGZ1bmN0aW9uIChjdXJyZW50LCBpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5wcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKCBjdXJyZW50Lm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgIHRyeSB7XG4gICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihjdXJyZW50KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgfVxufTsgLy8gQ2FwdHVyZSBlcnJvcnMgc28gdGhleSBkb24ndCBpbnRlcnJ1cHQgbW91bnRpbmcuXG5cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbENvbW1pdEhvb2tMYXlvdXRFZmZlY3RMaXN0TW91bnQoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB0cnkge1xuICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoTGF5b3V0LCBjdXJyZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn0gLy8gQ2FwdHVyZSBlcnJvcnMgc28gdGhleSBkb24ndCBpbnRlcnJ1cHQgdW5tb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgaW5zdGFuY2UpIHtcbiAgdHJ5IHtcbiAgICBjYWxsQ29tcG9uZW50V2lsbFVubW91bnRXaXRoVGltZXIoY3VycmVudCwgaW5zdGFuY2UpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufSAvLyBDYXB0dXJlIGVycm9ycyBzbyB0aGV5IGRvbid0IGludGVycnVwdCBtb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsQ29tcG9uZW50RGlkTW91bnQoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgaW5zdGFuY2UpIHtcbiAgdHJ5IHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufSAvLyBDYXB0dXJlIGVycm9ycyBzbyB0aGV5IGRvbid0IGludGVycnVwdCBtb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlBdHRhY2hSZWYoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB0cnkge1xuICAgIGNvbW1pdEF0dGFjaFJlZihjdXJyZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgdmFyIHJlZiA9IGN1cnJlbnQucmVmO1xuXG4gIGlmIChyZWYgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHJldFZhbDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIgJiYgZW5hYmxlUHJvZmlsZXJDb21taXRIb29rcyAmJiBjdXJyZW50Lm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICByZXRWYWwgPSByZWYobnVsbCk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGN1cnJlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXRWYWwgPSByZWYobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAge1xuICAgICAgICBpZiAodHlwZW9mIHJldFZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHJldHVybiB2YWx1ZSBmcm9tIGEgY2FsbGJhY2sgcmVmIGluICVzLiAnICsgJ0EgY2FsbGJhY2sgcmVmIHNob3VsZCBub3QgcmV0dXJuIGEgZnVuY3Rpb24uJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihjdXJyZW50KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsRGVzdHJveShjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KSB7XG4gIHRyeSB7XG4gICAgZGVzdHJveSgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufVxuXG52YXIgZm9jdXNlZEluc3RhbmNlSGFuZGxlID0gbnVsbDtcbnZhciBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgPSBmYWxzZTtcbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaXJzdENoaWxkKSB7XG4gIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IHByZXBhcmVGb3JDb21taXQocm9vdC5jb250YWluZXJJbmZvKTtcbiAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19iZWdpbigpOyAvLyBXZSBubyBsb25nZXIgbmVlZCB0byB0cmFjayB0aGUgYWN0aXZlIGluc3RhbmNlIGZpYmVyXG5cbiAgdmFyIHNob3VsZEZpcmUgPSBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXI7XG4gIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IGZhbHNlO1xuICBmb2N1c2VkSW5zdGFuY2VIYW5kbGUgPSBudWxsO1xuICByZXR1cm4gc2hvdWxkRmlyZTtcbn1cblxuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2JlZ2luKCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7IC8vIFRoaXMgcGhhc2UgaXMgb25seSB1c2VkIGZvciBiZWZvcmVBY3RpdmVJbnN0YW5jZUJsdXIuXG5cbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmICgoZmliZXIuc3VidHJlZUZsYWdzICYgQmVmb3JlTXV0YXRpb25NYXNrKSAhPT0gTm9GbGFncyAmJiBjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgY2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gY2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19jb21wbGV0ZSgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNfY29tcGxldGUoKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c09uRmliZXIoZmliZXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRXb3JrKSB7XG4gIHZhciBjdXJyZW50ID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZTtcbiAgdmFyIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzO1xuXG4gIGlmICgoZmxhZ3MgJiBTbmFwc2hvdCkgIT09IE5vRmxhZ3MpIHtcbiAgICBzZXRDdXJyZW50RmliZXIoZmluaXNoZWRXb3JrKTtcblxuICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlOyAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBzbmFwc2hvdCA9IGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSA9PT0gZmluaXNoZWRXb3JrLnR5cGUgPyBwcmV2UHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKGZpbmlzaGVkV29yay50eXBlLCBwcmV2UHJvcHMpLCBwcmV2U3RhdGUpO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhciBkaWRXYXJuU2V0ID0gZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGU7XG5cbiAgICAgICAgICAgICAgaWYgKHNuYXBzaG90ID09PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5TZXQuaGFzKGZpbmlzaGVkV29yay50eXBlKSkge1xuICAgICAgICAgICAgICAgIGRpZFdhcm5TZXQuYWRkKGZpbmlzaGVkV29yay50eXBlKTtcblxuICAgICAgICAgICAgICAgIGVycm9yKCclcy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpOiBBIHNuYXBzaG90IHZhbHVlIChvciBudWxsKSAnICsgJ211c3QgYmUgcmV0dXJuZWQuIFlvdSBoYXZlIHJldHVybmVkIHVuZGVmaW5lZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlID0gc25hcHNob3Q7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciByb290ID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIGNsZWFyQ29udGFpbmVyKHJvb3QuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGZvciB0aGVzZSBjb21wb25lbnQgdHlwZXNcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgdW5pdCBvZiB3b3JrIHRhZyBzaG91bGQgbm90IGhhdmUgc2lkZS1lZmZlY3RzLiBUaGlzIGVycm9yIGlzICcgKyAnbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChmbGFncywgZmluaXNoZWRXb3JrLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZSAhPT0gbnVsbCA/IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgOiBudWxsO1xuXG4gIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgIGRvIHtcbiAgICAgIGlmICgoZWZmZWN0LnRhZyAmIGZsYWdzKSA9PT0gZmxhZ3MpIHtcbiAgICAgICAgLy8gVW5tb3VudFxuICAgICAgICB2YXIgZGVzdHJveSA9IGVmZmVjdC5kZXN0cm95O1xuICAgICAgICBlZmZlY3QuZGVzdHJveSA9IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdCh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShmaW5pc2hlZFdvcmssIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0O1xuICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoZmxhZ3MsIGZpbmlzaGVkV29yaykge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gIHZhciBsYXN0RWZmZWN0ID0gdXBkYXRlUXVldWUgIT09IG51bGwgPyB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0IDogbnVsbDtcblxuICBpZiAobGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICB2YXIgZWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoKGVmZmVjdC50YWcgJiBmbGFncykgPT09IGZsYWdzKSB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKGZsYWdzICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RhcnRlZChmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdGFydGVkKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIE1vdW50XG5cblxuICAgICAgICB2YXIgY3JlYXRlID0gZWZmZWN0LmNyZWF0ZTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKChmbGFncyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGVmZmVjdC5kZXN0cm95ID0gY3JlYXRlKCk7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICgoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdChmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGRlc3Ryb3kgPSBlZmZlY3QuZGVzdHJveTtcblxuICAgICAgICAgIGlmIChkZXN0cm95ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGRlc3Ryb3kgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBob29rTmFtZSA9IHZvaWQgMDtcblxuICAgICAgICAgICAgaWYgKChlZmZlY3QudGFnICYgTGF5b3V0KSAhPT0gTm9GbGFncykge1xuICAgICAgICAgICAgICBob29rTmFtZSA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgoZWZmZWN0LnRhZyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAgICAgaG9va05hbWUgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGhvb2tOYW1lID0gJ3VzZUVmZmVjdCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBhZGRlbmR1bSA9IHZvaWQgMDtcblxuICAgICAgICAgICAgaWYgKGRlc3Ryb3kgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgYWRkZW5kdW0gPSAnIFlvdSByZXR1cm5lZCBudWxsLiBJZiB5b3VyIGVmZmVjdCBkb2VzIG5vdCByZXF1aXJlIGNsZWFuICcgKyAndXAsIHJldHVybiB1bmRlZmluZWQgKG9yIG5vdGhpbmcpLic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZXN0cm95LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgYWRkZW5kdW0gPSAnXFxuXFxuSXQgbG9va3MgbGlrZSB5b3Ugd3JvdGUgJyArIGhvb2tOYW1lICsgJyhhc3luYyAoKSA9PiAuLi4pIG9yIHJldHVybmVkIGEgUHJvbWlzZS4gJyArICdJbnN0ZWFkLCB3cml0ZSB0aGUgYXN5bmMgZnVuY3Rpb24gaW5zaWRlIHlvdXIgZWZmZWN0ICcgKyAnYW5kIGNhbGwgaXQgaW1tZWRpYXRlbHk6XFxuXFxuJyArIGhvb2tOYW1lICsgJygoKSA9PiB7XFxuJyArICcgIGFzeW5jIGZ1bmN0aW9uIGZldGNoRGF0YSgpIHtcXG4nICsgJyAgICAvLyBZb3UgY2FuIGF3YWl0IGhlcmVcXG4nICsgJyAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IE15QVBJLmdldERhdGEoc29tZUlkKTtcXG4nICsgJyAgICAvLyAuLi5cXG4nICsgJyAgfVxcbicgKyAnICBmZXRjaERhdGEoKTtcXG4nICsgXCJ9LCBbc29tZUlkXSk7IC8vIE9yIFtdIGlmIGVmZmVjdCBkb2Vzbid0IG5lZWQgcHJvcHMgb3Igc3RhdGVcXG5cXG5cIiArICdMZWFybiBtb3JlIGFib3V0IGRhdGEgZmV0Y2hpbmcgd2l0aCBIb29rczogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2hvb2tzLWRhdGEtZmV0Y2hpbmcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYWRkZW5kdW0gPSAnIFlvdSByZXR1cm5lZDogJyArIGRlc3Ryb3k7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVycm9yKCclcyBtdXN0IG5vdCByZXR1cm4gYW55dGhpbmcgYmVzaWRlcyBhIGZ1bmN0aW9uLCAnICsgJ3doaWNoIGlzIHVzZWQgZm9yIGNsZWFuLXVwLiVzJywgaG9va05hbWUsIGFkZGVuZHVtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgfSB3aGlsZSAoZWZmZWN0ICE9PSBmaXJzdEVmZmVjdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZUVmZmVjdER1cmF0aW9ucyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yaykge1xuICB7XG4gICAgLy8gT25seSBQcm9maWxlcnMgd2l0aCB3b3JrIGluIHRoZWlyIHN1YnRyZWUgd2lsbCBoYXZlIGFuIFVwZGF0ZSBlZmZlY3Qgc2NoZWR1bGVkLlxuICAgIGlmICgoZmluaXNoZWRXb3JrLmZsYWdzICYgVXBkYXRlKSAhPT0gTm9GbGFncykge1xuICAgICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgdmFyIF9maW5pc2hlZFdvcmskbWVtb2l6ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLFxuICAgICAgICAgICAgICAgIGlkID0gX2ZpbmlzaGVkV29yayRtZW1vaXplLmlkLFxuICAgICAgICAgICAgICAgIG9uUG9zdENvbW1pdCA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZS5vblBvc3RDb21taXQ7IC8vIFRoaXMgdmFsdWUgd2lsbCBzdGlsbCByZWZsZWN0IHRoZSBwcmV2aW91cyBjb21taXQgcGhhc2UuXG4gICAgICAgICAgICAvLyBJdCBkb2VzIG5vdCBnZXQgcmVzZXQgdW50aWwgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGNvbW1pdCBwaGFzZS5cblxuICAgICAgICAgICAgdmFyIGNvbW1pdFRpbWUgPSBnZXRDb21taXRUaW1lKCk7XG4gICAgICAgICAgICB2YXIgcGhhc2UgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlID09PSBudWxsID8gJ21vdW50JyA6ICd1cGRhdGUnO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChpc0N1cnJlbnRVcGRhdGVOZXN0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHBoYXNlID0gJ25lc3RlZC11cGRhdGUnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25Qb3N0Q29tbWl0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIG9uUG9zdENvbW1pdChpZCwgcGhhc2UsIHBhc3NpdmVFZmZlY3REdXJhdGlvbiwgY29tbWl0VGltZSk7XG4gICAgICAgICAgICB9IC8vIEJ1YmJsZSB0aW1lcyB0byB0aGUgbmV4dCBuZWFyZXN0IGFuY2VzdG9yIFByb2ZpbGVyLlxuICAgICAgICAgICAgLy8gQWZ0ZXIgd2UgcHJvY2VzcyB0aGF0IFByb2ZpbGVyLCB3ZSdsbCBidWJibGUgZnVydGhlciB1cC5cblxuXG4gICAgICAgICAgICB2YXIgcGFyZW50RmliZXIgPSBmaW5pc2hlZFdvcmsucmV0dXJuO1xuXG4gICAgICAgICAgICBvdXRlcjogd2hpbGUgKHBhcmVudEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICAgICAgICAgIHZhciByb290ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgcm9vdC5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz0gcGFzc2l2ZUVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG5cbiAgICAgICAgICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudFN0YXRlTm9kZSA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz0gcGFzc2l2ZUVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRMYXlvdXRFZmZlY3RPbkZpYmVyKGZpbmlzaGVkUm9vdCwgY3VycmVudCwgZmluaXNoZWRXb3JrLCBjb21taXR0ZWRMYW5lcykge1xuICBpZiAoKGZpbmlzaGVkV29yay5mbGFncyAmIExheW91dE1hc2spICE9PSBOb0ZsYWdzKSB7XG4gICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCAhb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCBsYXlvdXQgZWZmZWN0cyBoYXZlIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQgKGR1cmluZyBtdXRhdGlvbiBwaGFzZSkuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGRvbmUgdG8gcHJldmVudCBzaWJsaW5nIGNvbXBvbmVudCBlZmZlY3RzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBlYWNoIG90aGVyLFxuICAgICAgICAgICAgLy8gZS5nLiBhIGRlc3Ryb3kgZnVuY3Rpb24gaW4gb25lIGNvbXBvbmVudCBzaG91bGQgbmV2ZXIgb3ZlcnJpZGUgYSByZWYgc2V0XG4gICAgICAgICAgICAvLyBieSBhIGNyZWF0ZSBmdW5jdGlvbiBpbiBhbm90aGVyIGNvbXBvbmVudCBkdXJpbmcgdGhlIHNhbWUgY29tbWl0LlxuICAgICAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKGZpbmlzaGVkV29yay5mbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZE1vdW50LiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdjb21wb25lbnREaWRNb3VudC4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIHByZXZQcm9wcyA9IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSA9PT0gZmluaXNoZWRXb3JrLnR5cGUgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKGZpbmlzaGVkV29yay50eXBlLCBjdXJyZW50Lm1lbW9pemVkUHJvcHMpO1xuICAgICAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7IC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5zdGF0ZWAuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSwgaW5zdGFuY2UuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUpO1xuICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlLCBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvLyBUT0RPOiBJIHRoaW5rIHRoaXMgaXMgbm93IGFsd2F5cyBub24tbnVsbCBieSB0aGUgdGltZSBpdCByZWFjaGVzIHRoZVxuICAgICAgICAgIC8vIGNvbW1pdCBwaGFzZS4gQ29uc2lkZXIgcmVtb3ZpbmcgdGhlIHR5cGUgY2hlY2suXG5cblxuICAgICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgIGlmICh1cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ3Byb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG5cblxuICAgICAgICAgICAgY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCB1cGRhdGVRdWV1ZSwgaW5zdGFuY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUT0RPOiBJIHRoaW5rIHRoaXMgaXMgbm93IGFsd2F5cyBub24tbnVsbCBieSB0aGUgdGltZSBpdCByZWFjaGVzIHRoZVxuICAgICAgICAgIC8vIGNvbW1pdCBwaGFzZS4gQ29uc2lkZXIgcmVtb3ZpbmcgdGhlIHR5cGUgY2hlY2suXG4gICAgICAgICAgdmFyIF91cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgIGlmIChfdXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBfaW5zdGFuY2UgPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLmNoaWxkLnRhZykge1xuICAgICAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAgICAgIF9pbnN0YW5jZSA9IGdldFB1YmxpY0luc3RhbmNlKGZpbmlzaGVkV29yay5jaGlsZC5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgICAgICAgICAgX2luc3RhbmNlID0gZmluaXNoZWRXb3JrLmNoaWxkLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbW1pdFVwZGF0ZVF1ZXVlKGZpbmlzaGVkV29yaywgX3VwZGF0ZVF1ZXVlLCBfaW5zdGFuY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfaW5zdGFuY2UyID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTsgLy8gUmVuZGVyZXJzIG1heSBzY2hlZHVsZSB3b3JrIHRvIGJlIGRvbmUgYWZ0ZXIgaG9zdCBjb21wb25lbnRzIGFyZSBtb3VudGVkXG4gICAgICAgICAgLy8gKGVnIERPTSByZW5kZXJlciBtYXkgc2NoZWR1bGUgYXV0by1mb2N1cyBmb3IgaW5wdXRzIGFuZCBmb3JtIGNvbnRyb2xzKS5cbiAgICAgICAgICAvLyBUaGVzZSBlZmZlY3RzIHNob3VsZCBvbmx5IGJlIGNvbW1pdHRlZCB3aGVuIGNvbXBvbmVudHMgYXJlIGZpcnN0IG1vdW50ZWQsXG4gICAgICAgICAgLy8gYWthIHdoZW4gdGhlcmUgaXMgbm8gY3VycmVudC9hbHRlcm5hdGUuXG5cbiAgICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCAmJiBmaW5pc2hlZFdvcmsuZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICAgIHZhciB0eXBlID0gZmluaXNoZWRXb3JrLnR5cGU7XG4gICAgICAgICAgICB2YXIgcHJvcHMgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgIGNvbW1pdE1vdW50KF9pbnN0YW5jZTIsIHR5cGUsIHByb3BzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gV2UgaGF2ZSBubyBsaWZlLWN5Y2xlcyBhc3NvY2lhdGVkIHdpdGggdGV4dC5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBXZSBoYXZlIG5vIGxpZmUtY3ljbGVzIGFzc29jaWF0ZWQgd2l0aCBwb3J0YWxzLlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX2ZpbmlzaGVkV29yayRtZW1vaXplMiA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLFxuICAgICAgICAgICAgICAgIG9uQ29tbWl0ID0gX2ZpbmlzaGVkV29yayRtZW1vaXplMi5vbkNvbW1pdCxcbiAgICAgICAgICAgICAgICBvblJlbmRlciA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZTIub25SZW5kZXI7XG4gICAgICAgICAgICB2YXIgZWZmZWN0RHVyYXRpb24gPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgdmFyIGNvbW1pdFRpbWUgPSBnZXRDb21taXRUaW1lKCk7XG4gICAgICAgICAgICB2YXIgcGhhc2UgPSBjdXJyZW50ID09PSBudWxsID8gJ21vdW50JyA6ICd1cGRhdGUnO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChpc0N1cnJlbnRVcGRhdGVOZXN0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHBoYXNlID0gJ25lc3RlZC11cGRhdGUnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25SZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgb25SZW5kZXIoZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMuaWQsIHBoYXNlLCBmaW5pc2hlZFdvcmsuYWN0dWFsRHVyYXRpb24sIGZpbmlzaGVkV29yay50cmVlQmFzZUR1cmF0aW9uLCBmaW5pc2hlZFdvcmsuYWN0dWFsU3RhcnRUaW1lLCBjb21taXRUaW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIG9uQ29tbWl0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgb25Db21taXQoZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMuaWQsIHBoYXNlLCBlZmZlY3REdXJhdGlvbiwgY29tbWl0VGltZSk7XG4gICAgICAgICAgICAgIH0gLy8gU2NoZWR1bGUgYSBwYXNzaXZlIGVmZmVjdCBmb3IgdGhpcyBQcm9maWxlciB0byBjYWxsIG9uUG9zdENvbW1pdCBob29rcy5cbiAgICAgICAgICAgICAgLy8gVGhpcyBlZmZlY3Qgc2hvdWxkIGJlIHNjaGVkdWxlZCBldmVuIGlmIHRoZXJlIGlzIG5vIG9uUG9zdENvbW1pdCBjYWxsYmFjayBmb3IgdGhpcyBQcm9maWxlcixcbiAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgZWZmZWN0IGlzIGFsc28gd2hlcmUgdGltZXMgYnViYmxlIHRvIHBhcmVudCBQcm9maWxlcnMuXG5cblxuICAgICAgICAgICAgICBlbnF1ZXVlUGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdChmaW5pc2hlZFdvcmspOyAvLyBQcm9wYWdhdGUgbGF5b3V0IGVmZmVjdCBkdXJhdGlvbnMgdG8gdGhlIG5leHQgbmVhcmVzdCBQcm9maWxlciBhbmNlc3Rvci5cbiAgICAgICAgICAgICAgLy8gRG8gbm90IHJlc2V0IHRoZXNlIHZhbHVlcyB1bnRpbCB0aGUgbmV4dCByZW5kZXIgc28gRGV2VG9vbHMgaGFzIGEgY2hhbmNlIHRvIHJlYWQgdGhlbSBmaXJzdC5cblxuICAgICAgICAgICAgICB2YXIgcGFyZW50RmliZXIgPSBmaW5pc2hlZFdvcmsucmV0dXJuO1xuXG4gICAgICAgICAgICAgIG91dGVyOiB3aGlsZSAocGFyZW50RmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgICAgICAgICAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJvb3QgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHJvb3QuZWZmZWN0RHVyYXRpb24gKz0gZWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRTdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gKz0gZWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1pdFN1c3BlbnNlSHlkcmF0aW9uQ2FsbGJhY2tzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICBjYXNlIFRyYWNpbmdNYXJrZXJDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgdW5pdCBvZiB3b3JrIHRhZyBzaG91bGQgbm90IGhhdmUgc2lkZS1lZmZlY3RzLiBUaGlzIGVycm9yIGlzICcgKyAnbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCAhb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgIHtcbiAgICAgIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBSZWYpIHtcbiAgICAgICAgY29tbWl0QXR0YWNoUmVmKGZpbmlzaGVkV29yayk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlYXBwZWFyTGF5b3V0RWZmZWN0c09uRmliZXIobm9kZSkge1xuICAvLyBUdXJuIG9uIGxheW91dCBlZmZlY3RzIGluIGEgdHJlZSB0aGF0IHByZXZpb3VzbHkgZGlzYXBwZWFyZWQuXG4gIC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgTGF5b3V0U3RhdGljXG4gIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggbm9kZS5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgc2FmZWx5Q2FsbENvbW1pdEhvb2tMYXlvdXRFZmZlY3RMaXN0TW91bnQobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2FmZWx5Q2FsbENvbW1pdEhvb2tMYXlvdXRFZmZlY3RMaXN0TW91bnQobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudERpZE1vdW50KG5vZGUsIG5vZGUucmV0dXJuLCBpbnN0YW5jZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzYWZlbHlBdHRhY2hSZWYobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgc2FmZWx5QXR0YWNoUmVmKG5vZGUsIG5vZGUucmV0dXJuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4oZmluaXNoZWRXb3JrLCBpc0hpZGRlbikge1xuICAvLyBPbmx5IGhpZGUgb3IgdW5oaWRlIHRoZSB0b3AtbW9zdCBob3N0IG5vZGVzLlxuICB2YXIgaG9zdFN1YnRyZWVSb290ID0gbnVsbDtcblxuICB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgaW5zZXJ0ZWQgYnV0IHdlIG5lZWQgdG8gcmVjdXJzZSBkb3duIGl0c1xuICAgIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cbiAgICB2YXIgbm9kZSA9IGZpbmlzaGVkV29yaztcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQpIHtcbiAgICAgICAgaWYgKGhvc3RTdWJ0cmVlUm9vdCA9PT0gbnVsbCkge1xuICAgICAgICAgIGhvc3RTdWJ0cmVlUm9vdCA9IG5vZGU7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgICAgICBoaWRlSW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdW5oaWRlSW5zdGFuY2Uobm9kZS5zdGF0ZU5vZGUsIG5vZGUubWVtb2l6ZWRQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgICAgaWYgKGhvc3RTdWJ0cmVlUm9vdCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgX2luc3RhbmNlMyA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgaGlkZVRleHRJbnN0YW5jZShfaW5zdGFuY2UzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHVuaGlkZVRleHRJbnN0YW5jZShfaW5zdGFuY2UzLCBub2RlLm1lbW9pemVkUHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoKG5vZGUudGFnID09PSBPZmZzY3JlZW5Db21wb25lbnQgfHwgbm9kZS50YWcgPT09IExlZ2FjeUhpZGRlbkNvbXBvbmVudCkgJiYgbm9kZS5tZW1vaXplZFN0YXRlICE9PSBudWxsICYmIG5vZGUgIT09IGZpbmlzaGVkV29yaykgOyBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGZpbmlzaGVkV29yaykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChob3N0U3VidHJlZVJvb3QgPT09IG5vZGUpIHtcbiAgICAgICAgICBob3N0U3VidHJlZVJvb3QgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBub2RlKSB7XG4gICAgICAgIGhvc3RTdWJ0cmVlUm9vdCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEF0dGFjaFJlZihmaW5pc2hlZFdvcmspIHtcbiAgdmFyIHJlZiA9IGZpbmlzaGVkV29yay5yZWY7XG5cbiAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgdmFyIGluc3RhbmNlVG9Vc2U7XG5cbiAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgaW5zdGFuY2VUb1VzZSA9IGdldFB1YmxpY0luc3RhbmNlKGluc3RhbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGluc3RhbmNlVG9Vc2UgPSBpbnN0YW5jZTtcbiAgICB9IC8vIE1vdmVkIG91dHNpZGUgdG8gZW5zdXJlIERDRSB3b3JrcyB3aXRoIHRoaXMgZmxhZ1xuXG4gICAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciByZXRWYWw7XG5cbiAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICByZXRWYWwgPSByZWYoaW5zdGFuY2VUb1VzZSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0VmFsID0gcmVmKGluc3RhbmNlVG9Vc2UpO1xuICAgICAgfVxuXG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgcmV0VmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIGZyb20gYSBjYWxsYmFjayByZWYgaW4gJXMuICcgKyAnQSBjYWxsYmFjayByZWYgc2hvdWxkIG5vdCByZXR1cm4gYSBmdW5jdGlvbi4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFyZWYuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSkge1xuICAgICAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHJlZiBvYmplY3QgcHJvdmlkZWQgZm9yICVzLiAnICsgJ1VzZSBlaXRoZXIgYSByZWYtc2V0dGVyIGZ1bmN0aW9uIG9yIFJlYWN0LmNyZWF0ZVJlZigpLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVmLmN1cnJlbnQgPSBpbnN0YW5jZVRvVXNlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZXRhY2hGaWJlck11dGF0aW9uKGZpYmVyKSB7XG4gIC8vIEN1dCBvZmYgdGhlIHJldHVybiBwb2ludGVyIHRvIGRpc2Nvbm5lY3QgaXQgZnJvbSB0aGUgdHJlZS5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIGRldGVjdCBhbmQgd2FybiBhZ2FpbnN0IHN0YXRlIHVwZGF0ZXMgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC5cbiAgLy8gSXQgYWxzbyBwcmV2ZW50cyBldmVudHMgZnJvbSBidWJibGluZyBmcm9tIHdpdGhpbiBkaXNjb25uZWN0ZWQgY29tcG9uZW50cy5cbiAgLy9cbiAgLy8gSWRlYWxseSwgd2Ugc2hvdWxkIGFsc28gY2xlYXIgdGhlIGNoaWxkIHBvaW50ZXIgb2YgdGhlIHBhcmVudCBhbHRlcm5hdGUgdG8gbGV0IHRoaXNcbiAgLy8gZ2V0IEdDOmVkIGJ1dCB3ZSBkb24ndCBrbm93IHdoaWNoIGZvciBzdXJlIHdoaWNoIHBhcmVudCBpcyB0aGUgY3VycmVudFxuICAvLyBvbmUgc28gd2UnbGwgc2V0dGxlIGZvciBHQzppbmcgdGhlIHN1YnRyZWUgb2YgdGhpcyBjaGlsZC5cbiAgLy8gVGhpcyBjaGlsZCBpdHNlbGYgd2lsbCBiZSBHQzplZCB3aGVuIHRoZSBwYXJlbnQgdXBkYXRlcyB0aGUgbmV4dCB0aW1lLlxuICAvL1xuICAvLyBOb3RlIHRoYXQgd2UgY2FuJ3QgY2xlYXIgY2hpbGQgb3Igc2libGluZyBwb2ludGVycyB5ZXQuXG4gIC8vIFRoZXkncmUgbmVlZGVkIGZvciBwYXNzaXZlIGVmZmVjdHMgYW5kIGZvciBmaW5kRE9NTm9kZS5cbiAgLy8gV2UgZGVmZXIgdGhvc2UgZmllbGRzLCBhbmQgYWxsIG90aGVyIGNsZWFudXAsIHRvIHRoZSBwYXNzaXZlIHBoYXNlIChzZWUgZGV0YWNoRmliZXJBZnRlckVmZmVjdHMpLlxuICAvL1xuICAvLyBEb24ndCByZXNldCB0aGUgYWx0ZXJuYXRlIHlldCwgZWl0aGVyLiBXZSBuZWVkIHRoYXQgc28gd2UgY2FuIGRldGFjaCB0aGVcbiAgLy8gYWx0ZXJuYXRlJ3MgZmllbGRzIGluIHRoZSBwYXNzaXZlIHBoYXNlLiBDbGVhcmluZyB0aGUgcmV0dXJuIHBvaW50ZXIgaXNcbiAgLy8gc3VmZmljaWVudCBmb3IgZmluZERPTU5vZGUgc2VtYW50aWNzLlxuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICBhbHRlcm5hdGUucmV0dXJuID0gbnVsbDtcbiAgfVxuXG4gIGZpYmVyLnJldHVybiA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGZpYmVyKSB7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGZpYmVyLmFsdGVybmF0ZSA9IG51bGw7XG4gICAgZGV0YWNoRmliZXJBZnRlckVmZmVjdHMoYWx0ZXJuYXRlKTtcbiAgfSAvLyBOb3RlOiBEZWZlbnNpdmVseSB1c2luZyBuZWdhdGlvbiBpbnN0ZWFkIG9mIDwgaW4gY2FzZVxuICAvLyBgZGVsZXRlZFRyZWVDbGVhblVwTGV2ZWxgIGlzIHVuZGVmaW5lZC5cblxuXG4gIHtcbiAgICAvLyBDbGVhciBjeWNsaWNhbCBGaWJlciBmaWVsZHMuIFRoaXMgbGV2ZWwgYWxvbmUgaXMgZGVzaWduZWQgdG8gcm91Z2hseVxuICAgIC8vIGFwcHJveGltYXRlIHRoZSBwbGFubmVkIEZpYmVyIHJlZmFjdG9yLiBJbiB0aGF0IHdvcmxkLCBgc2V0U3RhdGVgIHdpbGwgYmVcbiAgICAvLyBib3VuZCB0byBhIHNwZWNpYWwgXCJpbnN0YW5jZVwiIG9iamVjdCBpbnN0ZWFkIG9mIGEgRmliZXIuIFRoZSBJbnN0YW5jZVxuICAgIC8vIG9iamVjdCB3aWxsIG5vdCBoYXZlIGFueSBvZiB0aGVzZSBmaWVsZHMuIEl0IHdpbGwgb25seSBiZSBjb25uZWN0ZWQgdG9cbiAgICAvLyB0aGUgZmliZXIgdHJlZSB2aWEgYSBzaW5nbGUgbGluayBhdCB0aGUgcm9vdC4gU28gaWYgdGhpcyBsZXZlbCBhbG9uZSBpc1xuICAgIC8vIHN1ZmZpY2llbnQgdG8gZml4IG1lbW9yeSBpc3N1ZXMsIHRoYXQgYm9kZXMgd2VsbCBmb3Igb3VyIHBsYW5zLlxuICAgIGZpYmVyLmNoaWxkID0gbnVsbDtcbiAgICBmaWJlci5kZWxldGlvbnMgPSBudWxsO1xuICAgIGZpYmVyLnNpYmxpbmcgPSBudWxsOyAvLyBUaGUgYHN0YXRlTm9kZWAgaXMgY3ljbGljYWwgYmVjYXVzZSBvbiBob3N0IG5vZGVzIGl0IHBvaW50cyB0byB0aGUgaG9zdFxuICAgIC8vIHRyZWUsIHdoaWNoIGhhcyBpdHMgb3duIHBvaW50ZXJzIHRvIGNoaWxkcmVuLCBwYXJlbnRzLCBhbmQgc2libGluZ3MuXG4gICAgLy8gVGhlIG90aGVyIGhvc3Qgbm9kZXMgYWxzbyBwb2ludCBiYWNrIHRvIGZpYmVycywgc28gd2Ugc2hvdWxkIGRldGFjaCB0aGF0XG4gICAgLy8gb25lLCB0b28uXG5cbiAgICBpZiAoZmliZXIudGFnID09PSBIb3N0Q29tcG9uZW50KSB7XG4gICAgICB2YXIgaG9zdEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICBpZiAoaG9zdEluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgIGRldGFjaERlbGV0ZWRJbnN0YW5jZShob3N0SW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpYmVyLnN0YXRlTm9kZSA9IG51bGw7IC8vIEknbSBpbnRlbnRpb25hbGx5IG5vdCBjbGVhcmluZyB0aGUgYHJldHVybmAgZmllbGQgaW4gdGhpcyBsZXZlbC4gV2VcbiAgICAvLyBhbHJlYWR5IGRpc2Nvbm5lY3QgdGhlIGByZXR1cm5gIHBvaW50ZXIgYXQgdGhlIHJvb3Qgb2YgdGhlIGRlbGV0ZWRcbiAgICAvLyBzdWJ0cmVlIChpbiBgZGV0YWNoRmliZXJNdXRhdGlvbmApLiBCZXNpZGVzLCBgcmV0dXJuYCBieSBpdHNlbGYgaXMgbm90XG4gICAgLy8gY3ljbGljYWwg4oCUIGl0J3Mgb25seSBjeWNsaWNhbCB3aGVuIGNvbWJpbmVkIHdpdGggYGNoaWxkYCwgYHNpYmxpbmdgLCBhbmRcbiAgICAvLyBgYWx0ZXJuYXRlYC4gQnV0IHdlJ2xsIGNsZWFyIGl0IGluIHRoZSBuZXh0IGxldmVsIGFueXdheSwganVzdCBpbiBjYXNlLlxuXG4gICAge1xuICAgICAgZmliZXIuX2RlYnVnT3duZXIgPSBudWxsO1xuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIFRoZW9yZXRpY2FsbHksIG5vdGhpbmcgaW4gaGVyZSBzaG91bGQgYmUgbmVjZXNzYXJ5LCBiZWNhdXNlIHdlIGFscmVhZHlcbiAgICAgIC8vIGRpc2Nvbm5lY3RlZCB0aGUgZmliZXIgZnJvbSB0aGUgdHJlZS4gU28gZXZlbiBpZiBzb21ldGhpbmcgbGVha3MgdGhpc1xuICAgICAgLy8gcGFydGljdWxhciBmaWJlciwgaXQgd29uJ3QgbGVhayBhbnl0aGluZyBlbHNlXG4gICAgICAvL1xuICAgICAgLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBicmFuY2ggaXMgdG8gYmUgc3VwZXIgYWdncmVzc2l2ZSBzbyB3ZSBjYW4gbWVhc3VyZVxuICAgICAgLy8gaWYgdGhlcmUncyBhbnkgZGlmZmVyZW5jZSBpbiBtZW1vcnkgaW1wYWN0LiBJZiB0aGVyZSBpcywgdGhhdCBjb3VsZFxuICAgICAgLy8gaW5kaWNhdGUgYSBSZWFjdCBsZWFrIHdlIGRvbid0IGtub3cgYWJvdXQuXG4gICAgICBmaWJlci5yZXR1cm4gPSBudWxsO1xuICAgICAgZmliZXIuZGVwZW5kZW5jaWVzID0gbnVsbDtcbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICAgICAgZmliZXIubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBudWxsO1xuICAgICAgZmliZXIuc3RhdGVOb2RlID0gbnVsbDsgLy8gVE9ETzogTW92ZSB0byBgY29tbWl0UGFzc2l2ZVVubW91bnRJbnNpZGVEZWxldGVkVHJlZU9uRmliZXJgIGluc3RlYWQuXG5cbiAgICAgIGZpYmVyLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFBhcmVudEZpYmVyKGZpYmVyKSB7XG4gIHZhciBwYXJlbnQgPSBmaWJlci5yZXR1cm47XG5cbiAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgIGlmIChpc0hvc3RQYXJlbnQocGFyZW50KSkge1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG5cbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBmaW5kIGEgaG9zdCBwYXJlbnQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyAnICsgJ2luIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbn1cblxuZnVuY3Rpb24gaXNIb3N0UGFyZW50KGZpYmVyKSB7XG4gIHJldHVybiBmaWJlci50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgZmliZXIudGFnID09PSBIb3N0Um9vdCB8fCBmaWJlci50YWcgPT09IEhvc3RQb3J0YWw7XG59XG5cbmZ1bmN0aW9uIGdldEhvc3RTaWJsaW5nKGZpYmVyKSB7XG4gIC8vIFdlJ3JlIGdvaW5nIHRvIHNlYXJjaCBmb3J3YXJkIGludG8gdGhlIHRyZWUgdW50aWwgd2UgZmluZCBhIHNpYmxpbmcgaG9zdFxuICAvLyBub2RlLiBVbmZvcnR1bmF0ZWx5LCBpZiBtdWx0aXBsZSBpbnNlcnRpb25zIGFyZSBkb25lIGluIGEgcm93IHdlIGhhdmUgdG9cbiAgLy8gc2VhcmNoIHBhc3QgdGhlbS4gVGhpcyBsZWFkcyB0byBleHBvbmVudGlhbCBzZWFyY2ggZm9yIHRoZSBuZXh0IHNpYmxpbmcuXG4gIC8vIFRPRE86IEZpbmQgYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZG8gdGhpcy5cbiAgdmFyIG5vZGUgPSBmaWJlcjtcblxuICBzaWJsaW5nczogd2hpbGUgKHRydWUpIHtcbiAgICAvLyBJZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZywgbGV0J3MgdHJ5IHRoZSBuZXh0IHNpYmxpbmcuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IGlzSG9zdFBhcmVudChub2RlLnJldHVybikpIHtcbiAgICAgICAgLy8gSWYgd2UgcG9wIG91dCBvZiB0aGUgcm9vdCBvciBoaXQgdGhlIHBhcmVudCB0aGUgZmliZXIgd2UgYXJlIHRoZVxuICAgICAgICAvLyBsYXN0IHNpYmxpbmcuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG5cbiAgICB3aGlsZSAobm9kZS50YWcgIT09IEhvc3RDb21wb25lbnQgJiYgbm9kZS50YWcgIT09IEhvc3RUZXh0ICYmIG5vZGUudGFnICE9PSBEZWh5ZHJhdGVkRnJhZ21lbnQpIHtcbiAgICAgIC8vIElmIGl0IGlzIG5vdCBob3N0IG5vZGUgYW5kLCB3ZSBtaWdodCBoYXZlIGEgaG9zdCBub2RlIGluc2lkZSBpdC5cbiAgICAgIC8vIFRyeSB0byBzZWFyY2ggZG93biB1bnRpbCB3ZSBmaW5kIG9uZS5cbiAgICAgIGlmIChub2RlLmZsYWdzICYgUGxhY2VtZW50KSB7XG4gICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSBjaGlsZCwgdHJ5IHRoZSBzaWJsaW5ncyBpbnN0ZWFkLlxuICAgICAgICBjb250aW51ZSBzaWJsaW5ncztcbiAgICAgIH0gLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoaWxkLCB0cnkgdGhlIHNpYmxpbmdzIGluc3RlYWQuXG4gICAgICAvLyBXZSBhbHNvIHNraXAgcG9ydGFscyBiZWNhdXNlIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoaXMgaG9zdCB0cmVlLlxuXG5cbiAgICAgIGlmIChub2RlLmNoaWxkID09PSBudWxsIHx8IG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgIGNvbnRpbnVlIHNpYmxpbmdzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIH1cbiAgICB9IC8vIENoZWNrIGlmIHRoaXMgaG9zdCBub2RlIGlzIHN0YWJsZSBvciBhYm91dCB0byBiZSBwbGFjZWQuXG5cblxuICAgIGlmICghKG5vZGUuZmxhZ3MgJiBQbGFjZW1lbnQpKSB7XG4gICAgICAvLyBGb3VuZCBpdCFcbiAgICAgIHJldHVybiBub2RlLnN0YXRlTm9kZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGxhY2VtZW50KGZpbmlzaGVkV29yaykge1xuXG5cbiAgdmFyIHBhcmVudEZpYmVyID0gZ2V0SG9zdFBhcmVudEZpYmVyKGZpbmlzaGVkV29yayk7IC8vIE5vdGU6IHRoZXNlIHR3byB2YXJpYWJsZXMgKm11c3QqIGFsd2F5cyBiZSB1cGRhdGVkIHRvZ2V0aGVyLlxuXG4gIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgcGFyZW50ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChwYXJlbnRGaWJlci5mbGFncyAmIENvbnRlbnRSZXNldCkge1xuICAgICAgICAgIC8vIFJlc2V0IHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIHBhcmVudCBiZWZvcmUgZG9pbmcgYW55IGluc2VydGlvbnNcbiAgICAgICAgICByZXNldFRleHRDb250ZW50KHBhcmVudCk7IC8vIENsZWFyIENvbnRlbnRSZXNldCBmcm9tIHRoZSBlZmZlY3QgdGFnXG5cbiAgICAgICAgICBwYXJlbnRGaWJlci5mbGFncyAmPSB+Q29udGVudFJlc2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGJlZm9yZSA9IGdldEhvc3RTaWJsaW5nKGZpbmlzaGVkV29yayk7IC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGluc2VydGVkIGJ1dCB3ZSBuZWVkIHRvIHJlY3Vyc2UgZG93biBpdHNcbiAgICAgICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuXG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShmaW5pc2hlZFdvcmssIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wYXJlbnQgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICB2YXIgX2JlZm9yZSA9IGdldEhvc3RTaWJsaW5nKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihmaW5pc2hlZFdvcmssIF9iZWZvcmUsIF9wYXJlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUtbm8tZmFsbHRocm91Z2hcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaG9zdCBwYXJlbnQgZmliZXIuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyAnICsgJ2luIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKG5vZGUsIGJlZm9yZSwgcGFyZW50KSB7XG4gIHZhciB0YWcgPSBub2RlLnRhZztcbiAgdmFyIGlzSG9zdCA9IHRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCB0YWcgPT09IEhvc3RUZXh0O1xuXG4gIGlmIChpc0hvc3QpIHtcbiAgICB2YXIgc3RhdGVOb2RlID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoYmVmb3JlKSB7XG4gICAgICBpbnNlcnRJbkNvbnRhaW5lckJlZm9yZShwYXJlbnQsIHN0YXRlTm9kZSwgYmVmb3JlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcihwYXJlbnQsIHN0YXRlTm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFBvcnRhbCkgOyBlbHNlIHtcbiAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKGNoaWxkLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICB2YXIgc2libGluZyA9IGNoaWxkLnNpYmxpbmc7XG5cbiAgICAgIHdoaWxlIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoc2libGluZywgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgICBzaWJsaW5nID0gc2libGluZy5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUobm9kZSwgYmVmb3JlLCBwYXJlbnQpIHtcbiAgdmFyIHRhZyA9IG5vZGUudGFnO1xuICB2YXIgaXNIb3N0ID0gdGFnID09PSBIb3N0Q29tcG9uZW50IHx8IHRhZyA9PT0gSG9zdFRleHQ7XG5cbiAgaWYgKGlzSG9zdCkge1xuICAgIHZhciBzdGF0ZU5vZGUgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgIGlmIChiZWZvcmUpIHtcbiAgICAgIGluc2VydEJlZm9yZShwYXJlbnQsIHN0YXRlTm9kZSwgYmVmb3JlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kQ2hpbGQocGFyZW50LCBzdGF0ZU5vZGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RQb3J0YWwpIDsgZWxzZSB7XG4gICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKGNoaWxkLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICB2YXIgc2libGluZyA9IGNoaWxkLnNpYmxpbmc7XG5cbiAgICAgIHdoaWxlIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShzaWJsaW5nLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59IC8vIFRoZXNlIGFyZSB0cmFja2VkIG9uIHRoZSBzdGFjayBhcyB3ZSByZWN1cnNpdmVseSB0cmF2ZXJzZSBhXG4vLyBkZWxldGVkIHN1YnRyZWUuXG4vLyBUT0RPOiBVcGRhdGUgdGhlc2UgZHVyaW5nIHRoZSB3aG9sZSBtdXRhdGlvbiBwaGFzZSwgbm90IGp1c3QgZHVyaW5nXG4vLyBhIGRlbGV0aW9uLlxuXG5cbnZhciBob3N0UGFyZW50ID0gbnVsbDtcbnZhciBob3N0UGFyZW50SXNDb250YWluZXIgPSBmYWxzZTtcblxuZnVuY3Rpb24gY29tbWl0RGVsZXRpb25FZmZlY3RzKHJvb3QsIHJldHVybkZpYmVyLCBkZWxldGVkRmliZXIpIHtcbiAge1xuICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGRlbGV0ZWQgYnV0IHdlIG5lZWQgdG8gcmVjdXJzZSBkb3duIGl0c1xuICAgIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cbiAgICAvLyBSZWN1cnNpdmVseSBkZWxldGUgYWxsIGhvc3Qgbm9kZXMgZnJvbSB0aGUgcGFyZW50LCBkZXRhY2ggcmVmcywgY2xlYW5cbiAgICAvLyB1cCBtb3VudGVkIGxheW91dCBlZmZlY3RzLCBhbmQgY2FsbCBjb21wb25lbnRXaWxsVW5tb3VudC5cbiAgICAvLyBXZSBvbmx5IG5lZWQgdG8gcmVtb3ZlIHRoZSB0b3Btb3N0IGhvc3QgY2hpbGQgaW4gZWFjaCBicmFuY2guIEJ1dCB0aGVuIHdlXG4gICAgLy8gc3RpbGwgbmVlZCB0byBrZWVwIHRyYXZlcnNpbmcgdG8gdW5tb3VudCBlZmZlY3RzLCByZWZzLCBhbmQgY1dVLiBUT0RPOiBXZVxuICAgIC8vIGNvdWxkIHNwbGl0IHRoaXMgaW50byB0d28gc2VwYXJhdGUgdHJhdmVyc2FscyBmdW5jdGlvbnMsIHdoZXJlIHRoZSBzZWNvbmRcbiAgICAvLyBvbmUgZG9lc24ndCBpbmNsdWRlIGFueSByZW1vdmVDaGlsZCBsb2dpYy4gVGhpcyBpcyBtYXliZSB0aGUgc2FtZVxuICAgIC8vIGZ1bmN0aW9uIGFzIFwiZGlzYXBwZWFyTGF5b3V0RWZmZWN0c1wiIChvciB3aGF0ZXZlciB0aGF0IHR1cm5zIGludG8gYWZ0ZXJcbiAgICAvLyB0aGUgbGF5b3V0IHBoYXNlIGlzIHJlZmFjdG9yZWQgdG8gdXNlIHJlY3Vyc2lvbikuXG4gICAgLy8gQmVmb3JlIHN0YXJ0aW5nLCBmaW5kIHRoZSBuZWFyZXN0IGhvc3QgcGFyZW50IG9uIHRoZSBzdGFjayBzbyB3ZSBrbm93XG4gICAgLy8gd2hpY2ggaW5zdGFuY2UvY29udGFpbmVyIHRvIHJlbW92ZSB0aGUgY2hpbGRyZW4gZnJvbS5cbiAgICAvLyBUT0RPOiBJbnN0ZWFkIG9mIHNlYXJjaGluZyB1cCB0aGUgZmliZXIgcmV0dXJuIHBhdGggb24gZXZlcnkgZGVsZXRpb24sIHdlXG4gICAgLy8gY2FuIHRyYWNrIHRoZSBuZWFyZXN0IGhvc3QgY29tcG9uZW50IG9uIHRoZSBKUyBzdGFjayBhcyB3ZSB0cmF2ZXJzZSB0aGVcbiAgICAvLyB0cmVlIGR1cmluZyB0aGUgY29tbWl0IHBoYXNlLiBUaGlzIHdvdWxkIG1ha2UgaW5zZXJ0aW9ucyBmYXN0ZXIsIHRvby5cbiAgICB2YXIgcGFyZW50ID0gcmV0dXJuRmliZXI7XG5cbiAgICBmaW5kUGFyZW50OiB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKHBhcmVudC50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlO1xuICAgICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhayBmaW5kUGFyZW50O1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWsgZmluZFBhcmVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWsgZmluZFBhcmVudDtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGhvc3RQYXJlbnQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gZmluZCBhIGhvc3QgcGFyZW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgJyArICdhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihyb290LCByZXR1cm5GaWJlciwgZGVsZXRlZEZpYmVyKTtcbiAgICBob3N0UGFyZW50ID0gbnVsbDtcbiAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBmYWxzZTtcbiAgfVxuXG4gIGRldGFjaEZpYmVyTXV0YXRpb24oZGVsZXRlZEZpYmVyKTtcbn1cblxuZnVuY3Rpb24gcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIHBhcmVudCkge1xuICAvLyBUT0RPOiBVc2UgYSBzdGF0aWMgZmxhZyB0byBza2lwIHRyZWVzIHRoYXQgZG9uJ3QgaGF2ZSB1bm1vdW50IGVmZmVjdHNcbiAgdmFyIGNoaWxkID0gcGFyZW50LmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgIGNvbW1pdERlbGV0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBjaGlsZCk7XG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdERlbGV0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpIHtcbiAgb25Db21taXRVbm1vdW50KGRlbGV0ZWRGaWJlcik7IC8vIFRoZSBjYXNlcyBpbiB0aGlzIG91dGVyIHN3aXRjaCBtb2RpZnkgdGhlIHN0YWNrIGJlZm9yZSB0aGV5IHRyYXZlcnNlXG4gIC8vIGludG8gdGhlaXIgc3VidHJlZS4gVGhlcmUgYXJlIHNpbXBsZXIgY2FzZXMgaW4gdGhlIGlubmVyIHN3aXRjaFxuICAvLyB0aGF0IGRvbid0IG1vZGlmeSB0aGUgc3RhY2suXG5cbiAgc3dpdGNoIChkZWxldGVkRmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgICAgfSAvLyBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCB0byBuZXh0IGJyYW5jaFxuXG4gICAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lLW5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICAvLyBXZSBvbmx5IG5lZWQgdG8gcmVtb3ZlIHRoZSBuZWFyZXN0IGhvc3QgY2hpbGQuIFNldCB0aGUgaG9zdCBwYXJlbnRcbiAgICAgICAgLy8gdG8gYG51bGxgIG9uIHRoZSBzdGFjayB0byBpbmRpY2F0ZSB0aGF0IG5lc3RlZCBjaGlsZHJlbiBkb24ndFxuICAgICAgICAvLyBuZWVkIHRvIGJlIHJlbW92ZWQuXG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcHJldkhvc3RQYXJlbnQgPSBob3N0UGFyZW50O1xuICAgICAgICAgIHZhciBwcmV2SG9zdFBhcmVudElzQ29udGFpbmVyID0gaG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBudWxsO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBwcmV2SG9zdFBhcmVudDtcbiAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBwcmV2SG9zdFBhcmVudElzQ29udGFpbmVyO1xuXG4gICAgICAgICAgaWYgKGhvc3RQYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIE5vdyB0aGF0IGFsbCB0aGUgY2hpbGQgZWZmZWN0cyBoYXZlIHVubW91bnRlZCwgd2UgY2FuIHJlbW92ZSB0aGVcbiAgICAgICAgICAgIC8vIG5vZGUgZnJvbSB0aGUgdHJlZS5cbiAgICAgICAgICAgIGlmIChob3N0UGFyZW50SXNDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgcmVtb3ZlQ2hpbGRGcm9tQ29udGFpbmVyKGhvc3RQYXJlbnQsIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVtb3ZlQ2hpbGQoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBEZWh5ZHJhdGVkRnJhZ21lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIERlbGV0ZSB0aGUgZGVoeWRyYXRlZCBzdXNwZW5zZSBib3VuZGFyeSBhbmQgYWxsIG9mIGl0cyBjb250ZW50LlxuXG5cbiAgICAgICAge1xuICAgICAgICAgIGlmIChob3N0UGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoaG9zdFBhcmVudElzQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgIGNsZWFyU3VzcGVuc2VCb3VuZGFyeUZyb21Db250YWluZXIoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjbGVhclN1c3BlbnNlQm91bmRhcnkoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgLy8gV2hlbiB3ZSBnbyBpbnRvIGEgcG9ydGFsLCBpdCBiZWNvbWVzIHRoZSBwYXJlbnQgdG8gcmVtb3ZlIGZyb20uXG4gICAgICAgICAgdmFyIF9wcmV2SG9zdFBhcmVudCA9IGhvc3RQYXJlbnQ7XG4gICAgICAgICAgdmFyIF9wcmV2SG9zdFBhcmVudElzQ29udGFpbmVyID0gaG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBkZWxldGVkRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICBob3N0UGFyZW50ID0gX3ByZXZIb3N0UGFyZW50O1xuICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IF9wcmV2SG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgdmFyIHVwZGF0ZVF1ZXVlID0gZGVsZXRlZEZpYmVyLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgbGFzdEVmZmVjdCA9IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3Q7XG5cbiAgICAgICAgICAgIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICAgICAgICAgICAgdmFyIGVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuXG4gICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB2YXIgX2VmZmVjdCA9IGVmZmVjdCxcbiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSA9IF9lZmZlY3QuZGVzdHJveSxcbiAgICAgICAgICAgICAgICAgICAgdGFnID0gX2VmZmVjdC50YWc7XG5cbiAgICAgICAgICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGFnICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQoZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICggZGVsZXRlZEZpYmVyLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpO1xuICAgICAgICAgICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0O1xuICAgICAgICAgICAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZGVsZXRlZEZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGluc3RhbmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggLy8gVE9ETzogUmVtb3ZlIHRoaXMgZGVhZCBmbGFnXG4gICAgICAgICBkZWxldGVkRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBvZmZzY3JlZW4gY29tcG9uZW50IGlzIGhpZGRlbiwgd2UgYWxyZWFkeSB1bm1vdW50ZWQgaXQuIEJlZm9yZVxuICAgICAgICAgIC8vIGRlbGV0aW5nIHRoZSBjaGlsZHJlbiwgdHJhY2sgdGhhdCBpdCdzIGFscmVhZHkgdW5tb3VudGVkIHNvIHRoYXQgd2VcbiAgICAgICAgICAvLyBkb24ndCBhdHRlbXB0IHRvIHVubW91bnQgdGhlIGVmZmVjdHMgYWdhaW4uXG4gICAgICAgICAgLy8gVE9ETzogSWYgdGhlIHRyZWUgaXMgaGlkZGVuLCBpbiBtb3N0IGNhc2VzIHdlIHNob3VsZCBiZSBhYmxlIHRvIHNraXBcbiAgICAgICAgICAvLyBvdmVyIHRoZSBuZXN0ZWQgY2hpbGRyZW4gZW50aXJlbHkuIEFuIGV4Y2VwdGlvbiBpcyB3ZSBoYXZlbid0IHlldCBmb3VuZFxuICAgICAgICAgIC8vIHRoZSB0b3Btb3N0IGhvc3Qgbm9kZSB0byBkZWxldGUsIHdoaWNoIHdlIGFscmVhZHkgdHJhY2sgb24gdGhlIHN0YWNrLlxuICAgICAgICAgIC8vIEJ1dCB0aGUgb3RoZXIgY2FzZSBpcyBwb3J0YWxzLCB3aGljaCBuZWVkIHRvIGJlIGRldGFjaGVkIG5vIG1hdHRlciBob3dcbiAgICAgICAgICAvLyBkZWVwbHkgdGhleSBhcmUgbmVzdGVkLiBXZSBzaG91bGQgdXNlIGEgc3VidHJlZSBmbGFnIHRvIHRyYWNrIHdoZXRoZXIgYVxuICAgICAgICAgIC8vIHN1YnRyZWUgaW5jbHVkZXMgYSBuZXN0ZWQgcG9ydGFsLlxuICAgICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8IGRlbGV0ZWRGaWJlci5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRTdXNwZW5zZUNhbGxiYWNrKGZpbmlzaGVkV29yaykge1xuICAvLyBUT0RPOiBNb3ZlIHRoaXMgdG8gcGFzc2l2ZSBwaGFzZVxuICB2YXIgbmV3U3RhdGUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTtcbn1cblxuZnVuY3Rpb24gY29tbWl0U3VzcGVuc2VIeWRyYXRpb25DYWxsYmFja3MoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspIHtcblxuICB2YXIgbmV3U3RhdGUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAobmV3U3RhdGUgPT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IHByZXZTdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICAgIGlmIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgY29tbWl0SHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKSB7XG4gIC8vIElmIHRoaXMgYm91bmRhcnkganVzdCB0aW1lZCBvdXQsIHRoZW4gaXQgd2lsbCBoYXZlIGEgc2V0IG9mIHdha2VhYmxlcy5cbiAgLy8gRm9yIGVhY2ggd2FrZWFibGUsIGF0dGFjaCBhIGxpc3RlbmVyIHNvIHRoYXQgd2hlbiBpdCByZXNvbHZlcywgUmVhY3RcbiAgLy8gYXR0ZW1wdHMgdG8gcmUtcmVuZGVyIHRoZSBib3VuZGFyeSBpbiB0aGUgcHJpbWFyeSAocHJlLXRpbWVvdXQpIHN0YXRlLlxuICB2YXIgd2FrZWFibGVzID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh3YWtlYWJsZXMgIT09IG51bGwpIHtcbiAgICBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIHZhciByZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgIGlmIChyZXRyeUNhY2hlID09PSBudWxsKSB7XG4gICAgICByZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZSA9IG5ldyBQb3NzaWJseVdlYWtTZXQoKTtcbiAgICB9XG5cbiAgICB3YWtlYWJsZXMuZm9yRWFjaChmdW5jdGlvbiAod2FrZWFibGUpIHtcbiAgICAgIC8vIE1lbW9pemUgdXNpbmcgdGhlIGJvdW5kYXJ5IGZpYmVyIHRvIHByZXZlbnQgcmVkdW5kYW50IGxpc3RlbmVycy5cbiAgICAgIHZhciByZXRyeSA9IHJlc29sdmVSZXRyeVdha2VhYmxlLmJpbmQobnVsbCwgZmluaXNoZWRXb3JrLCB3YWtlYWJsZSk7XG5cbiAgICAgIGlmICghcmV0cnlDYWNoZS5oYXMod2FrZWFibGUpKSB7XG4gICAgICAgIHJldHJ5Q2FjaGUuYWRkKHdha2VhYmxlKTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgICAgICBpZiAoaW5Qcm9ncmVzc0xhbmVzICE9PSBudWxsICYmIGluUHJvZ3Jlc3NSb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyB3b3JrIHN0aWxsLCBhc3NvY2lhdGUgdGhlIG9yaWdpbmFsIHVwZGF0ZXJzIHdpdGggaXQuXG4gICAgICAgICAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMoaW5Qcm9ncmVzc1Jvb3QsIGluUHJvZ3Jlc3NMYW5lcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBFcnJvcignRXhwZWN0ZWQgZmluaXNoZWQgcm9vdCBhbmQgbGFuZXMgdG8gYmUgc2V0LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHdha2VhYmxlLnRoZW4ocmV0cnksIHJldHJ5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSAvLyBUaGlzIGZ1bmN0aW9uIGRldGVjdHMgd2hlbiBhIFN1c3BlbnNlIGJvdW5kYXJ5IGdvZXMgZnJvbSB2aXNpYmxlIHRvIGhpZGRlbi5cbmZ1bmN0aW9uIGNvbW1pdE11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzKSB7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IGNvbW1pdHRlZExhbmVzO1xuICBpblByb2dyZXNzUm9vdCA9IHJvb3Q7XG4gIHNldEN1cnJlbnRGaWJlcihmaW5pc2hlZFdvcmspO1xuICBjb21taXRNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkV29yaywgcm9vdCk7XG4gIHNldEN1cnJlbnRGaWJlcihmaW5pc2hlZFdvcmspO1xuICBpblByb2dyZXNzTGFuZXMgPSBudWxsO1xuICBpblByb2dyZXNzUm9vdCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgcGFyZW50RmliZXIsIGxhbmVzKSB7XG4gIC8vIERlbGV0aW9ucyBlZmZlY3RzIGNhbiBiZSBzY2hlZHVsZWQgb24gYW55IGZpYmVyIHR5cGUuIFRoZXkgbmVlZCB0byBoYXBwZW5cbiAgLy8gYmVmb3JlIHRoZSBjaGlsZHJlbiBlZmZlY3RzIGhhZSBmaXJlZC5cbiAgdmFyIGRlbGV0aW9ucyA9IHBhcmVudEZpYmVyLmRlbGV0aW9ucztcblxuICBpZiAoZGVsZXRpb25zICE9PSBudWxsKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWxldGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZFRvRGVsZXRlID0gZGVsZXRpb25zW2ldO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb21taXREZWxldGlvbkVmZmVjdHMocm9vdCwgcGFyZW50RmliZXIsIGNoaWxkVG9EZWxldGUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY2hpbGRUb0RlbGV0ZSwgcGFyZW50RmliZXIsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgcHJldkRlYnVnRmliZXIgPSBnZXRDdXJyZW50RmliZXIoKTtcblxuICBpZiAocGFyZW50RmliZXIuc3VidHJlZUZsYWdzICYgTXV0YXRpb25NYXNrKSB7XG4gICAgdmFyIGNoaWxkID0gcGFyZW50RmliZXIuY2hpbGQ7XG5cbiAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihjaGlsZCk7XG4gICAgICBjb21taXRNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGNoaWxkLCByb290KTtcbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG4gIH1cblxuICBzZXRDdXJyZW50RmliZXIocHJldkRlYnVnRmliZXIpO1xufVxuXG5mdW5jdGlvbiBjb21taXRNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkV29yaywgcm9vdCwgbGFuZXMpIHtcbiAgdmFyIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlO1xuICB2YXIgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7IC8vIFRoZSBlZmZlY3QgZmxhZyBzaG91bGQgYmUgY2hlY2tlZCAqYWZ0ZXIqIHdlIHJlZmluZSB0aGUgdHlwZSBvZiBmaWJlcixcbiAgLy8gYmVjYXVzZSB0aGUgZmliZXIgdGFnIGlzIG1vcmUgc3BlY2lmaWMuIEFuIGV4Y2VwdGlvbiBpcyBhbnkgZmxhZyByZWxhdGVkXG4gIC8vIHRvIHJlY29uY2lsYXRpb24sIGJlY2F1c2UgdGhvc2UgY2FuIGJlIHNldCBvbiBhbGwgZmliZXIgdHlwZXMuXG5cbiAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KEluc2VydGlvbiB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoSW5zZXJ0aW9uIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9IC8vIExheW91dCBlZmZlY3RzIGFyZSBkZXN0cm95ZWQgZHVyaW5nIHRoZSBtdXRhdGlvbiBwaGFzZSBzbyB0aGF0IGFsbFxuICAgICAgICAgIC8vIGRlc3Ryb3kgZnVuY3Rpb25zIGZvciBhbGwgZmliZXJzIGFyZSBjYWxsZWQgYmVmb3JlIGFueSBjcmVhdGUgZnVuY3Rpb25zLlxuICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgc2libGluZyBjb21wb25lbnQgZWZmZWN0cyBmcm9tIGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlcixcbiAgICAgICAgICAvLyBlLmcuIGEgZGVzdHJveSBmdW5jdGlvbiBpbiBvbmUgY29tcG9uZW50IHNob3VsZCBuZXZlciBvdmVycmlkZSBhIHJlZiBzZXRcbiAgICAgICAgICAvLyBieSBhIGNyZWF0ZSBmdW5jdGlvbiBpbiBhbm90aGVyIGNvbXBvbmVudCBkdXJpbmcgdGhlIHNhbWUgY29tbWl0LlxuXG5cbiAgICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBSZWYpIHtcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIGN1cnJlbnQucmV0dXJuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgUmVmKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBjdXJyZW50LnJldHVybik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIC8vIFRPRE86IENvbnRlbnRSZXNldCBnZXRzIGNsZWFyZWQgYnkgdGhlIGNoaWxkcmVuIGR1cmluZyB0aGUgY29tbWl0XG4gICAgICAgICAgLy8gcGhhc2UuIFRoaXMgaXMgYSByZWZhY3RvciBoYXphcmQgYmVjYXVzZSBpdCBtZWFucyB3ZSBtdXN0IHJlYWRcbiAgICAgICAgICAvLyBmbGFncyB0aGUgZmxhZ3MgYWZ0ZXIgYGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0c2AgaGFzIGFscmVhZHkgcnVuO1xuICAgICAgICAgIC8vIHRoZSBvcmRlciBtYXR0ZXJzLiBXZSBzaG91bGQgcmVmYWN0b3Igc28gdGhhdCBDb250ZW50UmVzZXQgZG9lcyBub3RcbiAgICAgICAgICAvLyByZWx5IG9uIG11dGF0aW5nIHRoZSBmbGFnIGR1cmluZyBjb21taXQuIExpa2UgYnkgc2V0dGluZyBhIGZsYWdcbiAgICAgICAgICAvLyBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSBpbnN0ZWFkLlxuICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBDb250ZW50UmVzZXQpIHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlc2V0VGV4dENvbnRlbnQoaW5zdGFuY2UpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgICB2YXIgX2luc3RhbmNlNCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIGlmIChfaW5zdGFuY2U0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gQ29tbWl0IHRoZSB3b3JrIHByZXBhcmVkIGVhcmxpZXIuXG4gICAgICAgICAgICAgIHZhciBuZXdQcm9wcyA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzOyAvLyBGb3IgaHlkcmF0aW9uIHdlIHJldXNlIHRoZSB1cGRhdGUgcGF0aCBidXQgd2UgdHJlYXQgdGhlIG9sZFByb3BzXG4gICAgICAgICAgICAgIC8vIGFzIHRoZSBuZXdQcm9wcy4gVGhlIHVwZGF0ZVBheWxvYWQgd2lsbCBjb250YWluIHRoZSByZWFsIGNoYW5nZSBpblxuICAgICAgICAgICAgICAvLyB0aGlzIGNhc2UuXG5cbiAgICAgICAgICAgICAgdmFyIG9sZFByb3BzID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyA6IG5ld1Byb3BzO1xuICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpbmlzaGVkV29yay50eXBlOyAvLyBUT0RPOiBUeXBlIHRoZSB1cGRhdGVRdWV1ZSB0byBiZSBzcGVjaWZpYyB0byBob3N0IGNvbXBvbmVudHMuXG5cbiAgICAgICAgICAgICAgdmFyIHVwZGF0ZVBheWxvYWQgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZVBheWxvYWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgY29tbWl0VXBkYXRlKF9pbnN0YW5jZTQsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgc2hvdWxkIGhhdmUgYSB0ZXh0IG5vZGUgaW5pdGlhbGl6ZWQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5ICcgKyAnY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHRleHRJbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgICB2YXIgbmV3VGV4dCA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzOyAvLyBGb3IgaHlkcmF0aW9uIHdlIHJldXNlIHRoZSB1cGRhdGUgcGF0aCBidXQgd2UgdHJlYXQgdGhlIG9sZFByb3BzXG4gICAgICAgICAgICAvLyBhcyB0aGUgbmV3UHJvcHMuIFRoZSB1cGRhdGVQYXlsb2FkIHdpbGwgY29udGFpbiB0aGUgcmVhbCBjaGFuZ2UgaW5cbiAgICAgICAgICAgIC8vIHRoaXMgY2FzZS5cblxuICAgICAgICAgICAgdmFyIG9sZFRleHQgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbmV3VGV4dDtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29tbWl0VGV4dFVwZGF0ZSh0ZXh0SW5zdGFuY2UsIG9sZFRleHQsIG5ld1RleHQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB2YXIgcHJldlJvb3RTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICAgICAgICBpZiAocHJldlJvb3RTdGF0ZS5pc0RlaHlkcmF0ZWQpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgY29tbWl0SHlkcmF0ZWRDb250YWluZXIocm9vdC5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgIHZhciBvZmZzY3JlZW5GaWJlciA9IGZpbmlzaGVkV29yay5jaGlsZDtcblxuICAgICAgICBpZiAob2Zmc2NyZWVuRmliZXIuZmxhZ3MgJiBWaXNpYmlsaXR5KSB7XG4gICAgICAgICAgdmFyIG9mZnNjcmVlbkluc3RhbmNlID0gb2Zmc2NyZWVuRmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgIHZhciBuZXdTdGF0ZSA9IG9mZnNjcmVlbkZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIGlzSGlkZGVuID0gbmV3U3RhdGUgIT09IG51bGw7IC8vIFRyYWNrIHRoZSBjdXJyZW50IHN0YXRlIG9uIHRoZSBPZmZzY3JlZW4gaW5zdGFuY2Ugc28gd2UgY2FuXG4gICAgICAgICAgLy8gcmVhZCBpdCBkdXJpbmcgYW4gZXZlbnRcblxuICAgICAgICAgIG9mZnNjcmVlbkluc3RhbmNlLmlzSGlkZGVuID0gaXNIaWRkZW47XG5cbiAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgIHZhciB3YXNIaWRkZW4gPSBvZmZzY3JlZW5GaWJlci5hbHRlcm5hdGUgIT09IG51bGwgJiYgb2Zmc2NyZWVuRmliZXIuYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICAgIGlmICghd2FzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIC8vIFRPRE86IE1vdmUgdG8gcGFzc2l2ZSBwaGFzZVxuICAgICAgICAgICAgICBtYXJrQ29tbWl0VGltZU9mRmFsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0U3VzcGVuc2VDYWxsYmFjayhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhdHRhY2hTdXNwZW5zZVJldHJ5TGlzdGVuZXJzKGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF93YXNIaWRkZW4gPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICBpZiAoIC8vIFRPRE86IFJlbW92ZSB0aGlzIGRlYWQgZmxhZ1xuICAgICAgICAgZmluaXNoZWRXb3JrLm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgICAgIC8vIEJlZm9yZSBjb21taXR0aW5nIHRoZSBjaGlsZHJlbiwgdHJhY2sgb24gdGhlIHN0YWNrIHdoZXRoZXIgdGhpc1xuICAgICAgICAgIC8vIG9mZnNjcmVlbiBzdWJ0cmVlIHdhcyBhbHJlYWR5IGhpZGRlbiwgc28gdGhhdCB3ZSBkb24ndCB1bm1vdW50IHRoZVxuICAgICAgICAgIC8vIGVmZmVjdHMgYWdhaW4uXG4gICAgICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gfHwgX3dhc0hpZGRlbjtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFZpc2liaWxpdHkpIHtcbiAgICAgICAgICB2YXIgX29mZnNjcmVlbkluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICB2YXIgX25ld1N0YXRlID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgICB2YXIgX2lzSGlkZGVuID0gX25ld1N0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgdmFyIG9mZnNjcmVlbkJvdW5kYXJ5ID0gZmluaXNoZWRXb3JrOyAvLyBUcmFjayB0aGUgY3VycmVudCBzdGF0ZSBvbiB0aGUgT2Zmc2NyZWVuIGluc3RhbmNlIHNvIHdlIGNhblxuICAgICAgICAgIC8vIHJlYWQgaXQgZHVyaW5nIGFuIGV2ZW50XG5cbiAgICAgICAgICBfb2Zmc2NyZWVuSW5zdGFuY2UuaXNIaWRkZW4gPSBfaXNIaWRkZW47XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoX2lzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIGlmICghX3dhc0hpZGRlbikge1xuICAgICAgICAgICAgICAgIGlmICgob2Zmc2NyZWVuQm91bmRhcnkubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICAgICAgICBuZXh0RWZmZWN0ID0gb2Zmc2NyZWVuQm91bmRhcnk7XG4gICAgICAgICAgICAgICAgICB2YXIgb2Zmc2NyZWVuQ2hpbGQgPSBvZmZzY3JlZW5Cb3VuZGFyeS5jaGlsZDtcblxuICAgICAgICAgICAgICAgICAgd2hpbGUgKG9mZnNjcmVlbkNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRFZmZlY3QgPSBvZmZzY3JlZW5DaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19iZWdpbihvZmZzY3JlZW5DaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNjcmVlbkNoaWxkID0gb2Zmc2NyZWVuQ2hpbGQuc2libGluZztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyBUT0RPOiBUaGlzIG5lZWRzIHRvIHJ1biB3aGVuZXZlciB0aGVyZSdzIGFuIGluc2VydGlvbiBvciB1cGRhdGVcbiAgICAgICAgICAgIC8vIGluc2lkZSBhIGhpZGRlbiBPZmZzY3JlZW4gdHJlZS5cbiAgICAgICAgICAgIGhpZGVPclVuaGlkZUFsbENoaWxkcmVuKG9mZnNjcmVlbkJvdW5kYXJ5LCBfaXNIaWRkZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspIHtcbiAgLy8gUGxhY2VtZW50IGVmZmVjdHMgKGluc2VydGlvbnMsIHJlb3JkZXJzKSBjYW4gYmUgc2NoZWR1bGVkIG9uIGFueSBmaWJlclxuICAvLyB0eXBlLiBUaGV5IG5lZWRzIHRvIGhhcHBlbiBhZnRlciB0aGUgY2hpbGRyZW4gZWZmZWN0cyBoYXZlIGZpcmVkLCBidXRcbiAgLy8gYmVmb3JlIHRoZSBlZmZlY3RzIG9uIHRoaXMgZmliZXIgaGF2ZSBmaXJlZC5cbiAgdmFyIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzO1xuXG4gIGlmIChmbGFncyAmIFBsYWNlbWVudCkge1xuICAgIHRyeSB7XG4gICAgICBjb21taXRQbGFjZW1lbnQoZmluaXNoZWRXb3JrKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgfSAvLyBDbGVhciB0aGUgXCJwbGFjZW1lbnRcIiBmcm9tIGVmZmVjdCB0YWcgc28gdGhhdCB3ZSBrbm93IHRoYXQgdGhpcyBpc1xuICAgIC8vIGluc2VydGVkLCBiZWZvcmUgYW55IGxpZmUtY3ljbGVzIGxpa2UgY29tcG9uZW50RGlkTW91bnQgZ2V0cyBjYWxsZWQuXG4gICAgLy8gVE9ETzogZmluZERPTU5vZGUgZG9lc24ndCByZWx5IG9uIHRoaXMgYW55IG1vcmUgYnV0IGlzTW91bnRlZCBkb2VzXG4gICAgLy8gYW5kIGlzTW91bnRlZCBpcyBkZXByZWNhdGVkIGFueXdheSBzbyB3ZSBzaG91bGQgYmUgYWJsZSB0byBraWxsIHRoaXMuXG5cblxuICAgIGZpbmlzaGVkV29yay5mbGFncyAmPSB+UGxhY2VtZW50O1xuICB9XG5cbiAgaWYgKGZsYWdzICYgSHlkcmF0aW5nKSB7XG4gICAgZmluaXNoZWRXb3JrLmZsYWdzICY9IH5IeWRyYXRpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0TGF5b3V0RWZmZWN0cyhmaW5pc2hlZFdvcmssIHJvb3QsIGNvbW1pdHRlZExhbmVzKSB7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IGNvbW1pdHRlZExhbmVzO1xuICBpblByb2dyZXNzUm9vdCA9IHJvb3Q7XG4gIG5leHRFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gIGNvbW1pdExheW91dEVmZmVjdHNfYmVnaW4oZmluaXNoZWRXb3JrLCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IG51bGw7XG4gIGluUHJvZ3Jlc3NSb290ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gY29tbWl0TGF5b3V0RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcbiAgLy8gU3VzcGVuc2UgbGF5b3V0IGVmZmVjdHMgc2VtYW50aWNzIGRvbid0IGNoYW5nZSBmb3IgbGVnYWN5IHJvb3RzLlxuICB2YXIgaXNNb2Rlcm5Sb290ID0gKHN1YnRyZWVSb290Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcblxuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmICggZmliZXIudGFnID09PSBPZmZzY3JlZW5Db21wb25lbnQgJiYgaXNNb2Rlcm5Sb290KSB7XG4gICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IE9mZnNjcmVlbiBzdGFjaydzIHN0YXRlLlxuICAgICAgdmFyIGlzSGlkZGVuID0gZmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgIHZhciBuZXdPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBpc0hpZGRlbiB8fCBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47XG5cbiAgICAgIGlmIChuZXdPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4pIHtcbiAgICAgICAgLy8gVGhlIE9mZnNjcmVlbiB0cmVlIGlzIGhpZGRlbi4gU2tpcCBvdmVyIGl0cyBsYXlvdXQgZWZmZWN0cy5cbiAgICAgICAgY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETyAoT2Zmc2NyZWVuKSBBbHNvIGNoZWNrOiBzdWJ0cmVlRmxhZ3MgJiBMYXlvdXRNYXNrXG4gICAgICAgIHZhciBjdXJyZW50ID0gZmliZXIuYWx0ZXJuYXRlO1xuICAgICAgICB2YXIgd2FzSGlkZGVuID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG4gICAgICAgIHZhciBuZXdPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gd2FzSGlkZGVuIHx8IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuOyAvLyBUcmF2ZXJzZSB0aGUgT2Zmc2NyZWVuIHN1YnRyZWUgd2l0aCB0aGUgY3VycmVudCBPZmZzY3JlZW4gYXMgdGhlIHJvb3QuXG5cbiAgICAgICAgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gbmV3T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gbmV3T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcblxuICAgICAgICBpZiAob2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiAmJiAhcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByb290IG9mIGEgcmVhcHBlYXJpbmcgYm91bmRhcnkuIFR1cm4gaXRzIGxheW91dCBlZmZlY3RzXG4gICAgICAgICAgLy8gYmFjayBvbi5cbiAgICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXI7XG4gICAgICAgICAgcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2JlZ2luKGZpYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjaGlsZCA9IGZpcnN0Q2hpbGQ7XG5cbiAgICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkO1xuICAgICAgICAgIGNvbW1pdExheW91dEVmZmVjdHNfYmVnaW4oY2hpbGQsIC8vIE5ldyByb290OyBidWJibGUgYmFjayB1cCB0byBoZXJlIGFuZCBzdG9wLlxuICAgICAgICAgIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICAgIH0gLy8gUmVzdG9yZSBPZmZzY3JlZW4gc3RhdGUgYW5kIHJlc3VtZSBpbiBvdXItcHJvZ3Jlc3MgdHJhdmVyc2FsLlxuXG5cbiAgICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyO1xuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgIGNvbW1pdExheW91dE1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGZpYmVyLnN1YnRyZWVGbGFncyAmIExheW91dE1hc2spICE9PSBOb0ZsYWdzICYmIGZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGZpcnN0Q2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dE1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuXG4gICAgaWYgKChmaWJlci5mbGFncyAmIExheW91dE1hc2spICE9PSBOb0ZsYWdzKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbW1pdExheW91dEVmZmVjdE9uRmliZXIocm9vdCwgY3VycmVudCwgZmliZXIsIGNvbW1pdHRlZExhbmVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIgPT09IHN1YnRyZWVSb290KSB7XG4gICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc2FwcGVhckxheW91dEVmZmVjdHNfYmVnaW4oc3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBmaXJzdENoaWxkID0gZmliZXIuY2hpbGQ7IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgKFJlZlN0YXRpYyB8IExheW91dFN0YXRpYylcblxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCBmaWJlci5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCwgZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaWJlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQsIGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBmbGFncyAmIFJlZlN0YXRpY1xuICAgICAgICAgIHNhZmVseURldGFjaFJlZihmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoZmliZXIsIGZpYmVyLnJldHVybiwgaW5zdGFuY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHNhZmVseURldGFjaFJlZihmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYVxuICAgICAgICAgIHZhciBpc0hpZGRlbiA9IGZpYmVyLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgIC8vIE5lc3RlZCBPZmZzY3JlZW4gdHJlZSBpcyBhbHJlYWR5IGhpZGRlbi4gRG9uJ3QgZGlzYXBwZWFyXG4gICAgICAgICAgICAvLyBpdHMgZWZmZWN0cy5cbiAgICAgICAgICAgIGRpc2FwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IHN1YnRyZWVGbGFncyAmIExheW91dFN0YXRpY1xuXG5cbiAgICBpZiAoZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG5cbiAgICBpZiAoZmliZXIgPT09IHN1YnRyZWVSb290KSB7XG4gICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmIChmaWJlci50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCkge1xuICAgICAgdmFyIGlzSGlkZGVuID0gZmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgIC8vIE5lc3RlZCBPZmZzY3JlZW4gdHJlZSBpcyBzdGlsbCBoaWRkZW4uIERvbid0IHJlLWFwcGVhciBpdHMgZWZmZWN0cy5cbiAgICAgICAgcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfSAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBzdWJ0cmVlRmxhZ3MgJiBMYXlvdXRTdGF0aWNcblxuXG4gICAgaWYgKGZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgbm9kZSBtYXkgaGF2ZSBiZWVuIHJldXNlZCBmcm9tIGEgcHJldmlvdXMgcmVuZGVyLCBzbyB3ZSBjYW4ndFxuICAgICAgLy8gYXNzdW1lIGl0cyByZXR1cm4gcG9pbnRlciBpcyBjb3JyZWN0LlxuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWFwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZWFwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0OyAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBmbGFncyAmIExheW91dFN0YXRpY1xuXG4gICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgIHRyeSB7XG4gICAgICByZWFwcGVhckxheW91dEVmZmVjdHNPbkZpYmVyKGZpYmVyKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG5cbiAgICBpZiAoZmliZXIgPT09IHN1YnRyZWVSb290KSB7XG4gICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBub2RlIG1heSBoYXZlIGJlZW4gcmV1c2VkIGZyb20gYSBwcmV2aW91cyByZW5kZXIsIHNvIHdlIGNhbid0XG4gICAgICAvLyBhc3N1bWUgaXRzIHJldHVybiBwb2ludGVyIGlzIGNvcnJlY3QuXG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucykge1xuICBuZXh0RWZmZWN0ID0gZmluaXNoZWRXb3JrO1xuICBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2JlZ2luKGZpbmlzaGVkV29yaywgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKTtcbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MgJiYgZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuXG4gICAgaWYgKChmaWJlci5mbGFncyAmIFBhc3NpdmUpICE9PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb21taXRQYXNzaXZlTW91bnRPbkZpYmVyKHJvb3QsIGZpYmVyLCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIH1cblxuICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHtcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50T25GaWJlcihmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7XG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgc3RhcnRQYXNzaXZlRWZmZWN0VGltZXIoKTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgcmVjb3JkUGFzc2l2ZUVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzKGZpcnN0Q2hpbGQpIHtcbiAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c19iZWdpbigpO1xufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfYmVnaW4oKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmICgobmV4dEVmZmVjdC5mbGFncyAmIENoaWxkRGVsZXRpb24pICE9PSBOb0ZsYWdzKSB7XG4gICAgICB2YXIgZGVsZXRpb25zID0gZmliZXIuZGVsZXRpb25zO1xuXG4gICAgICBpZiAoZGVsZXRpb25zICE9PSBudWxsKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsZXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGZpYmVyVG9EZWxldGUgPSBkZWxldGlvbnNbaV07XG4gICAgICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyVG9EZWxldGU7XG4gICAgICAgICAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9iZWdpbihmaWJlclRvRGVsZXRlLCBmaWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgLy8gQSBmaWJlciB3YXMgZGVsZXRlZCBmcm9tIHRoaXMgcGFyZW50IGZpYmVyLCBidXQgaXQncyBzdGlsbCBwYXJ0IG9mXG4gICAgICAgICAgLy8gdGhlIHByZXZpb3VzIChhbHRlcm5hdGUpIHBhcmVudCBmaWJlcidzIGxpc3Qgb2YgY2hpbGRyZW4uIEJlY2F1c2VcbiAgICAgICAgICAvLyBjaGlsZHJlbiBhcmUgYSBsaW5rZWQgbGlzdCwgYW4gZWFybGllciBzaWJsaW5nIHRoYXQncyBzdGlsbCBhbGl2ZVxuICAgICAgICAgIC8vIHdpbGwgYmUgY29ubmVjdGVkIHRvIHRoZSBkZWxldGVkIGZpYmVyIHZpYSBpdHMgYGFsdGVybmF0ZWA6XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyAgIGxpdmUgZmliZXJcbiAgICAgICAgICAvLyAgIC0tYWx0ZXJuYXRlLS0+IHByZXZpb3VzIGxpdmUgZmliZXJcbiAgICAgICAgICAvLyAgIC0tc2libGluZy0tPiBkZWxldGVkIGZpYmVyXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBXZSBjYW4ndCBkaXNjb25uZWN0IGBhbHRlcm5hdGVgIG9uIG5vZGVzIHRoYXQgaGF2ZW4ndCBiZWVuIGRlbGV0ZWRcbiAgICAgICAgICAvLyB5ZXQsIGJ1dCB3ZSBjYW4gZGlzY29ubmVjdCB0aGUgYHNpYmxpbmdgIGFuZCBgY2hpbGRgIHBvaW50ZXJzLlxuICAgICAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgICAgaWYgKHByZXZpb3VzRmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBkZXRhY2hlZENoaWxkID0gcHJldmlvdXNGaWJlci5jaGlsZDtcblxuICAgICAgICAgICAgaWYgKGRldGFjaGVkQ2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcHJldmlvdXNGaWJlci5jaGlsZCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHZhciBkZXRhY2hlZFNpYmxpbmcgPSBkZXRhY2hlZENoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICAgICAgZGV0YWNoZWRDaGlsZC5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgICBkZXRhY2hlZENoaWxkID0gZGV0YWNoZWRTaWJsaW5nO1xuICAgICAgICAgICAgICB9IHdoaWxlIChkZXRhY2hlZENoaWxkICE9PSBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MgJiYgY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGNoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfY29tcGxldGUoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzX2NvbXBsZXRlKCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG5cbiAgICBpZiAoKGZpYmVyLmZsYWdzICYgUGFzc2l2ZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgICBjb21taXRQYXNzaXZlVW5tb3VudE9uRmliZXIoZmliZXIpO1xuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50T25GaWJlcihmaW5pc2hlZFdvcmspIHtcbiAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpO1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgcmVjb3JkUGFzc2l2ZUVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfYmVnaW4oZGVsZXRlZFN1YnRyZWVSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDsgLy8gRGVsZXRpb24gZWZmZWN0cyBmaXJlIGluIHBhcmVudCAtPiBjaGlsZCBvcmRlclxuICAgIC8vIFRPRE86IENoZWNrIGlmIGZpYmVyIGhhcyBhIFBhc3NpdmVTdGF0aWMgZmxhZ1xuXG4gICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICBjb21taXRQYXNzaXZlVW5tb3VudEluc2lkZURlbGV0ZWRUcmVlT25GaWJlcihmaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDsgLy8gVE9ETzogT25seSB0cmF2ZXJzZSBzdWJ0cmVlIGlmIGl0IGhhcyBhIFBhc3NpdmVTdGF0aWMgZmxhZy4gKEJ1dCwgaWYgd2VcbiAgICAvLyBkbyB0aGlzLCBzdGlsbCBuZWVkIHRvIGhhbmRsZSBgZGVsZXRlZFRyZWVDbGVhblVwTGV2ZWxgIGNvcnJlY3RseS4pXG5cbiAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGNoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2NvbXBsZXRlKGRlbGV0ZWRTdWJ0cmVlUm9vdCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfY29tcGxldGUoZGVsZXRlZFN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG4gICAgdmFyIHJldHVybkZpYmVyID0gZmliZXIucmV0dXJuO1xuXG4gICAge1xuICAgICAgLy8gUmVjdXJzaXZlbHkgdHJhdmVyc2UgdGhlIGVudGlyZSBkZWxldGVkIHRyZWUgYW5kIGNsZWFuIHVwIGZpYmVyIGZpZWxkcy5cbiAgICAgIC8vIFRoaXMgaXMgbW9yZSBhZ2dyZXNzaXZlIHRoYW4gaWRlYWwsIGFuZCB0aGUgbG9uZyB0ZXJtIGdvYWwgaXMgdG8gb25seVxuICAgICAgLy8gaGF2ZSB0byBkZXRhY2ggdGhlIGRlbGV0ZWQgdHJlZSBhdCB0aGUgcm9vdC5cbiAgICAgIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGZpYmVyKTtcblxuICAgICAgaWYgKGZpYmVyID09PSBkZWxldGVkU3VidHJlZVJvb3QpIHtcbiAgICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSByZXR1cm5GaWJlcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEluc2lkZURlbGV0ZWRUcmVlT25GaWJlcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHN3aXRjaCAoY3VycmVudC50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggY3VycmVudC5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpO1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEsIGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgICAgICAgIHJlY29yZFBhc3NpdmVFZmZlY3REdXJhdGlvbihjdXJyZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxLCBjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59IC8vIFRPRE86IFJldXNlIHJlYXBwZWFyTGF5b3V0RWZmZWN0cyB0cmF2ZXJzYWwgaGVyZT9cblxuXG5mdW5jdGlvbiBpbnZva2VMYXlvdXRFZmZlY3RNb3VudEluREVWKGZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmliZXIpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlUGFzc2l2ZUVmZmVjdE1vdW50SW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaWJlcik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VMYXlvdXRFZmZlY3RVbm1vdW50SW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChmaWJlciwgZmliZXIucmV0dXJuLCBpbnN0YW5jZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlUGFzc2l2ZUVmZmVjdFVubW91bnRJbkRFVihmaWJlcikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIENPTVBPTkVOVF9UWVBFID0gMDtcbnZhciBIQVNfUFNFVURPX0NMQVNTX1RZUEUgPSAxO1xudmFyIFJPTEVfVFlQRSA9IDI7XG52YXIgVEVTVF9OQU1FX1RZUEUgPSAzO1xudmFyIFRFWFRfVFlQRSA9IDQ7XG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3IpIHtcbiAgdmFyIHN5bWJvbEZvciA9IFN5bWJvbC5mb3I7XG4gIENPTVBPTkVOVF9UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci5jb21wb25lbnQnKTtcbiAgSEFTX1BTRVVET19DTEFTU19UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci5oYXNfcHNldWRvX2NsYXNzJyk7XG4gIFJPTEVfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3Iucm9sZScpO1xuICBURVNUX05BTUVfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3IudGVzdF9pZCcpO1xuICBURVhUX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLnRleHQnKTtcbn1cbnZhciBjb21taXRIb29rcyA9IFtdO1xuZnVuY3Rpb24gb25Db21taXRSb290JDEoKSB7XG4gIHtcbiAgICBjb21taXRIb29rcy5mb3JFYWNoKGZ1bmN0aW9uIChjb21taXRIb29rKSB7XG4gICAgICByZXR1cm4gY29tbWl0SG9vaygpO1xuICAgIH0pO1xuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRBY3RRdWV1ZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEFjdFF1ZXVlO1xuZnVuY3Rpb24gaXNMZWdhY3lBY3RFbnZpcm9ubWVudChmaWJlcikge1xuICB7XG4gICAgLy8gTGVnYWN5IG1vZGUuIFdlIHByZXNlcnZlIHRoZSBiZWhhdmlvciBvZiBSZWFjdCAxNydzIGFjdC4gSXQgYXNzdW1lcyBhblxuICAgIC8vIGFjdCBlbnZpcm9ubWVudCB3aGVuZXZlciBgamVzdGAgaXMgZGVmaW5lZCwgYnV0IHlvdSBjYW4gc3RpbGwgdHVybiBvZmZcbiAgICAvLyBzcHVyaW91cyB3YXJuaW5ncyBieSBzZXR0aW5nIElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCBleHBsaWNpdGx5XG4gICAgLy8gdG8gZmFsc2UuXG4gICAgdmFyIGlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbCA9IC8vICRGbG93RXhwZWN0ZWRFcnJvciDigJMgRmxvdyBkb2Vzbid0IGtub3cgYWJvdXQgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIGdsb2JhbFxuICAgIHR5cGVvZiBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgIT09ICd1bmRlZmluZWQnID8gSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIDogdW5kZWZpbmVkOyAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgLSBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCBqZXN0XG5cbiAgICB2YXIgamVzdElzRGVmaW5lZCA9IHR5cGVvZiBqZXN0ICE9PSAndW5kZWZpbmVkJztcbiAgICByZXR1cm4gIGplc3RJc0RlZmluZWQgJiYgaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsICE9PSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50QWN0RW52aXJvbm1lbnQoKSB7XG4gIHtcbiAgICB2YXIgaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsID0gLy8gJEZsb3dFeHBlY3RlZEVycm9yIOKAkyBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgZ2xvYmFsXG4gICAgdHlwZW9mIElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCAhPT0gJ3VuZGVmaW5lZCcgPyBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbCAmJiBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUT0RPOiBJbmNsdWRlIGxpbmsgdG8gcmVsZXZhbnQgZG9jdW1lbnRhdGlvbiBwYWdlLlxuICAgICAgZXJyb3IoJ1RoZSBjdXJyZW50IHRlc3RpbmcgZW52aXJvbm1lbnQgaXMgbm90IGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCAnICsgJ2FjdCguLi4pJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbDtcbiAgfVxufVxuXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICAgIFJlYWN0Q3VycmVudE93bmVyJDIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcixcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsXG4gICAgUmVhY3RDdXJyZW50QWN0UXVldWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEFjdFF1ZXVlO1xudmFyIE5vQ29udGV4dCA9XG4vKiAgICAgICAgICAgICAqL1xuMDtcbnZhciBCYXRjaGVkQ29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICovXG4xO1xudmFyIFJlbmRlckNvbnRleHQgPVxuLyogICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgQ29tbWl0Q29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICAqL1xuNDtcbnZhciBSb290SW5Qcm9ncmVzcyA9IDA7XG52YXIgUm9vdEZhdGFsRXJyb3JlZCA9IDE7XG52YXIgUm9vdEVycm9yZWQgPSAyO1xudmFyIFJvb3RTdXNwZW5kZWQgPSAzO1xudmFyIFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkgPSA0O1xudmFyIFJvb3RDb21wbGV0ZWQgPSA1O1xudmFyIFJvb3REaWROb3RDb21wbGV0ZSA9IDY7IC8vIERlc2NyaWJlcyB3aGVyZSB3ZSBhcmUgaW4gdGhlIFJlYWN0IGV4ZWN1dGlvbiBzdGFja1xuXG52YXIgZXhlY3V0aW9uQ29udGV4dCA9IE5vQ29udGV4dDsgLy8gVGhlIHJvb3Qgd2UncmUgd29ya2luZyBvblxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDsgLy8gVGhlIGZpYmVyIHdlJ3JlIHdvcmtpbmcgb25cblxudmFyIHdvcmtJblByb2dyZXNzID0gbnVsbDsgLy8gVGhlIGxhbmVzIHdlJ3JlIHJlbmRlcmluZ1xuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzOyAvLyBTdGFjayB0aGF0IGFsbG93cyBjb21wb25lbnRzIHRvIGNoYW5nZSB0aGUgcmVuZGVyIGxhbmVzIGZvciBpdHMgc3VidHJlZVxuLy8gVGhpcyBpcyBhIHN1cGVyc2V0IG9mIHRoZSBsYW5lcyB3ZSBzdGFydGVkIHdvcmtpbmcgb24gYXQgdGhlIHJvb3QuIFRoZSBvbmx5XG4vLyBjYXNlIHdoZXJlIGl0J3MgZGlmZmVyZW50IGZyb20gYHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzYCBpcyB3aGVuIHdlXG4vLyBlbnRlciBhIHN1YnRyZWUgdGhhdCBpcyBoaWRkZW4gYW5kIG5lZWRzIHRvIGJlIHVuaGlkZGVuOiBTdXNwZW5zZSBhbmRcbi8vIE9mZnNjcmVlbiBjb21wb25lbnQuXG4vL1xuLy8gTW9zdCB0aGluZ3MgaW4gdGhlIHdvcmsgbG9vcCBzaG91bGQgZGVhbCB3aXRoIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzLlxuLy8gTW9zdCB0aGluZ3MgaW4gYmVnaW4vY29tcGxldGUgcGhhc2VzIHNob3VsZCBkZWFsIHdpdGggc3VidHJlZVJlbmRlckxhbmVzLlxuXG52YXIgc3VidHJlZVJlbmRlckxhbmVzID0gTm9MYW5lcztcbnZhciBzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IgPSBjcmVhdGVDdXJzb3IoTm9MYW5lcyk7IC8vIFdoZXRoZXIgdG8gcm9vdCBjb21wbGV0ZWQsIGVycm9yZWQsIHN1c3BlbmRlZCwgZXRjLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RJblByb2dyZXNzOyAvLyBBIGZhdGFsIGVycm9yLCBpZiBvbmUgaXMgdGhyb3duXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yID0gbnVsbDsgLy8gXCJJbmNsdWRlZFwiIGxhbmVzIHJlZmVyIHRvIGxhbmVzIHRoYXQgd2VyZSB3b3JrZWQgb24gZHVyaW5nIHRoaXMgcmVuZGVyLiBJdCdzXG4vLyBzbGlnaHRseSBkaWZmZXJlbnQgdGhhbiBgcmVuZGVyTGFuZXNgIGJlY2F1c2UgYHJlbmRlckxhbmVzYCBjYW4gY2hhbmdlIGFzIHlvdVxuLy8gZW50ZXIgYW5kIGV4aXQgYW4gT2Zmc2NyZWVuIHRyZWUuIFRoaXMgdmFsdWUgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGFsbCByZW5kZXJcbi8vIGxhbmVzIGZvciB0aGUgZW50aXJlIHJlbmRlciBwaGFzZS5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMgPSBOb0xhbmVzOyAvLyBUaGUgd29yayBsZWZ0IG92ZXIgYnkgY29tcG9uZW50cyB0aGF0IHdlcmUgdmlzaXRlZCBkdXJpbmcgdGhpcyByZW5kZXIuIE9ubHlcbi8vIGluY2x1ZGVzIHVucHJvY2Vzc2VkIHVwZGF0ZXMsIG5vdCB3b3JrIGluIGJhaWxlZCBvdXQgY2hpbGRyZW4uXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgPSBOb0xhbmVzOyAvLyBMYW5lcyB0aGF0IHdlcmUgdXBkYXRlZCAoaW4gYW4gaW50ZXJsZWF2ZWQgZXZlbnQpIGR1cmluZyB0aGlzIHJlbmRlci5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID0gTm9MYW5lczsgLy8gTGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UgKCpub3QqIGFuIGludGVybGVhdmVkIGV2ZW50KS5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzID0gTm9MYW5lczsgLy8gRXJyb3JzIHRoYXQgYXJlIHRocm93biBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMgPSBudWxsOyAvLyBUaGVzZSBhcmUgZXJyb3JzIHRoYXQgd2UgcmVjb3ZlcmVkIGZyb20gd2l0aG91dCBzdXJmYWNpbmcgdGhlbSB0byB0aGUgVUkuXG4vLyBXZSB3aWxsIGxvZyB0aGVtIG9uY2UgdGhlIHRyZWUgY29tbWl0cy5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gbnVsbDsgLy8gVGhlIG1vc3QgcmVjZW50IHRpbWUgd2UgY29tbWl0dGVkIGEgZmFsbGJhY2suIFRoaXMgbGV0cyB1cyBlbnN1cmUgYSB0cmFpblxuLy8gbW9kZWwgd2hlcmUgd2UgZG9uJ3QgY29tbWl0IG5ldyBsb2FkaW5nIHN0YXRlcyBpbiB0b28gcXVpY2sgc3VjY2Vzc2lvbi5cblxudmFyIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPSAwO1xudmFyIEZBTExCQUNLX1RIUk9UVExFX01TID0gNTAwOyAvLyBUaGUgYWJzb2x1dGUgdGltZSBmb3Igd2hlbiB3ZSBzaG91bGQgc3RhcnQgZ2l2aW5nIHVwIG9uIHJlbmRlcmluZ1xuLy8gbW9yZSBhbmQgcHJlZmVyIENQVSBzdXNwZW5zZSBoZXVyaXN0aWNzIGluc3RlYWQuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lID0gSW5maW5pdHk7IC8vIEhvdyBsb25nIGEgcmVuZGVyIGlzIHN1cHBvc2VkIHRvIHRha2UgYmVmb3JlIHdlIHN0YXJ0IGZvbGxvd2luZyBDUFVcbi8vIHN1c3BlbnNlIGhldXJpc3RpY3MgYW5kIG9wdCBvdXQgb2YgcmVuZGVyaW5nIG1vcmUgY29udGVudC5cblxudmFyIFJFTkRFUl9USU1FT1VUX01TID0gNTAwO1xudmFyIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMgPSBudWxsO1xuXG5mdW5jdGlvbiByZXNldFJlbmRlclRpbWVyKCkge1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lID0gbm93KCkgKyBSRU5ERVJfVElNRU9VVF9NUztcbn1cblxuZnVuY3Rpb24gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpIHtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWU7XG59XG52YXIgaGFzVW5jYXVnaHRFcnJvciA9IGZhbHNlO1xudmFyIGZpcnN0VW5jYXVnaHRFcnJvciA9IG51bGw7XG52YXIgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsOyAvLyBPbmx5IHVzZWQgd2hlbiBlbmFibGVQcm9maWxlck5lc3RlZFVwZGF0ZVNjaGVkdWxlZEhvb2sgaXMgdHJ1ZTtcbnZhciByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xudmFyIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gbnVsbDtcbnZhciBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IE5vTGFuZXM7XG52YXIgcGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdHMgPSBbXTtcbnZhciBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gbnVsbDsgLy8gVXNlIHRoZXNlIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcCBvZiBuZXN0ZWQgdXBkYXRlc1xuXG52YXIgTkVTVEVEX1VQREFURV9MSU1JVCA9IDUwO1xudmFyIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDtcbnZhciByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSBudWxsO1xudmFyIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xudmFyIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbnZhciBORVNURURfUEFTU0lWRV9VUERBVEVfTElNSVQgPSA1MDtcbnZhciBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xudmFyIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsOyAvLyBJZiB0d28gdXBkYXRlcyBhcmUgc2NoZWR1bGVkIHdpdGhpbiB0aGUgc2FtZSBldmVudCwgd2Ugc2hvdWxkIHRyZWF0IHRoZWlyXG4vLyBldmVudCB0aW1lcyBhcyBzaW11bHRhbmVvdXMsIGV2ZW4gaWYgdGhlIGFjdHVhbCBjbG9jayB0aW1lIGhhcyBhZHZhbmNlZFxuLy8gYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHNlY29uZCBjYWxsLlxuXG52YXIgY3VycmVudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xudmFyIGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lID0gTm9MYW5lcztcbnZhciBpc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QgPSBmYWxzZTtcbmZ1bmN0aW9uIGdldFdvcmtJblByb2dyZXNzUm9vdCgpIHtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdDtcbn1cbmZ1bmN0aW9uIHJlcXVlc3RFdmVudFRpbWUoKSB7XG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICAvLyBXZSdyZSBpbnNpZGUgUmVhY3QsIHNvIGl0J3MgZmluZSB0byByZWFkIHRoZSBhY3R1YWwgdGltZS5cbiAgICByZXR1cm4gbm93KCk7XG4gIH0gLy8gV2UncmUgbm90IGluc2lkZSBSZWFjdCwgc28gd2UgbWF5IGJlIGluIHRoZSBtaWRkbGUgb2YgYSBicm93c2VyIGV2ZW50LlxuXG5cbiAgaWYgKGN1cnJlbnRFdmVudFRpbWUgIT09IE5vVGltZXN0YW1wKSB7XG4gICAgLy8gVXNlIHRoZSBzYW1lIHN0YXJ0IHRpbWUgZm9yIGFsbCB1cGRhdGVzIHVudGlsIHdlIGVudGVyIFJlYWN0IGFnYWluLlxuICAgIHJldHVybiBjdXJyZW50RXZlbnRUaW1lO1xuICB9IC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZSBzaW5jZSBSZWFjdCB5aWVsZGVkLiBDb21wdXRlIGEgbmV3IHN0YXJ0IHRpbWUuXG5cblxuICBjdXJyZW50RXZlbnRUaW1lID0gbm93KCk7XG4gIHJldHVybiBjdXJyZW50RXZlbnRUaW1lO1xufVxuZnVuY3Rpb24gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpIHtcbiAgLy8gU3BlY2lhbCBjYXNlc1xuICB2YXIgbW9kZSA9IGZpYmVyLm1vZGU7XG5cbiAgaWYgKChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICByZXR1cm4gU3luY0xhbmU7XG4gIH0gZWxzZSBpZiAoIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCAmJiB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIC8vIFRoaXMgaXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlLiBUaGVzZSBhcmUgbm90IG9mZmljaWFsbHkgc3VwcG9ydGVkLiBUaGVcbiAgICAvLyBvbGQgYmVoYXZpb3IgaXMgdG8gZ2l2ZSB0aGlzIHRoZSBzYW1lIFwidGhyZWFkXCIgKGxhbmVzKSBhc1xuICAgIC8vIHdoYXRldmVyIGlzIGN1cnJlbnRseSByZW5kZXJpbmcuIFNvIGlmIHlvdSBjYWxsIGBzZXRTdGF0ZWAgb24gYSBjb21wb25lbnRcbiAgICAvLyB0aGF0IGhhcHBlbnMgbGF0ZXIgaW4gdGhlIHNhbWUgcmVuZGVyLCBpdCB3aWxsIGZsdXNoLiBJZGVhbGx5LCB3ZSB3YW50IHRvXG4gICAgLy8gcmVtb3ZlIHRoZSBzcGVjaWFsIGNhc2UgYW5kIHRyZWF0IHRoZW0gYXMgaWYgdGhleSBjYW1lIGZyb20gYW5cbiAgICAvLyBpbnRlcmxlYXZlZCBldmVudC4gUmVnYXJkbGVzcywgdGhpcyBwYXR0ZXJuIGlzIG5vdCBvZmZpY2lhbGx5IHN1cHBvcnRlZC5cbiAgICAvLyBUaGlzIGJlaGF2aW9yIGlzIG9ubHkgYSBmYWxsYmFjay4gVGhlIGZsYWcgb25seSBleGlzdHMgdW50aWwgd2UgY2FuIHJvbGxcbiAgICAvLyBvdXQgdGhlIHNldFN0YXRlIHdhcm5pbmcsIHNpbmNlIGV4aXN0aW5nIGNvZGUgbWlnaHQgYWNjaWRlbnRhbGx5IHJlbHkgb25cbiAgICAvLyB0aGUgY3VycmVudCBiZWhhdmlvci5cbiAgICByZXR1cm4gcGlja0FyYml0cmFyeUxhbmUod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgdmFyIGlzVHJhbnNpdGlvbiA9IHJlcXVlc3RDdXJyZW50VHJhbnNpdGlvbigpICE9PSBOb1RyYW5zaXRpb247XG5cbiAgaWYgKGlzVHJhbnNpdGlvbikge1xuICAgIGlmICggUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uICE9PSBudWxsKSB7XG4gICAgICB2YXIgdHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcblxuICAgICAgaWYgKCF0cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzKSB7XG4gICAgICAgIHRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMgPSBuZXcgU2V0KCk7XG4gICAgICB9XG5cbiAgICAgIHRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuYWRkKGZpYmVyKTtcbiAgICB9IC8vIFRoZSBhbGdvcml0aG0gZm9yIGFzc2lnbmluZyBhbiB1cGRhdGUgdG8gYSBsYW5lIHNob3VsZCBiZSBzdGFibGUgZm9yIGFsbFxuICAgIC8vIHVwZGF0ZXMgYXQgdGhlIHNhbWUgcHJpb3JpdHkgd2l0aGluIHRoZSBzYW1lIGV2ZW50LiBUbyBkbyB0aGlzLCB0aGVcbiAgICAvLyBpbnB1dHMgdG8gdGhlIGFsZ29yaXRobSBtdXN0IGJlIHRoZSBzYW1lLlxuICAgIC8vXG4gICAgLy8gVGhlIHRyaWNrIHdlIHVzZSBpcyB0byBjYWNoZSB0aGUgZmlyc3Qgb2YgZWFjaCBvZiB0aGVzZSBpbnB1dHMgd2l0aGluIGFuXG4gICAgLy8gZXZlbnQuIFRoZW4gcmVzZXQgdGhlIGNhY2hlZCB2YWx1ZXMgb25jZSB3ZSBjYW4gYmUgc3VyZSB0aGUgZXZlbnQgaXNcbiAgICAvLyBvdmVyLiBPdXIgaGV1cmlzdGljIGZvciB0aGF0IGlzIHdoZW5ldmVyIHdlIGVudGVyIGEgY29uY3VycmVudCB3b3JrIGxvb3AuXG5cblxuICAgIGlmIChjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgICAvLyBBbGwgdHJhbnNpdGlvbnMgd2l0aGluIHRoZSBzYW1lIGV2ZW50IGFyZSBhc3NpZ25lZCB0aGUgc2FtZSBsYW5lLlxuICAgICAgY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPSBjbGFpbU5leHRUcmFuc2l0aW9uTGFuZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZTtcbiAgfSAvLyBVcGRhdGVzIG9yaWdpbmF0aW5nIGluc2lkZSBjZXJ0YWluIFJlYWN0IG1ldGhvZHMsIGxpa2UgZmx1c2hTeW5jLCBoYXZlXG4gIC8vIHRoZWlyIHByaW9yaXR5IHNldCBieSB0cmFja2luZyBpdCB3aXRoIGEgY29udGV4dCB2YXJpYWJsZS5cbiAgLy9cbiAgLy8gVGhlIG9wYXF1ZSB0eXBlIHJldHVybmVkIGJ5IHRoZSBob3N0IGNvbmZpZyBpcyBpbnRlcm5hbGx5IGEgbGFuZSwgc28gd2UgY2FuXG4gIC8vIHVzZSB0aGF0IGRpcmVjdGx5LlxuICAvLyBUT0RPOiBNb3ZlIHRoaXMgdHlwZSBjb252ZXJzaW9uIHRvIHRoZSBldmVudCBwcmlvcml0eSBtb2R1bGUuXG5cblxuICB2YXIgdXBkYXRlTGFuZSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuXG4gIGlmICh1cGRhdGVMYW5lICE9PSBOb0xhbmUpIHtcbiAgICByZXR1cm4gdXBkYXRlTGFuZTtcbiAgfSAvLyBUaGlzIHVwZGF0ZSBvcmlnaW5hdGVkIG91dHNpZGUgUmVhY3QuIEFzayB0aGUgaG9zdCBlbnZpcm9ubWVudCBmb3IgYW5cbiAgLy8gYXBwcm9wcmlhdGUgcHJpb3JpdHksIGJhc2VkIG9uIHRoZSB0eXBlIG9mIGV2ZW50LlxuICAvL1xuICAvLyBUaGUgb3BhcXVlIHR5cGUgcmV0dXJuZWQgYnkgdGhlIGhvc3QgY29uZmlnIGlzIGludGVybmFsbHkgYSBsYW5lLCBzbyB3ZSBjYW5cbiAgLy8gdXNlIHRoYXQgZGlyZWN0bHkuXG4gIC8vIFRPRE86IE1vdmUgdGhpcyB0eXBlIGNvbnZlcnNpb24gdG8gdGhlIGV2ZW50IHByaW9yaXR5IG1vZHVsZS5cblxuXG4gIHZhciBldmVudExhbmUgPSBnZXRDdXJyZW50RXZlbnRQcmlvcml0eSgpO1xuICByZXR1cm4gZXZlbnRMYW5lO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0UmV0cnlMYW5lKGZpYmVyKSB7XG4gIC8vIFRoaXMgaXMgYSBmb3JrIG9mIGByZXF1ZXN0VXBkYXRlTGFuZWAgZGVzaWduZWQgc3BlY2lmaWNhbGx5IGZvciBTdXNwZW5zZVxuICAvLyBcInJldHJpZXNcIiDigJQgYSBzcGVjaWFsIHVwZGF0ZSB0aGF0IGF0dGVtcHRzIHRvIGZsaXAgYSBTdXNwZW5zZSBib3VuZGFyeVxuICAvLyBmcm9tIGl0cyBwbGFjZWhvbGRlciBzdGF0ZSB0byBpdHMgcHJpbWFyeS9yZXNvbHZlZCBzdGF0ZS5cbiAgLy8gU3BlY2lhbCBjYXNlc1xuICB2YXIgbW9kZSA9IGZpYmVyLm1vZGU7XG5cbiAgaWYgKChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICByZXR1cm4gU3luY0xhbmU7XG4gIH1cblxuICByZXR1cm4gY2xhaW1OZXh0UmV0cnlMYW5lKCk7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKSB7XG4gIGNoZWNrRm9yTmVzdGVkVXBkYXRlcygpO1xuXG4gIHtcbiAgICBpZiAoaXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KSB7XG4gICAgICBlcnJvcigndXNlSW5zZXJ0aW9uRWZmZWN0IG11c3Qgbm90IHNjaGVkdWxlIHVwZGF0ZXMuJyk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChpc0ZsdXNoaW5nUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgIH1cbiAgfSAvLyBNYXJrIHRoYXQgdGhlIHJvb3QgaGFzIGEgcGVuZGluZyB1cGRhdGUuXG5cblxuICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgbGFuZSwgZXZlbnRUaW1lKTtcblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9MYW5lcyAmJiByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAvLyBUaGlzIHVwZGF0ZSB3YXMgZGlzcGF0Y2hlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS4gVGhpcyBpcyBhIG1pc3Rha2VcbiAgICAvLyBpZiB0aGUgdXBkYXRlIG9yaWdpbmF0ZXMgZnJvbSB1c2VyIHNwYWNlICh3aXRoIHRoZSBleGNlcHRpb24gb2YgbG9jYWxcbiAgICAvLyBob29rIHVwZGF0ZXMsIHdoaWNoIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5IGFuZCBkb24ndCByZWFjaCB0aGlzXG4gICAgLy8gZnVuY3Rpb24pLCBidXQgdGhlcmUgYXJlIHNvbWUgaW50ZXJuYWwgUmVhY3QgZmVhdHVyZXMgdGhhdCB1c2UgdGhpcyBhc1xuICAgIC8vIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgbGlrZSBzZWxlY3RpdmUgaHlkcmF0aW9uLlxuICAgIHdhcm5BYm91dFJlbmRlclBoYXNlVXBkYXRlc0luREVWKGZpYmVyKTsgLy8gVHJhY2sgbGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2VcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGEgbm9ybWFsIHVwZGF0ZSwgc2NoZWR1bGVkIGZyb20gb3V0c2lkZSB0aGUgcmVuZGVyIHBoYXNlLiBGb3JcbiAgICAvLyBleGFtcGxlLCBkdXJpbmcgYW4gaW5wdXQgZXZlbnQuXG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBmaWJlciwgbGFuZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2FybklmVXBkYXRlc05vdFdyYXBwZWRXaXRoQWN0REVWKGZpYmVyKTtcblxuICAgIGlmIChyb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAgIC8vIFJlY2VpdmVkIGFuIHVwZGF0ZSB0byBhIHRyZWUgdGhhdCdzIGluIHRoZSBtaWRkbGUgb2YgcmVuZGVyaW5nLiBNYXJrXG4gICAgICAvLyB0aGF0IHRoZXJlIHdhcyBhbiBpbnRlcmxlYXZlZCB1cGRhdGUgd29yayBvbiB0aGlzIHJvb3QuIFVubGVzcyB0aGVcbiAgICAgIC8vIGBkZWZlclJlbmRlclBoYXNlVXBkYXRlVG9OZXh0QmF0Y2hgIGZsYWcgaXMgb2ZmIGFuZCB0aGlzIGlzIGEgcmVuZGVyXG4gICAgICAvLyBwaGFzZSB1cGRhdGUuIEluIHRoYXQgY2FzZSwgd2UgZG9uJ3QgdHJlYXQgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgYXMgaWZcbiAgICAgIC8vIHRoZXkgd2VyZSBpbnRlcmxlYXZlZCwgZm9yIGJhY2t3YXJkcyBjb21wYXQgcmVhc29ucy5cbiAgICAgIGlmICggKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcywgbGFuZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkV2l0aERlbGF5KSB7XG4gICAgICAgIC8vIFRoZSByb290IGFscmVhZHkgc3VzcGVuZGVkIHdpdGggYSBkZWxheSwgd2hpY2ggbWVhbnMgdGhpcyByZW5kZXJcbiAgICAgICAgLy8gZGVmaW5pdGVseSB3b24ndCBmaW5pc2guIFNpbmNlIHdlIGhhdmUgYSBuZXcgdXBkYXRlLCBsZXQncyBtYXJrIGl0IGFzXG4gICAgICAgIC8vIHN1c3BlbmRlZCBub3csIHJpZ2h0IGJlZm9yZSBtYXJraW5nIHRoZSBpbmNvbWluZyB1cGRhdGUuIFRoaXMgaGFzIHRoZVxuICAgICAgICAvLyBlZmZlY3Qgb2YgaW50ZXJydXB0aW5nIHRoZSBjdXJyZW50IHJlbmRlciBhbmQgc3dpdGNoaW5nIHRvIHRoZSB1cGRhdGUuXG4gICAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3Qgb3ZlcnJpZGUgcGluZ3MgdGhhdCBoYXBwZW4gd2hpbGUgd2UndmVcbiAgICAgICAgLy8gYWxyZWFkeSBzdGFydGVkIHJlbmRlcmluZy5cbiAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG5cbiAgICBpZiAobGFuZSA9PT0gU3luY0xhbmUgJiYgZXhlY3V0aW9uQ29udGV4dCA9PT0gTm9Db250ZXh0ICYmIChmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUgJiYgLy8gVHJlYXQgYGFjdGAgYXMgaWYgaXQncyBpbnNpZGUgYGJhdGNoZWRVcGRhdGVzYCwgZXZlbiBpbiBsZWdhY3kgbW9kZS5cbiAgICAhKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmlzQmF0Y2hpbmdMZWdhY3kpKSB7XG4gICAgICAvLyBGbHVzaCB0aGUgc3luY2hyb25vdXMgd29yayBub3csIHVubGVzcyB3ZSdyZSBhbHJlYWR5IHdvcmtpbmcgb3IgaW5zaWRlXG4gICAgICAvLyBhIGJhdGNoLiBUaGlzIGlzIGludGVudGlvbmFsbHkgaW5zaWRlIHNjaGVkdWxlVXBkYXRlT25GaWJlciBpbnN0ZWFkIG9mXG4gICAgICAvLyBzY2hlZHVsZUNhbGxiYWNrRm9yRmliZXIgdG8gcHJlc2VydmUgdGhlIGFiaWxpdHkgdG8gc2NoZWR1bGUgYSBjYWxsYmFja1xuICAgICAgLy8gd2l0aG91dCBpbW1lZGlhdGVseSBmbHVzaGluZyBpdC4gV2Ugb25seSBkbyB0aGlzIGZvciB1c2VyLWluaXRpYXRlZFxuICAgICAgLy8gdXBkYXRlcywgdG8gcHJlc2VydmUgaGlzdG9yaWNhbCBiZWhhdmlvciBvZiBsZWdhY3kgbW9kZS5cbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrc09ubHlJbkxlZ2FjeU1vZGUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNjaGVkdWxlSW5pdGlhbEh5ZHJhdGlvbk9uUm9vdChyb290LCBsYW5lLCBldmVudFRpbWUpIHtcbiAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgZm9yayBvZiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIgdGhhdCBpcyBvbmx5IHVzZWQgdG9cbiAgLy8gc2NoZWR1bGUgdGhlIGluaXRpYWwgaHlkcmF0aW9uIG9mIGEgcm9vdCB0aGF0IGhhcyBqdXN0IGJlZW4gY3JlYXRlZC4gTW9zdFxuICAvLyBvZiB0aGUgc3R1ZmYgaW4gc2NoZWR1bGVVcGRhdGVPbkZpYmVyIGNhbiBiZSBza2lwcGVkLlxuICAvL1xuICAvLyBUaGUgbWFpbiByZWFzb24gZm9yIHRoaXMgc2VwYXJhdGUgcGF0aCwgdGhvdWdoLCBpcyB0byBkaXN0aW5ndWlzaCB0aGVcbiAgLy8gaW5pdGlhbCBjaGlsZHJlbiBmcm9tIHN1YnNlcXVlbnQgdXBkYXRlcy4gSW4gZnVsbHkgY2xpZW50LXJlbmRlcmVkIHJvb3RzXG4gIC8vIChjcmVhdGVSb290IGluc3RlYWQgb2YgaHlkcmF0ZVJvb3QpLCBhbGwgdG9wLWxldmVsIHJlbmRlcnMgYXJlIG1vZGVsZWQgYXNcbiAgLy8gdXBkYXRlcywgYnV0IGh5ZHJhdGlvbiByb290cyBhcmUgc3BlY2lhbCBiZWNhdXNlIHRoZSBpbml0aWFsIHJlbmRlciBtdXN0XG4gIC8vIG1hdGNoIHdoYXQgd2FzIHJlbmRlcmVkIG9uIHRoZSBzZXJ2ZXIuXG4gIHZhciBjdXJyZW50ID0gcm9vdC5jdXJyZW50O1xuICBjdXJyZW50LmxhbmVzID0gbGFuZTtcbiAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIGxhbmUsIGV2ZW50VGltZSk7XG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xufVxuZnVuY3Rpb24gaXNVbnNhZmVDbGFzc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSB7XG4gIC8vIENoZWNrIGlmIHRoaXMgaXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlLiBPbmx5IGNhbGxlZCBieSBjbGFzcyBjb21wb25lbnRzLFxuICAvLyB3aGljaCBzcGVjaWFsIChkZXByZWNhdGVkKSBiZWhhdmlvciBmb3IgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlIHByb3BzLlxuICByZXR1cm4gKC8vIFRPRE86IFJlbW92ZSBvdXRkYXRlZCBkZWZlclJlbmRlclBoYXNlVXBkYXRlVG9OZXh0QmF0Y2ggZXhwZXJpbWVudC4gV2VcbiAgICAvLyBkZWNpZGVkIG5vdCB0byBlbmFibGUgaXQuXG4gICAgIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dFxuICApO1xufSAvLyBVc2UgdGhpcyBmdW5jdGlvbiB0byBzY2hlZHVsZSBhIHRhc2sgZm9yIGEgcm9vdC4gVGhlcmUncyBvbmx5IG9uZSB0YXNrIHBlclxuLy8gcm9vdDsgaWYgYSB0YXNrIHdhcyBhbHJlYWR5IHNjaGVkdWxlZCwgd2UnbGwgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBwcmlvcml0eVxuLy8gb2YgdGhlIGV4aXN0aW5nIHRhc2sgaXMgdGhlIHNhbWUgYXMgdGhlIHByaW9yaXR5IG9mIHRoZSBuZXh0IGxldmVsIHRoYXQgdGhlXG4vLyByb290IGhhcyB3b3JrIG9uLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBldmVyeSB1cGRhdGUsIGFuZCByaWdodCBiZWZvcmVcbi8vIGV4aXRpbmcgYSB0YXNrLlxuXG5mdW5jdGlvbiBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgY3VycmVudFRpbWUpIHtcbiAgdmFyIGV4aXN0aW5nQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7IC8vIENoZWNrIGlmIGFueSBsYW5lcyBhcmUgYmVpbmcgc3RhcnZlZCBieSBvdGhlciB3b3JrLiBJZiBzbywgbWFyayB0aGVtIGFzXG4gIC8vIGV4cGlyZWQgc28gd2Uga25vdyB0byB3b3JrIG9uIHRob3NlIG5leHQuXG5cbiAgbWFya1N0YXJ2ZWRMYW5lc0FzRXhwaXJlZChyb290LCBjdXJyZW50VGltZSk7IC8vIERldGVybWluZSB0aGUgbmV4dCBsYW5lcyB0byB3b3JrIG9uLCBhbmQgdGhlaXIgcHJpb3JpdHkuXG5cbiAgdmFyIG5leHRMYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA6IE5vTGFuZXMpO1xuXG4gIGlmIChuZXh0TGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IFRoZXJlJ3Mgbm90aGluZyB0byB3b3JrIG9uLlxuICAgIGlmIChleGlzdGluZ0NhbGxiYWNrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQ2FsbGJhY2skMShleGlzdGluZ0NhbGxiYWNrTm9kZSk7XG4gICAgfVxuXG4gICAgcm9vdC5jYWxsYmFja05vZGUgPSBudWxsO1xuICAgIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZTtcbiAgICByZXR1cm47XG4gIH0gLy8gV2UgdXNlIHRoZSBoaWdoZXN0IHByaW9yaXR5IGxhbmUgdG8gcmVwcmVzZW50IHRoZSBwcmlvcml0eSBvZiB0aGUgY2FsbGJhY2suXG5cblxuICB2YXIgbmV3Q2FsbGJhY2tQcmlvcml0eSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobmV4dExhbmVzKTsgLy8gQ2hlY2sgaWYgdGhlcmUncyBhbiBleGlzdGluZyB0YXNrLiBXZSBtYXkgYmUgYWJsZSB0byByZXVzZSBpdC5cblxuICB2YXIgZXhpc3RpbmdDYWxsYmFja1ByaW9yaXR5ID0gcm9vdC5jYWxsYmFja1ByaW9yaXR5O1xuXG4gIGlmIChleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgPT09IG5ld0NhbGxiYWNrUHJpb3JpdHkgJiYgLy8gU3BlY2lhbCBjYXNlIHJlbGF0ZWQgdG8gYGFjdGAuIElmIHRoZSBjdXJyZW50bHkgc2NoZWR1bGVkIHRhc2sgaXMgYVxuICAvLyBTY2hlZHVsZXIgdGFzaywgcmF0aGVyIHRoYW4gYW4gYGFjdGAgdGFzaywgY2FuY2VsIGl0IGFuZCByZS1zY2hlZHVsZWRcbiAgLy8gb24gdGhlIGBhY3RgIHF1ZXVlLlxuICAhKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgIT09IG51bGwgJiYgZXhpc3RpbmdDYWxsYmFja05vZGUgIT09IGZha2VBY3RDYWxsYmFja05vZGUpKSB7XG4gICAge1xuICAgICAgLy8gSWYgd2UncmUgZ29pbmcgdG8gcmUtdXNlIGFuIGV4aXN0aW5nIHRhc2ssIGl0IG5lZWRzIHRvIGV4aXN0LlxuICAgICAgLy8gQXNzdW1lIHRoYXQgZGlzY3JldGUgdXBkYXRlIG1pY3JvdGFza3MgYXJlIG5vbi1jYW5jZWxsYWJsZSBhbmQgbnVsbC5cbiAgICAgIC8vIFRPRE86IFRlbXBvcmFyeSB1bnRpbCB3ZSBjb25maXJtIHRoaXMgd2FybmluZyBpcyBub3QgZmlyZWQuXG4gICAgICBpZiAoZXhpc3RpbmdDYWxsYmFja05vZGUgPT0gbnVsbCAmJiBleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgIT09IFN5bmNMYW5lKSB7XG4gICAgICAgIGVycm9yKCdFeHBlY3RlZCBzY2hlZHVsZWQgY2FsbGJhY2sgdG8gZXhpc3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICB9XG4gICAgfSAvLyBUaGUgcHJpb3JpdHkgaGFzbid0IGNoYW5nZWQuIFdlIGNhbiByZXVzZSB0aGUgZXhpc3RpbmcgdGFzay4gRXhpdC5cblxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tOb2RlICE9IG51bGwpIHtcbiAgICAvLyBDYW5jZWwgdGhlIGV4aXN0aW5nIGNhbGxiYWNrLiBXZSdsbCBzY2hlZHVsZSBhIG5ldyBvbmUgYmVsb3cuXG4gICAgY2FuY2VsQ2FsbGJhY2skMShleGlzdGluZ0NhbGxiYWNrTm9kZSk7XG4gIH0gLy8gU2NoZWR1bGUgYSBuZXcgY2FsbGJhY2suXG5cblxuICB2YXIgbmV3Q2FsbGJhY2tOb2RlO1xuXG4gIGlmIChuZXdDYWxsYmFja1ByaW9yaXR5ID09PSBTeW5jTGFuZSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogU3luYyBSZWFjdCBjYWxsYmFja3MgYXJlIHNjaGVkdWxlZCBvbiBhIHNwZWNpYWxcbiAgICAvLyBpbnRlcm5hbCBxdWV1ZVxuICAgIGlmIChyb290LnRhZyA9PT0gTGVnYWN5Um9vdCkge1xuICAgICAgaWYgKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmlzQmF0Y2hpbmdMZWdhY3kgIT09IG51bGwpIHtcbiAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHNjaGVkdWxlTGVnYWN5U3luY0NhbGxiYWNrKHBlcmZvcm1TeW5jV29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2NoZWR1bGVTeW5jQ2FsbGJhY2socGVyZm9ybVN5bmNXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCkpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIEZsdXNoIHRoZSBxdWV1ZSBpbiBhIG1pY3JvdGFzay5cbiAgICAgIGlmICggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIEluc2lkZSBgYWN0YCwgdXNlIG91ciBpbnRlcm5hbCBgYWN0YCBxdWV1ZSBzbyB0aGF0IHRoZXNlIGdldCBmbHVzaGVkXG4gICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgc2NvcGUgZXZlbiB3aGVuIHVzaW5nIHRoZSBzeW5jIHZlcnNpb25cbiAgICAgICAgLy8gb2YgYGFjdGAuXG4gICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudC5wdXNoKGZsdXNoU3luY0NhbGxiYWNrcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2hlZHVsZU1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gSW4gU2FmYXJpLCBhcHBlbmRpbmcgYW4gaWZyYW1lIGZvcmNlcyBtaWNyb3Rhc2tzIHRvIHJ1bi5cbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIyNDU5XG4gICAgICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBydW5uaW5nIGNhbGxiYWNrcyBpbiB0aGUgbWlkZGxlIG9mIHJlbmRlclxuICAgICAgICAgIC8vIG9yIGNvbW1pdCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGFnYWluc3QgdGhhdC5cbiAgICAgICAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyB3b3VsZCBzdGlsbCBwcmVtYXR1cmVseSBmbHVzaCB0aGUgY2FsbGJhY2tzXG4gICAgICAgICAgICAvLyBpZiB0aGlzIGhhcHBlbnMgb3V0c2lkZSByZW5kZXIgb3IgY29tbWl0IHBoYXNlIChlLmcuIGluIGFuIGV2ZW50KS5cbiAgICAgICAgICAgIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV3Q2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbDtcblxuICAgIHN3aXRjaCAobGFuZXNUb0V2ZW50UHJpb3JpdHkobmV4dExhbmVzKSkge1xuICAgICAgY2FzZSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBJbW1lZGlhdGVQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQ29udGludW91c0V2ZW50UHJpb3JpdHk6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBVc2VyQmxvY2tpbmdQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRGVmYXVsdEV2ZW50UHJpb3JpdHk6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgSWRsZUV2ZW50UHJpb3JpdHk6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBJZGxlUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIG5ld0NhbGxiYWNrTm9kZSA9IHNjaGVkdWxlQ2FsbGJhY2skMShzY2hlZHVsZXJQcmlvcml0eUxldmVsLCBwZXJmb3JtQ29uY3VycmVudFdvcmtPblJvb3QuYmluZChudWxsLCByb290KSk7XG4gIH1cblxuICByb290LmNhbGxiYWNrUHJpb3JpdHkgPSBuZXdDYWxsYmFja1ByaW9yaXR5O1xuICByb290LmNhbGxiYWNrTm9kZSA9IG5ld0NhbGxiYWNrTm9kZTtcbn0gLy8gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIGV2ZXJ5IGNvbmN1cnJlbnQgdGFzaywgaS5lLiBhbnl0aGluZyB0aGF0XG4vLyBnb2VzIHRocm91Z2ggU2NoZWR1bGVyLlxuXG5cbmZ1bmN0aW9uIHBlcmZvcm1Db25jdXJyZW50V29ya09uUm9vdChyb290LCBkaWRUaW1lb3V0KSB7XG4gIHtcbiAgICByZXNldE5lc3RlZFVwZGF0ZUZsYWcoKTtcbiAgfSAvLyBTaW5jZSB3ZSBrbm93IHdlJ3JlIGluIGEgUmVhY3QgZXZlbnQsIHdlIGNhbiBjbGVhciB0aGUgY3VycmVudFxuICAvLyBldmVudCB0aW1lLiBUaGUgbmV4dCB1cGRhdGUgd2lsbCBjb21wdXRlIGEgbmV3IGV2ZW50IHRpbWUuXG5cblxuICBjdXJyZW50RXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG4gIGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lID0gTm9MYW5lcztcblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbm90IGFscmVhZHkgYmUgd29ya2luZy4nKTtcbiAgfSAvLyBGbHVzaCBhbnkgcGVuZGluZyBwYXNzaXZlIGVmZmVjdHMgYmVmb3JlIGRlY2lkaW5nIHdoaWNoIGxhbmVzIHRvIHdvcmsgb24sXG4gIC8vIGluIGNhc2UgdGhleSBzY2hlZHVsZSBhZGRpdGlvbmFsIHdvcmsuXG5cblxuICB2YXIgb3JpZ2luYWxDYWxsYmFja05vZGUgPSByb290LmNhbGxiYWNrTm9kZTtcbiAgdmFyIGRpZEZsdXNoUGFzc2l2ZUVmZmVjdHMgPSBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG5cbiAgaWYgKGRpZEZsdXNoUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAvLyBTb21ldGhpbmcgaW4gdGhlIHBhc3NpdmUgZWZmZWN0IHBoYXNlIG1heSBoYXZlIGNhbmNlbGVkIHRoZSBjdXJyZW50IHRhc2suXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHRhc2sgbm9kZSBmb3IgdGhpcyByb290IHdhcyBjaGFuZ2VkLlxuICAgIGlmIChyb290LmNhbGxiYWNrTm9kZSAhPT0gb3JpZ2luYWxDYWxsYmFja05vZGUpIHtcbiAgICAgIC8vIFRoZSBjdXJyZW50IHRhc2sgd2FzIGNhbmNlbGVkLiBFeGl0LiBXZSBkb24ndCBuZWVkIHRvIGNhbGxcbiAgICAgIC8vIGBlbnN1cmVSb290SXNTY2hlZHVsZWRgIGJlY2F1c2UgdGhlIGNoZWNrIGFib3ZlIGltcGxpZXMgZWl0aGVyIHRoYXRcbiAgICAgIC8vIHRoZXJlJ3MgYSBuZXcgdGFzaywgb3IgdGhhdCB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrIG9uIHRoaXMgcm9vdC5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSAvLyBEZXRlcm1pbmUgdGhlIG5leHQgbGFuZXMgdG8gd29yayBvbiwgdXNpbmcgdGhlIGZpZWxkcyBzdG9yZWRcbiAgLy8gb24gdGhlIHJvb3QuXG5cblxuICB2YXIgbGFuZXMgPSBnZXROZXh0TGFuZXMocm9vdCwgcm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290ID8gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgOiBOb0xhbmVzKTtcblxuICBpZiAobGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBEZWZlbnNpdmUgY29kaW5nLiBUaGlzIGlzIG5ldmVyIGV4cGVjdGVkIHRvIGhhcHBlbi5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBXZSBkaXNhYmxlIHRpbWUtc2xpY2luZyBpbiBzb21lIGNhc2VzOiBpZiB0aGUgd29yayBoYXMgYmVlbiBDUFUtYm91bmRcbiAgLy8gZm9yIHRvbyBsb25nIChcImV4cGlyZWRcIiB3b3JrLCB0byBwcmV2ZW50IHN0YXJ2YXRpb24pLCBvciB3ZSdyZSBpblxuICAvLyBzeW5jLXVwZGF0ZXMtYnktZGVmYXVsdCBtb2RlLlxuICAvLyBUT0RPOiBXZSBvbmx5IGNoZWNrIGBkaWRUaW1lb3V0YCBkZWZlbnNpdmVseSwgdG8gYWNjb3VudCBmb3IgYSBTY2hlZHVsZXJcbiAgLy8gYnVnIHdlJ3JlIHN0aWxsIGludmVzdGlnYXRpbmcuIE9uY2UgdGhlIGJ1ZyBpbiBTY2hlZHVsZXIgaXMgZml4ZWQsXG4gIC8vIHdlIGNhbiByZW1vdmUgdGhpcywgc2luY2Ugd2UgdHJhY2sgZXhwaXJhdGlvbiBvdXJzZWx2ZXMuXG5cblxuICB2YXIgc2hvdWxkVGltZVNsaWNlID0gIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIGxhbmVzKSAmJiAhaW5jbHVkZXNFeHBpcmVkTGFuZShyb290LCBsYW5lcykgJiYgKCAhZGlkVGltZW91dCk7XG4gIHZhciBleGl0U3RhdHVzID0gc2hvdWxkVGltZVNsaWNlID8gcmVuZGVyUm9vdENvbmN1cnJlbnQocm9vdCwgbGFuZXMpIDogcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpO1xuXG4gIGlmIChleGl0U3RhdHVzICE9PSBSb290SW5Qcm9ncmVzcykge1xuICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgICAgLy8gSWYgc29tZXRoaW5nIHRocmV3IGFuIGVycm9yLCB0cnkgcmVuZGVyaW5nIG9uZSBtb3JlIHRpbWUuIFdlJ2xsXG4gICAgICAvLyByZW5kZXIgc3luY2hyb25vdXNseSB0byBibG9jayBjb25jdXJyZW50IGRhdGEgbXV0YXRpb25zLCBhbmQgd2UnbGxcbiAgICAgIC8vIGluY2x1ZGVzIGFsbCBwZW5kaW5nIHVwZGF0ZXMgYXJlIGluY2x1ZGVkLiBJZiBpdCBzdGlsbCBmYWlscyBhZnRlclxuICAgICAgLy8gdGhlIHNlY29uZCBhdHRlbXB0LCB3ZSdsbCBnaXZlIHVwIGFuZCBjb21taXQgdGhlIHJlc3VsdGluZyB0cmVlLlxuICAgICAgdmFyIGVycm9yUmV0cnlMYW5lcyA9IGdldExhbmVzVG9SZXRyeVN5bmNocm9ub3VzbHlPbkVycm9yKHJvb3QpO1xuXG4gICAgICBpZiAoZXJyb3JSZXRyeUxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIGxhbmVzID0gZXJyb3JSZXRyeUxhbmVzO1xuICAgICAgICBleGl0U3RhdHVzID0gcmVjb3ZlckZyb21Db25jdXJyZW50RXJyb3Iocm9vdCwgZXJyb3JSZXRyeUxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEZhdGFsRXJyb3JlZCkge1xuICAgICAgdmFyIGZhdGFsRXJyb3IgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yO1xuICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gICAgICB0aHJvdyBmYXRhbEVycm9yO1xuICAgIH1cblxuICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RGlkTm90Q29tcGxldGUpIHtcbiAgICAgIC8vIFRoZSByZW5kZXIgdW53b3VuZCB3aXRob3V0IGNvbXBsZXRpbmcgdGhlIHRyZWUuIFRoaXMgaGFwcGVucyBpbiBzcGVjaWFsXG4gICAgICAvLyBjYXNlcyB3aGVyZSBuZWVkIHRvIGV4aXQgdGhlIGN1cnJlbnQgcmVuZGVyIHdpdGhvdXQgcHJvZHVjaW5nIGFcbiAgICAgIC8vIGNvbnNpc3RlbnQgdHJlZSBvciBjb21taXR0aW5nLlxuICAgICAgLy9cbiAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGR1cmluZyBhIGNvbmN1cnJlbnQgcmVuZGVyLCBub3QgYSBkaXNjcmV0ZSBvclxuICAgICAgLy8gc3luY2hyb25vdXMgdXBkYXRlLiBXZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgZm9yIHRoaXMgd2hlbiB3ZVxuICAgICAgLy8gdW53b3VuZCB0aGUgc3RhY2suXG4gICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHJlbmRlciBjb21wbGV0ZWQuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIHJlbmRlciBtYXkgaGF2ZSB5aWVsZGVkIHRvIGEgY29uY3VycmVudCBldmVudCwgYW5kIGlmIHNvLFxuICAgICAgLy8gY29uZmlybSB0aGF0IGFueSBuZXdseSByZW5kZXJlZCBzdG9yZXMgYXJlIGNvbnNpc3RlbnQuXG4gICAgICAvLyBUT0RPOiBJdCdzIHBvc3NpYmxlIHRoYXQgZXZlbiBhIGNvbmN1cnJlbnQgcmVuZGVyIG1heSBuZXZlciBoYXZlIHlpZWxkZWRcbiAgICAgIC8vIHRvIHRoZSBtYWluIHRocmVhZCwgaWYgaXQgd2FzIGZhc3QgZW5vdWdoLCBvciBpZiBpdCBleHBpcmVkLiBXZSBjb3VsZFxuICAgICAgLy8gc2tpcCB0aGUgY29uc2lzdGVuY3kgY2hlY2sgaW4gdGhhdCBjYXNlLCB0b28uXG4gICAgICB2YXIgcmVuZGVyV2FzQ29uY3VycmVudCA9ICFpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCBsYW5lcyk7XG4gICAgICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5jdXJyZW50LmFsdGVybmF0ZTtcblxuICAgICAgaWYgKHJlbmRlcldhc0NvbmN1cnJlbnQgJiYgIWlzUmVuZGVyQ29uc2lzdGVudFdpdGhFeHRlcm5hbFN0b3JlcyhmaW5pc2hlZFdvcmspKSB7XG4gICAgICAgIC8vIEEgc3RvcmUgd2FzIG11dGF0ZWQgaW4gYW4gaW50ZXJsZWF2ZWQgZXZlbnQuIFJlbmRlciBhZ2FpbixcbiAgICAgICAgLy8gc3luY2hyb25vdXNseSwgdG8gYmxvY2sgZnVydGhlciBtdXRhdGlvbnMuXG4gICAgICAgIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7IC8vIFdlIG5lZWQgdG8gY2hlY2sgYWdhaW4gaWYgc29tZXRoaW5nIHRocmV3XG5cbiAgICAgICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgICAgICAgdmFyIF9lcnJvclJldHJ5TGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgICAgICAgIGlmIChfZXJyb3JSZXRyeUxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgICAgICBsYW5lcyA9IF9lcnJvclJldHJ5TGFuZXM7XG4gICAgICAgICAgICBleGl0U3RhdHVzID0gcmVjb3ZlckZyb21Db25jdXJyZW50RXJyb3Iocm9vdCwgX2Vycm9yUmV0cnlMYW5lcyk7IC8vIFdlIGFzc3VtZSB0aGUgdHJlZSBpcyBub3cgY29uc2lzdGVudCBiZWNhdXNlIHdlIGRpZG4ndCB5aWVsZCB0byBhbnlcbiAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgZXZlbnRzLlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RmF0YWxFcnJvcmVkKSB7XG4gICAgICAgICAgdmFyIF9mYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICAgICAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICAgICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgICAgICAgIHRocm93IF9mYXRhbEVycm9yO1xuICAgICAgICB9XG4gICAgICB9IC8vIFdlIG5vdyBoYXZlIGEgY29uc2lzdGVudCB0cmVlLiBUaGUgbmV4dCBzdGVwIGlzIGVpdGhlciB0byBjb21taXQgaXQsXG4gICAgICAvLyBvciwgaWYgc29tZXRoaW5nIHN1c3BlbmRlZCwgd2FpdCB0byBjb21taXQgaXQgYWZ0ZXIgYSB0aW1lb3V0LlxuXG5cbiAgICAgIHJvb3QuZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrO1xuICAgICAgcm9vdC5maW5pc2hlZExhbmVzID0gbGFuZXM7XG4gICAgICBmaW5pc2hDb25jdXJyZW50UmVuZGVyKHJvb3QsIGV4aXRTdGF0dXMsIGxhbmVzKTtcbiAgICB9XG4gIH1cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuXG4gIGlmIChyb290LmNhbGxiYWNrTm9kZSA9PT0gb3JpZ2luYWxDYWxsYmFja05vZGUpIHtcbiAgICAvLyBUaGUgdGFzayBub2RlIHNjaGVkdWxlZCBmb3IgdGhpcyByb290IGlzIHRoZSBzYW1lIG9uZSB0aGF0J3NcbiAgICAvLyBjdXJyZW50bHkgZXhlY3V0ZWQuIE5lZWQgdG8gcmV0dXJuIGEgY29udGludWF0aW9uLlxuICAgIHJldHVybiBwZXJmb3JtQ29uY3VycmVudFdvcmtPblJvb3QuYmluZChudWxsLCByb290KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiByZWNvdmVyRnJvbUNvbmN1cnJlbnRFcnJvcihyb290LCBlcnJvclJldHJ5TGFuZXMpIHtcbiAgLy8gSWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGh5ZHJhdGlvbiwgZGlzY2FyZCBzZXJ2ZXIgcmVzcG9uc2UgYW5kIGZhbGxcbiAgLy8gYmFjayB0byBjbGllbnQgc2lkZSByZW5kZXIuXG4gIC8vIEJlZm9yZSByZW5kZXJpbmcgYWdhaW4sIHNhdmUgdGhlIGVycm9ycyBmcm9tIHRoZSBwcmV2aW91cyBhdHRlbXB0LlxuICB2YXIgZXJyb3JzRnJvbUZpcnN0QXR0ZW1wdCA9IHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnM7XG5cbiAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHtcbiAgICAvLyBUaGUgc2hlbGwgZmFpbGVkIHRvIGh5ZHJhdGUuIFNldCBhIGZsYWcgdG8gZm9yY2UgYSBjbGllbnQgcmVuZGVyaW5nXG4gICAgLy8gZHVyaW5nIHRoZSBuZXh0IGF0dGVtcHQuIFRvIGRvIHRoaXMsIHdlIGNhbGwgcHJlcGFyZUZyZXNoU3RhY2sgbm93XG4gICAgLy8gdG8gY3JlYXRlIHRoZSByb290IHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuIFRoaXMgaXMgYSBiaXQgd2VpcmQgaW4gdGVybXNcbiAgICAvLyBvZiBmYWN0b3JpbmcsIGJlY2F1c2UgaXQgcmVsaWVzIG9uIHJlbmRlclJvb3RTeW5jIG5vdCBjYWxsaW5nXG4gICAgLy8gcHJlcGFyZUZyZXNoU3RhY2sgYWdhaW4gaW4gdGhlIGNhbGwgYmVsb3csIHdoaWNoIGhhcHBlbnMgYmVjYXVzZSB0aGVcbiAgICAvLyByb290IGFuZCBsYW5lcyBoYXZlbid0IGNoYW5nZWQuXG4gICAgLy9cbiAgICAvLyBUT0RPOiBJIHRoaW5rIHdoYXQgd2Ugc2hvdWxkIGRvIGlzIHNldCBGb3JjZUNsaWVudFJlbmRlciBpbnNpZGVcbiAgICAvLyB0aHJvd0V4Y2VwdGlvbiwgbGlrZSB3ZSBkbyBmb3IgbmVzdGVkIFN1c3BlbnNlIGJvdW5kYXJpZXMuIFRoZSByZWFzb25cbiAgICAvLyBpdCdzIGhlcmUgaW5zdGVhZCBpcyBzbyB3ZSBjYW4gc3dpdGNoIHRvIHRoZSBzeW5jaHJvbm91cyB3b3JrIGxvb3AsIHRvby5cbiAgICAvLyBTb21ldGhpbmcgdG8gY29uc2lkZXIgZm9yIGEgZnV0dXJlIHJlZmFjdG9yLlxuICAgIHZhciByb290V29ya0luUHJvZ3Jlc3MgPSBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBlcnJvclJldHJ5TGFuZXMpO1xuICAgIHJvb3RXb3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlcjtcblxuICAgIHtcbiAgICAgIGVycm9ySHlkcmF0aW5nQ29udGFpbmVyKHJvb3QuY29udGFpbmVySW5mbyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBlcnJvclJldHJ5TGFuZXMpO1xuXG4gIGlmIChleGl0U3RhdHVzICE9PSBSb290RXJyb3JlZCkge1xuICAgIC8vIFN1Y2Nlc3NmdWxseSBmaW5pc2hlZCByZW5kZXJpbmcgb24gcmV0cnlcbiAgICAvLyBUaGUgZXJyb3JzIGZyb20gdGhlIGZhaWxlZCBmaXJzdCBhdHRlbXB0IGhhdmUgYmVlbiByZWNvdmVyZWQuIEFkZFxuICAgIC8vIHRoZW0gdG8gdGhlIGNvbGxlY3Rpb24gb2YgcmVjb3ZlcmFibGUgZXJyb3JzLiBXZSdsbCBsb2cgdGhlbSBpbiB0aGVcbiAgICAvLyBjb21taXQgcGhhc2UuXG4gICAgdmFyIGVycm9yc0Zyb21TZWNvbmRBdHRlbXB0ID0gd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnM7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSBlcnJvcnNGcm9tRmlyc3RBdHRlbXB0OyAvLyBUaGUgZXJyb3JzIGZyb20gdGhlIHNlY29uZCBhdHRlbXB0IHNob3VsZCBiZSBxdWV1ZWQgYWZ0ZXIgdGhlIGVycm9yc1xuICAgIC8vIGZyb20gdGhlIGZpcnN0IGF0dGVtcHQsIHRvIHByZXNlcnZlIHRoZSBjYXVzYWwgc2VxdWVuY2UuXG5cbiAgICBpZiAoZXJyb3JzRnJvbVNlY29uZEF0dGVtcHQgIT09IG51bGwpIHtcbiAgICAgIHF1ZXVlUmVjb3ZlcmFibGVFcnJvcnMoZXJyb3JzRnJvbVNlY29uZEF0dGVtcHQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGl0U3RhdHVzO1xufVxuXG5mdW5jdGlvbiBxdWV1ZVJlY292ZXJhYmxlRXJyb3JzKGVycm9ycykge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPT09IG51bGwpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IGVycm9ycztcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycy5wdXNoLmFwcGx5KHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCBlcnJvcnMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaENvbmN1cnJlbnRSZW5kZXIocm9vdCwgZXhpdFN0YXR1cywgbGFuZXMpIHtcbiAgc3dpdGNoIChleGl0U3RhdHVzKSB7XG4gICAgY2FzZSBSb290SW5Qcm9ncmVzczpcbiAgICBjYXNlIFJvb3RGYXRhbEVycm9yZWQ6XG4gICAgICB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUm9vdCBkaWQgbm90IGNvbXBsZXRlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuICAgIC8vIEZsb3cga25vd3MgYWJvdXQgaW52YXJpYW50LCBzbyBpdCBjb21wbGFpbnMgaWYgSSBhZGQgYSBicmVha1xuICAgIC8vIHN0YXRlbWVudCwgYnV0IGVzbGludCBkb2Vzbid0IGtub3cgYWJvdXQgaW52YXJpYW50LCBzbyBpdCBjb21wbGFpbnNcbiAgICAvLyBpZiBJIGRvLiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgUm9vdEVycm9yZWQ6XG4gICAgICB7XG4gICAgICAgIC8vIFdlIHNob3VsZCBoYXZlIGFscmVhZHkgYXR0ZW1wdGVkIHRvIHJldHJ5IHRoaXMgdHJlZS4gSWYgd2UgcmVhY2hlZFxuICAgICAgICAvLyB0aGlzIHBvaW50LCBpdCBlcnJvcmVkIGFnYWluLiBDb21taXQgaXQuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUm9vdFN1c3BlbmRlZDpcbiAgICAgIHtcbiAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7IC8vIFdlIGhhdmUgYW4gYWNjZXB0YWJsZSBsb2FkaW5nIHN0YXRlLiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgd2VcbiAgICAgICAgLy8gc2hvdWxkIGltbWVkaWF0ZWx5IGNvbW1pdCBpdCBvciB3YWl0IGEgYml0LlxuXG4gICAgICAgIGlmIChpbmNsdWRlc09ubHlSZXRyaWVzKGxhbmVzKSAmJiAvLyBkbyBub3QgZGVsYXkgaWYgd2UncmUgaW5zaWRlIGFuIGFjdCgpIHNjb3BlXG4gICAgICAgICFzaG91bGRGb3JjZUZsdXNoRmFsbGJhY2tzSW5ERVYoKSkge1xuICAgICAgICAgIC8vIFRoaXMgcmVuZGVyIG9ubHkgaW5jbHVkZWQgcmV0cmllcywgbm8gdXBkYXRlcy4gVGhyb3R0bGUgY29tbWl0dGluZ1xuICAgICAgICAgIC8vIHJldHJpZXMgc28gdGhhdCB3ZSBkb24ndCBzaG93IHRvbyBtYW55IGxvYWRpbmcgc3RhdGVzIHRvbyBxdWlja2x5LlxuICAgICAgICAgIHZhciBtc1VudGlsVGltZW91dCA9IGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgKyBGQUxMQkFDS19USFJPVFRMRV9NUyAtIG5vdygpOyAvLyBEb24ndCBib3RoZXIgd2l0aCBhIHZlcnkgc2hvcnQgc3VzcGVuc2UgdGltZS5cblxuICAgICAgICAgIGlmIChtc1VudGlsVGltZW91dCA+IDEwKSB7XG4gICAgICAgICAgICB2YXIgbmV4dExhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIE5vTGFuZXMpO1xuXG4gICAgICAgICAgICBpZiAobmV4dExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgICAgICAgIC8vIFRoZXJlJ3MgYWRkaXRpb25hbCB3b3JrIG9uIHRoaXMgcm9vdC5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXM7XG5cbiAgICAgICAgICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKHN1c3BlbmRlZExhbmVzLCBsYW5lcykpIHtcbiAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIHByZWZlciB0byByZW5kZXIgdGhlIGZhbGxiYWNrIG9mIGF0IHRoZSBsYXN0XG4gICAgICAgICAgICAgIC8vIHN1c3BlbmRlZCBsZXZlbC4gUGluZyB0aGUgbGFzdCBzdXNwZW5kZWQgbGV2ZWwgdG8gdHJ5XG4gICAgICAgICAgICAgIC8vIHJlbmRlcmluZyBpdCBhZ2Fpbi5cbiAgICAgICAgICAgICAgLy8gRklYTUU6IFdoYXQgaWYgdGhlIHN1c3BlbmRlZCBsYW5lcyBhcmUgSWRsZT8gU2hvdWxkIG5vdCByZXN0YXJ0LlxuICAgICAgICAgICAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgICAgICAgICAgICBtYXJrUm9vdFBpbmdlZChyb290LCBzdXNwZW5kZWRMYW5lcyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSAvLyBUaGUgcmVuZGVyIGlzIHN1c3BlbmRlZCwgaXQgaGFzbid0IHRpbWVkIG91dCwgYW5kIHRoZXJlJ3Mgbm9cbiAgICAgICAgICAgIC8vIGxvd2VyIHByaW9yaXR5IHdvcmsgdG8gZG8uIEluc3RlYWQgb2YgY29tbWl0dGluZyB0aGUgZmFsbGJhY2tcbiAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5LCB3YWl0IGZvciBtb3JlIGRhdGEgdG8gYXJyaXZlLlxuXG5cbiAgICAgICAgICAgIHJvb3QudGltZW91dEhhbmRsZSA9IHNjaGVkdWxlVGltZW91dChjb21taXRSb290LmJpbmQobnVsbCwgcm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpLCBtc1VudGlsVGltZW91dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVGhlIHdvcmsgZXhwaXJlZC4gQ29tbWl0IGltbWVkaWF0ZWx5LlxuXG5cbiAgICAgICAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBSb290U3VzcGVuZGVkV2l0aERlbGF5OlxuICAgICAge1xuICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcblxuICAgICAgICBpZiAoaW5jbHVkZXNPbmx5VHJhbnNpdGlvbnMobGFuZXMpKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBhIHRyYW5zaXRpb24sIHNvIHdlIHNob3VsZCBleGl0IHdpdGhvdXQgY29tbWl0dGluZyBhXG4gICAgICAgICAgLy8gcGxhY2Vob2xkZXIgYW5kIHdpdGhvdXQgc2NoZWR1bGluZyBhIHRpbWVvdXQuIERlbGF5IGluZGVmaW5pdGVseVxuICAgICAgICAgIC8vIHVudGlsIHdlIHJlY2VpdmUgbW9yZSBkYXRhLlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzaG91bGRGb3JjZUZsdXNoRmFsbGJhY2tzSW5ERVYoKSkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgdHJhbnNpdGlvbiwgYnV0IHdlIGRpZCB0cmlnZ2VyIGFuIGF2b2lkZWQgc3RhdGUuXG4gICAgICAgICAgLy8gU2NoZWR1bGUgYSBwbGFjZWhvbGRlciB0byBkaXNwbGF5IGFmdGVyIGEgc2hvcnQgZGVsYXksIHVzaW5nIHRoZSBKdXN0XG4gICAgICAgICAgLy8gTm90aWNlYWJsZSBEaWZmZXJlbmNlLlxuICAgICAgICAgIC8vIFRPRE86IElzIHRoZSBKTkQgb3B0aW1pemF0aW9uIHdvcnRoIHRoZSBhZGRlZCBjb21wbGV4aXR5PyBJZiB0aGlzIGlzXG4gICAgICAgICAgLy8gdGhlIG9ubHkgcmVhc29uIHdlIHRyYWNrIHRoZSBldmVudCB0aW1lLCB0aGVuIHByb2JhYmx5IG5vdC5cbiAgICAgICAgICAvLyBDb25zaWRlciByZW1vdmluZy5cbiAgICAgICAgICB2YXIgbW9zdFJlY2VudEV2ZW50VGltZSA9IGdldE1vc3RSZWNlbnRFdmVudFRpbWUocm9vdCwgbGFuZXMpO1xuICAgICAgICAgIHZhciBldmVudFRpbWVNcyA9IG1vc3RSZWNlbnRFdmVudFRpbWU7XG4gICAgICAgICAgdmFyIHRpbWVFbGFwc2VkTXMgPSBub3coKSAtIGV2ZW50VGltZU1zO1xuXG4gICAgICAgICAgdmFyIF9tc1VudGlsVGltZW91dCA9IGpuZCh0aW1lRWxhcHNlZE1zKSAtIHRpbWVFbGFwc2VkTXM7IC8vIERvbid0IGJvdGhlciB3aXRoIGEgdmVyeSBzaG9ydCBzdXNwZW5zZSB0aW1lLlxuXG5cbiAgICAgICAgICBpZiAoX21zVW50aWxUaW1lb3V0ID4gMTApIHtcbiAgICAgICAgICAgIC8vIEluc3RlYWQgb2YgY29tbWl0dGluZyB0aGUgZmFsbGJhY2sgaW1tZWRpYXRlbHksIHdhaXQgZm9yIG1vcmUgZGF0YVxuICAgICAgICAgICAgLy8gdG8gYXJyaXZlLlxuICAgICAgICAgICAgcm9vdC50aW1lb3V0SGFuZGxlID0gc2NoZWR1bGVUaW1lb3V0KGNvbW1pdFJvb3QuYmluZChudWxsLCByb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyksIF9tc1VudGlsVGltZW91dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gQ29tbWl0IHRoZSBwbGFjZWhvbGRlci5cblxuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUm9vdENvbXBsZXRlZDpcbiAgICAgIHtcbiAgICAgICAgLy8gVGhlIHdvcmsgY29tcGxldGVkLiBSZWFkeSB0byBjb21taXQuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biByb290IGV4aXQgc3RhdHVzLicpO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzUmVuZGVyQ29uc2lzdGVudFdpdGhFeHRlcm5hbFN0b3JlcyhmaW5pc2hlZFdvcmspIHtcbiAgLy8gU2VhcmNoIHRoZSByZW5kZXJlZCB0cmVlIGZvciBleHRlcm5hbCBzdG9yZSByZWFkcywgYW5kIGNoZWNrIHdoZXRoZXIgdGhlXG4gIC8vIHN0b3JlcyB3ZXJlIG11dGF0ZWQgaW4gYSBjb25jdXJyZW50IGV2ZW50LiBJbnRlbnRpb25hbGx5IHVzaW5nIGFuIGl0ZXJhdGl2ZVxuICAvLyBsb29wIGluc3RlYWQgb2YgcmVjdXJzaW9uIHNvIHdlIGNhbiBleGl0IGVhcmx5LlxuICB2YXIgbm9kZSA9IGZpbmlzaGVkV29yaztcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChub2RlLmZsYWdzICYgU3RvcmVDb25zaXN0ZW5jeSkge1xuICAgICAgdmFyIHVwZGF0ZVF1ZXVlID0gbm9kZS51cGRhdGVRdWV1ZTtcblxuICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBjaGVja3MgPSB1cGRhdGVRdWV1ZS5zdG9yZXM7XG5cbiAgICAgICAgaWYgKGNoZWNrcyAhPT0gbnVsbCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hlY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hlY2sgPSBjaGVja3NbaV07XG4gICAgICAgICAgICB2YXIgZ2V0U25hcHNob3QgPSBjaGVjay5nZXRTbmFwc2hvdDtcbiAgICAgICAgICAgIHZhciByZW5kZXJlZFZhbHVlID0gY2hlY2sudmFsdWU7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmICghb2JqZWN0SXMoZ2V0U25hcHNob3QoKSwgcmVuZGVyZWRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBGb3VuZCBhbiBpbmNvbnNpc3RlbnQgc3RvcmUuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAvLyBJZiBgZ2V0U25hcHNob3RgIHRocm93cywgcmV0dXJuIGBmYWxzZWAuIFRoaXMgd2lsbCBzY2hlZHVsZVxuICAgICAgICAgICAgICAvLyBhIHJlLXJlbmRlciwgYW5kIHRoZSBlcnJvciB3aWxsIGJlIHJldGhyb3duIGR1cmluZyByZW5kZXIuXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gICAgaWYgKG5vZGUuc3VidHJlZUZsYWdzICYgU3RvcmVDb25zaXN0ZW5jeSAmJiBjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgIG5vZGUgPSBjaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH0gLy8gRmxvdyBkb2Vzbid0IGtub3cgdGhpcyBpcyB1bnJlYWNoYWJsZSwgYnV0IGVzbGludCBkb2VzXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnJlYWNoYWJsZVxuXG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgc3VzcGVuZGVkTGFuZXMpIHtcbiAgLy8gV2hlbiBzdXNwZW5kaW5nLCB3ZSBzaG91bGQgYWx3YXlzIGV4Y2x1ZGUgbGFuZXMgdGhhdCB3ZXJlIHBpbmdlZCBvciAobW9yZVxuICAvLyByYXJlbHksIHNpbmNlIHdlIHRyeSB0byBhdm9pZCBpdCkgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgLy8gVE9ETzogTG9sIG1heWJlIHRoZXJlJ3MgYSBiZXR0ZXIgd2F5IHRvIGZhY3RvciB0aGlzIGJlc2lkZXMgdGhpc1xuICAvLyBvYm5veGlvdXNseSBuYW1lZCBmdW5jdGlvbiA6KVxuICBzdXNwZW5kZWRMYW5lcyA9IHJlbW92ZUxhbmVzKHN1c3BlbmRlZExhbmVzLCB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyk7XG4gIHN1c3BlbmRlZExhbmVzID0gcmVtb3ZlTGFuZXMoc3VzcGVuZGVkTGFuZXMsIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzKTtcbiAgbWFya1Jvb3RTdXNwZW5kZWQocm9vdCwgc3VzcGVuZGVkTGFuZXMpO1xufSAvLyBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3Igc3luY2hyb25vdXMgdGFza3MgdGhhdCBkb24ndCBnb1xuLy8gdGhyb3VnaCBTY2hlZHVsZXJcblxuXG5mdW5jdGlvbiBwZXJmb3JtU3luY1dvcmtPblJvb3Qocm9vdCkge1xuICB7XG4gICAgc3luY05lc3RlZFVwZGF0ZUZsYWcoKTtcbiAgfVxuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBub3QgYWxyZWFkeSBiZSB3b3JraW5nLicpO1xuICB9XG5cbiAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB2YXIgbGFuZXMgPSBnZXROZXh0TGFuZXMocm9vdCwgTm9MYW5lcyk7XG5cbiAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKGxhbmVzLCBTeW5jTGFuZSkpIHtcbiAgICAvLyBUaGVyZSdzIG5vIHJlbWFpbmluZyBzeW5jIHdvcmsgbGVmdC5cbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7XG5cbiAgaWYgKHJvb3QudGFnICE9PSBMZWdhY3lSb290ICYmIGV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgLy8gSWYgc29tZXRoaW5nIHRocmV3IGFuIGVycm9yLCB0cnkgcmVuZGVyaW5nIG9uZSBtb3JlIHRpbWUuIFdlJ2xsIHJlbmRlclxuICAgIC8vIHN5bmNocm9ub3VzbHkgdG8gYmxvY2sgY29uY3VycmVudCBkYXRhIG11dGF0aW9ucywgYW5kIHdlJ2xsIGluY2x1ZGVzXG4gICAgLy8gYWxsIHBlbmRpbmcgdXBkYXRlcyBhcmUgaW5jbHVkZWQuIElmIGl0IHN0aWxsIGZhaWxzIGFmdGVyIHRoZSBzZWNvbmRcbiAgICAvLyBhdHRlbXB0LCB3ZSdsbCBnaXZlIHVwIGFuZCBjb21taXQgdGhlIHJlc3VsdGluZyB0cmVlLlxuICAgIHZhciBlcnJvclJldHJ5TGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgIGlmIChlcnJvclJldHJ5TGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgIGxhbmVzID0gZXJyb3JSZXRyeUxhbmVzO1xuICAgICAgZXhpdFN0YXR1cyA9IHJlY292ZXJGcm9tQ29uY3VycmVudEVycm9yKHJvb3QsIGVycm9yUmV0cnlMYW5lcyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RGYXRhbEVycm9yZWQpIHtcbiAgICB2YXIgZmF0YWxFcnJvciA9IHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3I7XG4gICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgICB0aHJvdyBmYXRhbEVycm9yO1xuICB9XG5cbiAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3REaWROb3RDb21wbGV0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUm9vdCBkaWQgbm90IGNvbXBsZXRlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICB9IC8vIFdlIG5vdyBoYXZlIGEgY29uc2lzdGVudCB0cmVlLiBCZWNhdXNlIHRoaXMgaXMgYSBzeW5jIHJlbmRlciwgd2VcbiAgLy8gd2lsbCBjb21taXQgaXQgZXZlbiBpZiBzb21ldGhpbmcgc3VzcGVuZGVkLlxuXG5cbiAgdmFyIGZpbmlzaGVkV29yayA9IHJvb3QuY3VycmVudC5hbHRlcm5hdGU7XG4gIHJvb3QuZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrO1xuICByb290LmZpbmlzaGVkTGFuZXMgPSBsYW5lcztcbiAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7IC8vIEJlZm9yZSBleGl0aW5nLCBtYWtlIHN1cmUgdGhlcmUncyBhIGNhbGxiYWNrIHNjaGVkdWxlZCBmb3IgdGhlIG5leHRcbiAgLy8gcGVuZGluZyBsZXZlbC5cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmx1c2hSb290KHJvb3QsIGxhbmVzKSB7XG4gIGlmIChsYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIG1lcmdlTGFuZXMobGFuZXMsIFN5bmNMYW5lKSk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcblxuICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpIHtcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gYmF0Y2hlZFVwZGF0ZXMkMShmbiwgYSkge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IEJhdGNoZWRDb250ZXh0O1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKGEpO1xuICB9IGZpbmFsbHkge1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDsgLy8gSWYgdGhlcmUgd2VyZSBsZWdhY3kgc3luYyB1cGRhdGVzLCBmbHVzaCB0aGVtIGF0IHRoZSBlbmQgb2YgdGhlIG91dGVyXG4gICAgLy8gbW9zdCBiYXRjaGVkVXBkYXRlcy1saWtlIG1ldGhvZC5cblxuICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQgJiYgLy8gVHJlYXQgYGFjdGAgYXMgaWYgaXQncyBpbnNpZGUgYGJhdGNoZWRVcGRhdGVzYCwgZXZlbiBpbiBsZWdhY3kgbW9kZS5cbiAgICAhKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmlzQmF0Y2hpbmdMZWdhY3kpKSB7XG4gICAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgICBmbHVzaFN5bmNDYWxsYmFja3NPbmx5SW5MZWdhY3lNb2RlKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaXNjcmV0ZVVwZGF0ZXMoZm4sIGEsIGIsIGMsIGQpIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuXG4gIHRyeSB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcbiAgICByZXR1cm4gZm4oYSwgYiwgYywgZCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuXG4gICAgaWYgKGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCkge1xuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgIH1cbiAgfVxufSAvLyBPdmVybG9hZCB0aGUgZGVmaW5pdGlvbiB0byB0aGUgdHdvIHZhbGlkIHNpZ25hdHVyZXMuXG4vLyBXYXJuaW5nLCB0aGlzIG9wdHMtb3V0IG9mIGNoZWNraW5nIHRoZSBmdW5jdGlvbiBib2R5LlxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG5mdW5jdGlvbiBmbHVzaFN5bmMoZm4pIHtcbiAgLy8gSW4gbGVnYWN5IG1vZGUsIHdlIGZsdXNoIHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlXG4gIC8vIG5leHQgZXZlbnQsIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyBvbmUuXG4gIGlmIChyb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyAhPT0gbnVsbCAmJiByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cy50YWcgPT09IExlZ2FjeVJvb3QgJiYgKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB9XG5cbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBCYXRjaGVkQ29udGV4dDtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuXG4gIHRyeSB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcblxuICAgIGlmIChmbikge1xuICAgICAgcmV0dXJuIGZuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7IC8vIEZsdXNoIHRoZSBpbW1lZGlhdGUgY2FsbGJhY2tzIHRoYXQgd2VyZSBzY2hlZHVsZWQgZHVyaW5nIHRoaXMgYmF0Y2guXG4gICAgLy8gTm90ZSB0aGF0IHRoaXMgd2lsbCBoYXBwZW4gZXZlbiBpZiBiYXRjaGVkVXBkYXRlcyBpcyBoaWdoZXIgdXBcbiAgICAvLyB0aGUgc3RhY2suXG5cbiAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGlzQWxyZWFkeVJlbmRlcmluZygpIHtcbiAgLy8gVXNlZCBieSB0aGUgcmVuZGVyZXIgdG8gcHJpbnQgYSB3YXJuaW5nIGlmIGNlcnRhaW4gQVBJcyBhcmUgY2FsbGVkIGZyb21cbiAgLy8gdGhlIHdyb25nIGNvbnRleHQuXG4gIHJldHVybiAgKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0O1xufVxuZnVuY3Rpb24gcHVzaFJlbmRlckxhbmVzKGZpYmVyLCBsYW5lcykge1xuICBwdXNoKHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvciwgc3VidHJlZVJlbmRlckxhbmVzLCBmaWJlcik7XG4gIHN1YnRyZWVSZW5kZXJMYW5lcyA9IG1lcmdlTGFuZXMoc3VidHJlZVJlbmRlckxhbmVzLCBsYW5lcyk7XG4gIHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMsIGxhbmVzKTtcbn1cbmZ1bmN0aW9uIHBvcFJlbmRlckxhbmVzKGZpYmVyKSB7XG4gIHN1YnRyZWVSZW5kZXJMYW5lcyA9IHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvci5jdXJyZW50O1xuICBwb3Aoc3VidHJlZVJlbmRlckxhbmVzQ3Vyc29yLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGxhbmVzKSB7XG4gIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcbiAgcm9vdC5maW5pc2hlZExhbmVzID0gTm9MYW5lcztcbiAgdmFyIHRpbWVvdXRIYW5kbGUgPSByb290LnRpbWVvdXRIYW5kbGU7XG5cbiAgaWYgKHRpbWVvdXRIYW5kbGUgIT09IG5vVGltZW91dCkge1xuICAgIC8vIFRoZSByb290IHByZXZpb3VzIHN1c3BlbmRlZCBhbmQgc2NoZWR1bGVkIGEgdGltZW91dCB0byBjb21taXQgYSBmYWxsYmFja1xuICAgIC8vIHN0YXRlLiBOb3cgdGhhdCB3ZSBoYXZlIGFkZGl0aW9uYWwgd29yaywgY2FuY2VsIHRoZSB0aW1lb3V0LlxuICAgIHJvb3QudGltZW91dEhhbmRsZSA9IG5vVGltZW91dDsgLy8gJEZsb3dGaXhNZSBDb21wbGFpbnMgbm9UaW1lb3V0IGlzIG5vdCBhIFRpbWVvdXRJRCwgZGVzcGl0ZSB0aGUgY2hlY2sgYWJvdmVcblxuICAgIGNhbmNlbFRpbWVvdXQodGltZW91dEhhbmRsZSk7XG4gIH1cblxuICBpZiAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICB2YXIgaW50ZXJydXB0ZWRXb3JrID0gd29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuXG4gICAgd2hpbGUgKGludGVycnVwdGVkV29yayAhPT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBpbnRlcnJ1cHRlZFdvcmsuYWx0ZXJuYXRlO1xuICAgICAgdW53aW5kSW50ZXJydXB0ZWRXb3JrKGN1cnJlbnQsIGludGVycnVwdGVkV29yayk7XG4gICAgICBpbnRlcnJ1cHRlZFdvcmsgPSBpbnRlcnJ1cHRlZFdvcmsucmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzUm9vdCA9IHJvb3Q7XG4gIHZhciByb290V29ya0luUHJvZ3Jlc3MgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhyb290LmN1cnJlbnQsIG51bGwpO1xuICB3b3JrSW5Qcm9ncmVzcyA9IHJvb3RXb3JrSW5Qcm9ncmVzcztcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBzdWJ0cmVlUmVuZGVyTGFuZXMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gbGFuZXM7XG4gIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290SW5Qcm9ncmVzcztcbiAgd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvciA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID0gTm9MYW5lcztcbiAgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSBudWxsO1xuICBmaW5pc2hRdWV1ZWluZ0NvbmN1cnJlbnRVcGRhdGVzKCk7XG5cbiAge1xuICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmRpc2NhcmRQZW5kaW5nV2FybmluZ3MoKTtcbiAgfVxuXG4gIHJldHVybiByb290V29ya0luUHJvZ3Jlc3M7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKSB7XG4gIGRvIHtcbiAgICB2YXIgZXJyb3JlZFdvcmsgPSB3b3JrSW5Qcm9ncmVzcztcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXNldCBtb2R1bGUtbGV2ZWwgc3RhdGUgdGhhdCB3YXMgc2V0IGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gICAgICByZXNldEhvb2tzQWZ0ZXJUaHJvdygpO1xuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTsgLy8gVE9ETzogSSBmb3VuZCBhbmQgYWRkZWQgdGhpcyBtaXNzaW5nIGxpbmUgd2hpbGUgaW52ZXN0aWdhdGluZyBhXG4gICAgICAvLyBzZXBhcmF0ZSBpc3N1ZS4gV3JpdGUgYSByZWdyZXNzaW9uIHRlc3QgdXNpbmcgc3RyaW5nIHJlZnMuXG5cbiAgICAgIFJlYWN0Q3VycmVudE93bmVyJDIuY3VycmVudCA9IG51bGw7XG5cbiAgICAgIGlmIChlcnJvcmVkV29yayA9PT0gbnVsbCB8fCBlcnJvcmVkV29yay5yZXR1cm4gPT09IG51bGwpIHtcbiAgICAgICAgLy8gRXhwZWN0ZWQgdG8gYmUgd29ya2luZyBvbiBhIG5vbi1yb290IGZpYmVyLiBUaGlzIGlzIGEgZmF0YWwgZXJyb3JcbiAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSdzIG5vIGFuY2VzdG9yIHRoYXQgY2FuIGhhbmRsZSBpdDsgdGhlIHJvb3QgaXNcbiAgICAgICAgLy8gc3VwcG9zZWQgdG8gY2FwdHVyZSBhbGwgZXJyb3JzIHRoYXQgd2VyZW4ndCBjYXVnaHQgYnkgYW4gZXJyb3JcbiAgICAgICAgLy8gYm91bmRhcnkuXG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RmF0YWxFcnJvcmVkO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yID0gdGhyb3duVmFsdWU7IC8vIFNldCBgd29ya0luUHJvZ3Jlc3NgIHRvIG51bGwuIFRoaXMgcmVwcmVzZW50cyBhZHZhbmNpbmcgdG8gdGhlIG5leHRcbiAgICAgICAgLy8gc2libGluZywgb3IgdGhlIHBhcmVudCBpZiB0aGVyZSBhcmUgbm8gc2libGluZ3MuIEJ1dCBzaW5jZSB0aGUgcm9vdFxuICAgICAgICAvLyBoYXMgbm8gc2libGluZ3Mgbm9yIGEgcGFyZW50LCB3ZSBzZXQgaXQgdG8gbnVsbC4gVXN1YWxseSB0aGlzIGlzXG4gICAgICAgIC8vIGhhbmRsZWQgYnkgYGNvbXBsZXRlVW5pdE9mV29ya2Agb3IgYHVud2luZFdvcmtgLCBidXQgc2luY2Ugd2UncmVcbiAgICAgICAgLy8gaW50ZW50aW9uYWxseSBub3QgY2FsbGluZyB0aG9zZSwgd2UgbmVlZCBzZXQgaXQgaGVyZS5cbiAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgY2FsbGluZyBgdW53aW5kV29ya2AgdG8gcG9wIHRoZSBjb250ZXh0cy5cblxuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIgJiYgZXJyb3JlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgIC8vIFJlY29yZCB0aGUgdGltZSBzcGVudCByZW5kZXJpbmcgYmVmb3JlIGFuIGVycm9yIHdhcyB0aHJvd24uIFRoaXNcbiAgICAgICAgLy8gYXZvaWRzIGluYWNjdXJhdGUgUHJvZmlsZXIgZHVyYXRpb25zIGluIHRoZSBjYXNlIG9mIGFcbiAgICAgICAgLy8gc3VzcGVuZGVkIHJlbmRlci5cbiAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShlcnJvcmVkV29yaywgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbmFibGVTY2hlZHVsaW5nUHJvZmlsZXIpIHtcbiAgICAgICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcblxuICAgICAgICBpZiAodGhyb3duVmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHRocm93blZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdGhyb3duVmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhciB3YWtlYWJsZSA9IHRocm93blZhbHVlO1xuICAgICAgICAgIG1hcmtDb21wb25lbnRTdXNwZW5kZWQoZXJyb3JlZFdvcmssIHdha2VhYmxlLCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWFya0NvbXBvbmVudEVycm9yZWQoZXJyb3JlZFdvcmssIHRocm93blZhbHVlLCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3dFeGNlcHRpb24ocm9vdCwgZXJyb3JlZFdvcmsucmV0dXJuLCBlcnJvcmVkV29yaywgdGhyb3duVmFsdWUsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgIGNvbXBsZXRlVW5pdE9mV29yayhlcnJvcmVkV29yayk7XG4gICAgfSBjYXRjaCAoeWV0QW5vdGhlclRocm93blZhbHVlKSB7XG4gICAgICAvLyBTb21ldGhpbmcgaW4gdGhlIHJldHVybiBwYXRoIGFsc28gdGhyZXcuXG4gICAgICB0aHJvd25WYWx1ZSA9IHlldEFub3RoZXJUaHJvd25WYWx1ZTtcblxuICAgICAgaWYgKHdvcmtJblByb2dyZXNzID09PSBlcnJvcmVkV29yayAmJiBlcnJvcmVkV29yayAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiB0aGlzIGJvdW5kYXJ5IGhhcyBhbHJlYWR5IGVycm9yZWQsIHRoZW4gd2UgaGFkIHRyb3VibGUgcHJvY2Vzc2luZ1xuICAgICAgICAvLyB0aGUgZXJyb3IuIEJ1YmJsZSBpdCB0byB0aGUgbmV4dCBib3VuZGFyeS5cbiAgICAgICAgZXJyb3JlZFdvcmsgPSBlcnJvcmVkV29yay5yZXR1cm47XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gZXJyb3JlZFdvcms7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcmVkV29yayA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgfVxuXG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIFJldHVybiB0byB0aGUgbm9ybWFsIHdvcmsgbG9vcC5cblxuXG4gICAgcmV0dXJuO1xuICB9IHdoaWxlICh0cnVlKTtcbn1cblxuZnVuY3Rpb24gcHVzaERpc3BhdGNoZXIoKSB7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMi5jdXJyZW50O1xuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICBpZiAocHJldkRpc3BhdGNoZXIgPT09IG51bGwpIHtcbiAgICAvLyBUaGUgUmVhY3QgaXNvbW9ycGhpYyBwYWNrYWdlIGRvZXMgbm90IGluY2x1ZGUgYSBkZWZhdWx0IGRpc3BhdGNoZXIuXG4gICAgLy8gSW5zdGVhZCB0aGUgZmlyc3QgcmVuZGVyZXIgd2lsbCBsYXppbHkgYXR0YWNoIG9uZSwgaW4gb3JkZXIgdG8gZ2l2ZVxuICAgIC8vIG5pY2VyIGVycm9yIG1lc3NhZ2VzLlxuICAgIHJldHVybiBDb250ZXh0T25seURpc3BhdGNoZXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHByZXZEaXNwYXRjaGVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpIHtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbn1cblxuZnVuY3Rpb24gbWFya0NvbW1pdFRpbWVPZkZhbGxiYWNrKCkge1xuICBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lID0gbm93KCk7XG59XG5mdW5jdGlvbiBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKGxhbmUpIHtcbiAgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzID0gbWVyZ2VMYW5lcyhsYW5lLCB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMpO1xufVxuZnVuY3Rpb24gcmVuZGVyRGlkU3VzcGVuZCgpIHtcbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RTdXNwZW5kZWQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290SW5Qcm9ncmVzcyB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkIHx8IHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXk7XG4gIH0gLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIHVwZGF0ZXMgdGhhdCB3ZSBza2lwcGVkIHRyZWUgdGhhdCBtaWdodCBoYXZlIHVuYmxvY2tlZFxuICAvLyB0aGlzIHJlbmRlci5cblxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgIT09IG51bGwgJiYgKGluY2x1ZGVzTm9uSWRsZVdvcmsod29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzKSB8fCBpbmNsdWRlc05vbklkbGVXb3JrKHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzKSkpIHtcbiAgICAvLyBNYXJrIHRoZSBjdXJyZW50IHJlbmRlciBhcyBzdXNwZW5kZWQgc28gdGhhdCB3ZSBzd2l0Y2ggdG8gd29ya2luZyBvblxuICAgIC8vIHRoZSB1cGRhdGVzIHRoYXQgd2VyZSBza2lwcGVkLiBVc3VhbGx5IHdlIG9ubHkgc3VzcGVuZCBhdCB0aGUgZW5kIG9mXG4gICAgLy8gdGhlIHJlbmRlciBwaGFzZS5cbiAgICAvLyBUT0RPOiBXZSBzaG91bGQgcHJvYmFibHkgYWx3YXlzIG1hcmsgdGhlIHJvb3QgYXMgc3VzcGVuZGVkIGltbWVkaWF0ZWx5XG4gICAgLy8gKGluc2lkZSB0aGlzIGZ1bmN0aW9uKSwgc2luY2UgYnkgc3VzcGVuZGluZyBhdCB0aGUgZW5kIG9mIHRoZSByZW5kZXJcbiAgICAvLyBwaGFzZSBpbnRyb2R1Y2VzIGEgcG90ZW50aWFsIG1pc3Rha2Ugd2hlcmUgd2Ugc3VzcGVuZCBsYW5lcyB0aGF0IHdlcmVcbiAgICAvLyBwaW5nZWQgb3IgdXBkYXRlZCB3aGlsZSB3ZSB3ZXJlIHJlbmRlcmluZy5cbiAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHdvcmtJblByb2dyZXNzUm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICB9XG59XG5mdW5jdGlvbiByZW5kZXJEaWRFcnJvcihlcnJvcikge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyAhPT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RXJyb3JlZDtcbiAgfVxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID09PSBudWxsKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9IFtlcnJvcl07XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycy5wdXNoKGVycm9yKTtcbiAgfVxufSAvLyBDYWxsZWQgZHVyaW5nIHJlbmRlciB0byBkZXRlcm1pbmUgaWYgYW55dGhpbmcgaGFzIHN1c3BlbmRlZC5cbi8vIFJldHVybnMgZmFsc2UgaWYgd2UncmUgbm90IHN1cmUuXG5cbmZ1bmN0aW9uIHJlbmRlckhhc05vdFN1c3BlbmRlZFlldCgpIHtcbiAgLy8gSWYgc29tZXRoaW5nIGVycm9yZWQgb3IgY29tcGxldGVkLCB3ZSBjYW4ndCByZWFsbHkgYmUgc3VyZSxcbiAgLy8gc28gdGhvc2UgYXJlIGZhbHNlLlxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3M7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gUmVuZGVyQ29udGV4dDtcbiAgdmFyIHByZXZEaXNwYXRjaGVyID0gcHVzaERpc3BhdGNoZXIoKTsgLy8gSWYgdGhlIHJvb3Qgb3IgbGFuZXMgaGF2ZSBjaGFuZ2VkLCB0aHJvdyBvdXQgdGhlIGV4aXN0aW5nIHN0YWNrXG4gIC8vIGFuZCBwcmVwYXJlIGEgZnJlc2ggb25lLiBPdGhlcndpc2Ugd2UnbGwgY29udGludWUgd2hlcmUgd2UgbGVmdCBvZmYuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCAhPT0gcm9vdCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gbGFuZXMpIHtcbiAgICB7XG4gICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgdmFyIG1lbW9pemVkVXBkYXRlcnMgPSByb290Lm1lbW9pemVkVXBkYXRlcnM7XG5cbiAgICAgICAgaWYgKG1lbW9pemVkVXBkYXRlcnMuc2l6ZSA+IDApIHtcbiAgICAgICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzLmNsZWFyKCk7XG4gICAgICAgIH0gLy8gQXQgdGhpcyBwb2ludCwgbW92ZSBGaWJlcnMgdGhhdCBzY2hlZHVsZWQgdGhlIHVwY29taW5nIHdvcmsgZnJvbSB0aGUgTWFwIHRvIHRoZSBTZXQuXG4gICAgICAgIC8vIElmIHdlIGJhaWxvdXQgb24gdGhpcyB3b3JrLCB3ZSdsbCBtb3ZlIHRoZW0gYmFjayAobGlrZSBhYm92ZSkuXG4gICAgICAgIC8vIEl0J3MgaW1wb3J0YW50IHRvIG1vdmUgdGhlbSBub3cgaW4gY2FzZSB0aGUgd29yayBzcGF3bnMgbW9yZSB3b3JrIGF0IHRoZSBzYW1lIHByaW9yaXR5IHdpdGggZGlmZmVyZW50IHVwZGF0ZXJzLlxuICAgICAgICAvLyBUaGF0IHdheSB3ZSBjYW4ga2VlcCB0aGUgY3VycmVudCB1cGRhdGUgYW5kIGZ1dHVyZSB1cGRhdGVzIHNlcGFyYXRlLlxuXG5cbiAgICAgICAgbW92ZVBlbmRpbmdGaWJlcnNUb01lbW9pemVkKHJvb3QsIGxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zID0gZ2V0VHJhbnNpdGlvbnNGb3JMYW5lcygpO1xuICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGxhbmVzKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUmVuZGVyU3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICBkbyB7XG4gICAgdHJ5IHtcbiAgICAgIHdvcmtMb29wU3luYygpO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAodGhyb3duVmFsdWUpIHtcbiAgICAgIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKTtcbiAgICB9XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG4gIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgYSBzeW5jIHJlbmRlciwgc28gd2Ugc2hvdWxkIGhhdmUgZmluaXNoZWQgdGhlIHdob2xlIHRyZWUuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29tbWl0IGFuIGluY29tcGxldGUgcm9vdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgJyArICdidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAge1xuICAgIG1hcmtSZW5kZXJTdG9wcGVkKCk7XG4gIH0gLy8gU2V0IHRoaXMgdG8gbnVsbCB0byBpbmRpY2F0ZSB0aGVyZSdzIG5vIGluLXByb2dyZXNzIHJlbmRlci5cblxuXG4gIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXM7XG59IC8vIFRoZSB3b3JrIGxvb3AgaXMgYW4gZXh0cmVtZWx5IGhvdCBwYXRoLiBUZWxsIENsb3N1cmUgbm90IHRvIGlubGluZSBpdC5cblxuLyoqIEBub2lubGluZSAqL1xuXG5cbmZ1bmN0aW9uIHdvcmtMb29wU3luYygpIHtcbiAgLy8gQWxyZWFkeSB0aW1lZCBvdXQsIHNvIHBlcmZvcm0gd29yayB3aXRob3V0IGNoZWNraW5nIGlmIHdlIG5lZWQgdG8geWllbGQuXG4gIHdoaWxlICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuICAgIHBlcmZvcm1Vbml0T2ZXb3JrKHdvcmtJblByb2dyZXNzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW5kZXJSb290Q29uY3VycmVudChyb290LCBsYW5lcykge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IFJlbmRlckNvbnRleHQ7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IHB1c2hEaXNwYXRjaGVyKCk7IC8vIElmIHRoZSByb290IG9yIGxhbmVzIGhhdmUgY2hhbmdlZCwgdGhyb3cgb3V0IHRoZSBleGlzdGluZyBzdGFja1xuICAvLyBhbmQgcHJlcGFyZSBhIGZyZXNoIG9uZS4gT3RoZXJ3aXNlIHdlJ2xsIGNvbnRpbnVlIHdoZXJlIHdlIGxlZnQgb2ZmLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgIT09IHJvb3QgfHwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgIT09IGxhbmVzKSB7XG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuXG4gICAgICAgIGlmIChtZW1vaXplZFVwZGF0ZXJzLnNpemUgPiAwKSB7XG4gICAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycy5jbGVhcigpO1xuICAgICAgICB9IC8vIEF0IHRoaXMgcG9pbnQsIG1vdmUgRmliZXJzIHRoYXQgc2NoZWR1bGVkIHRoZSB1cGNvbWluZyB3b3JrIGZyb20gdGhlIE1hcCB0byB0aGUgU2V0LlxuICAgICAgICAvLyBJZiB3ZSBiYWlsb3V0IG9uIHRoaXMgd29yaywgd2UnbGwgbW92ZSB0aGVtIGJhY2sgKGxpa2UgYWJvdmUpLlxuICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBtb3ZlIHRoZW0gbm93IGluIGNhc2UgdGhlIHdvcmsgc3Bhd25zIG1vcmUgd29yayBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoIGRpZmZlcmVudCB1cGRhdGVycy5cbiAgICAgICAgLy8gVGhhdCB3YXkgd2UgY2FuIGtlZXAgdGhlIGN1cnJlbnQgdXBkYXRlIGFuZCBmdXR1cmUgdXBkYXRlcyBzZXBhcmF0ZS5cblxuXG4gICAgICAgIG1vdmVQZW5kaW5nRmliZXJzVG9NZW1vaXplZChyb290LCBsYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyA9IGdldFRyYW5zaXRpb25zRm9yTGFuZXMoKTtcbiAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgbGFuZXMpO1xuICB9XG5cbiAge1xuICAgIG1hcmtSZW5kZXJTdGFydGVkKGxhbmVzKTtcbiAgfVxuXG4gIGRvIHtcbiAgICB0cnkge1xuICAgICAgd29ya0xvb3BDb25jdXJyZW50KCk7XG4gICAgICBicmVhaztcbiAgICB9IGNhdGNoICh0aHJvd25WYWx1ZSkge1xuICAgICAgaGFuZGxlRXJyb3Iocm9vdCwgdGhyb3duVmFsdWUpO1xuICAgIH1cbiAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpO1xuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG5cblxuICBpZiAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICAvLyBTdGlsbCB3b3JrIHJlbWFpbmluZy5cbiAgICB7XG4gICAgICBtYXJrUmVuZGVyWWllbGRlZCgpO1xuICAgIH1cblxuICAgIHJldHVybiBSb290SW5Qcm9ncmVzcztcbiAgfSBlbHNlIHtcbiAgICAvLyBDb21wbGV0ZWQgdGhlIHRyZWUuXG4gICAge1xuICAgICAgbWFya1JlbmRlclN0b3BwZWQoKTtcbiAgICB9IC8vIFNldCB0aGlzIHRvIG51bGwgdG8gaW5kaWNhdGUgdGhlcmUncyBubyBpbi1wcm9ncmVzcyByZW5kZXIuXG5cblxuICAgIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzOyAvLyBSZXR1cm4gdGhlIGZpbmFsIGV4aXQgc3RhdHVzLlxuXG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXM7XG4gIH1cbn1cbi8qKiBAbm9pbmxpbmUgKi9cblxuXG5mdW5jdGlvbiB3b3JrTG9vcENvbmN1cnJlbnQoKSB7XG4gIC8vIFBlcmZvcm0gd29yayB1bnRpbCBTY2hlZHVsZXIgYXNrcyB1cyB0byB5aWVsZFxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwgJiYgIXNob3VsZFlpZWxkKCkpIHtcbiAgICBwZXJmb3JtVW5pdE9mV29yayh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGVyZm9ybVVuaXRPZldvcmsodW5pdE9mV29yaykge1xuICAvLyBUaGUgY3VycmVudCwgZmx1c2hlZCwgc3RhdGUgb2YgdGhpcyBmaWJlciBpcyB0aGUgYWx0ZXJuYXRlLiBJZGVhbGx5XG4gIC8vIG5vdGhpbmcgc2hvdWxkIHJlbHkgb24gdGhpcywgYnV0IHJlbHlpbmcgb24gaXQgaGVyZSBtZWFucyB0aGF0IHdlIGRvbid0XG4gIC8vIG5lZWQgYW4gYWRkaXRpb25hbCBmaWVsZCBvbiB0aGUgd29yayBpbiBwcm9ncmVzcy5cbiAgdmFyIGN1cnJlbnQgPSB1bml0T2ZXb3JrLmFsdGVybmF0ZTtcbiAgc2V0Q3VycmVudEZpYmVyKHVuaXRPZldvcmspO1xuICB2YXIgbmV4dDtcblxuICBpZiAoICh1bml0T2ZXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIHN0YXJ0UHJvZmlsZXJUaW1lcih1bml0T2ZXb3JrKTtcbiAgICBuZXh0ID0gYmVnaW5Xb3JrJDEoY3VycmVudCwgdW5pdE9mV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKHVuaXRPZldvcmssIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIG5leHQgPSBiZWdpbldvcmskMShjdXJyZW50LCB1bml0T2ZXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgdW5pdE9mV29yay5tZW1vaXplZFByb3BzID0gdW5pdE9mV29yay5wZW5kaW5nUHJvcHM7XG5cbiAgaWYgKG5leHQgPT09IG51bGwpIHtcbiAgICAvLyBJZiB0aGlzIGRvZXNuJ3Qgc3Bhd24gbmV3IHdvcmssIGNvbXBsZXRlIHRoZSBjdXJyZW50IHdvcmsuXG4gICAgY29tcGxldGVVbml0T2ZXb3JrKHVuaXRPZldvcmspO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzID0gbmV4dDtcbiAgfVxuXG4gIFJlYWN0Q3VycmVudE93bmVyJDIuY3VycmVudCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbXBsZXRlVW5pdE9mV29yayh1bml0T2ZXb3JrKSB7XG4gIC8vIEF0dGVtcHQgdG8gY29tcGxldGUgdGhlIGN1cnJlbnQgdW5pdCBvZiB3b3JrLCB0aGVuIG1vdmUgdG8gdGhlIG5leHRcbiAgLy8gc2libGluZy4gSWYgdGhlcmUgYXJlIG5vIG1vcmUgc2libGluZ3MsIHJldHVybiB0byB0aGUgcGFyZW50IGZpYmVyLlxuICB2YXIgY29tcGxldGVkV29yayA9IHVuaXRPZldvcms7XG5cbiAgZG8ge1xuICAgIC8vIFRoZSBjdXJyZW50LCBmbHVzaGVkLCBzdGF0ZSBvZiB0aGlzIGZpYmVyIGlzIHRoZSBhbHRlcm5hdGUuIElkZWFsbHlcbiAgICAvLyBub3RoaW5nIHNob3VsZCByZWx5IG9uIHRoaXMsIGJ1dCByZWx5aW5nIG9uIGl0IGhlcmUgbWVhbnMgdGhhdCB3ZSBkb24ndFxuICAgIC8vIG5lZWQgYW4gYWRkaXRpb25hbCBmaWVsZCBvbiB0aGUgd29yayBpbiBwcm9ncmVzcy5cbiAgICB2YXIgY3VycmVudCA9IGNvbXBsZXRlZFdvcmsuYWx0ZXJuYXRlO1xuICAgIHZhciByZXR1cm5GaWJlciA9IGNvbXBsZXRlZFdvcmsucmV0dXJuOyAvLyBDaGVjayBpZiB0aGUgd29yayBjb21wbGV0ZWQgb3IgaWYgc29tZXRoaW5nIHRocmV3LlxuXG4gICAgaWYgKChjb21wbGV0ZWRXb3JrLmZsYWdzICYgSW5jb21wbGV0ZSkgPT09IE5vRmxhZ3MpIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihjb21wbGV0ZWRXb3JrKTtcbiAgICAgIHZhciBuZXh0ID0gdm9pZCAwO1xuXG4gICAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICBuZXh0ID0gY29tcGxldGVXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydFByb2ZpbGVyVGltZXIoY29tcGxldGVkV29yayk7XG4gICAgICAgIG5leHQgPSBjb21wbGV0ZVdvcmsoY3VycmVudCwgY29tcGxldGVkV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTsgLy8gVXBkYXRlIHJlbmRlciBkdXJhdGlvbiBhc3N1bWluZyB3ZSBkaWRuJ3QgZXJyb3IuXG5cbiAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShjb21wbGV0ZWRXb3JrLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG5cbiAgICAgIGlmIChuZXh0ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIENvbXBsZXRpbmcgdGhpcyBmaWJlciBzcGF3bmVkIG5ldyB3b3JrLiBXb3JrIG9uIHRoYXQgbmV4dC5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBuZXh0O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgZmliZXIgZGlkIG5vdCBjb21wbGV0ZSBiZWNhdXNlIHNvbWV0aGluZyB0aHJldy4gUG9wIHZhbHVlcyBvZmZcbiAgICAgIC8vIHRoZSBzdGFjayB3aXRob3V0IGVudGVyaW5nIHRoZSBjb21wbGV0ZSBwaGFzZS4gSWYgdGhpcyBpcyBhIGJvdW5kYXJ5LFxuICAgICAgLy8gY2FwdHVyZSB2YWx1ZXMgaWYgcG9zc2libGUuXG4gICAgICB2YXIgX25leHQgPSB1bndpbmRXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmspOyAvLyBCZWNhdXNlIHRoaXMgZmliZXIgZGlkIG5vdCBjb21wbGV0ZSwgZG9uJ3QgcmVzZXQgaXRzIGxhbmVzLlxuXG5cbiAgICAgIGlmIChfbmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiBjb21wbGV0aW5nIHRoaXMgd29yayBzcGF3bmVkIG5ldyB3b3JrLCBkbyB0aGF0IG5leHQuIFdlJ2xsIGNvbWVcbiAgICAgICAgLy8gYmFjayBoZXJlIGFnYWluLlxuICAgICAgICAvLyBTaW5jZSB3ZSdyZSByZXN0YXJ0aW5nLCByZW1vdmUgYW55dGhpbmcgdGhhdCBpcyBub3QgYSBob3N0IGVmZmVjdFxuICAgICAgICAvLyBmcm9tIHRoZSBlZmZlY3QgdGFnLlxuICAgICAgICBfbmV4dC5mbGFncyAmPSBIb3N0RWZmZWN0TWFzaztcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBfbmV4dDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAvLyBSZWNvcmQgdGhlIHJlbmRlciBkdXJhdGlvbiBmb3IgdGhlIGZpYmVyIHRoYXQgZXJyb3JlZC5cbiAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShjb21wbGV0ZWRXb3JrLCBmYWxzZSk7IC8vIEluY2x1ZGUgdGhlIHRpbWUgc3BlbnQgd29ya2luZyBvbiBmYWlsZWQgY2hpbGRyZW4gYmVmb3JlIGNvbnRpbnVpbmcuXG5cbiAgICAgICAgdmFyIGFjdHVhbER1cmF0aW9uID0gY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbjtcbiAgICAgICAgdmFyIGNoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICBhY3R1YWxEdXJhdGlvbiArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbjtcbiAgICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uID0gYWN0dWFsRHVyYXRpb247XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAvLyBNYXJrIHRoZSBwYXJlbnQgZmliZXIgYXMgaW5jb21wbGV0ZSBhbmQgY2xlYXIgaXRzIHN1YnRyZWUgZmxhZ3MuXG4gICAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IEluY29tcGxldGU7XG4gICAgICAgIHJldHVybkZpYmVyLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXZSd2ZSB1bndvdW5kIGFsbCB0aGUgd2F5IHRvIHRoZSByb290LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdERpZE5vdENvbXBsZXRlO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc2libGluZ0ZpYmVyID0gY29tcGxldGVkV29yay5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmdGaWJlciAhPT0gbnVsbCkge1xuICAgICAgLy8gSWYgdGhlcmUgaXMgbW9yZSB3b3JrIHRvIGRvIGluIHRoaXMgcmV0dXJuRmliZXIsIGRvIHRoYXQgbmV4dC5cbiAgICAgIHdvcmtJblByb2dyZXNzID0gc2libGluZ0ZpYmVyO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gT3RoZXJ3aXNlLCByZXR1cm4gdG8gdGhlIHBhcmVudFxuXG5cbiAgICBjb21wbGV0ZWRXb3JrID0gcmV0dXJuRmliZXI7IC8vIFVwZGF0ZSB0aGUgbmV4dCB0aGluZyB3ZSdyZSB3b3JraW5nIG9uIGluIGNhc2Ugc29tZXRoaW5nIHRocm93cy5cblxuICAgIHdvcmtJblByb2dyZXNzID0gY29tcGxldGVkV29yaztcbiAgfSB3aGlsZSAoY29tcGxldGVkV29yayAhPT0gbnVsbCk7IC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIHJvb3QuXG5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3MpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdENvbXBsZXRlZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRSb290KHJvb3QsIHJlY292ZXJhYmxlRXJyb3JzLCB0cmFuc2l0aW9ucykge1xuICAvLyBUT0RPOiBUaGlzIG5vIGxvbmdlciBtYWtlcyBhbnkgc2Vuc2UuIFdlIGFscmVhZHkgd3JhcCB0aGUgbXV0YXRpb24gYW5kXG4gIC8vIGxheW91dCBwaGFzZXMuIFNob3VsZCBiZSBhYmxlIHRvIHJlbW92ZS5cbiAgdmFyIHByZXZpb3VzVXBkYXRlTGFuZVByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcblxuICB0cnkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgY29tbWl0Um9vdEltcGwocm9vdCwgcmVjb3ZlcmFibGVFcnJvcnMsIHRyYW5zaXRpb25zLCBwcmV2aW91c1VwZGF0ZUxhbmVQcmlvcml0eSk7XG4gIH0gZmluYWxseSB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzVXBkYXRlTGFuZVByaW9yaXR5KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21taXRSb290SW1wbChyb290LCByZWNvdmVyYWJsZUVycm9ycywgdHJhbnNpdGlvbnMsIHJlbmRlclByaW9yaXR5TGV2ZWwpIHtcbiAgZG8ge1xuICAgIC8vIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCB3aWxsIGNhbGwgYGZsdXNoU3luY1VwZGF0ZVF1ZXVlYCBhdCB0aGUgZW5kLCB3aGljaFxuICAgIC8vIG1lYW5zIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCB3aWxsIHNvbWV0aW1lcyByZXN1bHQgaW4gYWRkaXRpb25hbFxuICAgIC8vIHBhc3NpdmUgZWZmZWN0cy4gU28gd2UgbmVlZCB0byBrZWVwIGZsdXNoaW5nIGluIGEgbG9vcCB1bnRpbCB0aGVyZSBhcmVcbiAgICAvLyBubyBtb3JlIHBlbmRpbmcgZWZmZWN0cy5cbiAgICAvLyBUT0RPOiBNaWdodCBiZSBiZXR0ZXIgaWYgYGZsdXNoUGFzc2l2ZUVmZmVjdHNgIGRpZCBub3QgYXV0b21hdGljYWxseVxuICAgIC8vIGZsdXNoIHN5bmNocm9ub3VzIHdvcmsgYXQgdGhlIGVuZCwgdG8gYXZvaWQgZmFjdG9yaW5nIGhhemFyZHMgbGlrZSB0aGlzLlxuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgfSB3aGlsZSAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgIT09IG51bGwpO1xuXG4gIGZsdXNoUmVuZGVyUGhhc2VTdHJpY3RNb2RlV2FybmluZ3NJbkRFVigpO1xuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBub3QgYWxyZWFkeSBiZSB3b3JraW5nLicpO1xuICB9XG5cbiAgdmFyIGZpbmlzaGVkV29yayA9IHJvb3QuZmluaXNoZWRXb3JrO1xuICB2YXIgbGFuZXMgPSByb290LmZpbmlzaGVkTGFuZXM7XG5cbiAge1xuICAgIG1hcmtDb21taXRTdGFydGVkKGxhbmVzKTtcbiAgfVxuXG4gIGlmIChmaW5pc2hlZFdvcmsgPT09IG51bGwpIHtcblxuICAgIHtcbiAgICAgIG1hcmtDb21taXRTdG9wcGVkKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgaWYgKGxhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgICAgIGVycm9yKCdyb290LmZpbmlzaGVkTGFuZXMgc2hvdWxkIG5vdCBiZSBlbXB0eSBkdXJpbmcgYSBjb21taXQuIFRoaXMgaXMgYSAnICsgJ2J1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByb290LmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IE5vTGFuZXM7XG5cbiAgaWYgKGZpbmlzaGVkV29yayA9PT0gcm9vdC5jdXJyZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29tbWl0IHRoZSBzYW1lIHRyZWUgYXMgYmVmb3JlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgJyArICdhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH0gLy8gY29tbWl0Um9vdCBuZXZlciByZXR1cm5zIGEgY29udGludWF0aW9uOyBpdCBhbHdheXMgZmluaXNoZXMgc3luY2hyb25vdXNseS5cbiAgLy8gU28gd2UgY2FuIGNsZWFyIHRoZXNlIG5vdyB0byBhbGxvdyBhIG5ldyBjYWxsYmFjayB0byBiZSBzY2hlZHVsZWQuXG5cblxuICByb290LmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZTsgLy8gVXBkYXRlIHRoZSBmaXJzdCBhbmQgbGFzdCBwZW5kaW5nIHRpbWVzIG9uIHRoaXMgcm9vdC4gVGhlIG5ldyBmaXJzdFxuICAvLyBwZW5kaW5nIHRpbWUgaXMgd2hhdGV2ZXIgaXMgbGVmdCBvbiB0aGUgcm9vdCBmaWJlci5cblxuICB2YXIgcmVtYWluaW5nTGFuZXMgPSBtZXJnZUxhbmVzKGZpbmlzaGVkV29yay5sYW5lcywgZmluaXNoZWRXb3JrLmNoaWxkTGFuZXMpO1xuICBtYXJrUm9vdEZpbmlzaGVkKHJvb3QsIHJlbWFpbmluZ0xhbmVzKTtcblxuICBpZiAocm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290KSB7XG4gICAgLy8gV2UgY2FuIHJlc2V0IHRoZXNlIG5vdyB0aGF0IHRoZXkgYXJlIGZpbmlzaGVkLlxuICAgIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgfSAvLyBJZiB0aGVyZSBhcmUgcGVuZGluZyBwYXNzaXZlIGVmZmVjdHMsIHNjaGVkdWxlIGEgY2FsbGJhY2sgdG8gcHJvY2VzcyB0aGVtLlxuICAvLyBEbyB0aGlzIGFzIGVhcmx5IGFzIHBvc3NpYmxlLCBzbyBpdCBpcyBxdWV1ZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UgdGhhdFxuICAvLyBtaWdodCBnZXQgc2NoZWR1bGVkIGluIHRoZSBjb21taXQgcGhhc2UuIChTZWUgIzE2NzE0LilcbiAgLy8gVE9ETzogRGVsZXRlIGFsbCBvdGhlciBwbGFjZXMgdGhhdCBzY2hlZHVsZSB0aGUgcGFzc2l2ZSBlZmZlY3QgY2FsbGJhY2tcbiAgLy8gVGhleSdyZSByZWR1bmRhbnQuXG5cblxuICBpZiAoKGZpbmlzaGVkV29yay5zdWJ0cmVlRmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MgfHwgKGZpbmlzaGVkV29yay5mbGFncyAmIFBhc3NpdmVNYXNrKSAhPT0gTm9GbGFncykge1xuICAgIGlmICghcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICAgIC8vIHRvIHN0b3JlIGl0IGluIHBlbmRpbmdQYXNzaXZlVHJhbnNpdGlvbnMgdW50aWwgdGhleSBnZXQgcHJvY2Vzc2VkXG4gICAgICAvLyBXZSBuZWVkIHRvIHBhc3MgdGhpcyB0aHJvdWdoIGFzIGFuIGFyZ3VtZW50IHRvIGNvbW1pdFJvb3RcbiAgICAgIC8vIGJlY2F1c2Ugd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyBtaWdodCBoYXZlIGNoYW5nZWQgYmV0d2VlblxuICAgICAgLy8gdGhlIHByZXZpb3VzIHJlbmRlciBhbmQgY29tbWl0IGlmIHdlIHRocm90dGxlIHRoZSBjb21taXRcbiAgICAgIC8vIHdpdGggc2V0VGltZW91dFxuXG4gICAgICBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gdHJhbnNpdGlvbnM7XG4gICAgICBzY2hlZHVsZUNhbGxiYWNrJDEoTm9ybWFsUHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpOyAvLyBUaGlzIHJlbmRlciB0cmlnZ2VyZWQgcGFzc2l2ZSBlZmZlY3RzOiByZWxlYXNlIHRoZSByb290IGNhY2hlIHBvb2xcbiAgICAgICAgLy8gKmFmdGVyKiBwYXNzaXZlIGVmZmVjdHMgZmlyZSB0byBhdm9pZCBmcmVlaW5nIGEgY2FjaGUgcG9vbCB0aGF0IG1heVxuICAgICAgICAvLyBiZSByZWZlcmVuY2VkIGJ5IGEgbm9kZSBpbiB0aGUgdHJlZSAoSG9zdFJvb3QsIENhY2hlIGJvdW5kYXJ5IGV0YylcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGVmZmVjdHMgaW4gdGhlIHdob2xlIHRyZWUuXG4gIC8vIFRPRE86IFRoaXMgaXMgbGVmdCBvdmVyIGZyb20gdGhlIGVmZmVjdCBsaXN0IGltcGxlbWVudGF0aW9uLCB3aGVyZSB3ZSBoYWRcbiAgLy8gdG8gY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYGZpcnN0RWZmZWN0YCB0byBzYXRpc2Z5IEZsb3cuIEkgdGhpbmsgdGhlXG4gIC8vIG9ubHkgb3RoZXIgcmVhc29uIHRoaXMgb3B0aW1pemF0aW9uIGV4aXN0cyBpcyBiZWNhdXNlIGl0IGFmZmVjdHMgcHJvZmlsaW5nLlxuICAvLyBSZWNvbnNpZGVyIHdoZXRoZXIgdGhpcyBpcyBuZWNlc3NhcnkuXG5cblxuICB2YXIgc3VidHJlZUhhc0VmZmVjdHMgPSAoZmluaXNoZWRXb3JrLnN1YnRyZWVGbGFncyAmIChCZWZvcmVNdXRhdGlvbk1hc2sgfCBNdXRhdGlvbk1hc2sgfCBMYXlvdXRNYXNrIHwgUGFzc2l2ZU1hc2spKSAhPT0gTm9GbGFncztcbiAgdmFyIHJvb3RIYXNFZmZlY3QgPSAoZmluaXNoZWRXb3JrLmZsYWdzICYgKEJlZm9yZU11dGF0aW9uTWFzayB8IE11dGF0aW9uTWFzayB8IExheW91dE1hc2sgfCBQYXNzaXZlTWFzaykpICE9PSBOb0ZsYWdzO1xuXG4gIGlmIChzdWJ0cmVlSGFzRWZmZWN0cyB8fCByb290SGFzRWZmZWN0KSB7XG4gICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcbiAgICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgfD0gQ29tbWl0Q29udGV4dDsgLy8gUmVzZXQgdGhpcyB0byBudWxsIGJlZm9yZSBjYWxsaW5nIGxpZmVjeWNsZXNcblxuICAgIFJlYWN0Q3VycmVudE93bmVyJDIuY3VycmVudCA9IG51bGw7IC8vIFRoZSBjb21taXQgcGhhc2UgaXMgYnJva2VuIGludG8gc2V2ZXJhbCBzdWItcGhhc2VzLiBXZSBkbyBhIHNlcGFyYXRlIHBhc3NcbiAgICAvLyBvZiB0aGUgZWZmZWN0IGxpc3QgZm9yIGVhY2ggcGhhc2U6IGFsbCBtdXRhdGlvbiBlZmZlY3RzIGNvbWUgYmVmb3JlIGFsbFxuICAgIC8vIGxheW91dCBlZmZlY3RzLCBhbmQgc28gb24uXG4gICAgLy8gVGhlIGZpcnN0IHBoYXNlIGEgXCJiZWZvcmUgbXV0YXRpb25cIiBwaGFzZS4gV2UgdXNlIHRoaXMgcGhhc2UgdG8gcmVhZCB0aGVcbiAgICAvLyBzdGF0ZSBvZiB0aGUgaG9zdCB0cmVlIHJpZ2h0IGJlZm9yZSB3ZSBtdXRhdGUgaXQuIFRoaXMgaXMgd2hlcmVcbiAgICAvLyBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSBpcyBjYWxsZWQuXG5cbiAgICB2YXIgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG5cbiAgICB7XG4gICAgICAvLyBNYXJrIHRoZSBjdXJyZW50IGNvbW1pdCB0aW1lIHRvIGJlIHNoYXJlZCBieSBhbGwgUHJvZmlsZXJzIGluIHRoaXNcbiAgICAgIC8vIGJhdGNoLiBUaGlzIGVuYWJsZXMgdGhlbSB0byBiZSBncm91cGVkIGxhdGVyLlxuICAgICAgcmVjb3JkQ29tbWl0VGltZSgpO1xuICAgIH1cblxuXG4gICAgY29tbWl0TXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgbGFuZXMpO1xuXG4gICAgcmVzZXRBZnRlckNvbW1pdChyb290LmNvbnRhaW5lckluZm8pOyAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyB0cmVlIGlzIG5vdyB0aGUgY3VycmVudCB0cmVlLiBUaGlzIG11c3QgY29tZSBhZnRlclxuICAgIC8vIHRoZSBtdXRhdGlvbiBwaGFzZSwgc28gdGhhdCB0aGUgcHJldmlvdXMgdHJlZSBpcyBzdGlsbCBjdXJyZW50IGR1cmluZ1xuICAgIC8vIGNvbXBvbmVudFdpbGxVbm1vdW50LCBidXQgYmVmb3JlIHRoZSBsYXlvdXQgcGhhc2UsIHNvIHRoYXQgdGhlIGZpbmlzaGVkXG4gICAgLy8gd29yayBpcyBjdXJyZW50IGR1cmluZyBjb21wb25lbnREaWRNb3VudC9VcGRhdGUuXG5cbiAgICByb290LmN1cnJlbnQgPSBmaW5pc2hlZFdvcms7IC8vIFRoZSBuZXh0IHBoYXNlIGlzIHRoZSBsYXlvdXQgcGhhc2UsIHdoZXJlIHdlIGNhbGwgZWZmZWN0cyB0aGF0IHJlYWRcblxuICAgIHtcbiAgICAgIG1hcmtMYXlvdXRFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gICAgfVxuXG4gICAgY29tbWl0TGF5b3V0RWZmZWN0cyhmaW5pc2hlZFdvcmssIHJvb3QsIGxhbmVzKTtcblxuICAgIHtcbiAgICAgIG1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCgpO1xuICAgIH1cbiAgICAvLyBvcHBvcnR1bml0eSB0byBwYWludC5cblxuXG4gICAgcmVxdWVzdFBhaW50KCk7XG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0OyAvLyBSZXNldCB0aGUgcHJpb3JpdHkgdG8gdGhlIHByZXZpb3VzIG5vbi1zeW5jIHZhbHVlLlxuXG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICB9IGVsc2Uge1xuICAgIC8vIE5vIGVmZmVjdHMuXG4gICAgcm9vdC5jdXJyZW50ID0gZmluaXNoZWRXb3JrOyAvLyBNZWFzdXJlIHRoZXNlIGFueXdheSBzbyB0aGUgZmxhbWVncmFwaCBleHBsaWNpdGx5IHNob3dzIHRoYXQgdGhlcmUgd2VyZVxuICAgIC8vIG5vIGVmZmVjdHMuXG4gICAgLy8gVE9ETzogTWF5YmUgdGhlcmUncyBhIGJldHRlciB3YXkgdG8gcmVwb3J0IHRoaXMuXG5cbiAgICB7XG4gICAgICByZWNvcmRDb21taXRUaW1lKCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3REaWRIYXZlUGFzc2l2ZUVmZmVjdHMgPSByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cztcblxuICBpZiAocm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAvLyBUaGlzIGNvbW1pdCBoYXMgcGFzc2l2ZSBlZmZlY3RzLiBTdGFzaCBhIHJlZmVyZW5jZSB0byB0aGVtLiBCdXQgZG9uJ3RcbiAgICAvLyBzY2hlZHVsZSBhIGNhbGxiYWNrIHVudGlsIGFmdGVyIGZsdXNoaW5nIGxheW91dCB3b3JrLlxuICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gICAgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSByb290O1xuICAgIHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzID0gbGFuZXM7XG4gIH0gZWxzZSB7XG5cbiAgICB7XG4gICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xuICAgICAgcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IG51bGw7XG4gICAgfVxuICB9IC8vIFJlYWQgdGhpcyBhZ2Fpbiwgc2luY2UgYW4gZWZmZWN0IG1pZ2h0IGhhdmUgdXBkYXRlZCBpdFxuXG5cbiAgcmVtYWluaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lczsgLy8gQ2hlY2sgaWYgdGhlcmUncyByZW1haW5pbmcgd29yayBvbiB0aGlzIHJvb3RcbiAgLy8gVE9ETzogVGhpcyBpcyBwYXJ0IG9mIHRoZSBgY29tcG9uZW50RGlkQ2F0Y2hgIGltcGxlbWVudGF0aW9uLiBJdHMgcHVycG9zZVxuICAvLyBpcyB0byBkZXRlY3Qgd2hldGhlciBzb21ldGhpbmcgbWlnaHQgaGF2ZSBjYWxsZWQgc2V0U3RhdGUgaW5zaWRlXG4gIC8vIGBjb21wb25lbnREaWRDYXRjaGAuIFRoZSBtZWNoYW5pc20gaXMga25vd24gdG8gYmUgZmxhd2VkIGJlY2F1c2UgYHNldFN0YXRlYFxuICAvLyBpbnNpZGUgYGNvbXBvbmVudERpZENhdGNoYCBpcyBpdHNlbGYgZmxhd2VkIOKAlCB0aGF0J3Mgd2h5IHdlIHJlY29tbWVuZFxuICAvLyBgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yYCBpbnN0ZWFkLiBIb3dldmVyLCBpdCBjb3VsZCBiZSBpbXByb3ZlZCBieVxuICAvLyBjaGVja2luZyBpZiByZW1haW5pbmdMYW5lcyBpbmNsdWRlcyBTeW5jIHdvcmssIGluc3RlYWQgb2Ygd2hldGhlciB0aGVyZSdzXG4gIC8vIGFueSB3b3JrIHJlbWFpbmluZyBhdCBhbGwgKHdoaWNoIHdvdWxkIGFsc28gaW5jbHVkZSBzdHVmZiBsaWtlIFN1c3BlbnNlXG4gIC8vIHJldHJpZXMgb3IgdHJhbnNpdGlvbnMpLiBJdCdzIGJlZW4gbGlrZSB0aGlzIGZvciBhIHdoaWxlLCB0aG91Z2gsIHNvIGZpeGluZ1xuICAvLyBpdCBwcm9iYWJseSBpc24ndCB0aGF0IHVyZ2VudC5cblxuICBpZiAocmVtYWluaW5nTGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBJZiB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLCB3ZSBjYW4gY2xlYXIgdGhlIHNldCBvZiBhbHJlYWR5IGZhaWxlZFxuICAgIC8vIGVycm9yIGJvdW5kYXJpZXMuXG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICghcm9vdERpZEhhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgICAgY29tbWl0RG91YmxlSW52b2tlRWZmZWN0c0luREVWKHJvb3QuY3VycmVudCwgZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ29tbWl0Um9vdChmaW5pc2hlZFdvcmsuc3RhdGVOb2RlLCByZW5kZXJQcmlvcml0eUxldmVsKTtcblxuICB7XG4gICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICByb290Lm1lbW9pemVkVXBkYXRlcnMuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgb25Db21taXRSb290JDEoKTtcbiAgfSAvLyBBbHdheXMgY2FsbCB0aGlzIGJlZm9yZSBleGl0aW5nIGBjb21taXRSb290YCwgdG8gZW5zdXJlIHRoYXQgYW55XG4gIC8vIGFkZGl0aW9uYWwgd29yayBvbiB0aGlzIHJvb3QgaXMgc2NoZWR1bGVkLlxuXG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcblxuICBpZiAocmVjb3ZlcmFibGVFcnJvcnMgIT09IG51bGwpIHtcbiAgICAvLyBUaGVyZSB3ZXJlIGVycm9ycyBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCByZWNvdmVyZWQgZnJvbSB0aGVtIHdpdGhvdXRcbiAgICAvLyBuZWVkaW5nIHRvIHN1cmZhY2UgaXQgdG8gdGhlIFVJLiBXZSBsb2cgdGhlbSBoZXJlLlxuICAgIHZhciBvblJlY292ZXJhYmxlRXJyb3IgPSByb290Lm9uUmVjb3ZlcmFibGVFcnJvcjtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVjb3ZlcmFibGVFcnJvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByZWNvdmVyYWJsZUVycm9yID0gcmVjb3ZlcmFibGVFcnJvcnNbaV07XG4gICAgICB2YXIgY29tcG9uZW50U3RhY2sgPSByZWNvdmVyYWJsZUVycm9yLnN0YWNrO1xuICAgICAgdmFyIGRpZ2VzdCA9IHJlY292ZXJhYmxlRXJyb3IuZGlnZXN0O1xuICAgICAgb25SZWNvdmVyYWJsZUVycm9yKHJlY292ZXJhYmxlRXJyb3IudmFsdWUsIHtcbiAgICAgICAgY29tcG9uZW50U3RhY2s6IGNvbXBvbmVudFN0YWNrLFxuICAgICAgICBkaWdlc3Q6IGRpZ2VzdFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGhhc1VuY2F1Z2h0RXJyb3IpIHtcbiAgICBoYXNVbmNhdWdodEVycm9yID0gZmFsc2U7XG4gICAgdmFyIGVycm9yJDEgPSBmaXJzdFVuY2F1Z2h0RXJyb3I7XG4gICAgZmlyc3RVbmNhdWdodEVycm9yID0gbnVsbDtcbiAgICB0aHJvdyBlcnJvciQxO1xuICB9IC8vIElmIHRoZSBwYXNzaXZlIGVmZmVjdHMgYXJlIHRoZSByZXN1bHQgb2YgYSBkaXNjcmV0ZSByZW5kZXIsIGZsdXNoIHRoZW1cbiAgLy8gc3luY2hyb25vdXNseSBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHRhc2sgc28gdGhhdCB0aGUgcmVzdWx0IGlzXG4gIC8vIGltbWVkaWF0ZWx5IG9ic2VydmFibGUuIE90aGVyd2lzZSwgd2UgYXNzdW1lIHRoYXQgdGhleSBhcmUgbm90XG4gIC8vIG9yZGVyLWRlcGVuZGVudCBhbmQgZG8gbm90IG5lZWQgdG8gYmUgb2JzZXJ2ZWQgYnkgZXh0ZXJuYWwgc3lzdGVtcywgc28gd2VcbiAgLy8gY2FuIHdhaXQgdW50aWwgYWZ0ZXIgcGFpbnQuXG4gIC8vIFRPRE86IFdlIGNhbiBvcHRpbWl6ZSB0aGlzIGJ5IG5vdCBzY2hlZHVsaW5nIHRoZSBjYWxsYmFjayBlYXJsaWVyLiBTaW5jZSB3ZVxuICAvLyBjdXJyZW50bHkgc2NoZWR1bGUgdGhlIGNhbGxiYWNrIGluIG11bHRpcGxlIHBsYWNlcywgd2lsbCB3YWl0IHVudGlsIHRob3NlXG4gIC8vIGFyZSBjb25zb2xpZGF0ZWQuXG5cblxuICBpZiAoaW5jbHVkZXNTb21lTGFuZShwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcywgU3luY0xhbmUpICYmIHJvb3QudGFnICE9PSBMZWdhY3lSb290KSB7XG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB9IC8vIFJlYWQgdGhpcyBhZ2Fpbiwgc2luY2UgYSBwYXNzaXZlIGVmZmVjdCBtaWdodCBoYXZlIHVwZGF0ZWQgaXRcblxuXG4gIHJlbWFpbmluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7XG5cbiAgaWYgKGluY2x1ZGVzU29tZUxhbmUocmVtYWluaW5nTGFuZXMsIFN5bmNMYW5lKSkge1xuICAgIHtcbiAgICAgIG1hcmtOZXN0ZWRVcGRhdGVTY2hlZHVsZWQoKTtcbiAgICB9IC8vIENvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHJvb3Qgc3luY2hyb25vdXNseSByZS1yZW5kZXJzIHdpdGhvdXRcbiAgICAvLyBmaW5pc2hpbmcuIElmIHRoZXJlIGFyZSB0b28gbWFueSwgaXQgaW5kaWNhdGVzIGFuIGluZmluaXRlIHVwZGF0ZSBsb29wLlxuXG5cbiAgICBpZiAocm9vdCA9PT0gcm9vdFdpdGhOZXN0ZWRVcGRhdGVzKSB7XG4gICAgICBuZXN0ZWRVcGRhdGVDb3VudCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gICAgICByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSByb290O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gIH0gLy8gSWYgbGF5b3V0IHdvcmsgd2FzIHNjaGVkdWxlZCwgZmx1c2ggaXQgbm93LlxuXG5cbiAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG5cbiAge1xuICAgIG1hcmtDb21taXRTdG9wcGVkKCk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmx1c2hQYXNzaXZlRWZmZWN0cygpIHtcbiAgLy8gUmV0dXJucyB3aGV0aGVyIHBhc3NpdmUgZWZmZWN0cyB3ZXJlIGZsdXNoZWQuXG4gIC8vIFRPRE86IENvbWJpbmUgdGhpcyBjaGVjayB3aXRoIHRoZSBvbmUgaW4gZmx1c2hQYXNzaXZlRUZmZWN0c0ltcGwuIFdlIHNob3VsZFxuICAvLyBwcm9iYWJseSBqdXN0IGNvbWJpbmUgdGhlIHR3byBmdW5jdGlvbnMuIEkgYmVsaWV2ZSB0aGV5IHdlcmUgb25seSBzZXBhcmF0ZVxuICAvLyBpbiB0aGUgZmlyc3QgcGxhY2UgYmVjYXVzZSB3ZSB1c2VkIHRvIHdyYXAgaXQgd2l0aFxuICAvLyBgU2NoZWR1bGVyLnJ1bldpdGhQcmlvcml0eWAsIHdoaWNoIGFjY2VwdHMgYSBmdW5jdGlvbi4gQnV0IG5vdyB3ZSB0cmFjayB0aGVcbiAgLy8gcHJpb3JpdHkgd2l0aGluIFJlYWN0IGl0c2VsZiwgc28gd2UgY2FuIG11dGF0ZSB0aGUgdmFyaWFibGUgZGlyZWN0bHkuXG4gIGlmIChyb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyAhPT0gbnVsbCkge1xuICAgIHZhciByZW5kZXJQcmlvcml0eSA9IGxhbmVzVG9FdmVudFByaW9yaXR5KHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzKTtcbiAgICB2YXIgcHJpb3JpdHkgPSBsb3dlckV2ZW50UHJpb3JpdHkoRGVmYXVsdEV2ZW50UHJpb3JpdHksIHJlbmRlclByaW9yaXR5KTtcbiAgICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG4gICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICAgIHRyeSB7XG4gICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByaW9yaXR5KTtcbiAgICAgIHJldHVybiBmbHVzaFBhc3NpdmVFZmZlY3RzSW1wbCgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjsgLy8gT25jZSBwYXNzaXZlIGVmZmVjdHMgaGF2ZSBydW4gZm9yIHRoZSB0cmVlIC0gZ2l2aW5nIGNvbXBvbmVudHMgYVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGVucXVldWVQZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0KGZpYmVyKSB7XG4gIHtcbiAgICBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cy5wdXNoKGZpYmVyKTtcblxuICAgIGlmICghcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICAgIHNjaGVkdWxlQ2FsbGJhY2skMShOb3JtYWxQcmlvcml0eSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoUGFzc2l2ZUVmZmVjdHNJbXBsKCkge1xuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gQ2FjaGUgYW5kIGNsZWFyIHRoZSB0cmFuc2l0aW9ucyBmbGFnXG5cblxuICB2YXIgdHJhbnNpdGlvbnMgPSBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zO1xuICBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gbnVsbDtcbiAgdmFyIHJvb3QgPSByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cztcbiAgdmFyIGxhbmVzID0gcGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXM7XG4gIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gbnVsbDsgLy8gVE9ETzogVGhpcyBpcyBzb21ldGltZXMgb3V0IG9mIHN5bmMgd2l0aCByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cy5cbiAgLy8gRmlndXJlIG91dCB3aHkgYW5kIGZpeCBpdC4gSXQncyBub3QgY2F1c2luZyBhbnkga25vd24gaXNzdWVzIChwcm9iYWJseVxuICAvLyBiZWNhdXNlIGl0J3Mgb25seSB1c2VkIGZvciBwcm9maWxpbmcpLCBidXQgaXQncyBhIHJlZmFjdG9yIGhhemFyZC5cblxuICBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IE5vTGFuZXM7XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZsdXNoIHBhc3NpdmUgZWZmZWN0cyB3aGlsZSBhbHJlYWR5IHJlbmRlcmluZy4nKTtcbiAgfVxuXG4gIHtcbiAgICBpc0ZsdXNoaW5nUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkKGxhbmVzKTtcbiAgfVxuXG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQ29tbWl0Q29udGV4dDtcbiAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzKHJvb3QuY3VycmVudCk7XG4gIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHMocm9vdCwgcm9vdC5jdXJyZW50LCBsYW5lcywgdHJhbnNpdGlvbnMpOyAvLyBUT0RPOiBNb3ZlIHRvIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNcblxuICB7XG4gICAgdmFyIHByb2ZpbGVyRWZmZWN0cyA9IHBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3RzO1xuICAgIHBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3RzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb2ZpbGVyRWZmZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIF9maWJlciA9IHByb2ZpbGVyRWZmZWN0c1tpXTtcbiAgICAgIGNvbW1pdFBhc3NpdmVFZmZlY3REdXJhdGlvbnMocm9vdCwgX2ZpYmVyKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgbWFya1Bhc3NpdmVFZmZlY3RzU3RvcHBlZCgpO1xuICB9XG5cbiAge1xuICAgIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihyb290LmN1cnJlbnQsIHRydWUpO1xuICB9XG5cbiAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcblxuICB7XG4gICAgLy8gSWYgYWRkaXRpb25hbCBwYXNzaXZlIGVmZmVjdHMgd2VyZSBzY2hlZHVsZWQsIGluY3JlbWVudCBhIGNvdW50ZXIuIElmIHRoaXNcbiAgICAvLyBleGNlZWRzIHRoZSBsaW1pdCwgd2UnbGwgZmlyZSBhIHdhcm5pbmcuXG4gICAgaWYgKGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGlmIChyb290ID09PSByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzKSB7XG4gICAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICAgICAgcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IHJvb3Q7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gICAgZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xuICB9IC8vIFRPRE86IE1vdmUgdG8gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c1xuXG5cbiAgb25Qb3N0Q29tbWl0Um9vdChyb290KTtcblxuICB7XG4gICAgdmFyIHN0YXRlTm9kZSA9IHJvb3QuY3VycmVudC5zdGF0ZU5vZGU7XG4gICAgc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uID0gMDtcbiAgICBzdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSB7XG4gIHJldHVybiBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCAhPT0gbnVsbCAmJiBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZC5oYXMoaW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gbWFya0xlZ2FjeUVycm9yQm91bmRhcnlBc0ZhaWxlZChpbnN0YW5jZSkge1xuICBpZiAobGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPT09IG51bGwpIHtcbiAgICBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG5ldyBTZXQoW2luc3RhbmNlXSk7XG4gIH0gZWxzZSB7XG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQuYWRkKGluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9UaHJvd1VuY2F1Z2h0RXJyb3IoZXJyb3IpIHtcbiAgaWYgKCFoYXNVbmNhdWdodEVycm9yKSB7XG4gICAgaGFzVW5jYXVnaHRFcnJvciA9IHRydWU7XG4gICAgZmlyc3RVbmNhdWdodEVycm9yID0gZXJyb3I7XG4gIH1cbn1cblxudmFyIG9uVW5jYXVnaHRFcnJvciA9IHByZXBhcmVUb1Rocm93VW5jYXVnaHRFcnJvcjtcblxuZnVuY3Rpb24gY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3JPblJvb3Qocm9vdEZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IpIHtcbiAgdmFyIGVycm9ySW5mbyA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKGVycm9yLCBzb3VyY2VGaWJlcik7XG4gIHZhciB1cGRhdGUgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUocm9vdEZpYmVyLCBlcnJvckluZm8sIFN5bmNMYW5lKTtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKHJvb3RGaWJlciwgdXBkYXRlLCBTeW5jTGFuZSk7XG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgU3luY0xhbmUsIGV2ZW50VGltZSk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3Ioc291cmNlRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yJDEpIHtcbiAge1xuICAgIHJlcG9ydFVuY2F1Z2h0RXJyb3JJbkRFVihlcnJvciQxKTtcbiAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoZmFsc2UpO1xuICB9XG5cbiAgaWYgKHNvdXJjZUZpYmVyLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAvLyBFcnJvciB3YXMgdGhyb3duIGF0IHRoZSByb290LiBUaGVyZSBpcyBubyBwYXJlbnQsIHNvIHRoZSByb290XG4gICAgLy8gaXRzZWxmIHNob3VsZCBjYXB0dXJlIGl0LlxuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KHNvdXJjZUZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IkMSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGZpYmVyID0gbnVsbDtcblxuICB7XG4gICAgZmliZXIgPSBuZWFyZXN0TW91bnRlZEFuY2VzdG9yO1xuICB9XG5cbiAgd2hpbGUgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgaWYgKGZpYmVyLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KGZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IkMSk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICB2YXIgY3RvciA9IGZpYmVyLnR5cGU7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkge1xuICAgICAgICB2YXIgZXJyb3JJbmZvID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIoZXJyb3IkMSwgc291cmNlRmliZXIpO1xuICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZShmaWJlciwgZXJyb3JJbmZvLCBTeW5jTGFuZSk7XG4gICAgICAgIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBTeW5jTGFuZSk7XG4gICAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG5cbiAgICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgU3luY0xhbmUsIGV2ZW50VGltZSk7XG4gICAgICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmliZXIgPSBmaWJlci5yZXR1cm47XG4gIH1cblxuICB7XG4gICAgLy8gVE9ETzogVW50aWwgd2UgcmUtbGFuZCBza2lwVW5tb3VudGVkQm91bmRhcmllcyAoc2VlICMyMDE0NyksIHRoaXMgd2FybmluZ1xuICAgIC8vIHdpbGwgZmlyZSBmb3IgZXJyb3JzIHRoYXQgYXJlIHRocm93biBieSBkZXN0cm95IGZ1bmN0aW9ucyBpbnNpZGUgZGVsZXRlZFxuICAgIC8vIHRyZWVzLiBXaGF0IGl0IHNob3VsZCBpbnN0ZWFkIGRvIGlzIHByb3BhZ2F0ZSB0aGUgZXJyb3IgdG8gdGhlIHBhcmVudCBvZlxuICAgIC8vIHRoZSBkZWxldGVkIHRyZWUuIEluIHRoZSBtZWFudGltZSwgZG8gbm90IGFkZCB0aGlzIHdhcm5pbmcgdG8gdGhlXG4gICAgLy8gYWxsb3dsaXN0OyB0aGlzIGlzIG9ubHkgZm9yIG91ciBpbnRlcm5hbCB1c2UuXG4gICAgZXJyb3IoJ0ludGVybmFsIFJlYWN0IGVycm9yOiBBdHRlbXB0ZWQgdG8gY2FwdHVyZSBhIGNvbW1pdCBwaGFzZSBlcnJvciAnICsgJ2luc2lkZSBhIGRldGFjaGVkIHRyZWUuIFRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIFJlYWN0LiBMaWtlbHkgJyArICdjYXVzZXMgaW5jbHVkZSBkZWxldGluZyB0aGUgc2FtZSBmaWJlciBtb3JlIHRoYW4gb25jZSwgY29tbWl0dGluZyBhbiAnICsgJ2FscmVhZHktZmluaXNoZWQgdHJlZSwgb3IgYW4gaW5jb25zaXN0ZW50IHJldHVybiBwb2ludGVyLlxcblxcbicgKyAnRXJyb3IgbWVzc2FnZTpcXG5cXG4lcycsIGVycm9yJDEpO1xuICB9XG59XG5mdW5jdGlvbiBwaW5nU3VzcGVuZGVkUm9vdChyb290LCB3YWtlYWJsZSwgcGluZ2VkTGFuZXMpIHtcbiAgdmFyIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlO1xuXG4gIGlmIChwaW5nQ2FjaGUgIT09IG51bGwpIHtcbiAgICAvLyBUaGUgd2FrZWFibGUgcmVzb2x2ZWQsIHNvIHdlIG5vIGxvbmdlciBuZWVkIHRvIG1lbW9pemUsIGJlY2F1c2UgaXQgd2lsbFxuICAgIC8vIG5ldmVyIGJlIHRocm93biBhZ2Fpbi5cbiAgICBwaW5nQ2FjaGUuZGVsZXRlKHdha2VhYmxlKTtcbiAgfVxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIG1hcmtSb290UGluZ2VkKHJvb3QsIHBpbmdlZExhbmVzKTtcbiAgd2FybklmU3VzcGVuc2VSZXNvbHV0aW9uTm90V3JhcHBlZFdpdGhBY3RERVYocm9vdCk7XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCA9PT0gcm9vdCAmJiBpc1N1YnNldE9mTGFuZXMod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMsIHBpbmdlZExhbmVzKSkge1xuICAgIC8vIFJlY2VpdmVkIGEgcGluZyBhdCB0aGUgc2FtZSBwcmlvcml0eSBsZXZlbCBhdCB3aGljaCB3ZSdyZSBjdXJyZW50bHlcbiAgICAvLyByZW5kZXJpbmcuIFdlIG1pZ2h0IHdhbnQgdG8gcmVzdGFydCB0aGlzIHJlbmRlci4gVGhpcyBzaG91bGQgbWlycm9yXG4gICAgLy8gdGhlIGxvZ2ljIG9mIHdoZXRoZXIgb3Igbm90IGEgcm9vdCBzdXNwZW5kcyBvbmNlIGl0IGNvbXBsZXRlcy5cbiAgICAvLyBUT0RPOiBJZiB3ZSdyZSByZW5kZXJpbmcgc3luYyBlaXRoZXIgZHVlIHRvIFN5bmMsIEJhdGNoZWQgb3IgZXhwaXJlZCxcbiAgICAvLyB3ZSBzaG91bGQgcHJvYmFibHkgbmV2ZXIgcmVzdGFydC5cbiAgICAvLyBJZiB3ZSdyZSBzdXNwZW5kZWQgd2l0aCBkZWxheSwgb3IgaWYgaXQncyBhIHJldHJ5LCB3ZSdsbCBhbHdheXMgc3VzcGVuZFxuICAgIC8vIHNvIHdlIGNhbiBhbHdheXMgcmVzdGFydC5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkICYmIGluY2x1ZGVzT25seVJldHJpZXMod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpICYmIG5vdygpIC0gZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA8IEZBTExCQUNLX1RIUk9UVExFX01TKSB7XG4gICAgICAvLyBSZXN0YXJ0IGZyb20gdGhlIHJvb3QuXG4gICAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRXZlbiB0aG91Z2ggd2UgY2FuJ3QgcmVzdGFydCByaWdodCBub3csIHdlIG1pZ2h0IGdldCBhblxuICAgICAgLy8gb3Bwb3J0dW5pdHkgbGF0ZXIuIFNvIHdlIG1hcmsgdGhpcyByZW5kZXIgYXMgaGF2aW5nIGEgcGluZy5cbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcywgcGluZ2VkTGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xufVxuXG5mdW5jdGlvbiByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKSB7XG4gIC8vIFRoZSBib3VuZGFyeSBmaWJlciAoYSBTdXNwZW5zZSBjb21wb25lbnQgb3IgU3VzcGVuc2VMaXN0IGNvbXBvbmVudClcbiAgLy8gcHJldmlvdXNseSB3YXMgcmVuZGVyZWQgaW4gaXRzIGZhbGxiYWNrIHN0YXRlLiBPbmUgb2YgdGhlIHByb21pc2VzIHRoYXRcbiAgLy8gc3VzcGVuZGVkIGl0IGhhcyByZXNvbHZlZCwgd2hpY2ggbWVhbnMgYXQgbGVhc3QgcGFydCBvZiB0aGUgdHJlZSB3YXNcbiAgLy8gbGlrZWx5IHVuYmxvY2tlZC4gVHJ5IHJlbmRlcmluZyBhZ2FpbiwgYXQgYSBuZXcgbGFuZXMuXG4gIGlmIChyZXRyeUxhbmUgPT09IE5vTGFuZSkge1xuICAgIC8vIFRPRE86IEFzc2lnbiB0aGlzIHRvIGBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZWA/IHRvIGF2b2lkXG4gICAgLy8gdW5uZWNlc3NhcnkgZW50YW5nbGVtZW50P1xuICAgIHJldHJ5TGFuZSA9IHJlcXVlc3RSZXRyeUxhbmUoYm91bmRhcnlGaWJlcik7XG4gIH0gLy8gVE9ETzogU3BlY2lhbCBjYXNlIGlkbGUgcHJpb3JpdHk/XG5cblxuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIHJldHJ5TGFuZSwgZXZlbnRUaW1lKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXRyeURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIpIHtcbiAgdmFyIHN1c3BlbnNlU3RhdGUgPSBib3VuZGFyeUZpYmVyLm1lbW9pemVkU3RhdGU7XG4gIHZhciByZXRyeUxhbmUgPSBOb0xhbmU7XG5cbiAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHtcbiAgICByZXRyeUxhbmUgPSBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZTtcbiAgfVxuXG4gIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVJldHJ5V2FrZWFibGUoYm91bmRhcnlGaWJlciwgd2FrZWFibGUpIHtcbiAgdmFyIHJldHJ5TGFuZSA9IE5vTGFuZTsgLy8gRGVmYXVsdFxuXG4gIHZhciByZXRyeUNhY2hlO1xuXG4gIHN3aXRjaCAoYm91bmRhcnlGaWJlci50YWcpIHtcbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0cnlDYWNoZSA9IGJvdW5kYXJ5RmliZXIuc3RhdGVOb2RlO1xuICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBib3VuZGFyeUZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHJldHJ5TGFuZSA9IHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcmV0cnlDYWNoZSA9IGJvdW5kYXJ5RmliZXIuc3RhdGVOb2RlO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQaW5nZWQgdW5rbm93biBzdXNwZW5zZSBib3VuZGFyeSB0eXBlLiAnICsgJ1RoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gUmVhY3QuJyk7XG4gIH1cblxuICBpZiAocmV0cnlDYWNoZSAhPT0gbnVsbCkge1xuICAgIC8vIFRoZSB3YWtlYWJsZSByZXNvbHZlZCwgc28gd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gbWVtb2l6ZSwgYmVjYXVzZSBpdCB3aWxsXG4gICAgLy8gbmV2ZXIgYmUgdGhyb3duIGFnYWluLlxuICAgIHJldHJ5Q2FjaGUuZGVsZXRlKHdha2VhYmxlKTtcbiAgfVxuXG4gIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xufSAvLyBDb21wdXRlcyB0aGUgbmV4dCBKdXN0IE5vdGljZWFibGUgRGlmZmVyZW5jZSAoSk5EKSBib3VuZGFyeS5cbi8vIFRoZSB0aGVvcnkgaXMgdGhhdCBhIHBlcnNvbiBjYW4ndCB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc21hbGwgZGlmZmVyZW5jZXMgaW4gdGltZS5cbi8vIFRoZXJlZm9yZSwgaWYgd2Ugd2FpdCBhIGJpdCBsb25nZXIgdGhhbiBuZWNlc3NhcnkgdGhhdCB3b24ndCB0cmFuc2xhdGUgdG8gYSBub3RpY2VhYmxlXG4vLyBkaWZmZXJlbmNlIGluIHRoZSBleHBlcmllbmNlLiBIb3dldmVyLCB3YWl0aW5nIGZvciBsb25nZXIgbWlnaHQgbWVhbiB0aGF0IHdlIGNhbiBhdm9pZFxuLy8gc2hvd2luZyBhbiBpbnRlcm1lZGlhdGUgbG9hZGluZyBzdGF0ZS4gVGhlIGxvbmdlciB3ZSBoYXZlIGFscmVhZHkgd2FpdGVkLCB0aGUgaGFyZGVyIGl0XG4vLyBpcyB0byB0ZWxsIHNtYWxsIGRpZmZlcmVuY2VzIGluIHRpbWUuIFRoZXJlZm9yZSwgdGhlIGxvbmdlciB3ZSd2ZSBhbHJlYWR5IHdhaXRlZCxcbi8vIHRoZSBsb25nZXIgd2UgY2FuIHdhaXQgYWRkaXRpb25hbGx5LiBBdCBzb21lIHBvaW50IHdlIGhhdmUgdG8gZ2l2ZSB1cCB0aG91Z2guXG4vLyBXZSBwaWNrIGEgdHJhaW4gbW9kZWwgd2hlcmUgdGhlIG5leHQgYm91bmRhcnkgY29tbWl0cyBhdCBhIGNvbnNpc3RlbnQgc2NoZWR1bGUuXG4vLyBUaGVzZSBwYXJ0aWN1bGFyIG51bWJlcnMgYXJlIHZhZ3VlIGVzdGltYXRlcy4gV2UgZXhwZWN0IHRvIGFkanVzdCB0aGVtIGJhc2VkIG9uIHJlc2VhcmNoLlxuXG5mdW5jdGlvbiBqbmQodGltZUVsYXBzZWQpIHtcbiAgcmV0dXJuIHRpbWVFbGFwc2VkIDwgMTIwID8gMTIwIDogdGltZUVsYXBzZWQgPCA0ODAgPyA0ODAgOiB0aW1lRWxhcHNlZCA8IDEwODAgPyAxMDgwIDogdGltZUVsYXBzZWQgPCAxOTIwID8gMTkyMCA6IHRpbWVFbGFwc2VkIDwgMzAwMCA/IDMwMDAgOiB0aW1lRWxhcHNlZCA8IDQzMjAgPyA0MzIwIDogY2VpbCh0aW1lRWxhcHNlZCAvIDE5NjApICogMTk2MDtcbn1cblxuZnVuY3Rpb24gY2hlY2tGb3JOZXN0ZWRVcGRhdGVzKCkge1xuICBpZiAobmVzdGVkVXBkYXRlQ291bnQgPiBORVNURURfVVBEQVRFX0xJTUlUKSB7XG4gICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICAgIHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IG51bGw7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIHVwZGF0ZSBkZXB0aCBleGNlZWRlZC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb21wb25lbnQgJyArICdyZXBlYXRlZGx5IGNhbGxzIHNldFN0YXRlIGluc2lkZSBjb21wb25lbnRXaWxsVXBkYXRlIG9yICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiBuZXN0ZWQgdXBkYXRlcyB0byAnICsgJ3ByZXZlbnQgaW5maW5pdGUgbG9vcHMuJyk7XG4gIH1cblxuICB7XG4gICAgaWYgKG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA+IE5FU1RFRF9QQVNTSVZFX1VQREFURV9MSU1JVCkge1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICAgIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuXG4gICAgICBlcnJvcignTWF4aW11bSB1cGRhdGUgZGVwdGggZXhjZWVkZWQuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgY29tcG9uZW50ICcgKyBcImNhbGxzIHNldFN0YXRlIGluc2lkZSB1c2VFZmZlY3QsIGJ1dCB1c2VFZmZlY3QgZWl0aGVyIGRvZXNuJ3QgXCIgKyAnaGF2ZSBhIGRlcGVuZGVuY3kgYXJyYXksIG9yIG9uZSBvZiB0aGUgZGVwZW5kZW5jaWVzIGNoYW5nZXMgb24gJyArICdldmVyeSByZW5kZXIuJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoUmVuZGVyUGhhc2VTdHJpY3RNb2RlV2FybmluZ3NJbkRFVigpIHtcbiAge1xuICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmcoKTtcblxuICAgIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoUGVuZGluZ1Vuc2FmZUxpZmVjeWNsZVdhcm5pbmdzKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihmaWJlciwgaGFzUGFzc2l2ZUVmZmVjdHMpIHtcbiAge1xuICAgIC8vIFRPRE8gKFN0cmljdEVmZmVjdHMpIFNob3VsZCB3ZSBzZXQgYSBtYXJrZXIgb24gdGhlIHJvb3QgaWYgaXQgY29udGFpbnMgc3RyaWN0IGVmZmVjdHNcbiAgICAvLyBzbyB3ZSBkb24ndCB0cmF2ZXJzZSB1bm5lY2Vzc2FyaWx5PyBzaW1pbGFyIHRvIHN1YnRyZWVGbGFncyBidXQganVzdCBhdCB0aGUgcm9vdCBsZXZlbC5cbiAgICAvLyBNYXliZSBub3QgYSBiaWcgZGVhbCBzaW5jZSB0aGlzIGlzIERFViBvbmx5IGJlaGF2aW9yLlxuICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudExheW91dERldiwgaW52b2tlTGF5b3V0RWZmZWN0VW5tb3VudEluREVWKTtcblxuICAgIGlmIChoYXNQYXNzaXZlRWZmZWN0cykge1xuICAgICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudFBhc3NpdmVEZXYsIGludm9rZVBhc3NpdmVFZmZlY3RVbm1vdW50SW5ERVYpO1xuICAgIH1cblxuICAgIGludm9rZUVmZmVjdHNJbkRldihmaWJlciwgTW91bnRMYXlvdXREZXYsIGludm9rZUxheW91dEVmZmVjdE1vdW50SW5ERVYpO1xuXG4gICAgaWYgKGhhc1Bhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBpbnZva2VFZmZlY3RzSW5EZXYoZmliZXIsIE1vdW50UGFzc2l2ZURldiwgaW52b2tlUGFzc2l2ZUVmZmVjdE1vdW50SW5ERVYpO1xuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlRWZmZWN0c0luRGV2KGZpcnN0Q2hpbGQsIGZpYmVyRmxhZ3MsIGludm9rZUVmZmVjdEZuKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICB2YXIgY3VycmVudCA9IGZpcnN0Q2hpbGQ7XG4gICAgdmFyIHN1YnRyZWVSb290ID0gbnVsbDtcblxuICAgIHdoaWxlIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJpbWFyeVN1YnRyZWVGbGFnID0gY3VycmVudC5zdWJ0cmVlRmxhZ3MgJiBmaWJlckZsYWdzO1xuXG4gICAgICBpZiAoY3VycmVudCAhPT0gc3VidHJlZVJvb3QgJiYgY3VycmVudC5jaGlsZCAhPT0gbnVsbCAmJiBwcmltYXJ5U3VidHJlZUZsYWcgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKGN1cnJlbnQuZmxhZ3MgJiBmaWJlckZsYWdzKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgIGludm9rZUVmZmVjdEZuKGN1cnJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnQuc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnNpYmxpbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudCA9IHN1YnRyZWVSb290ID0gY3VycmVudC5yZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQgPSBudWxsO1xuZnVuY3Rpb24gd2FybkFib3V0VXBkYXRlT25Ob3RZZXRNb3VudGVkRmliZXJJbkRFVihmaWJlcikge1xuICB7XG4gICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCkge1xuICAgICAgLy8gV2UgbGV0IHRoZSBvdGhlciB3YXJuaW5nIGFib3V0IHJlbmRlciBwaGFzZSB1cGRhdGVzIGRlYWwgd2l0aCB0aGlzIG9uZS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIShmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHRhZyA9IGZpYmVyLnRhZztcblxuICAgIGlmICh0YWcgIT09IEluZGV0ZXJtaW5hdGVDb21wb25lbnQgJiYgdGFnICE9PSBIb3N0Um9vdCAmJiB0YWcgIT09IENsYXNzQ29tcG9uZW50ICYmIHRhZyAhPT0gRnVuY3Rpb25Db21wb25lbnQgJiYgdGFnICE9PSBGb3J3YXJkUmVmICYmIHRhZyAhPT0gTWVtb0NvbXBvbmVudCAmJiB0YWcgIT09IFNpbXBsZU1lbW9Db21wb25lbnQpIHtcbiAgICAgIC8vIE9ubHkgd2FybiBmb3IgdXNlci1kZWZpbmVkIGNvbXBvbmVudHMsIG5vdCBpbnRlcm5hbCBvbmVzIGxpa2UgU3VzcGVuc2UuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBXZSBzaG93IHRoZSB3aG9sZSBzdGFjayBidXQgZGVkdXBlIG9uIHRoZSB0b3AgY29tcG9uZW50J3MgbmFtZSBiZWNhdXNlXG4gICAgLy8gdGhlIHByb2JsZW1hdGljIGNvZGUgYWxtb3N0IGFsd2F5cyBsaWVzIGluc2lkZSB0aGF0IGNvbXBvbmVudC5cblxuXG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnUmVhY3RDb21wb25lbnQnO1xuXG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQgIT09IG51bGwpIHtcbiAgICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50Lmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50ID0gbmV3IFNldChbY29tcG9uZW50TmFtZV0pO1xuICAgIH1cblxuICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgIHRyeSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgICBlcnJvcihcIkNhbid0IHBlcmZvcm0gYSBSZWFjdCBzdGF0ZSB1cGRhdGUgb24gYSBjb21wb25lbnQgdGhhdCBoYXNuJ3QgbW91bnRlZCB5ZXQuIFwiICsgJ1RoaXMgaW5kaWNhdGVzIHRoYXQgeW91IGhhdmUgYSBzaWRlLWVmZmVjdCBpbiB5b3VyIHJlbmRlciBmdW5jdGlvbiB0aGF0ICcgKyAnYXN5bmNocm9ub3VzbHkgbGF0ZXIgY2FsbHMgdHJpZXMgdG8gdXBkYXRlIHRoZSBjb21wb25lbnQuIE1vdmUgdGhpcyB3b3JrIHRvICcgKyAndXNlRWZmZWN0IGluc3RlYWQuJyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChwcmV2aW91c0ZpYmVyKSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxudmFyIGJlZ2luV29yayQxO1xuXG57XG4gIHZhciBkdW1teUZpYmVyID0gbnVsbDtcblxuICBiZWdpbldvcmskMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcykge1xuICAgIC8vIElmIGEgY29tcG9uZW50IHRocm93cyBhbiBlcnJvciwgd2UgcmVwbGF5IGl0IGFnYWluIGluIGEgc3luY2hyb25vdXNseVxuICAgIC8vIGRpc3BhdGNoZWQgZXZlbnQsIHNvIHRoYXQgdGhlIGRlYnVnZ2VyIHdpbGwgdHJlYXQgaXQgYXMgYW4gdW5jYXVnaHRcbiAgICAvLyBlcnJvciBTZWUgUmVhY3RFcnJvclV0aWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgIC8vIEJlZm9yZSBlbnRlcmluZyB0aGUgYmVnaW4gcGhhc2UsIGNvcHkgdGhlIHdvcmstaW4tcHJvZ3Jlc3Mgb250byBhIGR1bW15XG4gICAgLy8gZmliZXIuIElmIGJlZ2luV29yayB0aHJvd3MsIHdlJ2xsIHVzZSB0aGlzIHRvIHJlc2V0IHRoZSBzdGF0ZS5cbiAgICB2YXIgb3JpZ2luYWxXb3JrSW5Qcm9ncmVzc0NvcHkgPSBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVihkdW1teUZpYmVyLCB1bml0T2ZXb3JrKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYmVnaW5Xb3JrKGN1cnJlbnQsIHVuaXRPZldvcmssIGxhbmVzKTtcbiAgICB9IGNhdGNoIChvcmlnaW5hbEVycm9yKSB7XG4gICAgICBpZiAoZGlkU3VzcGVuZE9yRXJyb3JXaGlsZUh5ZHJhdGluZ0RFVigpIHx8IG9yaWdpbmFsRXJyb3IgIT09IG51bGwgJiYgdHlwZW9mIG9yaWdpbmFsRXJyb3IgPT09ICdvYmplY3QnICYmIHR5cGVvZiBvcmlnaW5hbEVycm9yLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gRG9uJ3QgcmVwbGF5IHByb21pc2VzLlxuICAgICAgICAvLyBEb24ndCByZXBsYXkgZXJyb3JzIGlmIHdlIGFyZSBoeWRyYXRpbmcgYW5kIGhhdmUgYWxyZWFkeSBzdXNwZW5kZWQgb3IgaGFuZGxlZCBhbiBlcnJvclxuICAgICAgICB0aHJvdyBvcmlnaW5hbEVycm9yO1xuICAgICAgfSAvLyBLZWVwIHRoaXMgY29kZSBpbiBzeW5jIHdpdGggaGFuZGxlRXJyb3I7IGFueSBjaGFuZ2VzIGhlcmUgbXVzdCBoYXZlXG4gICAgICAvLyBjb3JyZXNwb25kaW5nIGNoYW5nZXMgdGhlcmUuXG5cblxuICAgICAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gICAgICByZXNldEhvb2tzQWZ0ZXJUaHJvdygpOyAvLyBEb24ndCByZXNldCBjdXJyZW50IGRlYnVnIGZpYmVyLCBzaW5jZSB3ZSdyZSBhYm91dCB0byB3b3JrIG9uIHRoZVxuICAgICAgLy8gc2FtZSBmaWJlciBhZ2Fpbi5cbiAgICAgIC8vIFVud2luZCB0aGUgZmFpbGVkIHN0YWNrIGZyYW1lXG5cbiAgICAgIHVud2luZEludGVycnVwdGVkV29yayhjdXJyZW50LCB1bml0T2ZXb3JrKTsgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcHJvcGVydGllcyBvZiB0aGUgZmliZXIuXG5cbiAgICAgIGFzc2lnbkZpYmVyUHJvcGVydGllc0luREVWKHVuaXRPZldvcmssIG9yaWdpbmFsV29ya0luUHJvZ3Jlc3NDb3B5KTtcblxuICAgICAgaWYgKCB1bml0T2ZXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAvLyBSZXNldCB0aGUgcHJvZmlsZXIgdGltZXIuXG4gICAgICAgIHN0YXJ0UHJvZmlsZXJUaW1lcih1bml0T2ZXb3JrKTtcbiAgICAgIH0gLy8gUnVuIGJlZ2luV29yayBhZ2Fpbi5cblxuXG4gICAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgYmVnaW5Xb3JrLCBudWxsLCBjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcyk7XG5cbiAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgIHZhciByZXBsYXlFcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcblxuICAgICAgICBpZiAodHlwZW9mIHJlcGxheUVycm9yID09PSAnb2JqZWN0JyAmJiByZXBsYXlFcnJvciAhPT0gbnVsbCAmJiByZXBsYXlFcnJvci5fc3VwcHJlc3NMb2dnaW5nICYmIHR5cGVvZiBvcmlnaW5hbEVycm9yID09PSAnb2JqZWN0JyAmJiBvcmlnaW5hbEVycm9yICE9PSBudWxsICYmICFvcmlnaW5hbEVycm9yLl9zdXBwcmVzc0xvZ2dpbmcpIHtcbiAgICAgICAgICAvLyBJZiBzdXBwcmVzc2VkLCBsZXQgdGhlIGZsYWcgY2Fycnkgb3ZlciB0byB0aGUgb3JpZ2luYWwgZXJyb3Igd2hpY2ggaXMgdGhlIG9uZSB3ZSdsbCByZXRocm93LlxuICAgICAgICAgIG9yaWdpbmFsRXJyb3IuX3N1cHByZXNzTG9nZ2luZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gV2UgYWx3YXlzIHRocm93IHRoZSBvcmlnaW5hbCBlcnJvciBpbiBjYXNlIHRoZSBzZWNvbmQgcmVuZGVyIHBhc3MgaXMgbm90IGlkZW1wb3RlbnQuXG4gICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgYSBtZW1vaXplZCBmdW5jdGlvbiBvciBDb21tb25KUyBtb2R1bGUgZG9lc24ndCB0aHJvdyBhZnRlciBmaXJzdCBpbnZvY2F0aW9uLlxuXG5cbiAgICAgIHRocm93IG9yaWdpbmFsRXJyb3I7XG4gICAgfVxuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIgPSBmYWxzZTtcbnZhciBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQ7XG5cbntcbiAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50ID0gbmV3IFNldCgpO1xufVxuXG5mdW5jdGlvbiB3YXJuQWJvdXRSZW5kZXJQaGFzZVVwZGF0ZXNJbkRFVihmaWJlcikge1xuICB7XG4gICAgaWYgKGlzUmVuZGVyaW5nICYmICFnZXRJc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlSW5ERVYoKSkge1xuICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHJlbmRlcmluZ0NvbXBvbmVudE5hbWUgPSB3b3JrSW5Qcm9ncmVzcyAmJiBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnVW5rbm93bic7IC8vIERlZHVwZSBieSB0aGUgcmVuZGVyaW5nIGNvbXBvbmVudCBiZWNhdXNlIGl0J3MgdGhlIG9uZSB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLlxuXG4gICAgICAgICAgICB2YXIgZGVkdXBlS2V5ID0gcmVuZGVyaW5nQ29tcG9uZW50TmFtZTtcblxuICAgICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQuaGFzKGRlZHVwZUtleSkpIHtcbiAgICAgICAgICAgICAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50LmFkZChkZWR1cGVLZXkpO1xuICAgICAgICAgICAgICB2YXIgc2V0U3RhdGVDb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nO1xuXG4gICAgICAgICAgICAgIGVycm9yKCdDYW5ub3QgdXBkYXRlIGEgY29tcG9uZW50IChgJXNgKSB3aGlsZSByZW5kZXJpbmcgYSAnICsgJ2RpZmZlcmVudCBjb21wb25lbnQgKGAlc2ApLiBUbyBsb2NhdGUgdGhlIGJhZCBzZXRTdGF0ZSgpIGNhbGwgaW5zaWRlIGAlc2AsICcgKyAnZm9sbG93IHRoZSBzdGFjayB0cmFjZSBhcyBkZXNjcmliZWQgaW4gaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NldHN0YXRlLWluLXJlbmRlcicsIHNldFN0YXRlQ29tcG9uZW50TmFtZSwgcmVuZGVyaW5nQ29tcG9uZW50TmFtZSwgcmVuZGVyaW5nQ29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICghZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIpIHtcbiAgICAgICAgICAgICAgZXJyb3IoJ0Nhbm5vdCB1cGRhdGUgZHVyaW5nIGFuIGV4aXN0aW5nIHN0YXRlIHRyYW5zaXRpb24gKHN1Y2ggYXMgJyArICd3aXRoaW4gYHJlbmRlcmApLiBSZW5kZXIgbWV0aG9kcyBzaG91bGQgYmUgYSBwdXJlICcgKyAnZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLicpO1xuXG4gICAgICAgICAgICAgIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuICAgICAgbWVtb2l6ZWRVcGRhdGVycy5mb3JFYWNoKGZ1bmN0aW9uIChzY2hlZHVsaW5nRmliZXIpIHtcbiAgICAgICAgYWRkRmliZXJUb0xhbmVzTWFwKHJvb3QsIHNjaGVkdWxpbmdGaWJlciwgbGFuZXMpO1xuICAgICAgfSk7IC8vIFRoaXMgZnVuY3Rpb24gaW50ZW50aW9uYWxseSBkb2VzIG5vdCBjbGVhciBtZW1vaXplZCB1cGRhdGVycy5cbiAgICAgIC8vIFRob3NlIG1heSBzdGlsbCBiZSByZWxldmFudCB0byB0aGUgY3VycmVudCBjb21taXRcbiAgICAgIC8vIGFuZCBhIGZ1dHVyZSBvbmUgKGUuZy4gU3VzcGVuc2UpLlxuICAgIH1cbiAgfVxufVxudmFyIGZha2VBY3RDYWxsYmFja05vZGUgPSB7fTtcblxuZnVuY3Rpb24gc2NoZWR1bGVDYWxsYmFjayQxKHByaW9yaXR5TGV2ZWwsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICAvLyBJZiB3ZSdyZSBjdXJyZW50bHkgaW5zaWRlIGFuIGBhY3RgIHNjb3BlLCBieXBhc3MgU2NoZWR1bGVyIGFuZCBwdXNoIHRvXG4gICAgLy8gdGhlIGBhY3RgIHF1ZXVlIGluc3RlYWQuXG4gICAgdmFyIGFjdFF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50O1xuXG4gICAgaWYgKGFjdFF1ZXVlICE9PSBudWxsKSB7XG4gICAgICBhY3RRdWV1ZS5wdXNoKGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiBmYWtlQWN0Q2FsbGJhY2tOb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc2NoZWR1bGVDYWxsYmFjayhwcmlvcml0eUxldmVsLCBjYWxsYmFjayk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNhbmNlbENhbGxiYWNrJDEoY2FsbGJhY2tOb2RlKSB7XG4gIGlmICggY2FsbGJhY2tOb2RlID09PSBmYWtlQWN0Q2FsbGJhY2tOb2RlKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIEluIHByb2R1Y3Rpb24sIGFsd2F5cyBjYWxsIFNjaGVkdWxlci4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHN0cmlwcGVkIG91dC5cblxuXG4gIHJldHVybiBjYW5jZWxDYWxsYmFjayhjYWxsYmFja05vZGUpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRGb3JjZUZsdXNoRmFsbGJhY2tzSW5ERVYoKSB7XG4gIC8vIE5ldmVyIGZvcmNlIGZsdXNoIGluIHByb2R1Y3Rpb24uIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGdldCBzdHJpcHBlZCBvdXQuXG4gIHJldHVybiAgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZVcGRhdGVzTm90V3JhcHBlZFdpdGhBY3RERVYoZmliZXIpIHtcbiAge1xuICAgIGlmIChmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgIGlmICghaXNDb25jdXJyZW50QWN0RW52aXJvbm1lbnQoKSkge1xuICAgICAgICAvLyBOb3QgaW4gYW4gYWN0IGVudmlyb25tZW50LiBObyBuZWVkIHRvIHdhcm4uXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTGVnYWN5IG1vZGUgaGFzIGFkZGl0aW9uYWwgY2FzZXMgd2hlcmUgd2Ugc3VwcHJlc3MgYSB3YXJuaW5nLlxuICAgICAgaWYgKCFpc0xlZ2FjeUFjdEVudmlyb25tZW50KCkpIHtcbiAgICAgICAgLy8gTm90IGluIGFuIGFjdCBlbnZpcm9ubWVudC4gTm8gbmVlZCB0byB3YXJuLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChleGVjdXRpb25Db250ZXh0ICE9PSBOb0NvbnRleHQpIHtcbiAgICAgICAgLy8gTGVnYWN5IG1vZGUgZG9lc24ndCB3YXJuIGlmIHRoZSB1cGRhdGUgaXMgYmF0Y2hlZCwgaS5lLlxuICAgICAgICAvLyBiYXRjaGVkVXBkYXRlcyBvciBmbHVzaFN5bmMuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpYmVyLnRhZyAhPT0gRnVuY3Rpb25Db21wb25lbnQgJiYgZmliZXIudGFnICE9PSBGb3J3YXJkUmVmICYmIGZpYmVyLnRhZyAhPT0gU2ltcGxlTWVtb0NvbXBvbmVudCkge1xuICAgICAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBwcmUtaG9va3MgY29kZSwgbGVnYWN5IG1vZGUgb25seVxuICAgICAgICAvLyB3YXJucyBmb3IgdXBkYXRlcyB0aGF0IG9yaWdpbmF0ZSBmcm9tIGEgaG9vay5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgICBlcnJvcignQW4gdXBkYXRlIHRvICVzIGluc2lkZSBhIHRlc3Qgd2FzIG5vdCB3cmFwcGVkIGluIGFjdCguLi4pLlxcblxcbicgKyAnV2hlbiB0ZXN0aW5nLCBjb2RlIHRoYXQgY2F1c2VzIFJlYWN0IHN0YXRlIHVwZGF0ZXMgc2hvdWxkIGJlICcgKyAnd3JhcHBlZCBpbnRvIGFjdCguLi4pOlxcblxcbicgKyAnYWN0KCgpID0+IHtcXG4nICsgJyAgLyogZmlyZSBldmVudHMgdGhhdCB1cGRhdGUgc3RhdGUgKi9cXG4nICsgJ30pO1xcbicgKyAnLyogYXNzZXJ0IG9uIHRoZSBvdXRwdXQgKi9cXG5cXG4nICsgXCJUaGlzIGVuc3VyZXMgdGhhdCB5b3UncmUgdGVzdGluZyB0aGUgYmVoYXZpb3IgdGhlIHVzZXIgd291bGQgc2VlIFwiICsgJ2luIHRoZSBicm93c2VyLicgKyAnIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dyYXAtdGVzdHMtd2l0aC1hY3QnLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuSWZTdXNwZW5zZVJlc29sdXRpb25Ob3RXcmFwcGVkV2l0aEFjdERFVihyb290KSB7XG4gIHtcbiAgICBpZiAocm9vdC50YWcgIT09IExlZ2FjeVJvb3QgJiYgaXNDb25jdXJyZW50QWN0RW52aXJvbm1lbnQoKSAmJiBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdBIHN1c3BlbmRlZCByZXNvdXJjZSBmaW5pc2hlZCBsb2FkaW5nIGluc2lkZSBhIHRlc3QsIGJ1dCB0aGUgZXZlbnQgJyArICd3YXMgbm90IHdyYXBwZWQgaW4gYWN0KC4uLikuXFxuXFxuJyArICdXaGVuIHRlc3RpbmcsIGNvZGUgdGhhdCByZXNvbHZlcyBzdXNwZW5kZWQgZGF0YSBzaG91bGQgYmUgd3JhcHBlZCAnICsgJ2ludG8gYWN0KC4uLik6XFxuXFxuJyArICdhY3QoKCkgPT4ge1xcbicgKyAnICAvKiBmaW5pc2ggbG9hZGluZyBzdXNwZW5kZWQgZGF0YSAqL1xcbicgKyAnfSk7XFxuJyArICcvKiBhc3NlcnQgb24gdGhlIG91dHB1dCAqL1xcblxcbicgKyBcIlRoaXMgZW5zdXJlcyB0aGF0IHlvdSdyZSB0ZXN0aW5nIHRoZSBiZWhhdmlvciB0aGUgdXNlciB3b3VsZCBzZWUgXCIgKyAnaW4gdGhlIGJyb3dzZXIuJyArICcgTGVhcm4gbW9yZSBhdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd3JhcC10ZXN0cy13aXRoLWFjdCcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoaXNSdW5uaW5nKSB7XG4gIHtcbiAgICBpc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QgPSBpc1J1bm5pbmc7XG4gIH1cbn1cblxuLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2RlcyAqL1xudmFyIHJlc29sdmVGYW1pbHkgPSBudWxsOyAvLyAkRmxvd0ZpeE1lIEZsb3cgZ2V0cyBjb25mdXNlZCBieSBhIFdlYWtTZXQgZmVhdHVyZSBjaGVjayBiZWxvdy5cblxudmFyIGZhaWxlZEJvdW5kYXJpZXMgPSBudWxsO1xudmFyIHNldFJlZnJlc2hIYW5kbGVyID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAge1xuICAgIHJlc29sdmVGYW1pbHkgPSBoYW5kbGVyO1xuICB9XG59O1xuZnVuY3Rpb24gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuXG4gICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkodHlwZSk7XG5cbiAgICBpZiAoZmFtaWx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH0gLy8gVXNlIHRoZSBsYXRlc3Qga25vd24gaW1wbGVtZW50YXRpb24uXG5cblxuICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAgLy8gTm8gaW1wbGVtZW50YXRpb24gZGlmZmVyZW5jZXMuXG4gIHJldHVybiByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZSk7XG59XG5mdW5jdGlvbiByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyh0eXBlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KHR5cGUpO1xuXG4gICAgaWYgKGZhbWlseSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSByZWFsIGZvcndhcmRSZWYuIERvbid0IHdhbnQgdG8gY3Jhc2ggZWFybHkuXG4gICAgICBpZiAodHlwZSAhPT0gbnVsbCAmJiB0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHR5cGUucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEZvcndhcmRSZWYgaXMgc3BlY2lhbCBiZWNhdXNlIGl0cyByZXNvbHZlZCAudHlwZSBpcyBhbiBvYmplY3QsXG4gICAgICAgIC8vIGJ1dCBpdCdzIHBvc3NpYmxlIHRoYXQgd2Ugb25seSBoYXZlIGl0cyBpbm5lciByZW5kZXIgZnVuY3Rpb24gaW4gdGhlIG1hcC5cbiAgICAgICAgLy8gSWYgdGhhdCBpbm5lciByZW5kZXIgZnVuY3Rpb24gaXMgZGlmZmVyZW50LCB3ZSdsbCBidWlsZCBhIG5ldyBmb3J3YXJkUmVmIHR5cGUuXG4gICAgICAgIHZhciBjdXJyZW50UmVuZGVyID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUucmVuZGVyKTtcblxuICAgICAgICBpZiAodHlwZS5yZW5kZXIgIT09IGN1cnJlbnRSZW5kZXIpIHtcbiAgICAgICAgICB2YXIgc3ludGhldGljVHlwZSA9IHtcbiAgICAgICAgICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgICAgICAgICAgcmVuZGVyOiBjdXJyZW50UmVuZGVyXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmICh0eXBlLmRpc3BsYXlOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN5bnRoZXRpY1R5cGUuZGlzcGxheU5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBzeW50aGV0aWNUeXBlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH0gLy8gVXNlIHRoZSBsYXRlc3Qga25vd24gaW1wbGVtZW50YXRpb24uXG5cblxuICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGZpYmVyLCBlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgcHJldlR5cGUgPSBmaWJlci5lbGVtZW50VHlwZTtcbiAgICB2YXIgbmV4dFR5cGUgPSBlbGVtZW50LnR5cGU7IC8vIElmIHdlIGdvdCBoZXJlLCB3ZSBrbm93IHR5cGVzIGFyZW4ndCA9PT0gZXF1YWwuXG5cbiAgICB2YXIgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSBmYWxzZTtcbiAgICB2YXIgJCR0eXBlb2ZOZXh0VHlwZSA9IHR5cGVvZiBuZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgbmV4dFR5cGUgIT09IG51bGwgPyBuZXh0VHlwZS4kJHR5cGVvZiA6IG51bGw7XG5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV4dFR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXh0VHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHRoZSBpbm5lciB0eXBlIHlldC5cbiAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGFzc3VtZSB0aGF0IHRoZSBsYXp5IGlubmVyIHR5cGUgaXMgc3RhYmxlLFxuICAgICAgICAgICAgLy8gYW5kIHNvIGl0IGlzIHN1ZmZpY2llbnQgdG8gYXZvaWQgcmVjb25jaWxpbmcgaXQgYXdheS5cbiAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBnb2luZyB0byB1bndyYXAgb3IgYWN0dWFsbHkgdXNlIHRoZSBuZXcgbGF6eSB0eXBlLlxuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAge1xuICAgICAgICAgIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBpZiBpdCB3YXMgYnV0IGNhbiBubyBsb25nZXIgYmUgc2ltcGxlLFxuICAgICAgICAgICAgLy8gd2Ugc2hvdWxkbid0IHNldCB0aGlzLlxuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gQ2hlY2sgaWYgYm90aCB0eXBlcyBoYXZlIGEgZmFtaWx5IGFuZCBpdCdzIHRoZSBzYW1lIG9uZS5cblxuXG4gICAgaWYgKG5lZWRzQ29tcGFyZUZhbWlsaWVzKSB7XG4gICAgICAvLyBOb3RlOiBtZW1vKCkgYW5kIGZvcndhcmRSZWYoKSB3ZSdsbCBjb21wYXJlIG91dGVyIHJhdGhlciB0aGFuIGlubmVyIHR5cGUuXG4gICAgICAvLyBUaGlzIG1lYW5zIGJvdGggb2YgdGhlbSBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgdG8gcHJlc2VydmUgc3RhdGUuXG4gICAgICAvLyBJZiB3ZSB1bndyYXBwZWQgYW5kIGNvbXBhcmVkIHRoZSBpbm5lciB0eXBlcyBmb3Igd3JhcHBlcnMgaW5zdGVhZCxcbiAgICAgIC8vIHRoZW4gd2Ugd291bGQgcmlzayBmYWxzZWx5IHNheWluZyB0d28gc2VwYXJhdGUgbWVtbyhGb28pXG4gICAgICAvLyBjYWxscyBhcmUgZXF1aXZhbGVudCBiZWNhdXNlIHRoZXkgd3JhcCB0aGUgc2FtZSBGb28gZnVuY3Rpb24uXG4gICAgICB2YXIgcHJldkZhbWlseSA9IHJlc29sdmVGYW1pbHkocHJldlR5cGUpO1xuXG4gICAgICBpZiAocHJldkZhbWlseSAhPT0gdW5kZWZpbmVkICYmIHByZXZGYW1pbHkgPT09IHJlc29sdmVGYW1pbHkobmV4dFR5cGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gbWFya0ZhaWxlZEVycm9yQm91bmRhcnlGb3JIb3RSZWxvYWRpbmcoZmliZXIpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgV2Vha1NldCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmYWlsZWRCb3VuZGFyaWVzID09PSBudWxsKSB7XG4gICAgICBmYWlsZWRCb3VuZGFyaWVzID0gbmV3IFdlYWtTZXQoKTtcbiAgICB9XG5cbiAgICBmYWlsZWRCb3VuZGFyaWVzLmFkZChmaWJlcik7XG4gIH1cbn1cbnZhciBzY2hlZHVsZVJlZnJlc2ggPSBmdW5jdGlvbiAocm9vdCwgdXBkYXRlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc3RhbGVGYW1pbGllcyA9IHVwZGF0ZS5zdGFsZUZhbWlsaWVzLFxuICAgICAgICB1cGRhdGVkRmFtaWxpZXMgPSB1cGRhdGUudXBkYXRlZEZhbWlsaWVzO1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShyb290LmN1cnJlbnQsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfSk7XG4gIH1cbn07XG52YXIgc2NoZWR1bGVSb290ID0gZnVuY3Rpb24gKHJvb3QsIGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChyb290LmNvbnRleHQgIT09IGVtcHR5Q29udGV4dE9iamVjdCkge1xuICAgICAgLy8gU3VwZXIgZWRnZSBjYXNlOiByb290IGhhcyBhIGxlZ2FjeSBfcmVuZGVyU3VidHJlZSBjb250ZXh0XG4gICAgICAvLyBidXQgd2UgZG9uJ3Qga25vdyB0aGUgcGFyZW50Q29tcG9uZW50IHNvIHdlIGNhbid0IHBhc3MgaXQuXG4gICAgICAvLyBKdXN0IGlnbm9yZS4gV2UnbGwgZGVsZXRlIHRoaXMgd2l0aCBfcmVuZGVyU3VidHJlZSBjb2RlIHBhdGggbGF0ZXIuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICB1cGRhdGVDb250YWluZXIoZWxlbWVudCwgcm9vdCwgbnVsbCwgbnVsbCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkoZmliZXIsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcykge1xuICB7XG4gICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZSxcbiAgICAgICAgY2hpbGQgPSBmaWJlci5jaGlsZCxcbiAgICAgICAgc2libGluZyA9IGZpYmVyLnNpYmxpbmcsXG4gICAgICAgIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgdmFyIGNhbmRpZGF0ZVR5cGUgPSBudWxsO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZXNvbHZlRmFtaWx5IHRvIGJlIHNldCBkdXJpbmcgaG90IHJlbG9hZC4nKTtcbiAgICB9XG5cbiAgICB2YXIgbmVlZHNSZW5kZXIgPSBmYWxzZTtcbiAgICB2YXIgbmVlZHNSZW1vdW50ID0gZmFsc2U7XG5cbiAgICBpZiAoY2FuZGlkYXRlVHlwZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkoY2FuZGlkYXRlVHlwZSk7XG5cbiAgICAgIGlmIChmYW1pbHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoc3RhbGVGYW1pbGllcy5oYXMoZmFtaWx5KSkge1xuICAgICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodXBkYXRlZEZhbWlsaWVzLmhhcyhmYW1pbHkpKSB7XG4gICAgICAgICAgaWYgKHRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5lZWRzUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZmFpbGVkQm91bmRhcmllcyAhPT0gbnVsbCkge1xuICAgICAgaWYgKGZhaWxlZEJvdW5kYXJpZXMuaGFzKGZpYmVyKSB8fCBhbHRlcm5hdGUgIT09IG51bGwgJiYgZmFpbGVkQm91bmRhcmllcy5oYXMoYWx0ZXJuYXRlKSkge1xuICAgICAgICBuZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZWVkc1JlbW91bnQpIHtcbiAgICAgIGZpYmVyLl9kZWJ1Z05lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5lZWRzUmVtb3VudCB8fCBuZWVkc1JlbmRlcikge1xuICAgICAgdmFyIF9yb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICAgIGlmIChfcm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoX3Jvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiAhbmVlZHNSZW1vdW50KSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KGNoaWxkLCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpO1xuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KHNpYmxpbmcsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2ggPSBmdW5jdGlvbiAocm9vdCwgZmFtaWxpZXMpIHtcbiAge1xuICAgIHZhciBob3N0SW5zdGFuY2VzID0gbmV3IFNldCgpO1xuICAgIHZhciB0eXBlcyA9IG5ldyBTZXQoZmFtaWxpZXMubWFwKGZ1bmN0aW9uIChmYW1pbHkpIHtcbiAgICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgICB9KSk7XG4gICAgZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KHJvb3QuY3VycmVudCwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgIHJldHVybiBob3N0SW5zdGFuY2VzO1xuICB9XG59O1xuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoZmliZXIsIHR5cGVzLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZCxcbiAgICAgICAgc2libGluZyA9IGZpYmVyLnNpYmxpbmcsXG4gICAgICAgIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgdmFyIGNhbmRpZGF0ZVR5cGUgPSBudWxsO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZGlkTWF0Y2ggPSBmYWxzZTtcblxuICAgIGlmIChjYW5kaWRhdGVUeXBlICE9PSBudWxsKSB7XG4gICAgICBpZiAodHlwZXMuaGFzKGNhbmRpZGF0ZVR5cGUpKSB7XG4gICAgICAgIGRpZE1hdGNoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlkTWF0Y2gpIHtcbiAgICAgIC8vIFdlIGhhdmUgYSBtYXRjaC4gVGhpcyBvbmx5IGRyaWxscyBkb3duIHRvIHRoZSBjbG9zZXN0IGhvc3QgY29tcG9uZW50cy5cbiAgICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBzZWFyY2ggZGVlcGVyIGJlY2F1c2UgZm9yIHRoZSBwdXJwb3NlIG9mIGdpdmluZ1xuICAgICAgLy8gdmlzdWFsIGZlZWRiYWNrLCBcImZsYXNoaW5nXCIgb3V0ZXJtb3N0IHBhcmVudCByZWN0YW5nbGVzIGlzIHN1ZmZpY2llbnQuXG4gICAgICBmaW5kSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlcmUncyBubyBtYXRjaCwgbWF5YmUgdGhlcmUgd2lsbCBiZSBvbmUgZnVydGhlciBkb3duIGluIHRoZSBjaGlsZCB0cmVlLlxuICAgICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShjaGlsZCwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoc2libGluZywgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgZm91bmRIb3N0SW5zdGFuY2VzID0gZmluZENoaWxkSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKTtcblxuICAgIGlmIChmb3VuZEhvc3RJbnN0YW5jZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueSBob3N0IGNoaWxkcmVuLCBmYWxsYmFjayB0byBjbG9zZXN0IGhvc3QgcGFyZW50LlxuXG5cbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlKTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gcmVhY2ggcm9vdCBmaXJzdC4nKTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ2hpbGRIb3N0SW5zdGFuY2VzRm9yRmliZXJTaGFsbG93bHkoZmliZXIsIGhvc3RJbnN0YW5jZXMpIHtcbiAge1xuICAgIHZhciBub2RlID0gZmliZXI7XG4gICAgdmFyIGZvdW5kSG9zdEluc3RhbmNlcyA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgICAvLyBXZSBnb3QgYSBtYXRjaC5cbiAgICAgICAgZm91bmRIb3N0SW5zdGFuY2VzID0gdHJ1ZTtcbiAgICAgICAgaG9zdEluc3RhbmNlcy5hZGQobm9kZS5zdGF0ZU5vZGUpOyAvLyBUaGVyZSBtYXkgc3RpbGwgYmUgbW9yZSwgc28ga2VlcCBzZWFyY2hpbmcuXG4gICAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmaWJlcikge1xuICAgICAgICByZXR1cm4gZm91bmRIb3N0SW5zdGFuY2VzO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmliZXIpIHtcbiAgICAgICAgICByZXR1cm4gZm91bmRIb3N0SW5zdGFuY2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxudmFyIGhhc0JhZE1hcFBvbHlmaWxsO1xuXG57XG4gIGhhc0JhZE1hcFBvbHlmaWxsID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICB2YXIgbm9uRXh0ZW5zaWJsZU9iamVjdCA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSk7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tbmV3ICovXG5cbiAgICBuZXcgTWFwKFtbbm9uRXh0ZW5zaWJsZU9iamVjdCwgbnVsbF1dKTtcbiAgICBuZXcgU2V0KFtub25FeHRlbnNpYmxlT2JqZWN0XSk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1uZXcgKi9cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIFRPRE86IENvbnNpZGVyIHdhcm5pbmcgYWJvdXQgYmFkIHBvbHlmaWxsc1xuICAgIGhhc0JhZE1hcFBvbHlmaWxsID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBGaWJlck5vZGUodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSkge1xuICAvLyBJbnN0YW5jZVxuICB0aGlzLnRhZyA9IHRhZztcbiAgdGhpcy5rZXkgPSBrZXk7XG4gIHRoaXMuZWxlbWVudFR5cGUgPSBudWxsO1xuICB0aGlzLnR5cGUgPSBudWxsO1xuICB0aGlzLnN0YXRlTm9kZSA9IG51bGw7IC8vIEZpYmVyXG5cbiAgdGhpcy5yZXR1cm4gPSBudWxsO1xuICB0aGlzLmNoaWxkID0gbnVsbDtcbiAgdGhpcy5zaWJsaW5nID0gbnVsbDtcbiAgdGhpcy5pbmRleCA9IDA7XG4gIHRoaXMucmVmID0gbnVsbDtcbiAgdGhpcy5wZW5kaW5nUHJvcHMgPSBwZW5kaW5nUHJvcHM7XG4gIHRoaXMubWVtb2l6ZWRQcm9wcyA9IG51bGw7XG4gIHRoaXMudXBkYXRlUXVldWUgPSBudWxsO1xuICB0aGlzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICB0aGlzLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gIHRoaXMubW9kZSA9IG1vZGU7IC8vIEVmZmVjdHNcblxuICB0aGlzLmZsYWdzID0gTm9GbGFncztcbiAgdGhpcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICB0aGlzLmRlbGV0aW9ucyA9IG51bGw7XG4gIHRoaXMubGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmFsdGVybmF0ZSA9IG51bGw7XG5cbiAge1xuICAgIC8vIE5vdGU6IFRoZSBmb2xsb3dpbmcgaXMgZG9uZSB0byBhdm9pZCBhIHY4IHBlcmZvcm1hbmNlIGNsaWZmLlxuICAgIC8vXG4gICAgLy8gSW5pdGlhbGl6aW5nIHRoZSBmaWVsZHMgYmVsb3cgdG8gc21pcyBhbmQgbGF0ZXIgdXBkYXRpbmcgdGhlbSB3aXRoXG4gICAgLy8gZG91YmxlIHZhbHVlcyB3aWxsIGNhdXNlIEZpYmVycyB0byBlbmQgdXAgaGF2aW5nIHNlcGFyYXRlIHNoYXBlcy5cbiAgICAvLyBUaGlzIGJlaGF2aW9yL2J1ZyBoYXMgc29tZXRoaW5nIHRvIGRvIHdpdGggT2JqZWN0LnByZXZlbnRFeHRlbnNpb24oKS5cbiAgICAvLyBGb3J0dW5hdGVseSB0aGlzIG9ubHkgaW1wYWN0cyBERVYgYnVpbGRzLlxuICAgIC8vIFVuZm9ydHVuYXRlbHkgaXQgbWFrZXMgUmVhY3QgdW51c2FibHkgc2xvdyBmb3Igc29tZSBhcHBsaWNhdGlvbnMuXG4gICAgLy8gVG8gd29yayBhcm91bmQgdGhpcywgaW5pdGlhbGl6ZSB0aGUgZmllbGRzIGJlbG93IHdpdGggZG91Ymxlcy5cbiAgICAvL1xuICAgIC8vIExlYXJuIG1vcmUgYWJvdXQgdGhpcyBoZXJlOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTQzNjVcbiAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD04NTM4XG4gICAgdGhpcy5hY3R1YWxEdXJhdGlvbiA9IE51bWJlci5OYU47XG4gICAgdGhpcy5hY3R1YWxTdGFydFRpbWUgPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMuc2VsZkJhc2VEdXJhdGlvbiA9IE51bWJlci5OYU47XG4gICAgdGhpcy50cmVlQmFzZUR1cmF0aW9uID0gTnVtYmVyLk5hTjsgLy8gSXQncyBva2F5IHRvIHJlcGxhY2UgdGhlIGluaXRpYWwgZG91YmxlcyB3aXRoIHNtaXMgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXG4gICAgLy8gVGhpcyB3b24ndCB0cmlnZ2VyIHRoZSBwZXJmb3JtYW5jZSBjbGlmZiBtZW50aW9uZWQgYWJvdmUsXG4gICAgLy8gYW5kIGl0IHNpbXBsaWZpZXMgb3RoZXIgcHJvZmlsZXIgY29kZSAoaW5jbHVkaW5nIERldlRvb2xzKS5cblxuICAgIHRoaXMuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgIHRoaXMuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgdGhpcy5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICB0aGlzLnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICB9XG5cbiAge1xuICAgIC8vIFRoaXMgaXNuJ3QgZGlyZWN0bHkgdXNlZCBidXQgaXMgaGFuZHkgZm9yIGRlYnVnZ2luZyBpbnRlcm5hbHM6XG4gICAgdGhpcy5fZGVidWdTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuX2RlYnVnT3duZXIgPSBudWxsO1xuICAgIHRoaXMuX2RlYnVnTmVlZHNSZW1vdW50ID0gZmFsc2U7XG4gICAgdGhpcy5fZGVidWdIb29rVHlwZXMgPSBudWxsO1xuXG4gICAgaWYgKCFoYXNCYWRNYXBQb2x5ZmlsbCAmJiB0eXBlb2YgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnModGhpcyk7XG4gICAgfVxuICB9XG59IC8vIFRoaXMgaXMgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiwgcmF0aGVyIHRoYW4gYSBQT0pPIGNvbnN0cnVjdG9yLCBzdGlsbFxuLy8gcGxlYXNlIGVuc3VyZSB3ZSBkbyB0aGUgZm9sbG93aW5nOlxuLy8gMSkgTm9ib2R5IHNob3VsZCBhZGQgYW55IGluc3RhbmNlIG1ldGhvZHMgb24gdGhpcy4gSW5zdGFuY2UgbWV0aG9kcyBjYW4gYmVcbi8vICAgIG1vcmUgZGlmZmljdWx0IHRvIHByZWRpY3Qgd2hlbiB0aGV5IGdldCBvcHRpbWl6ZWQgYW5kIHRoZXkgYXJlIGFsbW9zdFxuLy8gICAgbmV2ZXIgaW5saW5lZCBwcm9wZXJseSBpbiBzdGF0aWMgY29tcGlsZXJzLlxuLy8gMikgTm9ib2R5IHNob3VsZCByZWx5IG9uIGBpbnN0YW5jZW9mIEZpYmVyYCBmb3IgdHlwZSB0ZXN0aW5nLiBXZSBzaG91bGRcbi8vICAgIGFsd2F5cyBrbm93IHdoZW4gaXQgaXMgYSBmaWJlci5cbi8vIDMpIFdlIG1pZ2h0IHdhbnQgdG8gZXhwZXJpbWVudCB3aXRoIHVzaW5nIG51bWVyaWMga2V5cyBzaW5jZSB0aGV5IGFyZSBlYXNpZXJcbi8vICAgIHRvIG9wdGltaXplIGluIGEgbm9uLUpJVCBlbnZpcm9ubWVudC5cbi8vIDQpIFdlIGNhbiBlYXNpbHkgZ28gZnJvbSBhIGNvbnN0cnVjdG9yIHRvIGEgY3JlYXRlRmliZXIgb2JqZWN0IGxpdGVyYWwgaWYgdGhhdFxuLy8gICAgaXMgZmFzdGVyLlxuLy8gNSkgSXQgc2hvdWxkIGJlIGVhc3kgdG8gcG9ydCB0aGlzIHRvIGEgQyBzdHJ1Y3QgYW5kIGtlZXAgYSBDIGltcGxlbWVudGF0aW9uXG4vLyAgICBjb21wYXRpYmxlLlxuXG5cbnZhciBjcmVhdGVGaWJlciA9IGZ1bmN0aW9uICh0YWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKSB7XG4gIC8vICRGbG93Rml4TWU6IHRoZSBzaGFwZXMgYXJlIGV4YWN0IGhlcmUgYnV0IEZsb3cgZG9lc24ndCBsaWtlIGNvbnN0cnVjdG9yc1xuICByZXR1cm4gbmV3IEZpYmVyTm9kZSh0YWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbn07XG5cbmZ1bmN0aW9uIHNob3VsZENvbnN0cnVjdCQxKENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGlzU2ltcGxlRnVuY3Rpb25Db21wb25lbnQodHlwZSkge1xuICByZXR1cm4gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgJiYgIXNob3VsZENvbnN0cnVjdCQxKHR5cGUpICYmIHR5cGUuZGVmYXVsdFByb3BzID09PSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiByZXNvbHZlTGF6eUNvbXBvbmVudFRhZyhDb21wb25lbnQpIHtcbiAgaWYgKHR5cGVvZiBDb21wb25lbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc2hvdWxkQ29uc3RydWN0JDEoQ29tcG9uZW50KSA/IENsYXNzQ29tcG9uZW50IDogRnVuY3Rpb25Db21wb25lbnQ7XG4gIH0gZWxzZSBpZiAoQ29tcG9uZW50ICE9PSB1bmRlZmluZWQgJiYgQ29tcG9uZW50ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gQ29tcG9uZW50LiQkdHlwZW9mO1xuXG4gICAgaWYgKCQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFKSB7XG4gICAgICByZXR1cm4gRm9yd2FyZFJlZjtcbiAgICB9XG5cbiAgICBpZiAoJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgcmV0dXJuIE1lbW9Db21wb25lbnQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ7XG59IC8vIFRoaXMgaXMgdXNlZCB0byBjcmVhdGUgYW4gYWx0ZXJuYXRlIGZpYmVyIHRvIGRvIHdvcmsgb24uXG5cbmZ1bmN0aW9uIGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnQsIHBlbmRpbmdQcm9wcykge1xuICB2YXIgd29ya0luUHJvZ3Jlc3MgPSBjdXJyZW50LmFsdGVybmF0ZTtcblxuICBpZiAod29ya0luUHJvZ3Jlc3MgPT09IG51bGwpIHtcbiAgICAvLyBXZSB1c2UgYSBkb3VibGUgYnVmZmVyaW5nIHBvb2xpbmcgdGVjaG5pcXVlIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHdlJ2xsXG4gICAgLy8gb25seSBldmVyIG5lZWQgYXQgbW9zdCB0d28gdmVyc2lvbnMgb2YgYSB0cmVlLiBXZSBwb29sIHRoZSBcIm90aGVyXCIgdW51c2VkXG4gICAgLy8gbm9kZSB0aGF0IHdlJ3JlIGZyZWUgdG8gcmV1c2UuIFRoaXMgaXMgbGF6aWx5IGNyZWF0ZWQgdG8gYXZvaWQgYWxsb2NhdGluZ1xuICAgIC8vIGV4dHJhIG9iamVjdHMgZm9yIHRoaW5ncyB0aGF0IGFyZSBuZXZlciB1cGRhdGVkLiBJdCBhbHNvIGFsbG93IHVzIHRvXG4gICAgLy8gcmVjbGFpbSB0aGUgZXh0cmEgbWVtb3J5IGlmIG5lZWRlZC5cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IGNyZWF0ZUZpYmVyKGN1cnJlbnQudGFnLCBwZW5kaW5nUHJvcHMsIGN1cnJlbnQua2V5LCBjdXJyZW50Lm1vZGUpO1xuICAgIHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID0gY3VycmVudC5lbGVtZW50VHlwZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlO1xuICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGN1cnJlbnQuc3RhdGVOb2RlO1xuXG4gICAge1xuICAgICAgLy8gREVWLW9ubHkgZmllbGRzXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdTb3VyY2UgPSBjdXJyZW50Ll9kZWJ1Z1NvdXJjZTtcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z093bmVyID0gY3VycmVudC5fZGVidWdPd25lcjtcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z0hvb2tUeXBlcyA9IGN1cnJlbnQuX2RlYnVnSG9va1R5cGVzO1xuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IGN1cnJlbnQ7XG4gICAgY3VycmVudC5hbHRlcm5hdGUgPSB3b3JrSW5Qcm9ncmVzcztcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMgPSBwZW5kaW5nUHJvcHM7IC8vIE5lZWRlZCBiZWNhdXNlIEJsb2NrcyBzdG9yZSBkYXRhIG9uIHR5cGUuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlOyAvLyBXZSBhbHJlYWR5IGhhdmUgYW4gYWx0ZXJuYXRlLlxuICAgIC8vIFJlc2V0IHRoZSBlZmZlY3QgdGFnLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBOb0ZsYWdzOyAvLyBUaGUgZWZmZWN0cyBhcmUgbm8gbG9uZ2VyIHZhbGlkLlxuXG4gICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBudWxsO1xuXG4gICAge1xuICAgICAgLy8gV2UgaW50ZW50aW9uYWxseSByZXNldCwgcmF0aGVyIHRoYW4gY29weSwgYWN0dWFsRHVyYXRpb24gJiBhY3R1YWxTdGFydFRpbWUuXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIHRpbWUgZnJvbSBlbmRsZXNzbHkgYWNjdW11bGF0aW5nIGluIG5ldyBjb21taXRzLlxuICAgICAgLy8gVGhpcyBoYXMgdGhlIGRvd25zaWRlIG9mIHJlc2V0dGluZyB2YWx1ZXMgZm9yIGRpZmZlcmVudCBwcmlvcml0eSByZW5kZXJzLFxuICAgICAgLy8gQnV0IHdvcmtzIGZvciB5aWVsZGluZyAodGhlIGNvbW1vbiBjYXNlKSBhbmQgc2hvdWxkIHN1cHBvcnQgcmVzdW1pbmcuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5hY3R1YWxEdXJhdGlvbiA9IDA7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5hY3R1YWxTdGFydFRpbWUgPSAtMTtcbiAgICB9XG4gIH0gLy8gUmVzZXQgYWxsIGVmZmVjdHMgZXhjZXB0IHN0YXRpYyBvbmVzLlxuICAvLyBTdGF0aWMgZWZmZWN0cyBhcmUgbm90IHNwZWNpZmljIHRvIGEgcmVuZGVyLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBjdXJyZW50LmZsYWdzICYgU3RhdGljTWFzaztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IGN1cnJlbnQuY2hpbGRMYW5lcztcbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQ7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTsgLy8gQ2xvbmUgdGhlIGRlcGVuZGVuY2llcyBvYmplY3QuIFRoaXMgaXMgbXV0YXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSwgc29cbiAgLy8gaXQgY2Fubm90IGJlIHNoYXJlZCB3aXRoIHRoZSBjdXJyZW50IGZpYmVyLlxuXG4gIHZhciBjdXJyZW50RGVwZW5kZW5jaWVzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IGN1cnJlbnREZXBlbmRlbmNpZXMgPT09IG51bGwgPyBudWxsIDoge1xuICAgIGxhbmVzOiBjdXJyZW50RGVwZW5kZW5jaWVzLmxhbmVzLFxuICAgIGZpcnN0Q29udGV4dDogY3VycmVudERlcGVuZGVuY2llcy5maXJzdENvbnRleHRcbiAgfTsgLy8gVGhlc2Ugd2lsbCBiZSBvdmVycmlkZGVuIGR1cmluZyB0aGUgcGFyZW50J3MgcmVjb25jaWxpYXRpb25cblxuICB3b3JrSW5Qcm9ncmVzcy5zaWJsaW5nID0gY3VycmVudC5zaWJsaW5nO1xuICB3b3JrSW5Qcm9ncmVzcy5pbmRleCA9IGN1cnJlbnQuaW5kZXg7XG4gIHdvcmtJblByb2dyZXNzLnJlZiA9IGN1cnJlbnQucmVmO1xuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50LnRyZWVCYXNlRHVyYXRpb247XG4gIH1cblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnTmVlZHNSZW1vdW50ID0gY3VycmVudC5fZGVidWdOZWVkc1JlbW91bnQ7XG5cbiAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhjdXJyZW50LnR5cGUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyhjdXJyZW50LnR5cGUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gcmVzb2x2ZUZvcndhcmRSZWZGb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xufSAvLyBVc2VkIHRvIHJldXNlIGEgRmliZXIgZm9yIGEgc2Vjb25kIHBhc3MuXG5cbmZ1bmN0aW9uIHJlc2V0V29ya0luUHJvZ3Jlc3Mod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgcmVzZXRzIHRoZSBGaWJlciB0byB3aGF0IGNyZWF0ZUZpYmVyIG9yIGNyZWF0ZVdvcmtJblByb2dyZXNzIHdvdWxkXG4gIC8vIGhhdmUgc2V0IHRoZSB2YWx1ZXMgdG8gYmVmb3JlIGR1cmluZyB0aGUgZmlyc3QgcGFzcy4gSWRlYWxseSB0aGlzIHdvdWxkbid0XG4gIC8vIGJlIG5lY2Vzc2FyeSBidXQgdW5mb3J0dW5hdGVseSBtYW55IGNvZGUgcGF0aHMgcmVhZHMgZnJvbSB0aGUgd29ya0luUHJvZ3Jlc3NcbiAgLy8gd2hlbiB0aGV5IHNob3VsZCBiZSByZWFkaW5nIGZyb20gY3VycmVudCBhbmQgd3JpdGluZyB0byB3b3JrSW5Qcm9ncmVzcy5cbiAgLy8gV2UgYXNzdW1lIHBlbmRpbmdQcm9wcywgaW5kZXgsIGtleSwgcmVmLCByZXR1cm4gYXJlIHN0aWxsIHVudG91Y2hlZCB0b1xuICAvLyBhdm9pZCBkb2luZyBhbm90aGVyIHJlY29uY2lsaWF0aW9uLlxuICAvLyBSZXNldCB0aGUgZWZmZWN0IGZsYWdzIGJ1dCBrZWVwIGFueSBQbGFjZW1lbnQgdGFncywgc2luY2UgdGhhdCdzIHNvbWV0aGluZ1xuICAvLyB0aGF0IGNoaWxkIGZpYmVyIGlzIHNldHRpbmcsIG5vdCB0aGUgcmVjb25jaWxpYXRpb24uXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IFN0YXRpY01hc2sgfCBQbGFjZW1lbnQ7IC8vIFRoZSBlZmZlY3RzIGFyZSBubyBsb25nZXIgdmFsaWQuXG5cbiAgdmFyIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBSZXNldCB0byBjcmVhdGVGaWJlcidzIGluaXRpYWwgdmFsdWVzLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gcmVuZGVyTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gbnVsbDtcblxuICAgIHtcbiAgICAgIC8vIE5vdGU6IFdlIGRvbid0IHJlc2V0IHRoZSBhY3R1YWxUaW1lIGNvdW50cy4gSXQncyB1c2VmdWwgdG8gYWNjdW11bGF0ZVxuICAgICAgLy8gYWN0dWFsIHRpbWUgYWNyb3NzIG11bHRpcGxlIHJlbmRlciBwYXNzZXMuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBSZXNldCB0byB0aGUgY2xvbmVkIHZhbHVlcyB0aGF0IGNyZWF0ZVdvcmtJblByb2dyZXNzIHdvdWxkJ3ZlLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBjdXJyZW50LmNoaWxkTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgIHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTsgLy8gTmVlZGVkIGJlY2F1c2UgQmxvY2tzIHN0b3JlIGRhdGEgb24gdHlwZS5cblxuICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGU7IC8vIENsb25lIHRoZSBkZXBlbmRlbmNpZXMgb2JqZWN0LiBUaGlzIGlzIG11dGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UsIHNvXG4gICAgLy8gaXQgY2Fubm90IGJlIHNoYXJlZCB3aXRoIHRoZSBjdXJyZW50IGZpYmVyLlxuXG4gICAgdmFyIGN1cnJlbnREZXBlbmRlbmNpZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50RGVwZW5kZW5jaWVzID09PSBudWxsID8gbnVsbCA6IHtcbiAgICAgIGxhbmVzOiBjdXJyZW50RGVwZW5kZW5jaWVzLmxhbmVzLFxuICAgICAgZmlyc3RDb250ZXh0OiBjdXJyZW50RGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dFxuICAgIH07XG5cbiAgICB7XG4gICAgICAvLyBOb3RlOiBXZSBkb24ndCByZXNldCB0aGUgYWN0dWFsVGltZSBjb3VudHMuIEl0J3MgdXNlZnVsIHRvIGFjY3VtdWxhdGVcbiAgICAgIC8vIGFjdHVhbCB0aW1lIGFjcm9zcyBtdWx0aXBsZSByZW5kZXIgcGFzc2VzLlxuICAgICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xufVxuZnVuY3Rpb24gY3JlYXRlSG9zdFJvb3RGaWJlcih0YWcsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSkge1xuICB2YXIgbW9kZTtcblxuICBpZiAodGFnID09PSBDb25jdXJyZW50Um9vdCkge1xuICAgIG1vZGUgPSBDb25jdXJyZW50TW9kZTtcblxuICAgIGlmIChpc1N0cmljdE1vZGUgPT09IHRydWUpIHtcbiAgICAgIG1vZGUgfD0gU3RyaWN0TGVnYWN5TW9kZTtcblxuICAgICAge1xuICAgICAgICBtb2RlIHw9IFN0cmljdEVmZmVjdHNNb2RlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBtb2RlID0gTm9Nb2RlO1xuICB9XG5cbiAgaWYgKCBpc0RldlRvb2xzUHJlc2VudCkge1xuICAgIC8vIEFsd2F5cyBjb2xsZWN0IHByb2ZpbGUgdGltaW5ncyB3aGVuIERldlRvb2xzIGFyZSBwcmVzZW50LlxuICAgIC8vIFRoaXMgZW5hYmxlcyBEZXZUb29scyB0byBzdGFydCBjYXB0dXJpbmcgdGltaW5nIGF0IGFueSBwb2ludOKAk1xuICAgIC8vIFdpdGhvdXQgc29tZSBub2RlcyBpbiB0aGUgdHJlZSBoYXZpbmcgZW1wdHkgYmFzZSB0aW1lcy5cbiAgICBtb2RlIHw9IFByb2ZpbGVNb2RlO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUZpYmVyKEhvc3RSb290LCBudWxsLCBudWxsLCBtb2RlKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh0eXBlLCAvLyBSZWFjdCRFbGVtZW50VHlwZVxua2V5LCBwZW5kaW5nUHJvcHMsIG93bmVyLCBtb2RlLCBsYW5lcykge1xuICB2YXIgZmliZXJUYWcgPSBJbmRldGVybWluYXRlQ29tcG9uZW50OyAvLyBUaGUgcmVzb2x2ZWQgdHlwZSBpcyBzZXQgaWYgd2Uga25vdyB3aGF0IHRoZSBmaW5hbCB0eXBlIHdpbGwgYmUuIEkuZS4gaXQncyBub3QgbGF6eS5cblxuICB2YXIgcmVzb2x2ZWRUeXBlID0gdHlwZTtcblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoc2hvdWxkQ29uc3RydWN0JDEodHlwZSkpIHtcbiAgICAgIGZpYmVyVGFnID0gQ2xhc3NDb21wb25lbnQ7XG5cbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIGZpYmVyVGFnID0gSG9zdENvbXBvbmVudDtcbiAgfSBlbHNlIHtcbiAgICBnZXRUYWc6IHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQocGVuZGluZ1Byb3BzLmNoaWxkcmVuLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICBmaWJlclRhZyA9IE1vZGU7XG4gICAgICAgIG1vZGUgfD0gU3RyaWN0TGVnYWN5TW9kZTtcblxuICAgICAgICBpZiAoIChtb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAvLyBTdHJpY3QgZWZmZWN0cyBzaG91bGQgbmV2ZXIgcnVuIG9uIGxlZ2FjeSByb290c1xuICAgICAgICAgIG1vZGUgfD0gU3RyaWN0RWZmZWN0c01vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tUHJvZmlsZXIocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2UocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZUxpc3QocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9PRkZTQ1JFRU5fVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfU0NPUEVfVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfQ0FDSEVfVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfVFJBQ0lOR19NQVJLRVJfVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gQ29udGV4dFByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcblxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgY29uc3VtZXJcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IENvbnRleHRDb25zdW1lcjtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gRm9yd2FyZFJlZjtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gTWVtb0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBMYXp5Q29tcG9uZW50O1xuICAgICAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICBpbmZvICs9ICcgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgJyArIFwiaXQncyBkZWZpbmVkIGluLCBvciB5b3UgbWlnaHQgaGF2ZSBtaXhlZCB1cCBkZWZhdWx0IGFuZCBcIiArICduYW1lZCBpbXBvcnRzLic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBvd25lck5hbWUgPSBvd25lciA/IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIob3duZXIpIDogbnVsbDtcblxuICAgICAgICAgICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgICAgICAgICBpbmZvICs9ICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbGVtZW50IHR5cGUgaXMgaW52YWxpZDogZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciBidWlsdC1pbiAnICsgJ2NvbXBvbmVudHMpIG9yIGEgY2xhc3MvZnVuY3Rpb24gKGZvciBjb21wb3NpdGUgY29tcG9uZW50cykgJyArIChcImJ1dCBnb3Q6IFwiICsgKHR5cGUgPT0gbnVsbCA/IHR5cGUgOiB0eXBlb2YgdHlwZSkgKyBcIi5cIiArIGluZm8pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKGZpYmVyVGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gdHlwZTtcbiAgZmliZXIudHlwZSA9IHJlc29sdmVkVHlwZTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcblxuICB7XG4gICAgZmliZXIuX2RlYnVnT3duZXIgPSBvd25lcjtcbiAgfVxuXG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoZWxlbWVudCwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIG93bmVyID0gbnVsbDtcblxuICB7XG4gICAgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgfVxuXG4gIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gIHZhciBwZW5kaW5nUHJvcHMgPSBlbGVtZW50LnByb3BzO1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHModHlwZSwga2V5LCBwZW5kaW5nUHJvcHMsIG93bmVyLCBtb2RlLCBsYW5lcyk7XG5cbiAge1xuICAgIGZpYmVyLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICBmaWJlci5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICB9XG5cbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZWxlbWVudHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoRnJhZ21lbnQsIGVsZW1lbnRzLCBrZXksIG1vZGUpO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVByb2ZpbGVyKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB7XG4gICAgaWYgKHR5cGVvZiBwZW5kaW5nUHJvcHMuaWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICBlcnJvcignUHJvZmlsZXIgbXVzdCBzcGVjaWZ5IGFuIFwiaWRcIiBvZiB0eXBlIGBzdHJpbmdgIGFzIGEgcHJvcC4gUmVjZWl2ZWQgdGhlIHR5cGUgYCVzYCBpbnN0ZWFkLicsIHR5cGVvZiBwZW5kaW5nUHJvcHMuaWQpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKFByb2ZpbGVyLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSB8IFByb2ZpbGVNb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuXG4gIHtcbiAgICBmaWJlci5zdGF0ZU5vZGUgPSB7XG4gICAgICBlZmZlY3REdXJhdGlvbjogMCxcbiAgICAgIHBhc3NpdmVFZmZlY3REdXJhdGlvbjogMFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihTdXNwZW5zZUNvbXBvbmVudCwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlTGlzdChwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoU3VzcGVuc2VMaXN0Q29tcG9uZW50LCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW4ocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKE9mZnNjcmVlbkNvbXBvbmVudCwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX09GRlNDUkVFTl9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICB2YXIgcHJpbWFyeUNoaWxkSW5zdGFuY2UgPSB7XG4gICAgaXNIaWRkZW46IGZhbHNlXG4gIH07XG4gIGZpYmVyLnN0YXRlTm9kZSA9IHByaW1hcnlDaGlsZEluc3RhbmNlO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UZXh0KGNvbnRlbnQsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RUZXh0LCBjb250ZW50LCBudWxsLCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tSG9zdEluc3RhbmNlRm9yRGVsZXRpb24oKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RDb21wb25lbnQsIG51bGwsIG51bGwsIE5vTW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gJ0RFTEVURUQnO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21EZWh5ZHJhdGVkRnJhZ21lbnQoZGVoeWRyYXRlZE5vZGUpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoRGVoeWRyYXRlZEZyYWdtZW50LCBudWxsLCBudWxsLCBOb01vZGUpO1xuICBmaWJlci5zdGF0ZU5vZGUgPSBkZWh5ZHJhdGVkTm9kZTtcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIHBlbmRpbmdQcm9wcyA9IHBvcnRhbC5jaGlsZHJlbiAhPT0gbnVsbCA/IHBvcnRhbC5jaGlsZHJlbiA6IFtdO1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihIb3N0UG9ydGFsLCBwZW5kaW5nUHJvcHMsIHBvcnRhbC5rZXksIG1vZGUpO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICBmaWJlci5zdGF0ZU5vZGUgPSB7XG4gICAgY29udGFpbmVySW5mbzogcG9ydGFsLmNvbnRhaW5lckluZm8sXG4gICAgcGVuZGluZ0NoaWxkcmVuOiBudWxsLFxuICAgIC8vIFVzZWQgYnkgcGVyc2lzdGVudCB1cGRhdGVzXG4gICAgaW1wbGVtZW50YXRpb246IHBvcnRhbC5pbXBsZW1lbnRhdGlvblxuICB9O1xuICByZXR1cm4gZmliZXI7XG59IC8vIFVzZWQgZm9yIHN0YXNoaW5nIFdJUCBwcm9wZXJ0aWVzIHRvIHJlcGxheSBmYWlsZWQgd29yayBpbiBERVYuXG5cbmZ1bmN0aW9uIGFzc2lnbkZpYmVyUHJvcGVydGllc0luREVWKHRhcmdldCwgc291cmNlKSB7XG4gIGlmICh0YXJnZXQgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIEZpYmVyJ3MgaW5pdGlhbCBwcm9wZXJ0aWVzIHdpbGwgYWx3YXlzIGJlIG92ZXJ3cml0dGVuLlxuICAgIC8vIFdlIG9ubHkgdXNlIGEgRmliZXIgdG8gZW5zdXJlIHRoZSBzYW1lIGhpZGRlbiBjbGFzcyBzbyBERVYgaXNuJ3Qgc2xvdy5cbiAgICB0YXJnZXQgPSBjcmVhdGVGaWJlcihJbmRldGVybWluYXRlQ29tcG9uZW50LCBudWxsLCBudWxsLCBOb01vZGUpO1xuICB9IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSB3cml0dGVuIGFzIGEgbGlzdCBvZiBhbGwgcHJvcGVydGllcy5cbiAgLy8gV2UgdHJpZWQgdG8gdXNlIE9iamVjdC5hc3NpZ24oKSBpbnN0ZWFkIGJ1dCB0aGlzIGlzIGNhbGxlZCBpblxuICAvLyB0aGUgaG90dGVzdCBwYXRoLCBhbmQgT2JqZWN0LmFzc2lnbigpIHdhcyB0b28gc2xvdzpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjUwMlxuICAvLyBUaGlzIGNvZGUgaXMgREVWLW9ubHkgc28gc2l6ZSBpcyBub3QgYSBjb25jZXJuLlxuXG5cbiAgdGFyZ2V0LnRhZyA9IHNvdXJjZS50YWc7XG4gIHRhcmdldC5rZXkgPSBzb3VyY2Uua2V5O1xuICB0YXJnZXQuZWxlbWVudFR5cGUgPSBzb3VyY2UuZWxlbWVudFR5cGU7XG4gIHRhcmdldC50eXBlID0gc291cmNlLnR5cGU7XG4gIHRhcmdldC5zdGF0ZU5vZGUgPSBzb3VyY2Uuc3RhdGVOb2RlO1xuICB0YXJnZXQucmV0dXJuID0gc291cmNlLnJldHVybjtcbiAgdGFyZ2V0LmNoaWxkID0gc291cmNlLmNoaWxkO1xuICB0YXJnZXQuc2libGluZyA9IHNvdXJjZS5zaWJsaW5nO1xuICB0YXJnZXQuaW5kZXggPSBzb3VyY2UuaW5kZXg7XG4gIHRhcmdldC5yZWYgPSBzb3VyY2UucmVmO1xuICB0YXJnZXQucGVuZGluZ1Byb3BzID0gc291cmNlLnBlbmRpbmdQcm9wcztcbiAgdGFyZ2V0Lm1lbW9pemVkUHJvcHMgPSBzb3VyY2UubWVtb2l6ZWRQcm9wcztcbiAgdGFyZ2V0LnVwZGF0ZVF1ZXVlID0gc291cmNlLnVwZGF0ZVF1ZXVlO1xuICB0YXJnZXQubWVtb2l6ZWRTdGF0ZSA9IHNvdXJjZS5tZW1vaXplZFN0YXRlO1xuICB0YXJnZXQuZGVwZW5kZW5jaWVzID0gc291cmNlLmRlcGVuZGVuY2llcztcbiAgdGFyZ2V0Lm1vZGUgPSBzb3VyY2UubW9kZTtcbiAgdGFyZ2V0LmZsYWdzID0gc291cmNlLmZsYWdzO1xuICB0YXJnZXQuc3VidHJlZUZsYWdzID0gc291cmNlLnN1YnRyZWVGbGFncztcbiAgdGFyZ2V0LmRlbGV0aW9ucyA9IHNvdXJjZS5kZWxldGlvbnM7XG4gIHRhcmdldC5sYW5lcyA9IHNvdXJjZS5sYW5lcztcbiAgdGFyZ2V0LmNoaWxkTGFuZXMgPSBzb3VyY2UuY2hpbGRMYW5lcztcbiAgdGFyZ2V0LmFsdGVybmF0ZSA9IHNvdXJjZS5hbHRlcm5hdGU7XG5cbiAge1xuICAgIHRhcmdldC5hY3R1YWxEdXJhdGlvbiA9IHNvdXJjZS5hY3R1YWxEdXJhdGlvbjtcbiAgICB0YXJnZXQuYWN0dWFsU3RhcnRUaW1lID0gc291cmNlLmFjdHVhbFN0YXJ0VGltZTtcbiAgICB0YXJnZXQuc2VsZkJhc2VEdXJhdGlvbiA9IHNvdXJjZS5zZWxmQmFzZUR1cmF0aW9uO1xuICAgIHRhcmdldC50cmVlQmFzZUR1cmF0aW9uID0gc291cmNlLnRyZWVCYXNlRHVyYXRpb247XG4gIH1cblxuICB0YXJnZXQuX2RlYnVnU291cmNlID0gc291cmNlLl9kZWJ1Z1NvdXJjZTtcbiAgdGFyZ2V0Ll9kZWJ1Z093bmVyID0gc291cmNlLl9kZWJ1Z093bmVyO1xuICB0YXJnZXQuX2RlYnVnTmVlZHNSZW1vdW50ID0gc291cmNlLl9kZWJ1Z05lZWRzUmVtb3VudDtcbiAgdGFyZ2V0Ll9kZWJ1Z0hvb2tUeXBlcyA9IHNvdXJjZS5fZGVidWdIb29rVHlwZXM7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIEZpYmVyUm9vdE5vZGUoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpIHtcbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMuY29udGFpbmVySW5mbyA9IGNvbnRhaW5lckluZm87XG4gIHRoaXMucGVuZGluZ0NoaWxkcmVuID0gbnVsbDtcbiAgdGhpcy5jdXJyZW50ID0gbnVsbDtcbiAgdGhpcy5waW5nQ2FjaGUgPSBudWxsO1xuICB0aGlzLmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHRoaXMudGltZW91dEhhbmRsZSA9IG5vVGltZW91dDtcbiAgdGhpcy5jb250ZXh0ID0gbnVsbDtcbiAgdGhpcy5wZW5kaW5nQ29udGV4dCA9IG51bGw7XG4gIHRoaXMuY2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgdGhpcy5jYWxsYmFja1ByaW9yaXR5ID0gTm9MYW5lO1xuICB0aGlzLmV2ZW50VGltZXMgPSBjcmVhdGVMYW5lTWFwKE5vTGFuZXMpO1xuICB0aGlzLmV4cGlyYXRpb25UaW1lcyA9IGNyZWF0ZUxhbmVNYXAoTm9UaW1lc3RhbXApO1xuICB0aGlzLnBlbmRpbmdMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuc3VzcGVuZGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLnBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5leHBpcmVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLm11dGFibGVSZWFkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmZpbmlzaGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmVudGFuZ2xlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5lbnRhbmdsZW1lbnRzID0gY3JlYXRlTGFuZU1hcChOb0xhbmVzKTtcbiAgdGhpcy5pZGVudGlmaWVyUHJlZml4ID0gaWRlbnRpZmllclByZWZpeDtcbiAgdGhpcy5vblJlY292ZXJhYmxlRXJyb3IgPSBvblJlY292ZXJhYmxlRXJyb3I7XG5cbiAge1xuICAgIHRoaXMubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YSA9IG51bGw7XG4gIH1cblxuICB7XG4gICAgdGhpcy5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgdGhpcy5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICB9XG5cbiAge1xuICAgIHRoaXMubWVtb2l6ZWRVcGRhdGVycyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IHRoaXMucGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IFRvdGFsTGFuZXM7IF9pKyspIHtcbiAgICAgIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAucHVzaChuZXcgU2V0KCkpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSBDb25jdXJyZW50Um9vdDpcbiAgICAgICAgdGhpcy5fZGVidWdSb290VHlwZSA9IGh5ZHJhdGUgPyAnaHlkcmF0ZVJvb3QoKScgOiAnY3JlYXRlUm9vdCgpJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTGVnYWN5Um9vdDpcbiAgICAgICAgdGhpcy5fZGVidWdSb290VHlwZSA9IGh5ZHJhdGUgPyAnaHlkcmF0ZSgpJyA6ICdyZW5kZXIoKSc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlclJvb3QoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpbml0aWFsQ2hpbGRyZW4sIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCAvLyBUT0RPOiBXZSBoYXZlIHNldmVyYWwgb2YgdGhlc2UgYXJndW1lbnRzIHRoYXQgYXJlIGNvbmNlcHR1YWxseSBwYXJ0IG9mIHRoZVxuLy8gaG9zdCBjb25maWcsIGJ1dCBiZWNhdXNlIHRoZXkgYXJlIHBhc3NlZCBpbiBhdCBydW50aW1lLCB3ZSBoYXZlIHRvIHRocmVhZFxuLy8gdGhlbSB0aHJvdWdoIHRoZSByb290IGNvbnN0cnVjdG9yLiBQZXJoYXBzIHdlIHNob3VsZCBwdXQgdGhlbSBhbGwgaW50byBhXG4vLyBzaW5nbGUgdHlwZSwgbGlrZSBhIER5bmFtaWNIb3N0Q29uZmlnIHRoYXQgaXMgZGVmaW5lZCBieSB0aGUgcmVuZGVyZXIuXG5pZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IsIHRyYW5zaXRpb25DYWxsYmFja3MpIHtcbiAgdmFyIHJvb3QgPSBuZXcgRmliZXJSb290Tm9kZShjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7XG4gIC8vIHN0YXRlTm9kZSBpcyBhbnkuXG5cblxuICB2YXIgdW5pbml0aWFsaXplZEZpYmVyID0gY3JlYXRlSG9zdFJvb3RGaWJlcih0YWcsIGlzU3RyaWN0TW9kZSk7XG4gIHJvb3QuY3VycmVudCA9IHVuaW5pdGlhbGl6ZWRGaWJlcjtcbiAgdW5pbml0aWFsaXplZEZpYmVyLnN0YXRlTm9kZSA9IHJvb3Q7XG5cbiAge1xuICAgIHZhciBfaW5pdGlhbFN0YXRlID0ge1xuICAgICAgZWxlbWVudDogaW5pdGlhbENoaWxkcmVuLFxuICAgICAgaXNEZWh5ZHJhdGVkOiBoeWRyYXRlLFxuICAgICAgY2FjaGU6IG51bGwsXG4gICAgICAvLyBub3QgZW5hYmxlZCB5ZXRcbiAgICAgIHRyYW5zaXRpb25zOiBudWxsLFxuICAgICAgcGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczogbnVsbFxuICAgIH07XG4gICAgdW5pbml0aWFsaXplZEZpYmVyLm1lbW9pemVkU3RhdGUgPSBfaW5pdGlhbFN0YXRlO1xuICB9XG5cbiAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHVuaW5pdGlhbGl6ZWRGaWJlcik7XG4gIHJldHVybiByb290O1xufVxuXG52YXIgUmVhY3RWZXJzaW9uID0gJzE4LjIuMCc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVBvcnRhbChjaGlsZHJlbiwgY29udGFpbmVySW5mbywgLy8gVE9ETzogZmlndXJlIG91dCB0aGUgQVBJIGZvciBjcm9zcy1yZW5kZXJlciBpbXBsZW1lbnRhdGlvbi5cbmltcGxlbWVudGF0aW9uKSB7XG4gIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG5cbiAge1xuICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oa2V5KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3cgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IFBvcnRhbFxuICAgICQkdHlwZW9mOiBSRUFDVF9QT1JUQUxfVFlQRSxcbiAgICBrZXk6IGtleSA9PSBudWxsID8gbnVsbCA6ICcnICsga2V5LFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICBjb250YWluZXJJbmZvOiBjb250YWluZXJJbmZvLFxuICAgIGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvblxuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcztcbnZhciBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZTtcblxue1xuICBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlID0ge307XG59XG5cbmZ1bmN0aW9uIGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCkge1xuICBpZiAoIXBhcmVudENvbXBvbmVudCkge1xuICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQocGFyZW50Q29tcG9uZW50KTtcbiAgdmFyIHBhcmVudENvbnRleHQgPSBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcik7XG5cbiAgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICB2YXIgQ29tcG9uZW50ID0gZmliZXIudHlwZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc0NoaWxkQ29udGV4dChmaWJlciwgQ29tcG9uZW50LCBwYXJlbnRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFyZW50Q29udGV4dDtcbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nKGNvbXBvbmVudCwgbWV0aG9kTmFtZSkge1xuICB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGNvbXBvbmVudCk7XG5cbiAgICBpZiAoZmliZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhjb21wb25lbnQpLmpvaW4oJywnKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXJndW1lbnQgYXBwZWFycyB0byBub3QgYmUgYSBSZWFjdENvbXBvbmVudC4gS2V5czogXCIgKyBrZXlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXIoZmliZXIpO1xuXG4gICAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGhvc3RGaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZVtjb21wb25lbnROYW1lXSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZVtjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihob3N0RmliZXIpO1xuXG4gICAgICAgICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgICAgICBlcnJvcignJXMgaXMgZGVwcmVjYXRlZCBpbiBTdHJpY3RNb2RlLiAnICsgJyVzIHdhcyBwYXNzZWQgYW4gaW5zdGFuY2Ugb2YgJXMgd2hpY2ggaXMgaW5zaWRlIFN0cmljdE1vZGUuICcgKyAnSW5zdGVhZCwgYWRkIGEgcmVmIGRpcmVjdGx5IHRvIHRoZSBlbGVtZW50IHlvdSB3YW50IHRvIHJlZmVyZW5jZS4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLWZpbmQtbm9kZScsIG1ldGhvZE5hbWUsIG1ldGhvZE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcignJXMgaXMgZGVwcmVjYXRlZCBpbiBTdHJpY3RNb2RlLiAnICsgJyVzIHdhcyBwYXNzZWQgYW4gaW5zdGFuY2Ugb2YgJXMgd2hpY2ggcmVuZGVycyBTdHJpY3RNb2RlIGNoaWxkcmVuLiAnICsgJ0luc3RlYWQsIGFkZCBhIHJlZiBkaXJlY3RseSB0byB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byByZWZlcmVuY2UuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1maW5kLW5vZGUnLCBtZXRob2ROYW1lLCBtZXRob2ROYW1lLCBjb21wb25lbnROYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgLy8gSWRlYWxseSB0aGlzIHNob3VsZCByZXNldCB0byBwcmV2aW91cyBidXQgdGhpcyBzaG91bGRuJ3QgYmUgY2FsbGVkIGluXG4gICAgICAgICAgLy8gcmVuZGVyIGFuZCB0aGVyZSdzIGFub3RoZXIgd2FybmluZyBmb3IgdGhhdCBhbnl3YXkuXG4gICAgICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHtcbiAgICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihwcmV2aW91c0ZpYmVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaG9zdEZpYmVyLnN0YXRlTm9kZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDb250YWluZXIoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yLCB0cmFuc2l0aW9uQ2FsbGJhY2tzKSB7XG4gIHZhciBoeWRyYXRlID0gZmFsc2U7XG4gIHZhciBpbml0aWFsQ2hpbGRyZW4gPSBudWxsO1xuICByZXR1cm4gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaW5pdGlhbENoaWxkcmVuLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUh5ZHJhdGlvbkNvbnRhaW5lcihpbml0aWFsQ2hpbGRyZW4sIC8vIFRPRE86IFJlbW92ZSBgY2FsbGJhY2tgIHdoZW4gd2UgZGVsZXRlIGxlZ2FjeSBtb2RlLlxuY2FsbGJhY2ssIGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvciwgdHJhbnNpdGlvbkNhbGxiYWNrcykge1xuICB2YXIgaHlkcmF0ZSA9IHRydWU7XG4gIHZhciByb290ID0gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaW5pdGlhbENoaWxkcmVuLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTsgLy8gVE9ETzogTW92ZSB0aGlzIHRvIEZpYmVyUm9vdCBjb25zdHJ1Y3RvclxuXG4gIHJvb3QuY29udGV4dCA9IGdldENvbnRleHRGb3JTdWJ0cmVlKG51bGwpOyAvLyBTY2hlZHVsZSB0aGUgaW5pdGlhbCByZW5kZXIuIEluIGEgaHlkcmF0aW9uIHJvb3QsIHRoaXMgaXMgZGlmZmVyZW50IGZyb21cbiAgLy8gYSByZWd1bGFyIHVwZGF0ZSBiZWNhdXNlIHRoZSBpbml0aWFsIHJlbmRlciBtdXN0IG1hdGNoIHdhcyB3YXMgcmVuZGVyZWRcbiAgLy8gb24gdGhlIHNlcnZlci5cbiAgLy8gTk9URTogVGhpcyB1cGRhdGUgaW50ZW50aW9uYWxseSBkb2Vzbid0IGhhdmUgYSBwYXlsb2FkLiBXZSdyZSBvbmx5IHVzaW5nXG4gIC8vIHRoZSB1cGRhdGUgdG8gc2NoZWR1bGUgd29yayBvbiB0aGUgcm9vdCBmaWJlciAoYW5kLCBmb3IgbGVnYWN5IHJvb3RzLCB0b1xuICAvLyBlbnF1ZXVlIHRoZSBjYWxsYmFjayBpZiBvbmUgaXMgcHJvdmlkZWQpLlxuXG4gIHZhciBjdXJyZW50ID0gcm9vdC5jdXJyZW50O1xuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGN1cnJlbnQpO1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7XG4gIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwgPyBjYWxsYmFjayA6IG51bGw7XG4gIGVucXVldWVVcGRhdGUoY3VycmVudCwgdXBkYXRlLCBsYW5lKTtcbiAgc2NoZWR1bGVJbml0aWFsSHlkcmF0aW9uT25Sb290KHJvb3QsIGxhbmUsIGV2ZW50VGltZSk7XG4gIHJldHVybiByb290O1xufVxuZnVuY3Rpb24gdXBkYXRlQ29udGFpbmVyKGVsZW1lbnQsIGNvbnRhaW5lciwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjaykge1xuICB7XG4gICAgb25TY2hlZHVsZVJvb3QoY29udGFpbmVyLCBlbGVtZW50KTtcbiAgfVxuXG4gIHZhciBjdXJyZW50JDEgPSBjb250YWluZXIuY3VycmVudDtcbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShjdXJyZW50JDEpO1xuXG4gIHtcbiAgICBtYXJrUmVuZGVyU2NoZWR1bGVkKGxhbmUpO1xuICB9XG5cbiAgdmFyIGNvbnRleHQgPSBnZXRDb250ZXh0Rm9yU3VidHJlZShwYXJlbnRDb21wb25lbnQpO1xuXG4gIGlmIChjb250YWluZXIuY29udGV4dCA9PT0gbnVsbCkge1xuICAgIGNvbnRhaW5lci5jb250ZXh0ID0gY29udGV4dDtcbiAgfSBlbHNlIHtcbiAgICBjb250YWluZXIucGVuZGluZ0NvbnRleHQgPSBjb250ZXh0O1xuICB9XG5cbiAge1xuICAgIGlmIChpc1JlbmRlcmluZyAmJiBjdXJyZW50ICE9PSBudWxsICYmICFkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzKSB7XG4gICAgICBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzID0gdHJ1ZTtcblxuICAgICAgZXJyb3IoJ1JlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlOyAnICsgJ3RyaWdnZXJpbmcgbmVzdGVkIGNvbXBvbmVudCB1cGRhdGVzIGZyb20gcmVuZGVyIGlzIG5vdCBhbGxvd2VkLiAnICsgJ0lmIG5lY2Vzc2FyeSwgdHJpZ2dlciBuZXN0ZWQgdXBkYXRlcyBpbiBjb21wb25lbnREaWRVcGRhdGUuXFxuXFxuJyArICdDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiAlcy4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGN1cnJlbnQpIHx8ICdVbmtub3duJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpOyAvLyBDYXV0aW9uOiBSZWFjdCBEZXZUb29scyBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByb3BlcnR5XG4gIC8vIGJlaW5nIGNhbGxlZCBcImVsZW1lbnRcIi5cblxuICB1cGRhdGUucGF5bG9hZCA9IHtcbiAgICBlbGVtZW50OiBlbGVtZW50XG4gIH07XG4gIGNhbGxiYWNrID0gY2FsbGJhY2sgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjaztcblxuICBpZiAoY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICB7XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1bWVudCB0byBiZSBhICcgKyAnZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgfVxuXG4gIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShjdXJyZW50JDEsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgY3VycmVudCQxLCBsYW5lLCBldmVudFRpbWUpO1xuICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgY3VycmVudCQxLCBsYW5lKTtcbiAgfVxuXG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gZ2V0UHVibGljUm9vdEluc3RhbmNlKGNvbnRhaW5lcikge1xuICB2YXIgY29udGFpbmVyRmliZXIgPSBjb250YWluZXIuY3VycmVudDtcblxuICBpZiAoIWNvbnRhaW5lckZpYmVyLmNoaWxkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzd2l0Y2ggKGNvbnRhaW5lckZpYmVyLmNoaWxkLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiBnZXRQdWJsaWNJbnN0YW5jZShjb250YWluZXJGaWJlci5jaGlsZC5zdGF0ZU5vZGUpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBjb250YWluZXJGaWJlci5jaGlsZC5zdGF0ZU5vZGU7XG4gIH1cbn1cbmZ1bmN0aW9uIGF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbiQxKGZpYmVyKSB7XG4gIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHJvb3QgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHtcbiAgICAgICAgICAvLyBGbHVzaCB0aGUgZmlyc3Qgc2NoZWR1bGVkIFwidXBkYXRlXCIuXG4gICAgICAgICAgdmFyIGxhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5UGVuZGluZ0xhbmVzKHJvb3QpO1xuICAgICAgICAgIGZsdXNoUm9vdChyb290LCBsYW5lcyk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgICAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pOyAvLyBJZiB3ZSdyZSBzdGlsbCBibG9ja2VkIGFmdGVyIHRoaXMsIHdlIG5lZWQgdG8gaW5jcmVhc2VcbiAgICAgICAgLy8gdGhlIHByaW9yaXR5IG9mIGFueSBwcm9taXNlcyByZXNvbHZpbmcgd2l0aGluIHRoaXNcbiAgICAgICAgLy8gYm91bmRhcnkgc28gdGhhdCB0aGV5IG5leHQgYXR0ZW1wdCBhbHNvIGhhcyBoaWdoZXIgcHJpLlxuXG4gICAgICAgIHZhciByZXRyeUxhbmUgPSBTeW5jTGFuZTtcbiAgICAgICAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIHJldHJ5TGFuZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtSZXRyeUxhbmVJbXBsKGZpYmVyLCByZXRyeUxhbmUpIHtcbiAgdmFyIHN1c3BlbnNlU3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsICYmIHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgIHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lID0gaGlnaGVyUHJpb3JpdHlMYW5lKHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lLCByZXRyeUxhbmUpO1xuICB9XG59IC8vIEluY3JlYXNlcyB0aGUgcHJpb3JpdHkgb2YgdGhlbmFibGVzIHdoZW4gdGhleSByZXNvbHZlIHdpdGhpbiB0aGlzIGJvdW5kYXJ5LlxuXG5cbmZ1bmN0aW9uIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCByZXRyeUxhbmUpIHtcbiAgbWFya1JldHJ5TGFuZUltcGwoZmliZXIsIHJldHJ5TGFuZSk7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSkge1xuICAgIG1hcmtSZXRyeUxhbmVJbXBsKGFsdGVybmF0ZSwgcmV0cnlMYW5lKTtcbiAgfVxufVxuZnVuY3Rpb24gYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24kMShmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgYW5kIHRoZXkgc2hvdWxkIG5vdCBzdXNwZW5kIG9uIEkvTyxcbiAgICAvLyBzaW5jZSB5b3UgaGF2ZSB0byB3cmFwIGFueXRoaW5nIHRoYXQgbWlnaHQgc3VzcGVuZCBpblxuICAgIC8vIFN1c3BlbnNlLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBsYW5lID0gU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIGxhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gIH1cblxuICBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgbGFuZSk7XG59XG5mdW5jdGlvbiBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkkMShmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgb3RoZXIgdGhhbiBzeW5jaHJvbm91c2x5IGZsdXNoIGl0LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgbGFuZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgfVxuXG4gIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKGZpYmVyKSB7XG4gIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHMoZmliZXIpO1xuXG4gIGlmIChob3N0RmliZXIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBob3N0RmliZXIuc3RhdGVOb2RlO1xufVxuXG52YXIgc2hvdWxkRXJyb3JJbXBsID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gIHJldHVybiBudWxsO1xufTtcblxuZnVuY3Rpb24gc2hvdWxkRXJyb3IoZmliZXIpIHtcbiAgcmV0dXJuIHNob3VsZEVycm9ySW1wbChmaWJlcik7XG59XG5cbnZhciBzaG91bGRTdXNwZW5kSW1wbCA9IGZ1bmN0aW9uIChmaWJlcikge1xuICByZXR1cm4gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiBzaG91bGRTdXNwZW5kKGZpYmVyKSB7XG4gIHJldHVybiBzaG91bGRTdXNwZW5kSW1wbChmaWJlcik7XG59XG52YXIgb3ZlcnJpZGVIb29rU3RhdGUgPSBudWxsO1xudmFyIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCA9IG51bGw7XG52YXIgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzRGVsZXRlUGF0aCA9IG51bGw7XG52YXIgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGggPSBudWxsO1xudmFyIHNjaGVkdWxlVXBkYXRlID0gbnVsbDtcbnZhciBzZXRFcnJvckhhbmRsZXIgPSBudWxsO1xudmFyIHNldFN1c3BlbnNlSGFuZGxlciA9IG51bGw7XG5cbntcbiAgdmFyIGNvcHlXaXRoRGVsZXRlSW1wbCA9IGZ1bmN0aW9uIChvYmosIHBhdGgsIGluZGV4KSB7XG4gICAgdmFyIGtleSA9IHBhdGhbaW5kZXhdO1xuICAgIHZhciB1cGRhdGVkID0gaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBhc3NpZ24oe30sIG9iaik7XG5cbiAgICBpZiAoaW5kZXggKyAxID09PSBwYXRoLmxlbmd0aCkge1xuICAgICAgaWYgKGlzQXJyYXkodXBkYXRlZCkpIHtcbiAgICAgICAgdXBkYXRlZC5zcGxpY2Uoa2V5LCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB1cGRhdGVkW2tleV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH0gLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuXG5cbiAgICB1cGRhdGVkW2tleV0gPSBjb3B5V2l0aERlbGV0ZUltcGwob2JqW2tleV0sIHBhdGgsIGluZGV4ICsgMSk7XG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG4gIH07XG5cbiAgdmFyIGNvcHlXaXRoRGVsZXRlID0gZnVuY3Rpb24gKG9iaiwgcGF0aCkge1xuICAgIHJldHVybiBjb3B5V2l0aERlbGV0ZUltcGwob2JqLCBwYXRoLCAwKTtcbiAgfTtcblxuICB2YXIgY29weVdpdGhSZW5hbWVJbXBsID0gZnVuY3Rpb24gKG9iaiwgb2xkUGF0aCwgbmV3UGF0aCwgaW5kZXgpIHtcbiAgICB2YXIgb2xkS2V5ID0gb2xkUGF0aFtpbmRleF07XG4gICAgdmFyIHVwZGF0ZWQgPSBpc0FycmF5KG9iaikgPyBvYmouc2xpY2UoKSA6IGFzc2lnbih7fSwgb2JqKTtcblxuICAgIGlmIChpbmRleCArIDEgPT09IG9sZFBhdGgubGVuZ3RoKSB7XG4gICAgICB2YXIgbmV3S2V5ID0gbmV3UGF0aFtpbmRleF07IC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcblxuICAgICAgdXBkYXRlZFtuZXdLZXldID0gdXBkYXRlZFtvbGRLZXldO1xuXG4gICAgICBpZiAoaXNBcnJheSh1cGRhdGVkKSkge1xuICAgICAgICB1cGRhdGVkLnNwbGljZShvbGRLZXksIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRbb2xkS2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuICAgICAgdXBkYXRlZFtvbGRLZXldID0gY29weVdpdGhSZW5hbWVJbXBsKCAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG4gICAgICBvYmpbb2xkS2V5XSwgb2xkUGF0aCwgbmV3UGF0aCwgaW5kZXggKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhSZW5hbWUgPSBmdW5jdGlvbiAob2JqLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgaWYgKG9sZFBhdGgubGVuZ3RoICE9PSBuZXdQYXRoLmxlbmd0aCkge1xuICAgICAgd2FybignY29weVdpdGhSZW5hbWUoKSBleHBlY3RzIHBhdGhzIG9mIHRoZSBzYW1lIGxlbmd0aCcpO1xuXG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3UGF0aC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgaWYgKG9sZFBhdGhbaV0gIT09IG5ld1BhdGhbaV0pIHtcbiAgICAgICAgICB3YXJuKCdjb3B5V2l0aFJlbmFtZSgpIGV4cGVjdHMgcGF0aHMgdG8gYmUgdGhlIHNhbWUgZXhjZXB0IGZvciB0aGUgZGVlcGVzdCBrZXknKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb3B5V2l0aFJlbmFtZUltcGwob2JqLCBvbGRQYXRoLCBuZXdQYXRoLCAwKTtcbiAgfTtcblxuICB2YXIgY29weVdpdGhTZXRJbXBsID0gZnVuY3Rpb24gKG9iaiwgcGF0aCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgaWYgKGluZGV4ID49IHBhdGgubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIGtleSA9IHBhdGhbaW5kZXhdO1xuICAgIHZhciB1cGRhdGVkID0gaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBhc3NpZ24oe30sIG9iaik7IC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcblxuICAgIHVwZGF0ZWRba2V5XSA9IGNvcHlXaXRoU2V0SW1wbChvYmpba2V5XSwgcGF0aCwgaW5kZXggKyAxLCB2YWx1ZSk7XG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG4gIH07XG5cbiAgdmFyIGNvcHlXaXRoU2V0ID0gZnVuY3Rpb24gKG9iaiwgcGF0aCwgdmFsdWUpIHtcbiAgICByZXR1cm4gY29weVdpdGhTZXRJbXBsKG9iaiwgcGF0aCwgMCwgdmFsdWUpO1xuICB9O1xuXG4gIHZhciBmaW5kSG9vayA9IGZ1bmN0aW9uIChmaWJlciwgaWQpIHtcbiAgICAvLyBGb3Igbm93LCB0aGUgXCJpZFwiIG9mIHN0YXRlZnVsIGhvb2tzIGlzIGp1c3QgdGhlIHN0YXRlZnVsIGhvb2sgaW5kZXguXG4gICAgLy8gVGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUgd2l0aCBlLmcuIG5lc3RlZCBob29rcy5cbiAgICB2YXIgY3VycmVudEhvb2sgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuXG4gICAgd2hpbGUgKGN1cnJlbnRIb29rICE9PSBudWxsICYmIGlkID4gMCkge1xuICAgICAgY3VycmVudEhvb2sgPSBjdXJyZW50SG9vay5uZXh0O1xuICAgICAgaWQtLTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudEhvb2s7XG4gIH07IC8vIFN1cHBvcnQgRGV2VG9vbHMgZWRpdGFibGUgdmFsdWVzIGZvciB1c2VTdGF0ZSBhbmQgdXNlUmVkdWNlci5cblxuXG4gIG92ZXJyaWRlSG9va1N0YXRlID0gZnVuY3Rpb24gKGZpYmVyLCBpZCwgcGF0aCwgdmFsdWUpIHtcbiAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG5cbiAgICBpZiAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5ld1N0YXRlID0gY29weVdpdGhTZXQoaG9vay5tZW1vaXplZFN0YXRlLCBwYXRoLCB2YWx1ZSk7XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7IC8vIFdlIGFyZW4ndCBhY3R1YWxseSBhZGRpbmcgYW4gdXBkYXRlIHRvIHRoZSBxdWV1ZSxcbiAgICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gdXBkYXRlIHdlIGNhbiBhZGQgZm9yIHVzZVJlZHVjZXIgaG9va3MgdGhhdCB3b24ndCB0cmlnZ2VyIGFuIGVycm9yLlxuICAgICAgLy8gKFRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWN0aW9uIHR5cGUgZm9yIERldlRvb2xzIG92ZXJyaWRlcy4pXG4gICAgICAvLyBBcyBhIHJlc3VsdCB0aG91Z2gsIFJlYWN0IHdpbGwgc2VlIHRoZSBzY2hlZHVsZWQgdXBkYXRlIGFzIGEgbm9vcCBhbmQgYmFpbG91dC5cbiAgICAgIC8vIFNoYWxsb3cgY2xvbmluZyBwcm9wcyB3b3JrcyBhcyBhIHdvcmthcm91bmQgZm9yIG5vdyB0byBieXBhc3MgdGhlIGJhaWxvdXQgY2hlY2suXG5cbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBhc3NpZ24oe30sIGZpYmVyLm1lbW9pemVkUHJvcHMpO1xuICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIGlkLCBwYXRoKSB7XG4gICAgdmFyIGhvb2sgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuXG4gICAgaWYgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoRGVsZXRlKGhvb2subWVtb2l6ZWRTdGF0ZSwgcGF0aCk7XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7IC8vIFdlIGFyZW4ndCBhY3R1YWxseSBhZGRpbmcgYW4gdXBkYXRlIHRvIHRoZSBxdWV1ZSxcbiAgICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gdXBkYXRlIHdlIGNhbiBhZGQgZm9yIHVzZVJlZHVjZXIgaG9va3MgdGhhdCB3b24ndCB0cmlnZ2VyIGFuIGVycm9yLlxuICAgICAgLy8gKFRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWN0aW9uIHR5cGUgZm9yIERldlRvb2xzIG92ZXJyaWRlcy4pXG4gICAgICAvLyBBcyBhIHJlc3VsdCB0aG91Z2gsIFJlYWN0IHdpbGwgc2VlIHRoZSBzY2hlZHVsZWQgdXBkYXRlIGFzIGEgbm9vcCBhbmQgYmFpbG91dC5cbiAgICAgIC8vIFNoYWxsb3cgY2xvbmluZyBwcm9wcyB3b3JrcyBhcyBhIHdvcmthcm91bmQgZm9yIG5vdyB0byBieXBhc3MgdGhlIGJhaWxvdXQgY2hlY2suXG5cbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBhc3NpZ24oe30sIGZpYmVyLm1lbW9pemVkUHJvcHMpO1xuICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIGlkLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgdmFyIGhvb2sgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuXG4gICAgaWYgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoUmVuYW1lKGhvb2subWVtb2l6ZWRTdGF0ZSwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7IC8vIFdlIGFyZW4ndCBhY3R1YWxseSBhZGRpbmcgYW4gdXBkYXRlIHRvIHRoZSBxdWV1ZSxcbiAgICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gdXBkYXRlIHdlIGNhbiBhZGQgZm9yIHVzZVJlZHVjZXIgaG9va3MgdGhhdCB3b24ndCB0cmlnZ2VyIGFuIGVycm9yLlxuICAgICAgLy8gKFRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWN0aW9uIHR5cGUgZm9yIERldlRvb2xzIG92ZXJyaWRlcy4pXG4gICAgICAvLyBBcyBhIHJlc3VsdCB0aG91Z2gsIFJlYWN0IHdpbGwgc2VlIHRoZSBzY2hlZHVsZWQgdXBkYXRlIGFzIGEgbm9vcCBhbmQgYmFpbG91dC5cbiAgICAgIC8vIFNoYWxsb3cgY2xvbmluZyBwcm9wcyB3b3JrcyBhcyBhIHdvcmthcm91bmQgZm9yIG5vdyB0byBieXBhc3MgdGhlIGJhaWxvdXQgY2hlY2suXG5cbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBhc3NpZ24oe30sIGZpYmVyLm1lbW9pemVkUHJvcHMpO1xuICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cbiAgfTsgLy8gU3VwcG9ydCBEZXZUb29scyBwcm9wcyBmb3IgZnVuY3Rpb24gY29tcG9uZW50cywgZm9yd2FyZFJlZiwgbWVtbywgaG9zdCBjb21wb25lbnRzLCBldGMuXG5cblxuICBvdmVycmlkZVByb3BzID0gZnVuY3Rpb24gKGZpYmVyLCBwYXRoLCB2YWx1ZSkge1xuICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IGNvcHlXaXRoU2V0KGZpYmVyLm1lbW9pemVkUHJvcHMsIHBhdGgsIHZhbHVlKTtcblxuICAgIGlmIChmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAgIGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBwYXRoKSB7XG4gICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhEZWxldGUoZmliZXIubWVtb2l6ZWRQcm9wcywgcGF0aCk7XG5cbiAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgICBmaWJlci5hbHRlcm5hdGUucGVuZGluZ1Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZVByb3BzUmVuYW1lUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgb2xkUGF0aCwgbmV3UGF0aCkge1xuICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IGNvcHlXaXRoUmVuYW1lKGZpYmVyLm1lbW9pemVkUHJvcHMsIG9sZFBhdGgsIG5ld1BhdGgpO1xuXG4gICAgaWYgKGZpYmVyLmFsdGVybmF0ZSkge1xuICAgICAgZmliZXIuYWx0ZXJuYXRlLnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG4gIH07XG5cbiAgc2NoZWR1bGVVcGRhdGUgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG4gIH07XG5cbiAgc2V0RXJyb3JIYW5kbGVyID0gZnVuY3Rpb24gKG5ld1Nob3VsZEVycm9ySW1wbCkge1xuICAgIHNob3VsZEVycm9ySW1wbCA9IG5ld1Nob3VsZEVycm9ySW1wbDtcbiAgfTtcblxuICBzZXRTdXNwZW5zZUhhbmRsZXIgPSBmdW5jdGlvbiAobmV3U2hvdWxkU3VzcGVuZEltcGwpIHtcbiAgICBzaG91bGRTdXNwZW5kSW1wbCA9IG5ld1Nob3VsZFN1c3BlbmRJbXBsO1xuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlQnlGaWJlcihmaWJlcikge1xuICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXIoZmliZXIpO1xuXG4gIGlmIChob3N0RmliZXIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBob3N0RmliZXIuc3RhdGVOb2RlO1xufVxuXG5mdW5jdGlvbiBlbXB0eUZpbmRGaWJlckJ5SG9zdEluc3RhbmNlKGluc3RhbmNlKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXJGb3JEZXZUb29scygpIHtcbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbmZ1bmN0aW9uIGluamVjdEludG9EZXZUb29scyhkZXZUb29sc0NvbmZpZykge1xuICB2YXIgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2UgPSBkZXZUb29sc0NvbmZpZy5maW5kRmliZXJCeUhvc3RJbnN0YW5jZTtcbiAgdmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xuICByZXR1cm4gaW5qZWN0SW50ZXJuYWxzKHtcbiAgICBidW5kbGVUeXBlOiBkZXZUb29sc0NvbmZpZy5idW5kbGVUeXBlLFxuICAgIHZlcnNpb246IGRldlRvb2xzQ29uZmlnLnZlcnNpb24sXG4gICAgcmVuZGVyZXJQYWNrYWdlTmFtZTogZGV2VG9vbHNDb25maWcucmVuZGVyZXJQYWNrYWdlTmFtZSxcbiAgICByZW5kZXJlckNvbmZpZzogZGV2VG9vbHNDb25maWcucmVuZGVyZXJDb25maWcsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGU6IG92ZXJyaWRlSG9va1N0YXRlLFxuICAgIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aDogb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoLFxuICAgIG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aDogb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoLFxuICAgIG92ZXJyaWRlUHJvcHM6IG92ZXJyaWRlUHJvcHMsXG4gICAgb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGg6IG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoLFxuICAgIG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoOiBvdmVycmlkZVByb3BzUmVuYW1lUGF0aCxcbiAgICBzZXRFcnJvckhhbmRsZXI6IHNldEVycm9ySGFuZGxlcixcbiAgICBzZXRTdXNwZW5zZUhhbmRsZXI6IHNldFN1c3BlbnNlSGFuZGxlcixcbiAgICBzY2hlZHVsZVVwZGF0ZTogc2NoZWR1bGVVcGRhdGUsXG4gICAgY3VycmVudERpc3BhdGNoZXJSZWY6IFJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gICAgZmluZEhvc3RJbnN0YW5jZUJ5RmliZXI6IGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyLFxuICAgIGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOiBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZSB8fCBlbXB0eUZpbmRGaWJlckJ5SG9zdEluc3RhbmNlLFxuICAgIC8vIFJlYWN0IFJlZnJlc2hcbiAgICBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2g6ICBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2ggLFxuICAgIHNjaGVkdWxlUmVmcmVzaDogIHNjaGVkdWxlUmVmcmVzaCAsXG4gICAgc2NoZWR1bGVSb290OiAgc2NoZWR1bGVSb290ICxcbiAgICBzZXRSZWZyZXNoSGFuZGxlcjogIHNldFJlZnJlc2hIYW5kbGVyICxcbiAgICAvLyBFbmFibGVzIERldlRvb2xzIHRvIGFwcGVuZCBvd25lciBzdGFja3MgdG8gZXJyb3IgbWVzc2FnZXMgaW4gREVWIG1vZGUuXG4gICAgZ2V0Q3VycmVudEZpYmVyOiAgZ2V0Q3VycmVudEZpYmVyRm9yRGV2VG9vbHMgLFxuICAgIC8vIEVuYWJsZXMgRGV2VG9vbHMgdG8gZGV0ZWN0IHJlY29uY2lsZXIgdmVyc2lvbiByYXRoZXIgdGhhbiByZW5kZXJlciB2ZXJzaW9uXG4gICAgLy8gd2hpY2ggbWF5IG5vdCBtYXRjaCBmb3IgdGhpcmQgcGFydHkgcmVuZGVyZXJzLlxuICAgIHJlY29uY2lsZXJWZXJzaW9uOiBSZWFjdFZlcnNpb25cbiAgfSk7XG59XG5cbi8qIGdsb2JhbCByZXBvcnRFcnJvciAqL1xuXG52YXIgZGVmYXVsdE9uUmVjb3ZlcmFibGVFcnJvciA9IHR5cGVvZiByZXBvcnRFcnJvciA9PT0gJ2Z1bmN0aW9uJyA/IC8vIEluIG1vZGVybiBicm93c2VycywgcmVwb3J0RXJyb3Igd2lsbCBkaXNwYXRjaCBhbiBlcnJvciBldmVudCxcbi8vIGVtdWxhdGluZyBhbiB1bmNhdWdodCBKYXZhU2NyaXB0IGVycm9yLlxucmVwb3J0RXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgLy8gSW4gb2xkZXIgYnJvd3NlcnMgYW5kIHRlc3QgZW52aXJvbm1lbnRzLCBmYWxsYmFjayB0byBjb25zb2xlLmVycm9yLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG4gIGNvbnNvbGVbJ2Vycm9yJ10oZXJyb3IpO1xufTtcblxuZnVuY3Rpb24gUmVhY3RET01Sb290KGludGVybmFsUm9vdCkge1xuICB0aGlzLl9pbnRlcm5hbFJvb3QgPSBpbnRlcm5hbFJvb3Q7XG59XG5cblJlYWN0RE9NSHlkcmF0aW9uUm9vdC5wcm90b3R5cGUucmVuZGVyID0gUmVhY3RET01Sb290LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoY2hpbGRyZW4pIHtcbiAgdmFyIHJvb3QgPSB0aGlzLl9pbnRlcm5hbFJvb3Q7XG5cbiAgaWYgKHJvb3QgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgYW4gdW5tb3VudGVkIHJvb3QuJyk7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogZG9lcyBub3Qgc3VwcG9ydCB0aGUgc2Vjb25kIGNhbGxiYWNrIGFyZ3VtZW50LiAnICsgJ1RvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciByZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gYSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLicpO1xuICAgIH0gZWxzZSBpZiAoaXNWYWxpZENvbnRhaW5lcihhcmd1bWVudHNbMV0pKSB7XG4gICAgICBlcnJvcignWW91IHBhc3NlZCBhIGNvbnRhaW5lciB0byB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIHJvb3QucmVuZGVyKC4uLikuICcgKyBcIllvdSBkb24ndCBuZWVkIHRvIHBhc3MgaXQgYWdhaW4gc2luY2UgeW91IGFscmVhZHkgcGFzc2VkIGl0IHRvIGNyZWF0ZSB0aGUgcm9vdC5cIik7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXJndW1lbnRzWzFdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZXJyb3IoJ1lvdSBwYXNzZWQgYSBzZWNvbmQgYXJndW1lbnQgdG8gcm9vdC5yZW5kZXIoLi4uKSBidXQgaXQgb25seSBhY2NlcHRzICcgKyAnb25lIGFyZ3VtZW50LicpO1xuICAgIH1cblxuICAgIHZhciBjb250YWluZXIgPSByb290LmNvbnRhaW5lckluZm87XG5cbiAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlICE9PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBob3N0SW5zdGFuY2UgPSBmaW5kSG9zdEluc3RhbmNlV2l0aE5vUG9ydGFscyhyb290LmN1cnJlbnQpO1xuXG4gICAgICBpZiAoaG9zdEluc3RhbmNlKSB7XG4gICAgICAgIGlmIChob3N0SW5zdGFuY2UucGFyZW50Tm9kZSAhPT0gY29udGFpbmVyKSB7XG4gICAgICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBJdCBsb29rcyBsaWtlIHRoZSBSZWFjdC1yZW5kZXJlZCBjb250ZW50IG9mIHRoZSAnICsgJ3Jvb3QgY29udGFpbmVyIHdhcyByZW1vdmVkIHdpdGhvdXQgdXNpbmcgUmVhY3QuIFRoaXMgaXMgbm90ICcgKyAnc3VwcG9ydGVkIGFuZCB3aWxsIGNhdXNlIGVycm9ycy4gSW5zdGVhZCwgY2FsbCAnICsgXCJyb290LnVubW91bnQoKSB0byBlbXB0eSBhIHJvb3QncyBjb250YWluZXIuXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlQ29udGFpbmVyKGNoaWxkcmVuLCByb290LCBudWxsLCBudWxsKTtcbn07XG5cblJlYWN0RE9NSHlkcmF0aW9uUm9vdC5wcm90b3R5cGUudW5tb3VudCA9IFJlYWN0RE9NUm9vdC5wcm90b3R5cGUudW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcigndW5tb3VudCguLi4pOiBkb2VzIG5vdCBzdXBwb3J0IGEgY2FsbGJhY2sgYXJndW1lbnQuICcgKyAnVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyIHJlbmRlcmluZywgZGVjbGFyZSBpdCBpbiBhIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3QgPSB0aGlzLl9pbnRlcm5hbFJvb3Q7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICB0aGlzLl9pbnRlcm5hbFJvb3QgPSBudWxsO1xuICAgIHZhciBjb250YWluZXIgPSByb290LmNvbnRhaW5lckluZm87XG5cbiAgICB7XG4gICAgICBpZiAoaXNBbHJlYWR5UmVuZGVyaW5nKCkpIHtcbiAgICAgICAgZXJyb3IoJ0F0dGVtcHRlZCB0byBzeW5jaHJvbm91c2x5IHVubW91bnQgYSByb290IHdoaWxlIFJlYWN0IHdhcyBhbHJlYWR5ICcgKyAncmVuZGVyaW5nLiBSZWFjdCBjYW5ub3QgZmluaXNoIHVubW91bnRpbmcgdGhlIHJvb3QgdW50aWwgdGhlICcgKyAnY3VycmVudCByZW5kZXIgaGFzIGNvbXBsZXRlZCwgd2hpY2ggbWF5IGxlYWQgdG8gYSByYWNlIGNvbmRpdGlvbi4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgdXBkYXRlQ29udGFpbmVyKG51bGwsIHJvb3QsIG51bGwsIG51bGwpO1xuICAgIH0pO1xuICAgIHVubWFya0NvbnRhaW5lckFzUm9vdChjb250YWluZXIpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVSb290KGNvbnRhaW5lciwgb3B0aW9ucykge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignY3JlYXRlUm9vdCguLi4pOiBUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAgd2FybklmUmVhY3RET01Db250YWluZXJJbkRFVihjb250YWluZXIpO1xuICB2YXIgaXNTdHJpY3RNb2RlID0gZmFsc2U7XG4gIHZhciBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlID0gZmFsc2U7XG4gIHZhciBpZGVudGlmaWVyUHJlZml4ID0gJyc7XG4gIHZhciBvblJlY292ZXJhYmxlRXJyb3IgPSBkZWZhdWx0T25SZWNvdmVyYWJsZUVycm9yO1xuICB2YXIgdHJhbnNpdGlvbkNhbGxiYWNrcyA9IG51bGw7XG5cbiAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAge1xuICAgICAgaWYgKG9wdGlvbnMuaHlkcmF0ZSkge1xuICAgICAgICB3YXJuKCdoeWRyYXRlIHRocm91Z2ggY3JlYXRlUm9vdCBpcyBkZXByZWNhdGVkLiBVc2UgUmVhY3RET01DbGllbnQuaHlkcmF0ZVJvb3QoY29udGFpbmVyLCA8QXBwIC8+KSBpbnN0ZWFkLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgICAgIGVycm9yKCdZb3UgcGFzc2VkIGEgSlNYIGVsZW1lbnQgdG8gY3JlYXRlUm9vdC4gWW91IHByb2JhYmx5IG1lYW50IHRvICcgKyAnY2FsbCByb290LnJlbmRlciBpbnN0ZWFkLiAnICsgJ0V4YW1wbGUgdXNhZ2U6XFxuXFxuJyArICcgIGxldCByb290ID0gY3JlYXRlUm9vdChkb21Db250YWluZXIpO1xcbicgKyAnICByb290LnJlbmRlcig8QXBwIC8+KTsnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnVuc3RhYmxlX3N0cmljdE1vZGUgPT09IHRydWUpIHtcbiAgICAgIGlzU3RyaWN0TW9kZSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaWRlbnRpZmllclByZWZpeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZGVudGlmaWVyUHJlZml4ID0gb3B0aW9ucy5pZGVudGlmaWVyUHJlZml4O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvblJlY292ZXJhYmxlRXJyb3IgPSBvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvcjtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy50cmFuc2l0aW9uQ2FsbGJhY2tzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyYW5zaXRpb25DYWxsYmFja3MgPSBvcHRpb25zLnRyYW5zaXRpb25DYWxsYmFja3M7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3QgPSBjcmVhdGVDb250YWluZXIoY29udGFpbmVyLCBDb25jdXJyZW50Um9vdCwgbnVsbCwgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpO1xuICBtYXJrQ29udGFpbmVyQXNSb290KHJvb3QuY3VycmVudCwgY29udGFpbmVyKTtcbiAgdmFyIHJvb3RDb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lcjtcbiAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICByZXR1cm4gbmV3IFJlYWN0RE9NUm9vdChyb290KTtcbn1cblxuZnVuY3Rpb24gUmVhY3RET01IeWRyYXRpb25Sb290KGludGVybmFsUm9vdCkge1xuICB0aGlzLl9pbnRlcm5hbFJvb3QgPSBpbnRlcm5hbFJvb3Q7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlSHlkcmF0aW9uKHRhcmdldCkge1xuICBpZiAodGFyZ2V0KSB7XG4gICAgcXVldWVFeHBsaWNpdEh5ZHJhdGlvblRhcmdldCh0YXJnZXQpO1xuICB9XG59XG5cblJlYWN0RE9NSHlkcmF0aW9uUm9vdC5wcm90b3R5cGUudW5zdGFibGVfc2NoZWR1bGVIeWRyYXRpb24gPSBzY2hlZHVsZUh5ZHJhdGlvbjtcbmZ1bmN0aW9uIGh5ZHJhdGVSb290KGNvbnRhaW5lciwgaW5pdGlhbENoaWxkcmVuLCBvcHRpb25zKSB7XG4gIGlmICghaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdoeWRyYXRlUm9vdCguLi4pOiBUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAgd2FybklmUmVhY3RET01Db250YWluZXJJbkRFVihjb250YWluZXIpO1xuXG4gIHtcbiAgICBpZiAoaW5pdGlhbENoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVycm9yKCdNdXN0IHByb3ZpZGUgaW5pdGlhbCBjaGlsZHJlbiBhcyBzZWNvbmQgYXJndW1lbnQgdG8gaHlkcmF0ZVJvb3QuICcgKyAnRXhhbXBsZSB1c2FnZTogaHlkcmF0ZVJvb3QoZG9tQ29udGFpbmVyLCA8QXBwIC8+KScpO1xuICAgIH1cbiAgfSAvLyBGb3Igbm93IHdlIHJldXNlIHRoZSB3aG9sZSBiYWcgb2Ygb3B0aW9ucyBzaW5jZSB0aGV5IGNvbnRhaW5cbiAgLy8gdGhlIGh5ZHJhdGlvbiBjYWxsYmFja3MuXG5cblxuICB2YXIgaHlkcmF0aW9uQ2FsbGJhY2tzID0gb3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucyA6IG51bGw7IC8vIFRPRE86IERlbGV0ZSB0aGlzIG9wdGlvblxuXG4gIHZhciBtdXRhYmxlU291cmNlcyA9IG9wdGlvbnMgIT0gbnVsbCAmJiBvcHRpb25zLmh5ZHJhdGVkU291cmNlcyB8fCBudWxsO1xuICB2YXIgaXNTdHJpY3RNb2RlID0gZmFsc2U7XG4gIHZhciBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlID0gZmFsc2U7XG4gIHZhciBpZGVudGlmaWVyUHJlZml4ID0gJyc7XG4gIHZhciBvblJlY292ZXJhYmxlRXJyb3IgPSBkZWZhdWx0T25SZWNvdmVyYWJsZUVycm9yO1xuXG4gIGlmIChvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChvcHRpb25zLnVuc3RhYmxlX3N0cmljdE1vZGUgPT09IHRydWUpIHtcbiAgICAgIGlzU3RyaWN0TW9kZSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaWRlbnRpZmllclByZWZpeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZGVudGlmaWVyUHJlZml4ID0gb3B0aW9ucy5pZGVudGlmaWVyUHJlZml4O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvblJlY292ZXJhYmxlRXJyb3IgPSBvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvcjtcbiAgICB9XG4gIH1cblxuICB2YXIgcm9vdCA9IGNyZWF0ZUh5ZHJhdGlvbkNvbnRhaW5lcihpbml0aWFsQ2hpbGRyZW4sIG51bGwsIGNvbnRhaW5lciwgQ29uY3VycmVudFJvb3QsIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpO1xuICBtYXJrQ29udGFpbmVyQXNSb290KHJvb3QuY3VycmVudCwgY29udGFpbmVyKTsgLy8gVGhpcyBjYW4ndCBiZSBhIGNvbW1lbnQgbm9kZSBzaW5jZSBoeWRyYXRpb24gZG9lc24ndCB3b3JrIG9uIGNvbW1lbnQgbm9kZXMgYW55d2F5LlxuXG4gIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKGNvbnRhaW5lcik7XG5cbiAgaWYgKG11dGFibGVTb3VyY2VzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdXRhYmxlU291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG11dGFibGVTb3VyY2UgPSBtdXRhYmxlU291cmNlc1tpXTtcbiAgICAgIHJlZ2lzdGVyTXV0YWJsZVNvdXJjZUZvckh5ZHJhdGlvbihyb290LCBtdXRhYmxlU291cmNlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFJlYWN0RE9NSHlkcmF0aW9uUm9vdChyb290KTtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRDb250YWluZXIobm9kZSkge1xuICByZXR1cm4gISEobm9kZSAmJiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSB8fCAhZGlzYWJsZUNvbW1lbnRzQXNET01Db250YWluZXJzICApKTtcbn0gLy8gVE9ETzogUmVtb3ZlIHRoaXMgZnVuY3Rpb24gd2hpY2ggYWxzbyBpbmNsdWRlcyBjb21tZW50IG5vZGVzLlxuLy8gV2Ugb25seSB1c2UgaXQgaW4gcGxhY2VzIHRoYXQgYXJlIGN1cnJlbnRseSBtb3JlIHJlbGF4ZWQuXG5cbmZ1bmN0aW9uIGlzVmFsaWRDb250YWluZXJMZWdhY3kobm9kZSkge1xuICByZXR1cm4gISEobm9kZSAmJiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgJiYgbm9kZS5ub2RlVmFsdWUgPT09ICcgcmVhY3QtbW91bnQtcG9pbnQtdW5zdGFibGUgJykpO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZSZWFjdERPTUNvbnRhaW5lckluREVWKGNvbnRhaW5lcikge1xuICB7XG4gICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIGNvbnRhaW5lci50YWdOYW1lICYmIGNvbnRhaW5lci50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdCT0RZJykge1xuICAgICAgZXJyb3IoJ2NyZWF0ZVJvb3QoKTogQ3JlYXRpbmcgcm9vdHMgZGlyZWN0bHkgd2l0aCBkb2N1bWVudC5ib2R5IGlzICcgKyAnZGlzY291cmFnZWQsIHNpbmNlIGl0cyBjaGlsZHJlbiBhcmUgb2Z0ZW4gbWFuaXB1bGF0ZWQgYnkgdGhpcmQtcGFydHkgJyArICdzY3JpcHRzIGFuZCBicm93c2VyIGV4dGVuc2lvbnMuIFRoaXMgbWF5IGxlYWQgdG8gc3VidGxlICcgKyAncmVjb25jaWxpYXRpb24gaXNzdWVzLiBUcnkgdXNpbmcgYSBjb250YWluZXIgZWxlbWVudCBjcmVhdGVkICcgKyAnZm9yIHlvdXIgYXBwLicpO1xuICAgIH1cblxuICAgIGlmIChpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChjb250YWluZXIpKSB7XG4gICAgICBpZiAoY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIpIHtcbiAgICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTS5yZW5kZXIoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkgb24gYSBjb250YWluZXIgdGhhdCAnICsgJ2hhcyBhbHJlYWR5IGJlZW4gcGFzc2VkIHRvIGNyZWF0ZVJvb3QoKSBiZWZvcmUuIEluc3RlYWQsIGNhbGwgJyArICdyb290LnJlbmRlcigpIG9uIHRoZSBleGlzdGluZyByb290IGluc3RlYWQgaWYgeW91IHdhbnQgdG8gdXBkYXRlIGl0LicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIkMyA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xudmFyIHRvcExldmVsVXBkYXRlV2FybmluZ3M7XG5cbntcbiAgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncyA9IGZ1bmN0aW9uIChjb250YWluZXIpIHtcbiAgICBpZiAoY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgJiYgY29udGFpbmVyLm5vZGVUeXBlICE9PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBob3N0SW5zdGFuY2UgPSBmaW5kSG9zdEluc3RhbmNlV2l0aE5vUG9ydGFscyhjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lci5jdXJyZW50KTtcblxuICAgICAgaWYgKGhvc3RJbnN0YW5jZSkge1xuICAgICAgICBpZiAoaG9zdEluc3RhbmNlLnBhcmVudE5vZGUgIT09IGNvbnRhaW5lcikge1xuICAgICAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogSXQgbG9va3MgbGlrZSB0aGUgUmVhY3QtcmVuZGVyZWQgY29udGVudCBvZiB0aGlzICcgKyAnY29udGFpbmVyIHdhcyByZW1vdmVkIHdpdGhvdXQgdXNpbmcgUmVhY3QuIFRoaXMgaXMgbm90ICcgKyAnc3VwcG9ydGVkIGFuZCB3aWxsIGNhdXNlIGVycm9ycy4gSW5zdGVhZCwgY2FsbCAnICsgJ1JlYWN0RE9NLnVubW91bnRDb21wb25lbnRBdE5vZGUgdG8gZW1wdHkgYSBjb250YWluZXIuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaXNSb290UmVuZGVyZWRCeVNvbWVSZWFjdCA9ICEhY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXI7XG4gICAgdmFyIHJvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICAgIHZhciBoYXNOb25Sb290UmVhY3RDaGlsZCA9ICEhKHJvb3RFbCAmJiBnZXRJbnN0YW5jZUZyb21Ob2RlKHJvb3RFbCkpO1xuXG4gICAgaWYgKGhhc05vblJvb3RSZWFjdENoaWxkICYmICFpc1Jvb3RSZW5kZXJlZEJ5U29tZVJlYWN0KSB7XG4gICAgICBlcnJvcigncmVuZGVyKC4uLik6IFJlcGxhY2luZyBSZWFjdC1yZW5kZXJlZCBjaGlsZHJlbiB3aXRoIGEgbmV3IHJvb3QgJyArICdjb21wb25lbnQuIElmIHlvdSBpbnRlbmRlZCB0byB1cGRhdGUgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSwgJyArICd5b3Ugc2hvdWxkIGluc3RlYWQgaGF2ZSB0aGUgZXhpc3RpbmcgY2hpbGRyZW4gdXBkYXRlIHRoZWlyIHN0YXRlICcgKyAnYW5kIHJlbmRlciB0aGUgbmV3IGNvbXBvbmVudHMgaW5zdGVhZCBvZiBjYWxsaW5nIFJlYWN0RE9NLnJlbmRlci4nKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiYgY29udGFpbmVyLnRhZ05hbWUgJiYgY29udGFpbmVyLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0JPRFknKSB7XG4gICAgICBlcnJvcigncmVuZGVyKCk6IFJlbmRlcmluZyBjb21wb25lbnRzIGRpcmVjdGx5IGludG8gZG9jdW1lbnQuYm9keSBpcyAnICsgJ2Rpc2NvdXJhZ2VkLCBzaW5jZSBpdHMgY2hpbGRyZW4gYXJlIG9mdGVuIG1hbmlwdWxhdGVkIGJ5IHRoaXJkLXBhcnR5ICcgKyAnc2NyaXB0cyBhbmQgYnJvd3NlciBleHRlbnNpb25zLiBUaGlzIG1heSBsZWFkIHRvIHN1YnRsZSAnICsgJ3JlY29uY2lsaWF0aW9uIGlzc3Vlcy4gVHJ5IHJlbmRlcmluZyBpbnRvIGEgY29udGFpbmVyIGVsZW1lbnQgY3JlYXRlZCAnICsgJ2ZvciB5b3VyIGFwcC4nKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgaWYgKCFjb250YWluZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUpIHtcbiAgICByZXR1cm4gY29udGFpbmVyLmRvY3VtZW50RWxlbWVudDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9vcE9uUmVjb3ZlcmFibGVFcnJvcigpIHsvLyBUaGlzIGlzbid0IHJlYWNoYWJsZSBiZWNhdXNlIG9uUmVjb3ZlcmFibGVFcnJvciBpc24ndCBjYWxsZWQgaW4gdGhlXG4gIC8vIGxlZ2FjeSBBUEkuXG59XG5cbmZ1bmN0aW9uIGxlZ2FjeUNyZWF0ZVJvb3RGcm9tRE9NQ29udGFpbmVyKGNvbnRhaW5lciwgaW5pdGlhbENoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrLCBpc0h5ZHJhdGlvbkNvbnRhaW5lcikge1xuICBpZiAoaXNIeWRyYXRpb25Db250YWluZXIpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0UHVibGljUm9vdEluc3RhbmNlKHJvb3QpO1xuICAgICAgICBvcmlnaW5hbENhbGxiYWNrLmNhbGwoaW5zdGFuY2UpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGNyZWF0ZUh5ZHJhdGlvbkNvbnRhaW5lcihpbml0aWFsQ2hpbGRyZW4sIGNhbGxiYWNrLCBjb250YWluZXIsIExlZ2FjeVJvb3QsIG51bGwsIC8vIGh5ZHJhdGlvbkNhbGxiYWNrc1xuICAgIGZhbHNlLCAvLyBpc1N0cmljdE1vZGVcbiAgICBmYWxzZSwgLy8gY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSxcbiAgICAnJywgLy8gaWRlbnRpZmllclByZWZpeFxuICAgIG5vb3BPblJlY292ZXJhYmxlRXJyb3IpO1xuICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0gcm9vdDtcbiAgICBtYXJrQ29udGFpbmVyQXNSb290KHJvb3QuY3VycmVudCwgY29udGFpbmVyKTtcbiAgICB2YXIgcm9vdENvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IGNvbnRhaW5lci5wYXJlbnROb2RlIDogY29udGFpbmVyO1xuICAgIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHJvb3RDb250YWluZXJFbGVtZW50KTtcbiAgICBmbHVzaFN5bmMoKTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfSBlbHNlIHtcbiAgICAvLyBGaXJzdCBjbGVhciBhbnkgZXhpc3RpbmcgY29udGVudC5cbiAgICB2YXIgcm9vdFNpYmxpbmc7XG5cbiAgICB3aGlsZSAocm9vdFNpYmxpbmcgPSBjb250YWluZXIubGFzdENoaWxkKSB7XG4gICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQocm9vdFNpYmxpbmcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0UHVibGljUm9vdEluc3RhbmNlKF9yb290KTtcblxuICAgICAgICBfb3JpZ2luYWxDYWxsYmFjay5jYWxsKGluc3RhbmNlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9yb290ID0gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lciwgTGVnYWN5Um9vdCwgbnVsbCwgLy8gaHlkcmF0aW9uQ2FsbGJhY2tzXG4gICAgZmFsc2UsIC8vIGlzU3RyaWN0TW9kZVxuICAgIGZhbHNlLCAvLyBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLFxuICAgICcnLCAvLyBpZGVudGlmaWVyUHJlZml4XG4gICAgbm9vcE9uUmVjb3ZlcmFibGVFcnJvcik7XG5cbiAgICBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9IF9yb290O1xuICAgIG1hcmtDb250YWluZXJBc1Jvb3QoX3Jvb3QuY3VycmVudCwgY29udGFpbmVyKTtcblxuICAgIHZhciBfcm9vdENvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IGNvbnRhaW5lci5wYXJlbnROb2RlIDogY29udGFpbmVyO1xuXG4gICAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMoX3Jvb3RDb250YWluZXJFbGVtZW50KTsgLy8gSW5pdGlhbCBtb3VudCBzaG91bGQgbm90IGJlIGJhdGNoZWQuXG5cbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgdXBkYXRlQ29udGFpbmVyKGluaXRpYWxDaGlsZHJlbiwgX3Jvb3QsIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2spO1xuICAgIH0pO1xuICAgIHJldHVybiBfcm9vdDtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuT25JbnZhbGlkQ2FsbGJhY2skMShjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICB7XG4gICAgaWYgKGNhbGxiYWNrICE9PSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsZXJOYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgY2hpbGRyZW4sIGNvbnRhaW5lciwgZm9yY2VIeWRyYXRlLCBjYWxsYmFjaykge1xuICB7XG4gICAgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncyhjb250YWluZXIpO1xuICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayQxKGNhbGxiYWNrID09PSB1bmRlZmluZWQgPyBudWxsIDogY2FsbGJhY2ssICdyZW5kZXInKTtcbiAgfVxuXG4gIHZhciBtYXliZVJvb3QgPSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcjtcbiAgdmFyIHJvb3Q7XG5cbiAgaWYgKCFtYXliZVJvb3QpIHtcbiAgICAvLyBJbml0aWFsIG1vdW50XG4gICAgcm9vdCA9IGxlZ2FjeUNyZWF0ZVJvb3RGcm9tRE9NQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGRyZW4sIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2ssIGZvcmNlSHlkcmF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdCA9IG1heWJlUm9vdDtcblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBvcmlnaW5hbENhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRQdWJsaWNSb290SW5zdGFuY2Uocm9vdCk7XG4gICAgICAgIG9yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH0gLy8gVXBkYXRlXG5cblxuICAgIHVwZGF0ZUNvbnRhaW5lcihjaGlsZHJlbiwgcm9vdCwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjayk7XG4gIH1cblxuICByZXR1cm4gZ2V0UHVibGljUm9vdEluc3RhbmNlKHJvb3QpO1xufVxuXG5mdW5jdGlvbiBmaW5kRE9NTm9kZShjb21wb25lbnRPckVsZW1lbnQpIHtcbiAge1xuICAgIHZhciBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyJDMuY3VycmVudDtcblxuICAgIGlmIChvd25lciAhPT0gbnVsbCAmJiBvd25lci5zdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIHZhciB3YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IG93bmVyLnN0YXRlTm9kZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXI7XG5cbiAgICAgIGlmICghd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIpIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIGFjY2Vzc2luZyBmaW5kRE9NTm9kZSBpbnNpZGUgaXRzIHJlbmRlcigpLiAnICsgJ3JlbmRlcigpIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLiBJdCBzaG91bGQgJyArICduZXZlciBhY2Nlc3Mgc29tZXRoaW5nIHRoYXQgcmVxdWlyZXMgc3RhbGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyAnICsgJ3JlbmRlciwgc3VjaCBhcyByZWZzLiBNb3ZlIHRoaXMgbG9naWMgdG8gY29tcG9uZW50RGlkTW91bnQgYW5kICcgKyAnY29tcG9uZW50RGlkVXBkYXRlIGluc3RlYWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKG93bmVyLnR5cGUpIHx8ICdBIGNvbXBvbmVudCcpO1xuICAgICAgfVxuXG4gICAgICBvd25lci5zdGF0ZU5vZGUuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29tcG9uZW50T3JFbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChjb21wb25lbnRPckVsZW1lbnQubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgIHJldHVybiBjb21wb25lbnRPckVsZW1lbnQ7XG4gIH1cblxuICB7XG4gICAgcmV0dXJuIGZpbmRIb3N0SW5zdGFuY2VXaXRoV2FybmluZyhjb21wb25lbnRPckVsZW1lbnQsICdmaW5kRE9NTm9kZScpO1xuICB9XG59XG5mdW5jdGlvbiBoeWRyYXRlKGVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spIHtcbiAge1xuICAgIGVycm9yKCdSZWFjdERPTS5oeWRyYXRlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gUmVhY3QgMTguIFVzZSBoeWRyYXRlUm9vdCAnICsgJ2luc3RlYWQuIFVudGlsIHlvdSBzd2l0Y2ggdG8gdGhlIG5ldyBBUEksIHlvdXIgYXBwIHdpbGwgYmVoYXZlIGFzICcgKyBcImlmIGl0J3MgcnVubmluZyBSZWFjdCAxNy4gTGVhcm4gXCIgKyAnbW9yZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N3aXRjaC10by1jcmVhdGVyb290Jyk7XG4gIH1cblxuICBpZiAoIWlzVmFsaWRDb250YWluZXJMZWdhY3koY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIHtcbiAgICB2YXIgaXNNb2Rlcm5Sb290ID0gaXNDb250YWluZXJNYXJrZWRBc1Jvb3QoY29udGFpbmVyKSAmJiBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTW9kZXJuUm9vdCkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS5oeWRyYXRlKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCBoeWRyYXRlUm9vdChjb250YWluZXIsIGVsZW1lbnQpPycpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiB0aHJvdyBvciB3YXJuIGlmIHdlIGNvdWxkbid0IGh5ZHJhdGU/XG5cblxuICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgZWxlbWVudCwgY29udGFpbmVyLCB0cnVlLCBjYWxsYmFjayk7XG59XG5mdW5jdGlvbiByZW5kZXIoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICB7XG4gICAgZXJyb3IoJ1JlYWN0RE9NLnJlbmRlciBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGluIFJlYWN0IDE4LiBVc2UgY3JlYXRlUm9vdCAnICsgJ2luc3RlYWQuIFVudGlsIHlvdSBzd2l0Y2ggdG8gdGhlIG5ldyBBUEksIHlvdXIgYXBwIHdpbGwgYmVoYXZlIGFzICcgKyBcImlmIGl0J3MgcnVubmluZyBSZWFjdCAxNy4gTGVhcm4gXCIgKyAnbW9yZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N3aXRjaC10by1jcmVhdGVyb290Jyk7XG4gIH1cblxuICBpZiAoIWlzVmFsaWRDb250YWluZXJMZWdhY3koY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIHtcbiAgICB2YXIgaXNNb2Rlcm5Sb290ID0gaXNDb250YWluZXJNYXJrZWRBc1Jvb3QoY29udGFpbmVyKSAmJiBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTW9kZXJuUm9vdCkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS5yZW5kZXIoKSBvbiBhIGNvbnRhaW5lciB0aGF0IHdhcyBwcmV2aW91c2x5ICcgKyAncGFzc2VkIHRvIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIHJvb3QucmVuZGVyKGVsZW1lbnQpPycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBlbGVtZW50LCBjb250YWluZXIsIGZhbHNlLCBjYWxsYmFjayk7XG59XG5mdW5jdGlvbiB1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICBlcnJvcignUmVhY3RET00udW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIoKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkICcgKyAnaW4gUmVhY3QgMTguIENvbnNpZGVyIHVzaW5nIGEgcG9ydGFsIGluc3RlYWQuIFVudGlsIHlvdSBzd2l0Y2ggdG8gJyArIFwidGhlIGNyZWF0ZVJvb3QgQVBJLCB5b3VyIGFwcCB3aWxsIGJlaGF2ZSBhcyBpZiBpdCdzIHJ1bm5pbmcgUmVhY3QgXCIgKyAnMTcuIExlYXJuIG1vcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zd2l0Y2gtdG8tY3JlYXRlcm9vdCcpO1xuICB9XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lck5vZGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAgaWYgKHBhcmVudENvbXBvbmVudCA9PSBudWxsIHx8ICFoYXMocGFyZW50Q29tcG9uZW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncGFyZW50Q29tcG9uZW50IG11c3QgYmUgYSB2YWxpZCBSZWFjdCBDb21wb25lbnQnKTtcbiAgfVxuXG4gIHJldHVybiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGZhbHNlLCBjYWxsYmFjayk7XG59XG5mdW5jdGlvbiB1bm1vdW50Q29tcG9uZW50QXROb2RlKGNvbnRhaW5lcikge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXJMZWdhY3koY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndW5tb3VudENvbXBvbmVudEF0Tm9kZSguLi4pOiBUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAge1xuICAgIHZhciBpc01vZGVyblJvb3QgPSBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChjb250YWluZXIpICYmIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID09PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNNb2Rlcm5Sb290KSB7XG4gICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NLnVubW91bnRDb21wb25lbnRBdE5vZGUoKSBvbiBhIGNvbnRhaW5lciB0aGF0IHdhcyBwcmV2aW91c2x5ICcgKyAncGFzc2VkIHRvIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiBEaWQgeW91IG1lYW4gdG8gY2FsbCByb290LnVubW91bnQoKT8nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIpIHtcbiAgICB7XG4gICAgICB2YXIgcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gICAgICB2YXIgcmVuZGVyZWRCeURpZmZlcmVudFJlYWN0ID0gcm9vdEVsICYmICFnZXRJbnN0YW5jZUZyb21Ob2RlKHJvb3RFbCk7XG5cbiAgICAgIGlmIChyZW5kZXJlZEJ5RGlmZmVyZW50UmVhY3QpIHtcbiAgICAgICAgZXJyb3IoXCJ1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFRoZSBub2RlIHlvdSdyZSBhdHRlbXB0aW5nIHRvIHVubW91bnQgXCIgKyAnd2FzIHJlbmRlcmVkIGJ5IGFub3RoZXIgY29weSBvZiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICB9IC8vIFVubW91bnQgc2hvdWxkIG5vdCBiZSBiYXRjaGVkLlxuXG5cbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgbnVsbCwgY29udGFpbmVyLCBmYWxzZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgc2hvdWxkIHByb2JhYmx5IHVzZSBgZGVsZXRlIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyYFxuICAgICAgICBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9IG51bGw7XG4gICAgICAgIHVubWFya0NvbnRhaW5lckFzUm9vdChjb250YWluZXIpO1xuICAgICAgfSk7XG4gICAgfSk7IC8vIElmIHlvdSBjYWxsIHVubW91bnRDb21wb25lbnRBdE5vZGUgdHdpY2UgaW4gcXVpY2sgc3VjY2Vzc2lvbiwgeW91J2xsXG4gICAgLy8gZ2V0IGB0cnVlYCB0d2ljZS4gVGhhdCdzIHByb2JhYmx5IGZpbmU/XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB7XG4gICAgICB2YXIgX3Jvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuXG4gICAgICB2YXIgaGFzTm9uUm9vdFJlYWN0Q2hpbGQgPSAhIShfcm9vdEVsICYmIGdldEluc3RhbmNlRnJvbU5vZGUoX3Jvb3RFbCkpOyAvLyBDaGVjayBpZiB0aGUgY29udGFpbmVyIGl0c2VsZiBpcyBhIFJlYWN0IHJvb3Qgbm9kZS5cblxuICAgICAgdmFyIGlzQ29udGFpbmVyUmVhY3RSb290ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiYgaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIucGFyZW50Tm9kZSkgJiYgISFjb250YWluZXIucGFyZW50Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyO1xuXG4gICAgICBpZiAoaGFzTm9uUm9vdFJlYWN0Q2hpbGQpIHtcbiAgICAgICAgZXJyb3IoXCJ1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFRoZSBub2RlIHlvdSdyZSBhdHRlbXB0aW5nIHRvIHVubW91bnQgXCIgKyAnd2FzIHJlbmRlcmVkIGJ5IFJlYWN0IGFuZCBpcyBub3QgYSB0b3AtbGV2ZWwgY29udGFpbmVyLiAlcycsIGlzQ29udGFpbmVyUmVhY3RSb290ID8gJ1lvdSBtYXkgaGF2ZSBhY2NpZGVudGFsbHkgcGFzc2VkIGluIGEgUmVhY3Qgcm9vdCBub2RlIGluc3RlYWQgJyArICdvZiBpdHMgY29udGFpbmVyLicgOiAnSW5zdGVhZCwgaGF2ZSB0aGUgcGFyZW50IGNvbXBvbmVudCB1cGRhdGUgaXRzIHN0YXRlIGFuZCAnICsgJ3JlcmVuZGVyIGluIG9yZGVyIHRvIHJlbW92ZSB0aGlzIGNvbXBvbmVudC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuc2V0QXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbiQxKTtcbnNldEF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uJDEpO1xuc2V0QXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5KGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eSQxKTtcbnNldEdldEN1cnJlbnRVcGRhdGVQcmlvcml0eShnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkpO1xuc2V0QXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkocnVuV2l0aFByaW9yaXR5KTtcblxue1xuICBpZiAodHlwZW9mIE1hcCAhPT0gJ2Z1bmN0aW9uJyB8fCAvLyAkRmxvd0lzc3VlIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIE1hcCBoYXMgbm8gcHJvdG90eXBlXG4gIE1hcC5wcm90b3R5cGUgPT0gbnVsbCB8fCB0eXBlb2YgTWFwLnByb3RvdHlwZS5mb3JFYWNoICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBTZXQgIT09ICdmdW5jdGlvbicgfHwgLy8gJEZsb3dJc3N1ZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBTZXQgaGFzIG5vIHByb3RvdHlwZVxuICBTZXQucHJvdG90eXBlID09IG51bGwgfHwgdHlwZW9mIFNldC5wcm90b3R5cGUuY2xlYXIgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIFNldC5wcm90b3R5cGUuZm9yRWFjaCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGVycm9yKCdSZWFjdCBkZXBlbmRzIG9uIE1hcCBhbmQgU2V0IGJ1aWx0LWluIHR5cGVzLiBNYWtlIHN1cmUgdGhhdCB5b3UgbG9hZCBhICcgKyAncG9seWZpbGwgaW4gb2xkZXIgYnJvd3NlcnMuIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1wb2x5ZmlsbHMnKTtcbiAgfVxufVxuXG5zZXRSZXN0b3JlSW1wbGVtZW50YXRpb24ocmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQzKTtcbnNldEJhdGNoaW5nSW1wbGVtZW50YXRpb24oYmF0Y2hlZFVwZGF0ZXMkMSwgZGlzY3JldGVVcGRhdGVzLCBmbHVzaFN5bmMpO1xuXG5mdW5jdGlvbiBjcmVhdGVQb3J0YWwkMShjaGlsZHJlbiwgY29udGFpbmVyKSB7XG4gIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH0gLy8gVE9ETzogcGFzcyBSZWFjdERPTSBwb3J0YWwgaW1wbGVtZW50YXRpb24gYXMgdGhpcmQgYXJndW1lbnRcbiAgLy8gJEZsb3dGaXhNZSBUaGUgRmxvdyB0eXBlIGlzIG9wYXF1ZSBidXQgdGhlcmUncyBubyB3YXkgdG8gYWN0dWFsbHkgY3JlYXRlIGl0LlxuXG5cbiAgcmV0dXJuIGNyZWF0ZVBvcnRhbChjaGlsZHJlbiwgY29udGFpbmVyLCBudWxsLCBrZXkpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGNhbGxiYWNrKSB7XG4gIHJldHVybiB1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGNhbGxiYWNrKTtcbn1cblxudmFyIEludGVybmFscyA9IHtcbiAgdXNpbmdDbGllbnRFbnRyeVBvaW50OiBmYWxzZSxcbiAgLy8gS2VlcCBpbiBzeW5jIHdpdGggUmVhY3RUZXN0VXRpbHMuanMuXG4gIC8vIFRoaXMgaXMgYW4gYXJyYXkgZm9yIGJldHRlciBtaW5pZmljYXRpb24uXG4gIEV2ZW50czogW2dldEluc3RhbmNlRnJvbU5vZGUsIGdldE5vZGVGcm9tSW5zdGFuY2UsIGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUsIGVucXVldWVTdGF0ZVJlc3RvcmUsIHJlc3RvcmVTdGF0ZUlmTmVlZGVkLCBiYXRjaGVkVXBkYXRlcyQxXVxufTtcblxuZnVuY3Rpb24gY3JlYXRlUm9vdCQxKGNvbnRhaW5lciwgb3B0aW9ucykge1xuICB7XG4gICAgaWYgKCFJbnRlcm5hbHMudXNpbmdDbGllbnRFbnRyeVBvaW50ICYmICFmYWxzZSkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgaW1wb3J0aW5nIGNyZWF0ZVJvb3QgZnJvbSBcInJlYWN0LWRvbVwiIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnWW91IHNob3VsZCBpbnN0ZWFkIGltcG9ydCBpdCBmcm9tIFwicmVhY3QtZG9tL2NsaWVudFwiLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjcmVhdGVSb290KGNvbnRhaW5lciwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGh5ZHJhdGVSb290JDEoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIG9wdGlvbnMpIHtcbiAge1xuICAgIGlmICghSW50ZXJuYWxzLnVzaW5nQ2xpZW50RW50cnlQb2ludCAmJiAhZmFsc2UpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGltcG9ydGluZyBoeWRyYXRlUm9vdCBmcm9tIFwicmVhY3QtZG9tXCIgd2hpY2ggaXMgbm90IHN1cHBvcnRlZC4gJyArICdZb3Ugc2hvdWxkIGluc3RlYWQgaW1wb3J0IGl0IGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCIuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGh5ZHJhdGVSb290KGNvbnRhaW5lciwgaW5pdGlhbENoaWxkcmVuLCBvcHRpb25zKTtcbn0gLy8gT3ZlcmxvYWQgdGhlIGRlZmluaXRpb24gdG8gdGhlIHR3byB2YWxpZCBzaWduYXR1cmVzLlxuLy8gV2FybmluZywgdGhpcyBvcHRzLW91dCBvZiBjaGVja2luZyB0aGUgZnVuY3Rpb24gYm9keS5cblxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG5mdW5jdGlvbiBmbHVzaFN5bmMkMShmbikge1xuICB7XG4gICAgaWYgKGlzQWxyZWFkeVJlbmRlcmluZygpKSB7XG4gICAgICBlcnJvcignZmx1c2hTeW5jIHdhcyBjYWxsZWQgZnJvbSBpbnNpZGUgYSBsaWZlY3ljbGUgbWV0aG9kLiBSZWFjdCBjYW5ub3QgJyArICdmbHVzaCB3aGVuIFJlYWN0IGlzIGFscmVhZHkgcmVuZGVyaW5nLiBDb25zaWRlciBtb3ZpbmcgdGhpcyBjYWxsIHRvICcgKyAnYSBzY2hlZHVsZXIgdGFzayBvciBtaWNybyB0YXNrLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmbHVzaFN5bmMoZm4pO1xufVxudmFyIGZvdW5kRGV2VG9vbHMgPSBpbmplY3RJbnRvRGV2VG9vbHMoe1xuICBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTogZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUsXG4gIGJ1bmRsZVR5cGU6ICAxICxcbiAgdmVyc2lvbjogUmVhY3RWZXJzaW9uLFxuICByZW5kZXJlclBhY2thZ2VOYW1lOiAncmVhY3QtZG9tJ1xufSk7XG5cbntcbiAgaWYgKCFmb3VuZERldlRvb2xzICYmIGNhblVzZURPTSAmJiB3aW5kb3cudG9wID09PSB3aW5kb3cuc2VsZikge1xuICAgIC8vIElmIHdlJ3JlIGluIENocm9tZSBvciBGaXJlZm94LCBwcm92aWRlIGEgZG93bmxvYWQgbGluayBpZiBub3QgaW5zdGFsbGVkLlxuICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0Nocm9tZScpID4gLTEgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdFZGdlJykgPT09IC0xIHx8IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRmlyZWZveCcpID4gLTEpIHtcbiAgICAgIHZhciBwcm90b2NvbCA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbDsgLy8gRG9uJ3Qgd2FybiBpbiBleG90aWMgY2FzZXMgbGlrZSBjaHJvbWUtZXh0ZW5zaW9uOi8vLlxuXG4gICAgICBpZiAoL14oaHR0cHM/fGZpbGUpOiQvLnRlc3QocHJvdG9jb2wpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcbiAgICAgICAgY29uc29sZS5pbmZvKCclY0Rvd25sb2FkIHRoZSBSZWFjdCBEZXZUb29scyAnICsgJ2ZvciBhIGJldHRlciBkZXZlbG9wbWVudCBleHBlcmllbmNlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1kZXZ0b29scycgKyAocHJvdG9jb2wgPT09ICdmaWxlOicgPyAnXFxuWW91IG1pZ2h0IG5lZWQgdG8gdXNlIGEgbG9jYWwgSFRUUCBzZXJ2ZXIgKGluc3RlYWQgb2YgZmlsZTovLyk6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LWRldnRvb2xzLWZhcScgOiAnJyksICdmb250LXdlaWdodDpib2xkJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydHMuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQgPSBJbnRlcm5hbHM7XG5leHBvcnRzLmNyZWF0ZVBvcnRhbCA9IGNyZWF0ZVBvcnRhbCQxO1xuZXhwb3J0cy5jcmVhdGVSb290ID0gY3JlYXRlUm9vdCQxO1xuZXhwb3J0cy5maW5kRE9NTm9kZSA9IGZpbmRET01Ob2RlO1xuZXhwb3J0cy5mbHVzaFN5bmMgPSBmbHVzaFN5bmMkMTtcbmV4cG9ydHMuaHlkcmF0ZSA9IGh5ZHJhdGU7XG5leHBvcnRzLmh5ZHJhdGVSb290ID0gaHlkcmF0ZVJvb3QkMTtcbmV4cG9ydHMucmVuZGVyID0gcmVuZGVyO1xuZXhwb3J0cy51bm1vdW50Q29tcG9uZW50QXROb2RlID0gdW5tb3VudENvbXBvbmVudEF0Tm9kZTtcbmV4cG9ydHMudW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgPSBiYXRjaGVkVXBkYXRlcyQxO1xuZXhwb3J0cy51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lciA9IHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyO1xuZXhwb3J0cy52ZXJzaW9uID0gUmVhY3RWZXJzaW9uO1xuICAgICAgICAgIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgXG4gIH0pKCk7XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vZnJvbnRlbmQvLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzPyIpOwoKLyoqKi8gfSksCgovKioqLyAiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9jbGllbnQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2NsaWVudC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCiJ1c2Ugc3RyaWN0IjsKZXZhbCgiXG5cbnZhciBtID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgcmVhY3QtZG9tICovIFwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9pbmRleC5qc1wiKTtcbmlmIChmYWxzZSkge30gZWxzZSB7XG4gIHZhciBpID0gbS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcbiAgZXhwb3J0cy5jcmVhdGVSb290ID0gZnVuY3Rpb24oYywgbykge1xuICAgIGkudXNpbmdDbGllbnRFbnRyeVBvaW50ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG0uY3JlYXRlUm9vdChjLCBvKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG4gIGV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBmdW5jdGlvbihjLCBoLCBvKSB7XG4gICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbS5oeWRyYXRlUm9vdChjLCBoLCBvKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vZnJvbnRlbmQvLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9jbGllbnQuanM/Iik7CgovKioqLyB9KSwKCi8qKiovICIuLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2luZGV4LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2luZGV4LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoidXNlIHN0cmljdCI7CmV2YWwoIlxuXG5mdW5jdGlvbiBjaGVja0RDRSgpIHtcbiAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuICBpZiAoXG4gICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFICE9PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodHJ1ZSkge1xuICAgIC8vIFRoaXMgYnJhbmNoIGlzIHVucmVhY2hhYmxlIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZFxuICAgIC8vIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgY29uZGl0aW9uIGlzIHRydWUgb25seSBpbiBkZXZlbG9wbWVudC5cbiAgICAvLyBUaGVyZWZvcmUgaWYgdGhlIGJyYW5jaCBpcyBzdGlsbCBoZXJlLCBkZWFkIGNvZGUgZWxpbWluYXRpb24gd2Fzbid0XG4gICAgLy8gcHJvcGVybHkgYXBwbGllZC5cbiAgICAvLyBEb24ndCBjaGFuZ2UgdGhlIG1lc3NhZ2UuIFJlYWN0IERldlRvb2xzIHJlbGllcyBvbiBpdC4gQWxzbyBtYWtlIHN1cmVcbiAgICAvLyB0aGlzIG1lc3NhZ2UgZG9lc24ndCBvY2N1ciBlbHNld2hlcmUgaW4gdGhpcyBmdW5jdGlvbiwgb3IgaXQgd2lsbCBjYXVzZVxuICAgIC8vIGEgZmFsc2UgcG9zaXRpdmUuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdeX14nKTtcbiAgfVxuICB0cnkge1xuICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBjb2RlIGFib3ZlIGhhcyBiZWVuIGRlYWQgY29kZSBlbGltaW5hdGVkIChEQ0UnZCkuXG4gICAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFKGNoZWNrRENFKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gRGV2VG9vbHMgc2hvdWxkbid0IGNyYXNoIFJlYWN0LCBubyBtYXR0ZXIgd2hhdC5cbiAgICAvLyBXZSBzaG91bGQgc3RpbGwgcmVwb3J0IGluIGNhc2Ugd2UgYnJlYWsgdGhpcyBjb2RlLlxuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxufVxuXG5pZiAoZmFsc2UpIHt9IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vY2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qcyAqLyBcIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vY2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qc1wiKTtcbn1cblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9mcm9udGVuZC8uLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2luZGV4LmpzPyIpOwoKLyoqKi8gfSksCgovKioqLyAiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKChtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCiJ1c2Ugc3RyaWN0IjsKZXZhbCgiLyogbW9kdWxlIGRlY29yYXRvciAqLyBtb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm5tZChtb2R1bGUpO1xuLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5cblxuaWYgKHRydWUpIHtcbiAgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgICB2YXIgUmVhY3RWZXJzaW9uID0gJzE4LjIuMCc7XG5cbi8vIEFUVEVOVElPTlxuLy8gV2hlbiBhZGRpbmcgbmV3IHN5bWJvbHMgdG8gdGhpcyBmaWxlLFxuLy8gUGxlYXNlIGNvbnNpZGVyIGFsc28gYWRkaW5nIHRvICdyZWFjdC1kZXZ0b29scy1zaGFyZWQvc3JjL2JhY2tlbmQvUmVhY3RTeW1ib2xzJ1xuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpO1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJyk7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJyk7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubGF6eScpO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Qub2Zmc2NyZWVuJyk7XG52YXIgTUFZQkVfSVRFUkFUT1JfU1lNQk9MID0gU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InO1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gIGlmIChtYXliZUl0ZXJhYmxlID09PSBudWxsIHx8IHR5cGVvZiBtYXliZUl0ZXJhYmxlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG1heWJlSXRlcmF0b3IgPSBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtNQVlCRV9JVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdO1xuXG4gIGlmICh0eXBlb2YgbWF5YmVJdGVyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtYXliZUl0ZXJhdG9yO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgZGlzcGF0Y2hlci5cbiAqL1xudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHR5cGUge1JlYWN0Q29tcG9uZW50fVxuICAgKi9cbiAgY3VycmVudDogbnVsbFxufTtcblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBiYXRjaCdzIGNvbmZpZ3VyYXRpb24gc3VjaCBhcyBob3cgbG9uZyBhbiB1cGRhdGVcbiAqIHNob3VsZCBzdXNwZW5kIGZvciBpZiBpdCBuZWVkcyB0by5cbiAqL1xudmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnID0ge1xuICB0cmFuc2l0aW9uOiBudWxsXG59O1xuXG52YXIgUmVhY3RDdXJyZW50QWN0UXVldWUgPSB7XG4gIGN1cnJlbnQ6IG51bGwsXG4gIC8vIFVzZWQgdG8gcmVwcm9kdWNlIGJlaGF2aW9yIG9mIGBiYXRjaGVkVXBkYXRlc2AgaW4gbGVnYWN5IG1vZGUuXG4gIGlzQmF0Y2hpbmdMZWdhY3k6IGZhbHNlLFxuICBkaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZTogZmFsc2Vcbn07XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgb3duZXIuXG4gKlxuICogVGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIGNvbXBvbmVudCB3aG8gc2hvdWxkIG93biBhbnkgY29tcG9uZW50cyB0aGF0IGFyZVxuICogY3VycmVudGx5IGJlaW5nIGNvbnN0cnVjdGVkLlxuICovXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHR5cGUge1JlYWN0Q29tcG9uZW50fVxuICAgKi9cbiAgY3VycmVudDogbnVsbFxufTtcblxudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSB7fTtcbnZhciBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gbnVsbDtcbmZ1bmN0aW9uIHNldEV4dHJhU3RhY2tGcmFtZShzdGFjaykge1xuICB7XG4gICAgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IHN0YWNrO1xuICB9XG59XG5cbntcbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5zZXRFeHRyYVN0YWNrRnJhbWUgPSBmdW5jdGlvbiAoc3RhY2spIHtcbiAgICB7XG4gICAgICBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gc3RhY2s7XG4gICAgfVxuICB9OyAvLyBTdGFjayBpbXBsZW1lbnRhdGlvbiBpbmplY3RlZCBieSB0aGUgY3VycmVudCByZW5kZXJlci5cblxuXG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gbnVsbDtcblxuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN0YWNrID0gJyc7IC8vIEFkZCBhbiBleHRyYSB0b3AgZnJhbWUgd2hpbGUgYW4gZWxlbWVudCBpcyBiZWluZyB2YWxpZGF0ZWRcblxuICAgIGlmIChjdXJyZW50RXh0cmFTdGFja0ZyYW1lKSB7XG4gICAgICBzdGFjayArPSBjdXJyZW50RXh0cmFTdGFja0ZyYW1lO1xuICAgIH0gLy8gRGVsZWdhdGUgdG8gdGhlIGluamVjdGVkIHJlbmRlcmVyLXNwZWNpZmljIGltcGxlbWVudGF0aW9uXG5cblxuICAgIHZhciBpbXBsID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2s7XG5cbiAgICBpZiAoaW1wbCkge1xuICAgICAgc3RhY2sgKz0gaW1wbCgpIHx8ICcnO1xuICAgIH1cblxuICAgIHJldHVybiBzdGFjaztcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGVuYWJsZVNjb3BlQVBJID0gZmFsc2U7IC8vIEV4cGVyaW1lbnRhbCBDcmVhdGUgRXZlbnQgSGFuZGxlIEFQSS5cbnZhciBlbmFibGVDYWNoZUVsZW1lbnQgPSBmYWxzZTtcbnZhciBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyA9IGZhbHNlOyAvLyBObyBrbm93biBidWdzLCBidXQgbmVlZHMgcGVyZm9ybWFuY2UgdGVzdGluZ1xuXG52YXIgZW5hYmxlTGVnYWN5SGlkZGVuID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaWJlclxuLy8gc3R1ZmYuIEludGVuZGVkIHRvIGVuYWJsZSBSZWFjdCBjb3JlIG1lbWJlcnMgdG8gbW9yZSBlYXNpbHkgZGVidWcgc2NoZWR1bGluZ1xuLy8gaXNzdWVzIGluIERFViBidWlsZHMuXG5cbnZhciBlbmFibGVEZWJ1Z1RyYWNpbmcgPSBmYWxzZTsgLy8gVHJhY2sgd2hpY2ggRmliZXIocykgc2NoZWR1bGUgcmVuZGVyIHdvcmsuXG5cbnZhciBSZWFjdFNoYXJlZEludGVybmFscyA9IHtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjogUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLFxuICBSZWFjdEN1cnJlbnRPd25lcjogUmVhY3RDdXJyZW50T3duZXJcbn07XG5cbntcbiAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEFjdFF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWU7XG59XG5cbi8vIGJ5IGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYnkgYSBCYWJlbCBwbHVnaW4uXG4vL1xuLy8gSW4gUFJPRCAob3IgaW4gcGFja2FnZXMgd2l0aG91dCBhY2Nlc3MgdG8gUmVhY3QgaW50ZXJuYWxzKSxcbi8vIHRoZXkgYXJlIGxlZnQgYXMgdGhleSBhcmUgaW5zdGVhZC5cblxuZnVuY3Rpb24gd2Fybihmb3JtYXQpIHtcbiAge1xuICAgIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnd2FybicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlcnJvcihmb3JtYXQpIHtcbiAge1xuICAgIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnZXJyb3InLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykge1xuICAvLyBXaGVuIGNoYW5naW5nIHRoaXMgbG9naWMsIHlvdSBtaWdodCB3YW50IHRvIGFsc29cbiAgLy8gdXBkYXRlIGNvbnNvbGVXaXRoU3RhY2tEZXYud3d3LmpzIGFzIHdlbGwuXG4gIHtcbiAgICB2YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gICAgdmFyIHN0YWNrID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKCk7XG5cbiAgICBpZiAoc3RhY2sgIT09ICcnKSB7XG4gICAgICBmb3JtYXQgKz0gJyVzJztcbiAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChbc3RhY2tdKTtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuXG5cbiAgICB2YXIgYXJnc1dpdGhGb3JtYXQgPSBhcmdzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIFN0cmluZyhpdGVtKTtcbiAgICB9KTsgLy8gQ2FyZWZ1bDogUk4gY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcmVmaXhcblxuICAgIGFyZ3NXaXRoRm9ybWF0LnVuc2hpZnQoJ1dhcm5pbmc6ICcgKyBmb3JtYXQpOyAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBzcHJlYWQgKG9yIC5hcHBseSkgZGlyZWN0bHkgYmVjYXVzZSBpdFxuICAgIC8vIGJyZWFrcyBJRTk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2MTBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG5cbiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlW2xldmVsXSwgY29uc29sZSwgYXJnc1dpdGhGb3JtYXQpO1xuICB9XG59XG5cbnZhciBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnQgPSB7fTtcblxuZnVuY3Rpb24gd2Fybk5vb3AocHVibGljSW5zdGFuY2UsIGNhbGxlck5hbWUpIHtcbiAge1xuICAgIHZhciBfY29uc3RydWN0b3IgPSBwdWJsaWNJbnN0YW5jZS5jb25zdHJ1Y3RvcjtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IF9jb25zdHJ1Y3RvciAmJiAoX2NvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IF9jb25zdHJ1Y3Rvci5uYW1lKSB8fCAnUmVhY3RDbGFzcyc7XG4gICAgdmFyIHdhcm5pbmdLZXkgPSBjb21wb25lbnROYW1lICsgXCIuXCIgKyBjYWxsZXJOYW1lO1xuXG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudFt3YXJuaW5nS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVycm9yKFwiQ2FuJ3QgY2FsbCAlcyBvbiBhIGNvbXBvbmVudCB0aGF0IGlzIG5vdCB5ZXQgbW91bnRlZC4gXCIgKyAnVGhpcyBpcyBhIG5vLW9wLCBidXQgaXQgbWlnaHQgaW5kaWNhdGUgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gJyArICdJbnN0ZWFkLCBhc3NpZ24gdG8gYHRoaXMuc3RhdGVgIGRpcmVjdGx5IG9yIGRlZmluZSBhIGBzdGF0ZSA9IHt9O2AgJyArICdjbGFzcyBwcm9wZXJ0eSB3aXRoIHRoZSBkZXNpcmVkIHN0YXRlIGluIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFtZSwgY29tcG9uZW50TmFtZSk7XG5cbiAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbd2FybmluZ0tleV0gPSB0cnVlO1xuICB9XG59XG4vKipcbiAqIFRoaXMgaXMgdGhlIGFic3RyYWN0IEFQSSBmb3IgYW4gdXBkYXRlIHF1ZXVlLlxuICovXG5cblxudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0ge1xuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB3ZSB3YW50IHRvIHRlc3QuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgaXNNb3VudGVkOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAgICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAgICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gICAqXG4gICAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAgICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gY2FsbGVyTmFtZSBuYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVGb3JjZVVwZGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnZm9yY2VVcGRhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogUmVwbGFjZXMgYWxsIG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIG9yIGBzZXRTdGF0ZWAgdG8gbXV0YXRlIHN0YXRlLlxuICAgKiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gICAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcGxldGVTdGF0ZSBOZXh0IHN0YXRlLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IGNhbGxlck5hbWUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNvbXBsZXRlU3RhdGUsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdyZXBsYWNlU3RhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIFRoaXMgb25seSBleGlzdHMgYmVjYXVzZSBfcGVuZGluZ1N0YXRlIGlzXG4gICAqIGludGVybmFsLiBUaGlzIHByb3ZpZGVzIGEgbWVyZ2luZyBzdHJhdGVneSB0aGF0IGlzIG5vdCBhdmFpbGFibGUgdG8gZGVlcFxuICAgKiBwcm9wZXJ0aWVzIHdoaWNoIGlzIGNvbmZ1c2luZy4gVE9ETzogRXhwb3NlIHBlbmRpbmdTdGF0ZSBvciBkb24ndCB1c2UgaXRcbiAgICogZHVyaW5nIHRoZSBtZXJnZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIHN0YXRlLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IE5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3NldFN0YXRlJyk7XG4gIH1cbn07XG5cbnZhciBhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuXG52YXIgZW1wdHlPYmplY3QgPSB7fTtcblxue1xuICBPYmplY3QuZnJlZXplKGVtcHR5T2JqZWN0KTtcbn1cbi8qKlxuICogQmFzZSBjbGFzcyBoZWxwZXJzIGZvciB0aGUgdXBkYXRpbmcgc3RhdGUgb2YgYSBjb21wb25lbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHtcbiAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OyAvLyBJZiBhIGNvbXBvbmVudCBoYXMgc3RyaW5nIHJlZnMsIHdlIHdpbGwgYXNzaWduIGEgZGlmZmVyZW50IG9iamVjdCBsYXRlci5cblxuICB0aGlzLnJlZnMgPSBlbXB0eU9iamVjdDsgLy8gV2UgaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCB1cGRhdGVyIGJ1dCB0aGUgcmVhbCBvbmUgZ2V0cyBpbmplY3RlZCBieSB0aGVcbiAgLy8gcmVuZGVyZXIuXG5cbiAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcbn1cblxuQ29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50ID0ge307XG4vKipcbiAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgdG8gbXV0YXRlXG4gKiBzdGF0ZS4gWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGNhbGxzIHRvIGBzZXRTdGF0ZWAgd2lsbCBydW4gc3luY2hyb25vdXNseSxcbiAqIGFzIHRoZXkgbWF5IGV2ZW50dWFsbHkgYmUgYmF0Y2hlZCB0b2dldGhlci4gIFlvdSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbFxuICogY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGNhbGwgdG8gc2V0U3RhdGUgaXMgYWN0dWFsbHlcbiAqIGNvbXBsZXRlZC5cbiAqXG4gKiBXaGVuIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgdG8gc2V0U3RhdGUsIGl0IHdpbGwgYmUgY2FsbGVkIGF0IHNvbWUgcG9pbnQgaW5cbiAqIHRoZSBmdXR1cmUgKG5vdCBzeW5jaHJvbm91c2x5KS4gSXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgdXAgdG8gZGF0ZVxuICogY29tcG9uZW50IGFyZ3VtZW50cyAoc3RhdGUsIHByb3BzLCBjb250ZXh0KS4gVGhlc2UgdmFsdWVzIGNhbiBiZSBkaWZmZXJlbnRcbiAqIGZyb20gdGhpcy4qIGJlY2F1c2UgeW91ciBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGFmdGVyIHJlY2VpdmVQcm9wcyBidXQgYmVmb3JlXG4gKiBzaG91bGRDb21wb25lbnRVcGRhdGUsIGFuZCB0aGlzIG5ldyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHdpbGwgbm90IHlldCBiZVxuICogYXNzaWduZWQgdG8gdGhpcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdHxmdW5jdGlvbn0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSBvciBmdW5jdGlvbiB0b1xuICogICAgICAgIHByb2R1Y2UgbmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIGN1cnJlbnQgc3RhdGUuXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHN0YXRlIGlzIHVwZGF0ZWQuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuXG5Db21wb25lbnQucHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24gKHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBwYXJ0aWFsU3RhdGUgIT09ICdvYmplY3QnICYmIHR5cGVvZiBwYXJ0aWFsU3RhdGUgIT09ICdmdW5jdGlvbicgJiYgcGFydGlhbFN0YXRlICE9IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgJyArICdmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMuJyk7XG4gIH1cblxuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2ssICdzZXRTdGF0ZScpO1xufTtcbi8qKlxuICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gKlxuICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gKlxuICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAqXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqIEBmaW5hbFxuICogQHByb3RlY3RlZFxuICovXG5cblxuQ29tcG9uZW50LnByb3RvdHlwZS5mb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsIGNhbGxiYWNrLCAnZm9yY2VVcGRhdGUnKTtcbn07XG4vKipcbiAqIERlcHJlY2F0ZWQgQVBJcy4gVGhlc2UgQVBJcyB1c2VkIHRvIGV4aXN0IG9uIGNsYXNzaWMgUmVhY3QgY2xhc3NlcyBidXQgc2luY2VcbiAqIHdlIHdvdWxkIGxpa2UgdG8gZGVwcmVjYXRlIHRoZW0sIHdlJ3JlIG5vdCBnb2luZyB0byBtb3ZlIHRoZW0gb3ZlciB0byB0aGlzXG4gKiBtb2Rlcm4gYmFzZSBjbGFzcy4gSW5zdGVhZCwgd2UgZGVmaW5lIGEgZ2V0dGVyIHRoYXQgd2FybnMgaWYgaXQncyBhY2Nlc3NlZC5cbiAqL1xuXG5cbntcbiAgdmFyIGRlcHJlY2F0ZWRBUElzID0ge1xuICAgIGlzTW91bnRlZDogWydpc01vdW50ZWQnLCAnSW5zdGVhZCwgbWFrZSBzdXJlIHRvIGNsZWFuIHVwIHN1YnNjcmlwdGlvbnMgYW5kIHBlbmRpbmcgcmVxdWVzdHMgaW4gJyArICdjb21wb25lbnRXaWxsVW5tb3VudCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4nXSxcbiAgICByZXBsYWNlU3RhdGU6IFsncmVwbGFjZVN0YXRlJywgJ1JlZmFjdG9yIHlvdXIgY29kZSB0byB1c2Ugc2V0U3RhdGUgaW5zdGVhZCAoc2VlICcgKyAnaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zMjM2KS4nXVxuICB9O1xuXG4gIHZhciBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcgPSBmdW5jdGlvbiAobWV0aG9kTmFtZSwgaW5mbykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb21wb25lbnQucHJvdG90eXBlLCBtZXRob2ROYW1lLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2FybignJXMoLi4uKSBpcyBkZXByZWNhdGVkIGluIHBsYWluIEphdmFTY3JpcHQgUmVhY3QgY2xhc3Nlcy4gJXMnLCBpbmZvWzBdLCBpbmZvWzFdKTtcblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGZvciAodmFyIGZuTmFtZSBpbiBkZXByZWNhdGVkQVBJcykge1xuICAgIGlmIChkZXByZWNhdGVkQVBJcy5oYXNPd25Qcm9wZXJ0eShmbk5hbWUpKSB7XG4gICAgICBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcoZm5OYW1lLCBkZXByZWNhdGVkQVBJc1tmbk5hbWVdKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gQ29tcG9uZW50RHVtbXkoKSB7fVxuXG5Db21wb25lbnREdW1teS5wcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuLyoqXG4gKiBDb252ZW5pZW5jZSBjb21wb25lbnQgd2l0aCBkZWZhdWx0IHNoYWxsb3cgZXF1YWxpdHkgY2hlY2sgZm9yIHNDVS5cbiAqL1xuXG5mdW5jdGlvbiBQdXJlQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsgLy8gSWYgYSBjb21wb25lbnQgaGFzIHN0cmluZyByZWZzLCB3ZSB3aWxsIGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgbGF0ZXIuXG5cbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cbnZhciBwdXJlQ29tcG9uZW50UHJvdG90eXBlID0gUHVyZUNvbXBvbmVudC5wcm90b3R5cGUgPSBuZXcgQ29tcG9uZW50RHVtbXkoKTtcbnB1cmVDb21wb25lbnRQcm90b3R5cGUuY29uc3RydWN0b3IgPSBQdXJlQ29tcG9uZW50OyAvLyBBdm9pZCBhbiBleHRyYSBwcm90b3R5cGUganVtcCBmb3IgdGhlc2UgbWV0aG9kcy5cblxuYXNzaWduKHB1cmVDb21wb25lbnRQcm90b3R5cGUsIENvbXBvbmVudC5wcm90b3R5cGUpO1xucHVyZUNvbXBvbmVudFByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCA9IHRydWU7XG5cbi8vIGFuIGltbXV0YWJsZSBvYmplY3Qgd2l0aCBhIHNpbmdsZSBtdXRhYmxlIHZhbHVlXG5mdW5jdGlvbiBjcmVhdGVSZWYoKSB7XG4gIHZhciByZWZPYmplY3QgPSB7XG4gICAgY3VycmVudDogbnVsbFxuICB9O1xuXG4gIHtcbiAgICBPYmplY3Quc2VhbChyZWZPYmplY3QpO1xuICB9XG5cbiAgcmV0dXJuIHJlZk9iamVjdDtcbn1cblxudmFyIGlzQXJyYXlJbXBsID0gQXJyYXkuaXNBcnJheTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuXG5mdW5jdGlvbiBpc0FycmF5KGEpIHtcbiAgcmV0dXJuIGlzQXJyYXlJbXBsKGEpO1xufVxuXG4vKlxuICogVGhlIGAnJyArIHZhbHVlYCBwYXR0ZXJuICh1c2VkIGluIGluIHBlcmYtc2Vuc2l0aXZlIGNvZGUpIHRocm93cyBmb3IgU3ltYm9sXG4gKiBhbmQgVGVtcG9yYWwuKiB0eXBlcy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzIyMDY0LlxuICpcbiAqIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgd2lsbCB0aHJvdyBhbiBlYXNpZXItdG8tdW5kZXJzdGFuZCxcbiAqIGVhc2llci10by1kZWJ1ZyBleGNlcHRpb24gd2l0aCBhIGNsZWFyIGVycm9ycyBtZXNzYWdlIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGVcbiAqIHByb2JsZW0uIChJbnN0ZWFkIG9mIGEgY29uZnVzaW5nIGV4Y2VwdGlvbiB0aHJvd24gaW5zaWRlIHRoZSBpbXBsZW1lbnRhdGlvblxuICogb2YgdGhlIGB2YWx1ZWAgb2JqZWN0KS5cbiAqL1xuLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cbmZ1bmN0aW9uIHR5cGVOYW1lKHZhbHVlKSB7XG4gIHtcbiAgICAvLyB0b1N0cmluZ1RhZyBpcyBuZWVkZWQgZm9yIG5hbWVzcGFjZWQgdHlwZXMgbGlrZSBUZW1wb3JhbC5JbnN0YW50XG4gICAgdmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wudG9TdHJpbmdUYWc7XG4gICAgdmFyIHR5cGUgPSBoYXNUb1N0cmluZ1RhZyAmJiB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddIHx8IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgfHwgJ09iamVjdCc7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cbn0gLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cblxuXG5mdW5jdGlvbiB3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkge1xuICB7XG4gICAgdHJ5IHtcbiAgICAgIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICAvLyBJZiB5b3UgZW5kZWQgdXAgaGVyZSBieSBmb2xsb3dpbmcgYW4gZXhjZXB0aW9uIGNhbGwgc3RhY2ssIGhlcmUncyB3aGF0J3NcbiAgLy8gaGFwcGVuZWQ6IHlvdSBzdXBwbGllZCBhbiBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIFJlYWN0IChhcyBhIHByb3AsIGtleSxcbiAgLy8gRE9NIGF0dHJpYnV0ZSwgQ1NTIHByb3BlcnR5LCBzdHJpbmcgcmVmLCBldGMuKSBhbmQgd2hlbiBSZWFjdCB0cmllZCB0b1xuICAvLyBjb2VyY2UgaXQgdG8gYSBzdHJpbmcgdXNpbmcgYCcnICsgdmFsdWVgLCBhbiBleGNlcHRpb24gd2FzIHRocm93bi5cbiAgLy9cbiAgLy8gVGhlIG1vc3QgY29tbW9uIHR5cGVzIHRoYXQgd2lsbCBjYXVzZSB0aGlzIGV4Y2VwdGlvbiBhcmUgYFN5bWJvbGAgaW5zdGFuY2VzXG4gIC8vIGFuZCBUZW1wb3JhbCBvYmplY3RzIGxpa2UgYFRlbXBvcmFsLkluc3RhbnRgLiBCdXQgYW55IG9iamVjdCB0aGF0IGhhcyBhXG4gIC8vIGB2YWx1ZU9mYCBvciBgW1N5bWJvbC50b1ByaW1pdGl2ZV1gIG1ldGhvZCB0aGF0IHRocm93cyB3aWxsIGFsc28gY2F1c2UgdGhpc1xuICAvLyBleGNlcHRpb24uIChMaWJyYXJ5IGF1dGhvcnMgZG8gdGhpcyB0byBwcmV2ZW50IHVzZXJzIGZyb20gdXNpbmcgYnVpbHQtaW5cbiAgLy8gbnVtZXJpYyBvcGVyYXRvcnMgbGlrZSBgK2Agb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMgbGlrZSBgPj1gIGJlY2F1c2UgY3VzdG9tXG4gIC8vIG1ldGhvZHMgYXJlIG5lZWRlZCB0byBwZXJmb3JtIGFjY3VyYXRlIGFyaXRobWV0aWMgb3IgY29tcGFyaXNvbi4pXG4gIC8vXG4gIC8vIFRvIGZpeCB0aGUgcHJvYmxlbSwgY29lcmNlIHRoaXMgb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZyBiZWZvcmVcbiAgLy8gcGFzc2luZyBpdCB0byBSZWFjdC4gVGhlIG1vc3QgcmVsaWFibGUgd2F5IGlzIHVzdWFsbHkgYFN0cmluZyh2YWx1ZSlgLlxuICAvL1xuICAvLyBUbyBmaW5kIHdoaWNoIHZhbHVlIGlzIHRocm93aW5nLCBjaGVjayB0aGUgYnJvd3NlciBvciBkZWJ1Z2dlciBjb25zb2xlLlxuICAvLyBCZWZvcmUgdGhpcyBleGNlcHRpb24gd2FzIHRocm93biwgdGhlcmUgc2hvdWxkIGJlIGBjb25zb2xlLmVycm9yYCBvdXRwdXRcbiAgLy8gdGhhdCBzaG93cyB0aGUgdHlwZSAoU3ltYm9sLCBUZW1wb3JhbC5QbGFpbkRhdGUsIGV0Yy4pIHRoYXQgY2F1c2VkIHRoZVxuICAvLyBwcm9ibGVtIGFuZCBob3cgdGhhdCB0eXBlIHdhcyB1c2VkOiBrZXksIGF0cnJpYnV0ZSwgaW5wdXQgdmFsdWUgcHJvcCwgZXRjLlxuICAvLyBJbiBtb3N0IGNhc2VzLCB0aGlzIGNvbnNvbGUgb3V0cHV0IGFsc28gc2hvd3MgdGhlIGNvbXBvbmVudCBhbmQgaXRzXG4gIC8vIGFuY2VzdG9yIGNvbXBvbmVudHMgd2hlcmUgdGhlIGV4Y2VwdGlvbiBoYXBwZW5lZC5cbiAgLy9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gIHJldHVybiAnJyArIHZhbHVlO1xufVxuZnVuY3Rpb24gY2hlY2tLZXlTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBrZXkgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZGlzcGxheU5hbWUgPSBvdXRlclR5cGUuZGlzcGxheU5hbWU7XG5cbiAgaWYgKGRpc3BsYXlOYW1lKSB7XG4gICAgcmV0dXJuIGRpc3BsYXlOYW1lO1xuICB9XG5cbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZTtcbn0gLy8gS2VlcCBpbiBzeW5jIHdpdGggcmVhY3QtcmVjb25jaWxlci9nZXRDb21wb25lbnROYW1lRnJvbUZpYmVyXG5cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59IC8vIE5vdGUgdGhhdCB0aGUgcmVjb25jaWxlciBwYWNrYWdlIHNob3VsZCBnZW5lcmFsbHkgcHJlZmVyIHRvIHVzZSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKCkgaW5zdGVhZC5cblxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkge1xuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgLy8gSG9zdCByb290LCB0ZXh0IG5vZGUgb3IganVzdCBpbnZhbGlkIHR5cGUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiB0eXBlLnRhZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoKS4gJyArICdUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcblxuICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZUxpc3QnO1xuXG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgdmFyIG91dGVyTmFtZSA9IHR5cGUuZGlzcGxheU5hbWUgfHwgbnVsbDtcblxuICAgICAgICBpZiAob3V0ZXJOYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG91dGVyTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCAnTWVtbyc7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShpbml0KHBheWxvYWQpKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBSRVNFUlZFRF9QUk9QUyA9IHtcbiAga2V5OiB0cnVlLFxuICByZWY6IHRydWUsXG4gIF9fc2VsZjogdHJ1ZSxcbiAgX19zb3VyY2U6IHRydWVcbn07XG52YXIgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24sIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duLCBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzO1xuXG57XG4gIGRpZFdhcm5BYm91dFN0cmluZ1JlZnMgPSB7fTtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRSZWYoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdyZWYnKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAncmVmJykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5yZWYgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRLZXkoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdrZXknKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAna2V5JykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5rZXkgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBga2V5YCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdrZXknLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdLZXksXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ1JlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICB7XG4gICAgICBpZiAoIXNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXM6IGByZWZgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHdhcm5BYm91dEFjY2Vzc2luZ1JlZi5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ3JlZicsIHtcbiAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ1JlZixcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnJlZiA9PT0gJ3N0cmluZycgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCAmJiBjb25maWcuX19zZWxmICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuc3RhdGVOb2RlICE9PSBjb25maWcuX19zZWxmKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiAnICsgJ1N1cHBvcnQgZm9yIHN0cmluZyByZWZzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiAnICsgJ1RoaXMgY2FzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb24uICcgKyAnV2UgYXNrIHlvdSB0byBtYW51YWxseSBmaXggdGhpcyBjYXNlIGJ5IHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgY29tcG9uZW50TmFtZSwgY29uZmlnLnJlZik7XG5cbiAgICAgICAgZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBSZWFjdCBlbGVtZW50LiBUaGlzIG5vIGxvbmdlciBhZGhlcmVzIHRvXG4gKiB0aGUgY2xhc3MgcGF0dGVybiwgc28gZG8gbm90IHVzZSBuZXcgdG8gY2FsbCBpdC4gQWxzbywgaW5zdGFuY2VvZiBjaGVja1xuICogd2lsbCBub3Qgd29yay4gSW5zdGVhZCB0ZXN0ICQkdHlwZW9mIGZpZWxkIGFnYWluc3QgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIHRvIGNoZWNrXG4gKiBpZiBzb21ldGhpbmcgaXMgYSBSZWFjdCBFbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHsqfSBwcm9wc1xuICogQHBhcmFtIHsqfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gcmVmXG4gKiBAcGFyYW0geyp9IG93bmVyXG4gKiBAcGFyYW0geyp9IHNlbGYgQSAqdGVtcG9yYXJ5KiBoZWxwZXIgdG8gZGV0ZWN0IHBsYWNlcyB3aGVyZSBgdGhpc2AgaXNcbiAqIGRpZmZlcmVudCBmcm9tIHRoZSBgb3duZXJgIHdoZW4gUmVhY3QuY3JlYXRlRWxlbWVudCBpcyBjYWxsZWQsIHNvIHRoYXQgd2VcbiAqIGNhbiB3YXJuLiBXZSB3YW50IHRvIGdldCByaWQgb2Ygb3duZXIgYW5kIHJlcGxhY2Ugc3RyaW5nIGByZWZgcyB3aXRoIGFycm93XG4gKiBmdW5jdGlvbnMsIGFuZCBhcyBsb25nIGFzIGB0aGlzYCBhbmQgb3duZXIgYXJlIHRoZSBzYW1lLCB0aGVyZSB3aWxsIGJlIG5vXG4gKiBjaGFuZ2UgaW4gYmVoYXZpb3IuXG4gKiBAcGFyYW0geyp9IHNvdXJjZSBBbiBhbm5vdGF0aW9uIG9iamVjdCAoYWRkZWQgYnkgYSB0cmFuc3BpbGVyIG9yIG90aGVyd2lzZSlcbiAqIGluZGljYXRpbmcgZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBhbmQvb3Igb3RoZXIgaW5mb3JtYXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG5cbnZhciBSZWFjdEVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKSB7XG4gIHZhciBlbGVtZW50ID0ge1xuICAgIC8vIFRoaXMgdGFnIGFsbG93cyB1cyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGFzIGEgUmVhY3QgRWxlbWVudFxuICAgICQkdHlwZW9mOiBSRUFDVF9FTEVNRU5UX1RZUEUsXG4gICAgLy8gQnVpbHQtaW4gcHJvcGVydGllcyB0aGF0IGJlbG9uZyBvbiB0aGUgZWxlbWVudFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXksXG4gICAgcmVmOiByZWYsXG4gICAgcHJvcHM6IHByb3BzLFxuICAgIC8vIFJlY29yZCB0aGUgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIGVsZW1lbnQuXG4gICAgX293bmVyOiBvd25lclxuICB9O1xuXG4gIHtcbiAgICAvLyBUaGUgdmFsaWRhdGlvbiBmbGFnIGlzIGN1cnJlbnRseSBtdXRhdGl2ZS4gV2UgcHV0IGl0IG9uXG4gICAgLy8gYW4gZXh0ZXJuYWwgYmFja2luZyBzdG9yZSBzbyB0aGF0IHdlIGNhbiBmcmVlemUgdGhlIHdob2xlIG9iamVjdC5cbiAgICAvLyBUaGlzIGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgV2Vha01hcCBvbmNlIHRoZXkgYXJlIGltcGxlbWVudGVkIGluXG4gICAgLy8gY29tbW9ubHkgdXNlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMuXG4gICAgZWxlbWVudC5fc3RvcmUgPSB7fTsgLy8gVG8gbWFrZSBjb21wYXJpbmcgUmVhY3RFbGVtZW50cyBlYXNpZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHdlIG1ha2VcbiAgICAvLyB0aGUgdmFsaWRhdGlvbiBmbGFnIG5vbi1lbnVtZXJhYmxlICh3aGVyZSBwb3NzaWJsZSwgd2hpY2ggc2hvdWxkXG4gICAgLy8gaW5jbHVkZSBldmVyeSBlbnZpcm9ubWVudCB3ZSBydW4gdGVzdHMgaW4pLCBzbyB0aGUgdGVzdCBmcmFtZXdvcmtcbiAgICAvLyBpZ25vcmVzIGl0LlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQuX3N0b3JlLCAndmFsaWRhdGVkJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogZmFsc2VcbiAgICB9KTsgLy8gc2VsZiBhbmQgc291cmNlIGFyZSBERVYgb25seSBwcm9wZXJ0aWVzLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc2VsZicsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzZWxmXG4gICAgfSk7IC8vIFR3byBlbGVtZW50cyBjcmVhdGVkIGluIHR3byBkaWZmZXJlbnQgcGxhY2VzIHNob3VsZCBiZSBjb25zaWRlcmVkXG4gICAgLy8gZXF1YWwgZm9yIHRlc3RpbmcgcHVycG9zZXMgYW5kIHRoZXJlZm9yZSB3ZSBoaWRlIGl0IGZyb20gZW51bWVyYXRpb24uXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zb3VyY2UnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc291cmNlXG4gICAgfSk7XG5cbiAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50LnByb3BzKTtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuLyoqXG4gKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgb2YgdGhlIGdpdmVuIHR5cGUuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2NyZWF0ZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgdmFyIHByb3BOYW1lOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBrZXkgPSBudWxsO1xuICB2YXIgcmVmID0gbnVsbDtcbiAgdmFyIHNlbGYgPSBudWxsO1xuICB2YXIgc291cmNlID0gbnVsbDtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgcmVmID0gY29uZmlnLnJlZjtcblxuICAgICAge1xuICAgICAgICB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAge1xuICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGNvbmZpZy5rZXkpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfVxuXG4gICAgc2VsZiA9IGNvbmZpZy5fX3NlbGYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zZWxmO1xuICAgIHNvdXJjZSA9IGNvbmZpZy5fX3NvdXJjZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbmZpZy5fX3NvdXJjZTsgLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIGEgbmV3IHByb3BzIG9iamVjdFxuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250b1xuICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC5cblxuXG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuXG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICAgIE9iamVjdC5mcmVlemUoY2hpbGRBcnJheSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9IC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuXG5cbiAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7XG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChrZXkgfHwgcmVmKSB7XG4gICAgICB2YXIgZGlzcGxheU5hbWUgPSB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyA/IHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8ICdVbmtub3duJyA6IHR5cGU7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlZikge1xuICAgICAgICBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBSZWFjdEVsZW1lbnQodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCwgcHJvcHMpO1xufVxuZnVuY3Rpb24gY2xvbmVBbmRSZXBsYWNlS2V5KG9sZEVsZW1lbnQsIG5ld0tleSkge1xuICB2YXIgbmV3RWxlbWVudCA9IFJlYWN0RWxlbWVudChvbGRFbGVtZW50LnR5cGUsIG5ld0tleSwgb2xkRWxlbWVudC5yZWYsIG9sZEVsZW1lbnQuX3NlbGYsIG9sZEVsZW1lbnQuX3NvdXJjZSwgb2xkRWxlbWVudC5fb3duZXIsIG9sZEVsZW1lbnQucHJvcHMpO1xuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cbi8qKlxuICogQ2xvbmUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgdXNpbmcgZWxlbWVudCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2Nsb25lZWxlbWVudFxuICovXG5cbmZ1bmN0aW9uIGNsb25lRWxlbWVudChlbGVtZW50LCBjb25maWcsIGNoaWxkcmVuKSB7XG4gIGlmIChlbGVtZW50ID09PSBudWxsIHx8IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlJlYWN0LmNsb25lRWxlbWVudCguLi4pOiBUaGUgYXJndW1lbnQgbXVzdCBiZSBhIFJlYWN0IGVsZW1lbnQsIGJ1dCB5b3UgcGFzc2VkIFwiICsgZWxlbWVudCArIFwiLlwiKTtcbiAgfVxuXG4gIHZhciBwcm9wTmFtZTsgLy8gT3JpZ2luYWwgcHJvcHMgYXJlIGNvcGllZFxuXG4gIHZhciBwcm9wcyA9IGFzc2lnbih7fSwgZWxlbWVudC5wcm9wcyk7IC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcblxuICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gIHZhciByZWYgPSBlbGVtZW50LnJlZjsgLy8gU2VsZiBpcyBwcmVzZXJ2ZWQgc2luY2UgdGhlIG93bmVyIGlzIHByZXNlcnZlZC5cblxuICB2YXIgc2VsZiA9IGVsZW1lbnQuX3NlbGY7IC8vIFNvdXJjZSBpcyBwcmVzZXJ2ZWQgc2luY2UgY2xvbmVFbGVtZW50IGlzIHVubGlrZWx5IHRvIGJlIHRhcmdldGVkIGJ5IGFcbiAgLy8gdHJhbnNwaWxlciwgYW5kIHRoZSBvcmlnaW5hbCBzb3VyY2UgaXMgcHJvYmFibHkgYSBiZXR0ZXIgaW5kaWNhdG9yIG9mIHRoZVxuICAvLyB0cnVlIG93bmVyLlxuXG4gIHZhciBzb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7IC8vIE93bmVyIHdpbGwgYmUgcHJlc2VydmVkLCB1bmxlc3MgcmVmIGlzIG92ZXJyaWRkZW5cblxuICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgLy8gU2lsZW50bHkgc3RlYWwgdGhlIHJlZiBmcm9tIHRoZSBwYXJlbnQuXG4gICAgICByZWYgPSBjb25maWcucmVmO1xuICAgICAgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oY29uZmlnLmtleSk7XG4gICAgICB9XG5cbiAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTtcbiAgICB9IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIG92ZXJyaWRlIGV4aXN0aW5nIHByb3BzXG5cblxuICAgIHZhciBkZWZhdWx0UHJvcHM7XG5cbiAgICBpZiAoZWxlbWVudC50eXBlICYmIGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIGRlZmF1bHRQcm9wcyA9IGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHM7XG4gICAgfVxuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgaWYgKGNvbmZpZ1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvXG4gIC8vIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0LlxuXG5cbiAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7XG5cbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgfVxuXG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9XG5cbiAgcmV0dXJuIFJlYWN0RWxlbWVudChlbGVtZW50LnR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcyk7XG59XG4vKipcbiAqIFZlcmlmaWVzIHRoZSBvYmplY3QgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2lzdmFsaWRlbGVtZW50XG4gKiBAcGFyYW0gez9vYmplY3R9IG9iamVjdFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgb2JqZWN0YCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIEBmaW5hbFxuICovXG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufVxuXG52YXIgU0VQQVJBVE9SID0gJy4nO1xudmFyIFNVQlNFUEFSQVRPUiA9ICc6Jztcbi8qKlxuICogRXNjYXBlIGFuZCB3cmFwIGtleSBzbyBpdCBpcyBzYWZlIHRvIHVzZSBhcyBhIHJlYWN0aWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRvIGJlIGVzY2FwZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBlc2NhcGVkIGtleS5cbiAqL1xuXG5mdW5jdGlvbiBlc2NhcGUoa2V5KSB7XG4gIHZhciBlc2NhcGVSZWdleCA9IC9bPTpdL2c7XG4gIHZhciBlc2NhcGVyTG9va3VwID0ge1xuICAgICc9JzogJz0wJyxcbiAgICAnOic6ICc9MidcbiAgfTtcbiAgdmFyIGVzY2FwZWRTdHJpbmcgPSBrZXkucmVwbGFjZShlc2NhcGVSZWdleCwgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgcmV0dXJuIGVzY2FwZXJMb29rdXBbbWF0Y2hdO1xuICB9KTtcbiAgcmV0dXJuICckJyArIGVzY2FwZWRTdHJpbmc7XG59XG4vKipcbiAqIFRPRE86IFRlc3QgdGhhdCBhIHNpbmdsZSBjaGlsZCBhbmQgYW4gYXJyYXkgd2l0aCBvbmUgaXRlbSBoYXZlIHRoZSBzYW1lIGtleVxuICogcGF0dGVybi5cbiAqL1xuXG5cbnZhciBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7XG52YXIgdXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXggPSAvXFwvKy9nO1xuXG5mdW5jdGlvbiBlc2NhcGVVc2VyUHJvdmlkZWRLZXkodGV4dCkge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlKHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4LCAnJCYvJyk7XG59XG4vKipcbiAqIEdlbmVyYXRlIGEga2V5IHN0cmluZyB0aGF0IGlkZW50aWZpZXMgYSBlbGVtZW50IHdpdGhpbiBhIHNldC5cbiAqXG4gKiBAcGFyYW0geyp9IGVsZW1lbnQgQSBlbGVtZW50IHRoYXQgY291bGQgY29udGFpbiBhIG1hbnVhbCBrZXkuXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggdGhhdCBpcyB1c2VkIGlmIGEgbWFudWFsIGtleSBpcyBub3QgcHJvdmlkZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXRFbGVtZW50S2V5KGVsZW1lbnQsIGluZGV4KSB7XG4gIC8vIERvIHNvbWUgdHlwZWNoZWNraW5nIGhlcmUgc2luY2Ugd2UgY2FsbCB0aGlzIGJsaW5kbHkuIFdlIHdhbnQgdG8gZW5zdXJlXG4gIC8vIHRoYXQgd2UgZG9uJ3QgYmxvY2sgcG90ZW50aWFsIGZ1dHVyZSBFUyBBUElzLlxuICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdvYmplY3QnICYmIGVsZW1lbnQgIT09IG51bGwgJiYgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgIC8vIEV4cGxpY2l0IGtleVxuICAgIHtcbiAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oZWxlbWVudC5rZXkpO1xuICAgIH1cblxuICAgIHJldHVybiBlc2NhcGUoJycgKyBlbGVtZW50LmtleSk7XG4gIH0gLy8gSW1wbGljaXQga2V5IGRldGVybWluZWQgYnkgdGhlIGluZGV4IGluIHRoZSBzZXRcblxuXG4gIHJldHVybiBpbmRleC50b1N0cmluZygzNik7XG59XG5cbmZ1bmN0aW9uIG1hcEludG9BcnJheShjaGlsZHJlbiwgYXJyYXksIGVzY2FwZWRQcmVmaXgsIG5hbWVTb0ZhciwgY2FsbGJhY2spIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgY2hpbGRyZW47XG5cbiAgaWYgKHR5cGUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGUgPT09ICdib29sZWFuJykge1xuICAgIC8vIEFsbCBvZiB0aGUgYWJvdmUgYXJlIHBlcmNlaXZlZCBhcyBudWxsLlxuICAgIGNoaWxkcmVuID0gbnVsbDtcbiAgfVxuXG4gIHZhciBpbnZva2VDYWxsYmFjayA9IGZhbHNlO1xuXG4gIGlmIChjaGlsZHJlbiA9PT0gbnVsbCkge1xuICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBzd2l0Y2ggKGNoaWxkcmVuLiQkdHlwZW9mKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgfVxuICB9XG5cbiAgaWYgKGludm9rZUNhbGxiYWNrKSB7XG4gICAgdmFyIF9jaGlsZCA9IGNoaWxkcmVuO1xuICAgIHZhciBtYXBwZWRDaGlsZCA9IGNhbGxiYWNrKF9jaGlsZCk7IC8vIElmIGl0J3MgdGhlIG9ubHkgY2hpbGQsIHRyZWF0IHRoZSBuYW1lIGFzIGlmIGl0IHdhcyB3cmFwcGVkIGluIGFuIGFycmF5XG4gICAgLy8gc28gdGhhdCBpdCdzIGNvbnNpc3RlbnQgaWYgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBncm93czpcblxuICAgIHZhciBjaGlsZEtleSA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgKyBnZXRFbGVtZW50S2V5KF9jaGlsZCwgMCkgOiBuYW1lU29GYXI7XG5cbiAgICBpZiAoaXNBcnJheShtYXBwZWRDaGlsZCkpIHtcbiAgICAgIHZhciBlc2NhcGVkQ2hpbGRLZXkgPSAnJztcblxuICAgICAgaWYgKGNoaWxkS2V5ICE9IG51bGwpIHtcbiAgICAgICAgZXNjYXBlZENoaWxkS2V5ID0gZXNjYXBlVXNlclByb3ZpZGVkS2V5KGNoaWxkS2V5KSArICcvJztcbiAgICAgIH1cblxuICAgICAgbWFwSW50b0FycmF5KG1hcHBlZENoaWxkLCBhcnJheSwgZXNjYXBlZENoaWxkS2V5LCAnJywgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgcmV0dXJuIGM7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKG1hcHBlZENoaWxkICE9IG51bGwpIHtcbiAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChtYXBwZWRDaGlsZCkpIHtcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRoZSBgaWZgIHN0YXRlbWVudCBoZXJlIHByZXZlbnRzIGF1dG8tZGlzYWJsaW5nIG9mIHRoZSBzYWZlXG4gICAgICAgICAgLy8gY29lcmNpb24gRVNMaW50IHJ1bGUsIHNvIHdlIG11c3QgbWFudWFsbHkgZGlzYWJsZSBpdCBiZWxvdy5cbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIFJlYWN0LlBvcnRhbCBkb2Vzbid0IGhhdmUgYSBrZXlcbiAgICAgICAgICBpZiAobWFwcGVkQ2hpbGQua2V5ICYmICghX2NoaWxkIHx8IF9jaGlsZC5rZXkgIT09IG1hcHBlZENoaWxkLmtleSkpIHtcbiAgICAgICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24obWFwcGVkQ2hpbGQua2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBtYXBwZWRDaGlsZCA9IGNsb25lQW5kUmVwbGFjZUtleShtYXBwZWRDaGlsZCwgLy8gS2VlcCBib3RoIHRoZSAobWFwcGVkKSBhbmQgb2xkIGtleXMgaWYgdGhleSBkaWZmZXIsIGp1c3QgYXNcbiAgICAgICAgLy8gdHJhdmVyc2VBbGxDaGlsZHJlbiB1c2VkIHRvIGRvIGZvciBvYmplY3RzIGFzIGNoaWxkcmVuXG4gICAgICAgIGVzY2FwZWRQcmVmaXggKyAoIC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgUmVhY3QuUG9ydGFsIGRvZXNuJ3QgaGF2ZSBhIGtleVxuICAgICAgICBtYXBwZWRDaGlsZC5rZXkgJiYgKCFfY2hpbGQgfHwgX2NoaWxkLmtleSAhPT0gbWFwcGVkQ2hpbGQua2V5KSA/IC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgZXhpc3RpbmcgZWxlbWVudCdzIGtleSBjYW4gYmUgYSBudW1iZXJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gICAgICAgIGVzY2FwZVVzZXJQcm92aWRlZEtleSgnJyArIG1hcHBlZENoaWxkLmtleSkgKyAnLycgOiAnJykgKyBjaGlsZEtleSk7XG4gICAgICB9XG5cbiAgICAgIGFycmF5LnB1c2gobWFwcGVkQ2hpbGQpO1xuICAgIH1cblxuICAgIHJldHVybiAxO1xuICB9XG5cbiAgdmFyIGNoaWxkO1xuICB2YXIgbmV4dE5hbWU7XG4gIHZhciBzdWJ0cmVlQ291bnQgPSAwOyAvLyBDb3VudCBvZiBjaGlsZHJlbiBmb3VuZCBpbiB0aGUgY3VycmVudCBzdWJ0cmVlLlxuXG4gIHZhciBuZXh0TmFtZVByZWZpeCA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgOiBuYW1lU29GYXIgKyBTVUJTRVBBUkFUT1I7XG5cbiAgaWYgKGlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRFbGVtZW50S2V5KGNoaWxkLCBpKTtcbiAgICAgIHN1YnRyZWVDb3VudCArPSBtYXBJbnRvQXJyYXkoY2hpbGQsIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuZXh0TmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4oY2hpbGRyZW4pO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgaXRlcmFibGVDaGlsZHJlbiA9IGNoaWxkcmVuO1xuXG4gICAgICB7XG4gICAgICAgIC8vIFdhcm4gYWJvdXQgdXNpbmcgTWFwcyBhcyBjaGlsZHJlblxuICAgICAgICBpZiAoaXRlcmF0b3JGbiA9PT0gaXRlcmFibGVDaGlsZHJlbi5lbnRyaWVzKSB7XG4gICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNYXBzKSB7XG4gICAgICAgICAgICB3YXJuKCdVc2luZyBNYXBzIGFzIGNoaWxkcmVuIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnVXNlIGFuIGFycmF5IG9mIGtleWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaWRXYXJuQWJvdXRNYXBzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoaXRlcmFibGVDaGlsZHJlbik7XG4gICAgICB2YXIgc3RlcDtcbiAgICAgIHZhciBpaSA9IDA7XG5cbiAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgY2hpbGQgPSBzdGVwLnZhbHVlO1xuICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0RWxlbWVudEtleShjaGlsZCwgaWkrKyk7XG4gICAgICAgIHN1YnRyZWVDb3VudCArPSBtYXBJbnRvQXJyYXkoY2hpbGQsIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuZXh0TmFtZSwgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgdmFyIGNoaWxkcmVuU3RyaW5nID0gU3RyaW5nKGNoaWxkcmVuKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogXCIgKyAoY2hpbGRyZW5TdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjaGlsZHJlbikuam9pbignLCAnKSArICd9JyA6IGNoaWxkcmVuU3RyaW5nKSArIFwiKS4gXCIgKyAnSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSAnICsgJ2luc3RlYWQuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN1YnRyZWVDb3VudDtcbn1cblxuLyoqXG4gKiBNYXBzIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5tYXBcbiAqXG4gKiBUaGUgcHJvdmlkZWQgbWFwRnVuY3Rpb24oY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZnVuYyBUaGUgbWFwIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgZm9yIG1hcEZ1bmN0aW9uLlxuICogQHJldHVybiB7b2JqZWN0fSBPYmplY3QgY29udGFpbmluZyB0aGUgb3JkZXJlZCBtYXAgb2YgcmVzdWx0cy5cbiAqL1xuZnVuY3Rpb24gbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmMsIGNvbnRleHQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBjb3VudCA9IDA7XG4gIG1hcEludG9BcnJheShjaGlsZHJlbiwgcmVzdWx0LCAnJywgJycsIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBmdW5jLmNhbGwoY29udGV4dCwgY2hpbGQsIGNvdW50KyspO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogQ291bnQgdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzXG4gKiBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmNvdW50XG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4uXG4gKi9cblxuXG5mdW5jdGlvbiBjb3VudENoaWxkcmVuKGNoaWxkcmVuKSB7XG4gIHZhciBuID0gMDtcbiAgbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uICgpIHtcbiAgICBuKys7IC8vIERvbid0IHJldHVybiBhbnl0aGluZ1xuICB9KTtcbiAgcmV0dXJuIG47XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVuZm9yZWFjaFxuICpcbiAqIFRoZSBwcm92aWRlZCBmb3JFYWNoRnVuYyhjaGlsZCwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoXG4gKiBsZWFmIGNoaWxkLlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHtmdW5jdGlvbigqLCBpbnQpfSBmb3JFYWNoRnVuY1xuICogQHBhcmFtIHsqfSBmb3JFYWNoQ29udGV4dCBDb250ZXh0IGZvciBmb3JFYWNoQ29udGV4dC5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaENoaWxkcmVuKGNoaWxkcmVuLCBmb3JFYWNoRnVuYywgZm9yRWFjaENvbnRleHQpIHtcbiAgbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uICgpIHtcbiAgICBmb3JFYWNoRnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBEb24ndCByZXR1cm4gYW55dGhpbmcuXG4gIH0sIGZvckVhY2hDb250ZXh0KTtcbn1cbi8qKlxuICogRmxhdHRlbiBhIGNoaWxkcmVuIG9iamVjdCAodHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gKSBhbmRcbiAqIHJldHVybiBhbiBhcnJheSB3aXRoIGFwcHJvcHJpYXRlbHkgcmUta2V5ZWQgY2hpbGRyZW4uXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVudG9hcnJheVxuICovXG5cblxuZnVuY3Rpb24gdG9BcnJheShjaGlsZHJlbikge1xuICByZXR1cm4gbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZDtcbiAgfSkgfHwgW107XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGluIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiBhbmQgdmVyaWZpZXMgdGhhdCB0aGVyZVxuICogaXMgb25seSBvbmUgY2hpbGQgaW4gdGhlIGNvbGxlY3Rpb24uXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVub25seVxuICpcbiAqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGEgc2luZ2xlIGNoaWxkIGdldHNcbiAqIHBhc3NlZCB3aXRob3V0IGEgd3JhcHBlciwgYnV0IHRoZSBwdXJwb3NlIG9mIHRoaXMgaGVscGVyIGZ1bmN0aW9uIGlzIHRvXG4gKiBhYnN0cmFjdCBhd2F5IHRoZSBwYXJ0aWN1bGFyIHN0cnVjdHVyZSBvZiBjaGlsZHJlbi5cbiAqXG4gKiBAcGFyYW0gez9vYmplY3R9IGNoaWxkcmVuIENoaWxkIGNvbGxlY3Rpb24gc3RydWN0dXJlLlxuICogQHJldHVybiB7UmVhY3RFbGVtZW50fSBUaGUgZmlyc3QgYW5kIG9ubHkgYFJlYWN0RWxlbWVudGAgY29udGFpbmVkIGluIHRoZVxuICogc3RydWN0dXJlLlxuICovXG5cblxuZnVuY3Rpb24gb25seUNoaWxkKGNoaWxkcmVuKSB7XG4gIGlmICghaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC4nKTtcbiAgfVxuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChkZWZhdWx0VmFsdWUpIHtcbiAgLy8gVE9ETzogU2Vjb25kIGFyZ3VtZW50IHVzZWQgdG8gYmUgYW4gb3B0aW9uYWwgYGNhbGN1bGF0ZUNoYW5nZWRCaXRzYFxuICAvLyBmdW5jdGlvbi4gV2FybiB0byByZXNlcnZlIGZvciBmdXR1cmUgdXNlP1xuICB2YXIgY29udGV4dCA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgIC8vIEFzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IG11bHRpcGxlIGNvbmN1cnJlbnQgcmVuZGVyZXJzLCB3ZSBjYXRlZ29yaXplXG4gICAgLy8gc29tZSByZW5kZXJlcnMgYXMgcHJpbWFyeSBhbmQgb3RoZXJzIGFzIHNlY29uZGFyeS4gV2Ugb25seSBleHBlY3RcbiAgICAvLyB0aGVyZSB0byBiZSB0d28gY29uY3VycmVudCByZW5kZXJlcnMgYXQgbW9zdDogUmVhY3QgTmF0aXZlIChwcmltYXJ5KSBhbmRcbiAgICAvLyBGYWJyaWMgKHNlY29uZGFyeSk7IFJlYWN0IERPTSAocHJpbWFyeSkgYW5kIFJlYWN0IEFSVCAoc2Vjb25kYXJ5KS5cbiAgICAvLyBTZWNvbmRhcnkgcmVuZGVyZXJzIHN0b3JlIHRoZWlyIGNvbnRleHQgdmFsdWVzIG9uIHNlcGFyYXRlIGZpZWxkcy5cbiAgICBfY3VycmVudFZhbHVlOiBkZWZhdWx0VmFsdWUsXG4gICAgX2N1cnJlbnRWYWx1ZTI6IGRlZmF1bHRWYWx1ZSxcbiAgICAvLyBVc2VkIHRvIHRyYWNrIGhvdyBtYW55IGNvbmN1cnJlbnQgcmVuZGVyZXJzIHRoaXMgY29udGV4dCBjdXJyZW50bHlcbiAgICAvLyBzdXBwb3J0cyB3aXRoaW4gaW4gYSBzaW5nbGUgcmVuZGVyZXIuIFN1Y2ggYXMgcGFyYWxsZWwgc2VydmVyIHJlbmRlcmluZy5cbiAgICBfdGhyZWFkQ291bnQ6IDAsXG4gICAgLy8gVGhlc2UgYXJlIGNpcmN1bGFyXG4gICAgUHJvdmlkZXI6IG51bGwsXG4gICAgQ29uc3VtZXI6IG51bGwsXG4gICAgLy8gQWRkIHRoZXNlIHRvIHVzZSBzYW1lIGhpZGRlbiBjbGFzcyBpbiBWTSBhcyBTZXJ2ZXJDb250ZXh0XG4gICAgX2RlZmF1bHRWYWx1ZTogbnVsbCxcbiAgICBfZ2xvYmFsTmFtZTogbnVsbFxuICB9O1xuICBjb250ZXh0LlByb3ZpZGVyID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9QUk9WSURFUl9UWVBFLFxuICAgIF9jb250ZXh0OiBjb250ZXh0XG4gIH07XG4gIHZhciBoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycyA9IGZhbHNlO1xuICB2YXIgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIgPSBmYWxzZTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0RGlzcGxheU5hbWVPbkNvbnN1bWVyID0gZmFsc2U7XG5cbiAge1xuICAgIC8vIEEgc2VwYXJhdGUgb2JqZWN0LCBidXQgcHJveGllcyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjb250ZXh0IG9iamVjdCBmb3JcbiAgICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSXQgaGFzIGEgZGlmZmVyZW50ICQkdHlwZW9mLCBzbyB3ZSBjYW4gcHJvcGVybHlcbiAgICAvLyB3YXJuIGZvciB0aGUgaW5jb3JyZWN0IHVzYWdlIG9mIENvbnRleHQgYXMgYSBDb25zdW1lci5cbiAgICB2YXIgQ29uc3VtZXIgPSB7XG4gICAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgICAgX2NvbnRleHQ6IGNvbnRleHRcbiAgICB9OyAvLyAkRmxvd0ZpeE1lOiBGbG93IGNvbXBsYWlucyBhYm91dCBub3Qgc2V0dGluZyBhIHZhbHVlLCB3aGljaCBpcyBpbnRlbnRpb25hbCBoZXJlXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDb25zdW1lciwge1xuICAgICAgUHJvdmlkZXI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlcikge1xuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0LkNvbnN1bWVyLlByb3ZpZGVyPiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LlByb3ZpZGVyPiBpbnN0ZWFkPycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250ZXh0LlByb3ZpZGVyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfUHJvdmlkZXIpIHtcbiAgICAgICAgICBjb250ZXh0LlByb3ZpZGVyID0gX1Byb3ZpZGVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX2N1cnJlbnRWYWx1ZToge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fY3VycmVudFZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gX2N1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF9jdXJyZW50VmFsdWUyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9jdXJyZW50VmFsdWUyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlMikge1xuICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTIgPSBfY3VycmVudFZhbHVlMjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF90aHJlYWRDb3VudDoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fdGhyZWFkQ291bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF90aHJlYWRDb3VudCkge1xuICAgICAgICAgIGNvbnRleHQuX3RocmVhZENvdW50ID0gX3RocmVhZENvdW50O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgQ29uc3VtZXI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycykge1xuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0LkNvbnN1bWVyLkNvbnN1bWVyPiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LkNvbnN1bWVyPiBpbnN0ZWFkPycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250ZXh0LkNvbnN1bWVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGlzcGxheU5hbWU6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuZGlzcGxheU5hbWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKGRpc3BsYXlOYW1lKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lcikge1xuICAgICAgICAgICAgd2FybignU2V0dGluZyBgZGlzcGxheU5hbWVgIG9uIENvbnRleHQuQ29uc3VtZXIgaGFzIG5vIGVmZmVjdC4gJyArIFwiWW91IHNob3VsZCBzZXQgaXQgZGlyZWN0bHkgb24gdGhlIGNvbnRleHQgd2l0aCBDb250ZXh0LmRpc3BsYXlOYW1lID0gJyVzJy5cIiwgZGlzcGxheU5hbWUpO1xuXG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7IC8vICRGbG93Rml4TWU6IEZsb3cgY29tcGxhaW5zIGFib3V0IG1pc3NpbmcgcHJvcGVydGllcyBiZWNhdXNlIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZCBkZWZpbmVQcm9wZXJ0eVxuXG4gICAgY29udGV4dC5Db25zdW1lciA9IENvbnN1bWVyO1xuICB9XG5cbiAge1xuICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IG51bGw7XG4gICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyMiA9IG51bGw7XG4gIH1cblxuICByZXR1cm4gY29udGV4dDtcbn1cblxudmFyIFVuaW5pdGlhbGl6ZWQgPSAtMTtcbnZhciBQZW5kaW5nID0gMDtcbnZhciBSZXNvbHZlZCA9IDE7XG52YXIgUmVqZWN0ZWQgPSAyO1xuXG5mdW5jdGlvbiBsYXp5SW5pdGlhbGl6ZXIocGF5bG9hZCkge1xuICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgdmFyIGN0b3IgPSBwYXlsb2FkLl9yZXN1bHQ7XG4gICAgdmFyIHRoZW5hYmxlID0gY3RvcigpOyAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgIC8vIFRoaXMgbWlnaHQgdGhyb3cgZWl0aGVyIGJlY2F1c2UgaXQncyBtaXNzaW5nIG9yIHRocm93cy4gSWYgc28sIHdlIHRyZWF0IGl0XG4gICAgLy8gYXMgc3RpbGwgdW5pbml0aWFsaXplZCBhbmQgdHJ5IGFnYWluIG5leHQgdGltZS4gV2hpY2ggaXMgdGhlIHNhbWUgYXMgd2hhdFxuICAgIC8vIGhhcHBlbnMgaWYgdGhlIGN0b3Igb3IgYW55IHdyYXBwZXJzIHByb2Nlc3NpbmcgdGhlIGN0b3IgdGhyb3dzLiBUaGlzIG1pZ2h0XG4gICAgLy8gZW5kIHVwIGZpeGluZyBpdCBpZiB0aGUgcmVzb2x1dGlvbiB3YXMgYSBjb25jdXJyZW5jeSBidWcuXG5cbiAgICB0aGVuYWJsZS50aGVuKGZ1bmN0aW9uIChtb2R1bGVPYmplY3QpIHtcbiAgICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFBlbmRpbmcgfHwgcGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgICAgIC8vIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUuXG4gICAgICAgIHZhciByZXNvbHZlZCA9IHBheWxvYWQ7XG4gICAgICAgIHJlc29sdmVkLl9zdGF0dXMgPSBSZXNvbHZlZDtcbiAgICAgICAgcmVzb2x2ZWQuX3Jlc3VsdCA9IG1vZHVsZU9iamVjdDtcbiAgICAgIH1cbiAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFBlbmRpbmcgfHwgcGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgICAgIC8vIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUuXG4gICAgICAgIHZhciByZWplY3RlZCA9IHBheWxvYWQ7XG4gICAgICAgIHJlamVjdGVkLl9zdGF0dXMgPSBSZWplY3RlZDtcbiAgICAgICAgcmVqZWN0ZWQuX3Jlc3VsdCA9IGVycm9yO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgICAgLy8gSW4gY2FzZSwgd2UncmUgc3RpbGwgdW5pbml0aWFsaXplZCwgdGhlbiB3ZSdyZSB3YWl0aW5nIGZvciB0aGUgdGhlbmFibGVcbiAgICAgIC8vIHRvIHJlc29sdmUuIFNldCBpdCBhcyBwZW5kaW5nIGluIHRoZSBtZWFudGltZS5cbiAgICAgIHZhciBwZW5kaW5nID0gcGF5bG9hZDtcbiAgICAgIHBlbmRpbmcuX3N0YXR1cyA9IFBlbmRpbmc7XG4gICAgICBwZW5kaW5nLl9yZXN1bHQgPSB0aGVuYWJsZTtcbiAgICB9XG4gIH1cblxuICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBSZXNvbHZlZCkge1xuICAgIHZhciBtb2R1bGVPYmplY3QgPSBwYXlsb2FkLl9yZXN1bHQ7XG5cbiAgICB7XG4gICAgICBpZiAobW9kdWxlT2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IoJ2xhenk6IEV4cGVjdGVkIHRoZSByZXN1bHQgb2YgYSBkeW5hbWljIGltcCcgKyAnb3J0KCkgY2FsbC4gJyArICdJbnN0ZWFkIHJlY2VpdmVkOiAlc1xcblxcbllvdXIgY29kZSBzaG91bGQgbG9vayBsaWtlOiBcXG4gICcgKyAvLyBCcmVhayB1cCBpbXBvcnRzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICAnY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcCcgKyBcIm9ydCgnLi9NeUNvbXBvbmVudCcpKVxcblxcblwiICsgJ0RpZCB5b3UgYWNjaWRlbnRhbGx5IHB1dCBjdXJseSBicmFjZXMgYXJvdW5kIHRoZSBpbXBvcnQ/JywgbW9kdWxlT2JqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoISgnZGVmYXVsdCcgaW4gbW9kdWxlT2JqZWN0KSkge1xuICAgICAgICBlcnJvcignbGF6eTogRXhwZWN0ZWQgdGhlIHJlc3VsdCBvZiBhIGR5bmFtaWMgaW1wJyArICdvcnQoKSBjYWxsLiAnICsgJ0luc3RlYWQgcmVjZWl2ZWQ6ICVzXFxuXFxuWW91ciBjb2RlIHNob3VsZCBsb29rIGxpa2U6IFxcbiAgJyArIC8vIEJyZWFrIHVwIGltcG9ydHMgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IHBhcnNpbmcgdGhlbSBhcyBkZXBlbmRlbmNpZXMuXG4gICAgICAgICdjb25zdCBNeUNvbXBvbmVudCA9IGxhenkoKCkgPT4gaW1wJyArIFwib3J0KCcuL015Q29tcG9uZW50JykpXCIsIG1vZHVsZU9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZHVsZU9iamVjdC5kZWZhdWx0O1xuICB9IGVsc2Uge1xuICAgIHRocm93IHBheWxvYWQuX3Jlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBsYXp5KGN0b3IpIHtcbiAgdmFyIHBheWxvYWQgPSB7XG4gICAgLy8gV2UgdXNlIHRoZXNlIGZpZWxkcyB0byBzdG9yZSB0aGUgcmVzdWx0LlxuICAgIF9zdGF0dXM6IFVuaW5pdGlhbGl6ZWQsXG4gICAgX3Jlc3VsdDogY3RvclxuICB9O1xuICB2YXIgbGF6eVR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0xBWllfVFlQRSxcbiAgICBfcGF5bG9hZDogcGF5bG9hZCxcbiAgICBfaW5pdDogbGF6eUluaXRpYWxpemVyXG4gIH07XG5cbiAge1xuICAgIC8vIEluIHByb2R1Y3Rpb24sIHRoaXMgd291bGQganVzdCBzZXQgaXQgb24gdGhlIG9iamVjdC5cbiAgICB2YXIgZGVmYXVsdFByb3BzO1xuICAgIHZhciBwcm9wVHlwZXM7IC8vICRGbG93Rml4TWVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGxhenlUeXBlLCB7XG4gICAgICBkZWZhdWx0UHJvcHM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFByb3BzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdEZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgICBlcnJvcignUmVhY3QubGF6eSguLi4pOiBJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIGFzc2lnbiBgZGVmYXVsdFByb3BzYCB0byAnICsgJ2EgbGF6eSBjb21wb25lbnQgaW1wb3J0LiBFaXRoZXIgc3BlY2lmeSB0aGVtIHdoZXJlIHRoZSBjb21wb25lbnQgJyArICdpcyBkZWZpbmVkLCBvciBjcmVhdGUgYSB3cmFwcGluZyBjb21wb25lbnQgYXJvdW5kIGl0LicpO1xuXG4gICAgICAgICAgZGVmYXVsdFByb3BzID0gbmV3RGVmYXVsdFByb3BzOyAvLyBNYXRjaCBwcm9kdWN0aW9uIGJlaGF2aW9yIG1vcmUgY2xvc2VseTpcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdkZWZhdWx0UHJvcHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwcm9wVHlwZXM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcFR5cGVzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdQcm9wVHlwZXMpIHtcbiAgICAgICAgICBlcnJvcignUmVhY3QubGF6eSguLi4pOiBJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIGFzc2lnbiBgcHJvcFR5cGVzYCB0byAnICsgJ2EgbGF6eSBjb21wb25lbnQgaW1wb3J0LiBFaXRoZXIgc3BlY2lmeSB0aGVtIHdoZXJlIHRoZSBjb21wb25lbnQgJyArICdpcyBkZWZpbmVkLCBvciBjcmVhdGUgYSB3cmFwcGluZyBjb21wb25lbnQgYXJvdW5kIGl0LicpO1xuXG4gICAgICAgICAgcHJvcFR5cGVzID0gbmV3UHJvcFR5cGVzOyAvLyBNYXRjaCBwcm9kdWN0aW9uIGJlaGF2aW9yIG1vcmUgY2xvc2VseTpcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdwcm9wVHlwZXMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsYXp5VHlwZTtcbn1cblxuZnVuY3Rpb24gZm9yd2FyZFJlZihyZW5kZXIpIHtcbiAge1xuICAgIGlmIChyZW5kZXIgIT0gbnVsbCAmJiByZW5kZXIuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHJlY2VpdmVkIGEgYG1lbW9gICcgKyAnY29tcG9uZW50LiBJbnN0ZWFkIG9mIGZvcndhcmRSZWYobWVtbyguLi4pKSwgdXNlICcgKyAnbWVtbyhmb3J3YXJkUmVmKC4uLikpLicpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHdhcyBnaXZlbiAlcy4nLCByZW5kZXIgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgcmVuZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJlbmRlci5sZW5ndGggIT09IDAgJiYgcmVuZGVyLmxlbmd0aCAhPT0gMikge1xuICAgICAgICBlcnJvcignZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGFjY2VwdCBleGFjdGx5IHR3byBwYXJhbWV0ZXJzOiBwcm9wcyBhbmQgcmVmLiAlcycsIHJlbmRlci5sZW5ndGggPT09IDEgPyAnRGlkIHlvdSBmb3JnZXQgdG8gdXNlIHRoZSByZWYgcGFyYW1ldGVyPycgOiAnQW55IGFkZGl0aW9uYWwgcGFyYW1ldGVyIHdpbGwgYmUgdW5kZWZpbmVkLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZW5kZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHJlbmRlci5kZWZhdWx0UHJvcHMgIT0gbnVsbCB8fCByZW5kZXIucHJvcFR5cGVzICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVuZGVyIGZ1bmN0aW9ucyBkbyBub3Qgc3VwcG9ydCBwcm9wVHlwZXMgb3IgZGVmYXVsdFByb3BzLiAnICsgJ0RpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgYSBSZWFjdCBjb21wb25lbnQ/Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnRUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgIHJlbmRlcjogcmVuZGVyXG4gIH07XG5cbiAge1xuICAgIHZhciBvd25OYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgJ2Rpc3BsYXlOYW1lJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG93bk5hbWU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBvd25OYW1lID0gbmFtZTsgLy8gVGhlIGlubmVyIGNvbXBvbmVudCBzaG91bGRuJ3QgaW5oZXJpdCB0aGlzIGRpc3BsYXkgbmFtZSBpbiBtb3N0IGNhc2VzLFxuICAgICAgICAvLyBiZWNhdXNlIHRoZSBjb21wb25lbnQgbWF5IGJlIHVzZWQgZWxzZXdoZXJlLlxuICAgICAgICAvLyBCdXQgaXQncyBuaWNlIGZvciBhbm9ueW1vdXMgZnVuY3Rpb25zIHRvIGluaGVyaXQgdGhlIG5hbWUsXG4gICAgICAgIC8vIHNvIHRoYXQgb3VyIGNvbXBvbmVudC1zdGFjayBnZW5lcmF0aW9uIGxvZ2ljIHdpbGwgZGlzcGxheSB0aGVpciBmcmFtZXMuXG4gICAgICAgIC8vIEFuIGFub255bW91cyBmdW5jdGlvbiBnZW5lcmFsbHkgc3VnZ2VzdHMgYSBwYXR0ZXJuIGxpa2U6XG4gICAgICAgIC8vICAgUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4gey4uLn0pO1xuICAgICAgICAvLyBUaGlzIGtpbmQgb2YgaW5uZXIgZnVuY3Rpb24gaXMgbm90IHVzZWQgZWxzZXdoZXJlIHNvIHRoZSBzaWRlIGVmZmVjdCBpcyBva2F5LlxuXG4gICAgICAgIGlmICghcmVuZGVyLm5hbWUgJiYgIXJlbmRlci5kaXNwbGF5TmFtZSkge1xuICAgICAgICAgIHJlbmRlci5kaXNwbGF5TmFtZSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50VHlwZTtcbn1cblxudmFyIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0U7XG5cbntcbiAgUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1vZHVsZS5yZWZlcmVuY2UnKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vdGU6IHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIChlLmcuIGlmIGl0J3MgYSBwb2x5ZmlsbCkuXG5cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IGVuYWJsZURlYnVnVHJhY2luZyAgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCBlbmFibGVMZWdhY3lIaWRkZW4gIHx8IHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8IGVuYWJsZVNjb3BlQVBJICB8fCBlbmFibGVDYWNoZUVsZW1lbnQgIHx8IGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBUaGlzIG5lZWRzIHRvIGluY2x1ZGUgYWxsIHBvc3NpYmxlIG1vZHVsZSByZWZlcmVuY2Ugb2JqZWN0XG4gICAgLy8gdHlwZXMgc3VwcG9ydGVkIGJ5IGFueSBGbGlnaHQgY29uZmlndXJhdGlvbiBhbnl3aGVyZSBzaW5jZVxuICAgIC8vIHdlIGRvbid0IGtub3cgd2hpY2ggRmxpZ2h0IGJ1aWxkIHRoaXMgd2lsbCBlbmQgdXAgYmVpbmcgdXNlZFxuICAgIC8vIHdpdGguXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSB8fCB0eXBlLmdldE1vZHVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbWVtbyh0eXBlLCBjb21wYXJlKSB7XG4gIHtcbiAgICBpZiAoIWlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSkge1xuICAgICAgZXJyb3IoJ21lbW86IFRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgY29tcG9uZW50LiBJbnN0ZWFkICcgKyAncmVjZWl2ZWQ6ICVzJywgdHlwZSA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiB0eXBlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudFR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX01FTU9fVFlQRSxcbiAgICB0eXBlOiB0eXBlLFxuICAgIGNvbXBhcmU6IGNvbXBhcmUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb21wYXJlXG4gIH07XG5cbiAge1xuICAgIHZhciBvd25OYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgJ2Rpc3BsYXlOYW1lJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG93bk5hbWU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBvd25OYW1lID0gbmFtZTsgLy8gVGhlIGlubmVyIGNvbXBvbmVudCBzaG91bGRuJ3QgaW5oZXJpdCB0aGlzIGRpc3BsYXkgbmFtZSBpbiBtb3N0IGNhc2VzLFxuICAgICAgICAvLyBiZWNhdXNlIHRoZSBjb21wb25lbnQgbWF5IGJlIHVzZWQgZWxzZXdoZXJlLlxuICAgICAgICAvLyBCdXQgaXQncyBuaWNlIGZvciBhbm9ueW1vdXMgZnVuY3Rpb25zIHRvIGluaGVyaXQgdGhlIG5hbWUsXG4gICAgICAgIC8vIHNvIHRoYXQgb3VyIGNvbXBvbmVudC1zdGFjayBnZW5lcmF0aW9uIGxvZ2ljIHdpbGwgZGlzcGxheSB0aGVpciBmcmFtZXMuXG4gICAgICAgIC8vIEFuIGFub255bW91cyBmdW5jdGlvbiBnZW5lcmFsbHkgc3VnZ2VzdHMgYSBwYXR0ZXJuIGxpa2U6XG4gICAgICAgIC8vICAgUmVhY3QubWVtbygocHJvcHMpID0+IHsuLi59KTtcbiAgICAgICAgLy8gVGhpcyBraW5kIG9mIGlubmVyIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGVsc2V3aGVyZSBzbyB0aGUgc2lkZSBlZmZlY3QgaXMgb2theS5cblxuICAgICAgICBpZiAoIXR5cGUubmFtZSAmJiAhdHlwZS5kaXNwbGF5TmFtZSkge1xuICAgICAgICAgIHR5cGUuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFR5cGU7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEaXNwYXRjaGVyKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudDtcblxuICB7XG4gICAgaWYgKGRpc3BhdGNoZXIgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yJyArICcgb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4nICsgJzEuIFlvdSBtaWdodCBoYXZlIG1pc21hdGNoaW5nIHZlcnNpb25zIG9mIFJlYWN0IGFuZCB0aGUgcmVuZGVyZXIgKHN1Y2ggYXMgUmVhY3QgRE9NKVxcbicgKyAnMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbicgKyAnMy4gWW91IG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0IGluIHRoZSBzYW1lIGFwcFxcbicgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uJyk7XG4gICAgfVxuICB9IC8vIFdpbGwgcmVzdWx0IGluIGEgbnVsbCBhY2Nlc3MgZXJyb3IgaWYgYWNjZXNzZWQgb3V0c2lkZSByZW5kZXIgcGhhc2UuIFdlXG4gIC8vIGludGVudGlvbmFsbHkgZG9uJ3QgdGhyb3cgb3VyIG93biBlcnJvciBiZWNhdXNlIHRoaXMgaXMgaW4gYSBob3QgcGF0aC5cbiAgLy8gQWxzbyBoZWxwcyBlbnN1cmUgdGhpcyBpcyBpbmxpbmVkLlxuXG5cbiAgcmV0dXJuIGRpc3BhdGNoZXI7XG59XG5mdW5jdGlvbiB1c2VDb250ZXh0KENvbnRleHQpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuXG4gIHtcbiAgICAvLyBUT0RPOiBhZGQgYSBtb3JlIGdlbmVyaWMgd2FybmluZyBmb3IgaW52YWxpZCB2YWx1ZXMuXG4gICAgaWYgKENvbnRleHQuX2NvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJlYWxDb250ZXh0ID0gQ29udGV4dC5fY29udGV4dDsgLy8gRG9uJ3QgZGVkdXBsaWNhdGUgYmVjYXVzZSB0aGlzIGxlZ2l0aW1hdGVseSBjYXVzZXMgYnVnc1xuICAgICAgLy8gYW5kIG5vYm9keSBzaG91bGQgYmUgdXNpbmcgdGhpcyBpbiBleGlzdGluZyBjb2RlLlxuXG4gICAgICBpZiAocmVhbENvbnRleHQuQ29uc3VtZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LkNvbnN1bWVyKSBpcyBub3Qgc3VwcG9ydGVkLCBtYXkgY2F1c2UgYnVncywgYW5kIHdpbGwgYmUgJyArICdyZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTtcbiAgICAgIH0gZWxzZSBpZiAocmVhbENvbnRleHQuUHJvdmlkZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LlByb3ZpZGVyKSBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlzcGF0Y2hlci51c2VDb250ZXh0KENvbnRleHQpO1xufVxuZnVuY3Rpb24gdXNlU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlU3RhdGUoaW5pdGlhbFN0YXRlKTtcbn1cbmZ1bmN0aW9uIHVzZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG59XG5mdW5jdGlvbiB1c2VSZWYoaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlUmVmKGluaXRpYWxWYWx1ZSk7XG59XG5mdW5jdGlvbiB1c2VFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZU1lbW8oY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlTWVtbyhjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlRGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAge1xuICAgIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgICByZXR1cm4gZGlzcGF0Y2hlci51c2VEZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbik7XG4gIH1cbn1cbmZ1bmN0aW9uIHVzZVRyYW5zaXRpb24oKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlVHJhbnNpdGlvbigpO1xufVxuZnVuY3Rpb24gdXNlRGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZURlZmVycmVkVmFsdWUodmFsdWUpO1xufVxuZnVuY3Rpb24gdXNlSWQoKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSWQoKTtcbn1cbmZ1bmN0aW9uIHVzZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xufVxuXG4vLyBIZWxwZXJzIHRvIHBhdGNoIGNvbnNvbGUubG9ncyB0byBhdm9pZCBsb2dnaW5nIGR1cmluZyBzaWRlLWVmZmVjdCBmcmVlXG4vLyByZXBsYXlpbmcgb24gcmVuZGVyIGZ1bmN0aW9uLiBUaGlzIGN1cnJlbnRseSBvbmx5IHBhdGNoZXMgdGhlIG9iamVjdFxuLy8gbGF6aWx5IHdoaWNoIHdvbid0IGNvdmVyIGlmIHRoZSBsb2cgZnVuY3Rpb24gd2FzIGV4dHJhY3RlZCBlYWdlcmx5LlxuLy8gV2UgY291bGQgYWxzbyBlYWdlcmx5IHBhdGNoIHRoZSBtZXRob2QuXG52YXIgZGlzYWJsZWREZXB0aCA9IDA7XG52YXIgcHJldkxvZztcbnZhciBwcmV2SW5mbztcbnZhciBwcmV2V2FybjtcbnZhciBwcmV2RXJyb3I7XG52YXIgcHJldkdyb3VwO1xudmFyIHByZXZHcm91cENvbGxhcHNlZDtcbnZhciBwcmV2R3JvdXBFbmQ7XG5cbmZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cblxuZGlzYWJsZWRMb2cuX19yZWFjdERpc2FibGVkTG9nID0gdHJ1ZTtcbmZ1bmN0aW9uIGRpc2FibGVMb2dzKCkge1xuICB7XG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICBwcmV2V2FybiA9IGNvbnNvbGUud2FybjtcbiAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkID0gY29uc29sZS5ncm91cENvbGxhcHNlZDtcbiAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTkwOTlcblxuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZyxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgaW5mbzogcHJvcHMsXG4gICAgICAgIGxvZzogcHJvcHMsXG4gICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICBlcnJvcjogcHJvcHMsXG4gICAgICAgIGdyb3VwOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICBncm91cEVuZDogcHJvcHNcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBkaXNhYmxlZERlcHRoKys7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlZW5hYmxlTG9ncygpIHtcbiAge1xuICAgIGRpc2FibGVkRGVwdGgtLTtcblxuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBsb2c6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgaW5mbzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2SW5mb1xuICAgICAgICB9KSxcbiAgICAgICAgd2FybjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2V2FyblxuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkVycm9yXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cENvbGxhcHNlZFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBFbmQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwRW5kXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPCAwKSB7XG4gICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xudmFyIHByZWZpeDtcbmZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBFeHRyYWN0IHRoZSBWTSBzcGVjaWZpYyBwcmVmaXggdXNlZCBieSBlYWNoIGxpbmUuXG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO1xuICAgICAgICBwcmVmaXggPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbiAgICAgIH1cbiAgICB9IC8vIFdlIHVzZSB0aGUgcHJlZml4IHRvIGVuc3VyZSBvdXIgc3RhY2tzIGxpbmUgdXAgd2l0aCBuYXRpdmUgc3RhY2sgZnJhbWVzLlxuXG5cbiAgICByZXR1cm4gJ1xcbicgKyBwcmVmaXggKyBuYW1lO1xuICB9XG59XG52YXIgcmVlbnRyeSA9IGZhbHNlO1xudmFyIGNvbXBvbmVudEZyYW1lQ2FjaGU7XG5cbntcbiAgdmFyIFBvc3NpYmx5V2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcbiAgY29tcG9uZW50RnJhbWVDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gIC8vIElmIHNvbWV0aGluZyBhc2tlZCBmb3IgYSBzdGFjayBpbnNpZGUgYSBmYWtlIHJlbmRlciwgaXQgc2hvdWxkIGdldCBpZ25vcmVkLlxuICBpZiAoICFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7IC8vIFNldCB0aGUgZGlzcGF0Y2hlciBpbiBERVYgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGNhbGwgaW4gdGhlIHJlbmRlciBmdW5jdGlvblxuICAgIC8vIGZvciB3YXJuaW5ncy5cblxuICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gbnVsbDtcbiAgICBkaXNhYmxlTG9ncygpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIHNob3VsZCB0aHJvdy5cbiAgICBpZiAoY29uc3RydWN0KSB7XG4gICAgICAvLyBTb21ldGhpbmcgc2hvdWxkIGJlIHNldHRpbmcgdGhlIHByb3BzIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgIHZhciBGYWtlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfTsgLy8gJEZsb3dGaXhNZVxuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgJ3Byb3BzJywge1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBXZSB1c2UgYSB0aHJvd2luZyBzZXR0ZXIgaW5zdGVhZCBvZiBmcm96ZW4gb3Igbm9uLXdyaXRhYmxlIHByb3BzXG4gICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdvbid0IHRocm93IGluIGEgbm9uLXN0cmljdCBtb2RlIGZ1bmN0aW9uLlxuICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgIC8vIFdlIGNvbnN0cnVjdCBhIGRpZmZlcmVudCBjb250cm9sIGZvciB0aGlzIGNhc2UgdG8gaW5jbHVkZSBhbnkgZXh0cmFcbiAgICAgICAgLy8gZnJhbWVzIGFkZGVkIGJ5IHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChGYWtlLCBbXSk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBmbi5jYWxsKEZha2UucHJvdG90eXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICB9XG5cbiAgICAgIGZuKCk7XG4gICAgfVxuICB9IGNhdGNoIChzYW1wbGUpIHtcbiAgICAvLyBUaGlzIGlzIGlubGluZWQgbWFudWFsbHkgYmVjYXVzZSBjbG9zdXJlIGRvZXNuJ3QgZG8gaXQgZm9yIHVzLlxuICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiB0eXBlb2Ygc2FtcGxlLnN0YWNrID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgZmlyc3QgZnJhbWUgZnJvbSB0aGUgc2FtcGxlIHRoYXQgaXNuJ3QgYWxzbyBpbiB0aGUgY29udHJvbC5cbiAgICAgIC8vIFNraXBwaW5nIG9uZSBmcmFtZSB0aGF0IHdlIGFzc3VtZSBpcyB0aGUgZnJhbWUgdGhhdCBjYWxscyB0aGUgdHdvLlxuICAgICAgdmFyIHNhbXBsZUxpbmVzID0gc2FtcGxlLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBjb250cm9sTGluZXMgPSBjb250cm9sLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBzID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBjID0gY29udHJvbExpbmVzLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChzID49IDEgJiYgYyA+PSAwICYmIHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgLy8gV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBzdGFjayBmcmFtZSB0byBiZSBzaGFyZWQuXG4gICAgICAgIC8vIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgbW9zdCBvbmUuIEhvd2V2ZXIsIHN0YWNrIGZyYW1lcyBtYXkgYmVcbiAgICAgICAgLy8gY3V0IG9mZiBkdWUgdG8gbWF4aW11bSBzdGFjayBsaW1pdHMuIEluIHRoaXMgY2FzZSwgb25lIG1heWJlIGN1dCBvZmZcbiAgICAgICAgLy8gZWFybGllciB0aGFuIHRoZSBvdGhlci4gV2UgYXNzdW1lIHRoYXQgdGhlIHNhbXBsZSBpcyBsb25nZXIgb3IgdGhlIHNhbWVcbiAgICAgICAgLy8gYW5kIHRoZXJlIGZvciBjdXQgb2ZmIGVhcmxpZXIuIFNvIHdlIHNob3VsZCBmaW5kIHRoZSByb290IG1vc3QgZnJhbWUgaW5cbiAgICAgICAgLy8gdGhlIHNhbXBsZSBzb21ld2hlcmUgaW4gdGhlIGNvbnRyb2wuXG4gICAgICAgIGMtLTtcbiAgICAgIH1cblxuICAgICAgZm9yICg7IHMgPj0gMSAmJiBjID49IDA7IHMtLSwgYy0tKSB7XG4gICAgICAgIC8vIE5leHQgd2UgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgd2hpY2ggc2hvdWxkIGJlIHRoZVxuICAgICAgICAvLyBmcmFtZSB0aGF0IGNhbGxlZCBvdXIgc2FtcGxlIGZ1bmN0aW9uIGFuZCB0aGUgY29udHJvbC5cbiAgICAgICAgaWYgKHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAvLyBJbiBWOCwgdGhlIGZpcnN0IGxpbmUgaXMgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBidXQgb3RoZXIgVk1zIGRvbid0LlxuICAgICAgICAgIC8vIElmIHdlJ3JlIGFib3V0IHRvIHJldHVybiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBjb250cm9sIGlzIGFsc28gb24gdGhlIHNhbWVcbiAgICAgICAgICAvLyBsaW5lLCB0aGF0J3MgYSBwcmV0dHkgZ29vZCBpbmRpY2F0b3IgdGhhdCBvdXIgc2FtcGxlIHRocmV3IGF0IHNhbWUgbGluZSBhc1xuICAgICAgICAgIC8vIHRoZSBjb250cm9sLiBJLmUuIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSBzYW1wbGUgZnJhbWUuIFNvIHdlIGlnbm9yZSB0aGlzIHJlc3VsdC5cbiAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IHBhc3NlZCBhIGNsYXNzIHRvIGZ1bmN0aW9uIGNvbXBvbmVudCwgb3Igbm9uLWZ1bmN0aW9uLlxuICAgICAgICAgIGlmIChzICE9PSAxIHx8IGMgIT09IDEpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgcy0tO1xuICAgICAgICAgICAgICBjLS07IC8vIFdlIG1heSBzdGlsbCBoYXZlIHNpbWlsYXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgICAgICAgLy8gVGhlIG5leHQgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgc2hvdWxkIGJlIG91ciBtYXRjaCB0aG91Z2guXG5cbiAgICAgICAgICAgICAgaWYgKGMgPCAwIHx8IHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAgICAgICAvLyBWOCBhZGRzIGEgXCJuZXdcIiBwcmVmaXggZm9yIG5hdGl2ZSBjbGFzc2VzLiBMZXQncyByZW1vdmUgaXQgdG8gbWFrZSBpdCBwcmV0dGllci5cbiAgICAgICAgICAgICAgICB2YXIgX2ZyYW1lID0gJ1xcbicgKyBzYW1wbGVMaW5lc1tzXS5yZXBsYWNlKCcgYXQgbmV3ICcsICcgYXQgJyk7IC8vIElmIG91ciBjb21wb25lbnQgZnJhbWUgaXMgbGFiZWxlZCBcIjxhbm9ueW1vdXM+XCJcbiAgICAgICAgICAgICAgICAvLyBidXQgd2UgaGF2ZSBhIHVzZXItcHJvdmlkZWQgXCJkaXNwbGF5TmFtZVwiXG4gICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGluIHRvIG1ha2UgdGhlIHN0YWNrIG1vcmUgcmVhZGFibGUuXG5cblxuICAgICAgICAgICAgICAgIGlmIChmbi5kaXNwbGF5TmFtZSAmJiBfZnJhbWUuaW5jbHVkZXMoJzxhbm9ueW1vdXM+JykpIHtcbiAgICAgICAgICAgICAgICAgIF9mcmFtZSA9IF9mcmFtZS5yZXBsYWNlKCc8YW5vbnltb3VzPicsIGZuLmRpc3BsYXlOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBfZnJhbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gLy8gUmV0dXJuIHRoZSBsaW5lIHdlIGZvdW5kLlxuXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZyYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChzID49IDEgJiYgYyA+PSAwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICByZWVudHJ5ID0gZmFsc2U7XG5cbiAgICB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTGF6eSBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoaW5pdChwYXlsb2FkKSwgc291cmNlLCBvd25lckZuKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC5cbiAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKGhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLicgKyAnVGhpcyBvZnRlbiBoYXBwZW5zIGJlY2F1c2Ugb2YgdHlwb3Mgc3VjaCBhcyBgUHJvcFR5cGVzLmZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGBQcm9wVHlwZXMuZnVuY2AuJyk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvciQxID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciQxID0gZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSAmJiAhKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzJyArICcgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgbG9jYXRpb24sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yJDEpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IkMS5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvciQxLm1lc3NhZ2VdID0gdHJ1ZTtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCdGYWlsZWQgJXMgdHlwZTogJXMnLCBsb2NhdGlvbiwgZXJyb3IkMS5tZXNzYWdlKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIHNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duO1xuXG57XG4gIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpIHtcbiAgaWYgKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKHNvdXJjZSkge1xuICBpZiAoc291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZmlsZU5hbWUgPSBzb3VyY2UuZmlsZU5hbWUucmVwbGFjZSgvXi4qW1xcXFxcXC9dLywgJycpO1xuICAgIHZhciBsaW5lTnVtYmVyID0gc291cmNlLmxpbmVOdW1iZXI7XG4gICAgcmV0dXJuICdcXG5cXG5DaGVjayB5b3VyIGNvZGUgYXQgJyArIGZpbGVOYW1lICsgJzonICsgbGluZU51bWJlciArICcuJztcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW1Gb3JQcm9wcyhlbGVtZW50UHJvcHMpIHtcbiAgaWYgKGVsZW1lbnRQcm9wcyAhPT0gbnVsbCAmJiBlbGVtZW50UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShlbGVtZW50UHJvcHMuX19zb3VyY2UpO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuLyoqXG4gKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAqIHVwZGF0ZXMuXG4gKi9cblxuXG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICB2YXIgaW5mbyA9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuXG4gIGlmICghaW5mbykge1xuICAgIHZhciBwYXJlbnROYW1lID0gdHlwZW9mIHBhcmVudFR5cGUgPT09ICdzdHJpbmcnID8gcGFyZW50VHlwZSA6IHBhcmVudFR5cGUuZGlzcGxheU5hbWUgfHwgcGFyZW50VHlwZS5uYW1lO1xuXG4gICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgIGluZm8gPSBcIlxcblxcbkNoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPFwiICsgcGFyZW50TmFtZSArIFwiPi5cIjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5mbztcbn1cbi8qKlxuICogV2FybiBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW4gZXhwbGljaXQga2V5IGFzc2lnbmVkIHRvIGl0LlxuICogVGhpcyBlbGVtZW50IGlzIGluIGFuIGFycmF5LiBUaGUgYXJyYXkgY291bGQgZ3JvdyBhbmQgc2hyaW5rIG9yIGJlXG4gKiByZW9yZGVyZWQuIEFsbCBjaGlsZHJlbiB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcmUgcmVxdWlyZWQgdG9cbiAqIGhhdmUgYSBcImtleVwiIHByb3BlcnR5IGFzc2lnbmVkIHRvIGl0LiBFcnJvciBzdGF0dXNlcyBhcmUgY2FjaGVkIHNvIGEgd2FybmluZ1xuICogd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IHRoYXQgcmVxdWlyZXMgYSBrZXkuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgZWxlbWVudCdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUV4cGxpY2l0S2V5KGVsZW1lbnQsIHBhcmVudFR5cGUpIHtcbiAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgfHwgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gIHZhciBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvID0gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKTtcblxuICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dID0gdHJ1ZTsgLy8gVXN1YWxseSB0aGUgY3VycmVudCBvd25lciBpcyB0aGUgb2ZmZW5kZXIsIGJ1dCBpZiBpdCBhY2NlcHRzIGNoaWxkcmVuIGFzIGFcbiAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAvLyBhc3NpZ25pbmcgaXQgYSBrZXkuXG5cbiAgdmFyIGNoaWxkT3duZXIgPSAnJztcblxuICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lciAhPT0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIC8vIEdpdmUgdGhlIGNvbXBvbmVudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGlzIGNoaWxkLlxuICAgIGNoaWxkT3duZXIgPSBcIiBJdCB3YXMgcGFzc2VkIGEgY2hpbGQgZnJvbSBcIiArIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShlbGVtZW50Ll9vd25lci50eXBlKSArIFwiLlwiO1xuICB9XG5cbiAge1xuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCk7XG5cbiAgICBlcnJvcignRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgXCJrZXlcIiBwcm9wLicgKyAnJXMlcyBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dhcm5pbmcta2V5cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLCBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvLCBjaGlsZE93bmVyKTtcblxuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gIH1cbn1cbi8qKlxuICogRW5zdXJlIHRoYXQgZXZlcnkgZWxlbWVudCBlaXRoZXIgaXMgcGFzc2VkIGluIGEgc3RhdGljIGxvY2F0aW9uLCBpbiBhblxuICogYXJyYXkgd2l0aCBhbiBleHBsaWNpdCBrZXlzIHByb3BlcnR5IGRlZmluZWQsIG9yIGluIGFuIG9iamVjdCBsaXRlcmFsXG4gKiB3aXRoIHZhbGlkIGtleSBwcm9wZXJ0eS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3ROb2RlfSBub2RlIFN0YXRpY2FsbHkgcGFzc2VkIGNoaWxkIG9mIGFueSB0eXBlLlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIG5vZGUncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVDaGlsZEtleXMobm9kZSwgcGFyZW50VHlwZSkge1xuICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGlzQXJyYXkobm9kZSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IG5vZGVbaV07XG5cbiAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShjaGlsZCwgcGFyZW50VHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XG4gICAgLy8gVGhpcyBlbGVtZW50IHdhcyBwYXNzZWQgaW4gYSB2YWxpZCBsb2NhdGlvbi5cbiAgICBpZiAobm9kZS5fc3RvcmUpIHtcbiAgICAgIG5vZGUuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgfVxuICB9IGVsc2UgaWYgKG5vZGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obm9kZSk7XG5cbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEVudHJ5IGl0ZXJhdG9ycyB1c2VkIHRvIHByb3ZpZGUgaW1wbGljaXQga2V5cyxcbiAgICAgIC8vIGJ1dCBub3cgd2UgcHJpbnQgYSBzZXBhcmF0ZSB3YXJuaW5nIGZvciB0aGVtIGxhdGVyLlxuICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IG5vZGUuZW50cmllcykge1xuICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobm9kZSk7XG4gICAgICAgIHZhciBzdGVwO1xuXG4gICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoc3RlcC52YWx1ZSwgcGFyZW50VHlwZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdpdmVuIGFuIGVsZW1lbnQsIHZhbGlkYXRlIHRoYXQgaXRzIHByb3BzIGZvbGxvdyB0aGUgcHJvcFR5cGVzIGRlZmluaXRpb24sXG4gKiBwcm92aWRlZCBieSB0aGUgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudFxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCkge1xuICB7XG4gICAgdmFyIHR5cGUgPSBlbGVtZW50LnR5cGU7XG5cbiAgICBpZiAodHlwZSA9PT0gbnVsbCB8fCB0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHByb3BUeXBlcztcblxuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gTm90ZTogTWVtbyBvbmx5IGNoZWNrcyBvdXRlciBwcm9wcyBoZXJlLlxuICAgIC8vIElubmVyIHByb3BzIGFyZSBjaGVja2VkIGluIHRoZSByZWNvbmNpbGVyLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3BUeXBlcykge1xuICAgICAgLy8gSW50ZW50aW9uYWxseSBpbnNpZGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGluaXRpYWxpemVyczpcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuICAgICAgY2hlY2tQcm9wVHlwZXMocHJvcFR5cGVzLCBlbGVtZW50LnByb3BzLCAncHJvcCcsIG5hbWUsIGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAodHlwZS5Qcm9wVHlwZXMgIT09IHVuZGVmaW5lZCAmJiAhcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24pIHtcbiAgICAgIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gdHJ1ZTsgLy8gSW50ZW50aW9uYWxseSBpbnNpZGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGluaXRpYWxpemVyczpcblxuICAgICAgdmFyIF9uYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuXG4gICAgICBlcnJvcignQ29tcG9uZW50ICVzIGRlY2xhcmVkIGBQcm9wVHlwZXNgIGluc3RlYWQgb2YgYHByb3BUeXBlc2AuIERpZCB5b3UgbWlzc3BlbGwgdGhlIHByb3BlcnR5IGFzc2lnbm1lbnQ/JywgX25hbWUgfHwgJ1Vua25vd24nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHR5cGUuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nICYmICF0eXBlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyBpcyBvbmx5IHVzZWQgb24gY2xhc3NpYyBSZWFjdC5jcmVhdGVDbGFzcyAnICsgJ2RlZmluaXRpb25zLiBVc2UgYSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgYGRlZmF1bHRQcm9wc2AgaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYSBmcmFnbWVudCwgdmFsaWRhdGUgdGhhdCBpdCBjYW4gb25seSBiZSBwcm92aWRlZCB3aXRoIGZyYWdtZW50IHByb3BzXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZnJhZ21lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhmcmFnbWVudCkge1xuICB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmcmFnbWVudC5wcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoa2V5ICE9PSAnY2hpbGRyZW4nICYmIGtleSAhPT0gJ2tleScpIHtcbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgcHJvcCBgJXNgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuICcgKyAnUmVhY3QuRnJhZ21lbnQgY2FuIG9ubHkgaGF2ZSBga2V5YCBhbmQgYGNoaWxkcmVuYCBwcm9wcy4nLCBrZXkpO1xuXG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmcmFnbWVudC5yZWYgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgYHJlZmAgc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4nKTtcblxuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbih0eXBlLCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIHZhbGlkVHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKTsgLy8gV2Ugd2FybiBpbiB0aGlzIGNhc2UgYnV0IGRvbid0IHRocm93LiBXZSBleHBlY3QgdGhlIGVsZW1lbnQgY3JlYXRpb24gdG9cbiAgLy8gc3VjY2VlZCBhbmQgdGhlcmUgd2lsbCBsaWtlbHkgYmUgZXJyb3JzIGluIHJlbmRlci5cblxuICBpZiAoIXZhbGlkVHlwZSkge1xuICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgbmFtZWQgaW1wb3J0cy5cIjtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlSW5mbyA9IGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtRm9yUHJvcHMocHJvcHMpO1xuXG4gICAgaWYgKHNvdXJjZUluZm8pIHtcbiAgICAgIGluZm8gKz0gc291cmNlSW5mbztcbiAgICB9IGVsc2Uge1xuICAgICAgaW5mbyArPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcbiAgICB9XG5cbiAgICB2YXIgdHlwZVN0cmluZztcblxuICAgIGlmICh0eXBlID09PSBudWxsKSB7XG4gICAgICB0eXBlU3RyaW5nID0gJ251bGwnO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheSh0eXBlKSkge1xuICAgICAgdHlwZVN0cmluZyA9ICdhcnJheSc7XG4gICAgfSBlbHNlIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICB0eXBlU3RyaW5nID0gXCI8XCIgKyAoZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgJ1Vua25vd24nKSArIFwiIC8+XCI7XG4gICAgICBpbmZvID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBleHBvcnQgYSBKU1ggbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50Pyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGVTdHJpbmcgPSB0eXBlb2YgdHlwZTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBlcnJvcignUmVhY3QuY3JlYXRlRWxlbWVudDogdHlwZSBpcyBpbnZhbGlkIC0tIGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgJyArICdidWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlICcgKyAnY29tcG9uZW50cykgYnV0IGdvdDogJXMuJXMnLCB0eXBlU3RyaW5nLCBpbmZvKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gVGhlIHJlc3VsdCBjYW4gYmUgbnVsbGlzaCBpZiBhIG1vY2sgb3IgYSBjdXN0b20gZnVuY3Rpb24gaXMgdXNlZC5cbiAgLy8gVE9ETzogRHJvcCB0aGlzIHdoZW4gdGhlc2UgYXJlIG5vIGxvbmdlciBhbGxvd2VkIGFzIHRoZSB0eXBlIGFyZ3VtZW50LlxuXG4gIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfSAvLyBTa2lwIGtleSB3YXJuaW5nIGlmIHRoZSB0eXBlIGlzbid0IHZhbGlkIHNpbmNlIG91ciBrZXkgdmFsaWRhdGlvbiBsb2dpY1xuICAvLyBkb2Vzbid0IGV4cGVjdCBhIG5vbi1zdHJpbmcvZnVuY3Rpb24gdHlwZSBhbmQgY2FuIHRocm93IGNvbmZ1c2luZyBlcnJvcnMuXG4gIC8vIFdlIGRvbid0IHdhbnQgZXhjZXB0aW9uIGJlaGF2aW9yIHRvIGRpZmZlciBiZXR3ZWVuIGRldiBhbmQgcHJvZC5cbiAgLy8gKFJlbmRlcmluZyB3aWxsIHRocm93IHdpdGggYSBoZWxwZnVsIG1lc3NhZ2UgYW5kIGFzIHNvb24gYXMgdGhlIHR5cGUgaXNcbiAgLy8gZml4ZWQsIHRoZSBrZXkgd2FybmluZ3Mgd2lsbCBhcHBlYXIuKVxuXG5cbiAgaWYgKHZhbGlkVHlwZSkge1xuICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIHR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgdmFsaWRhdGVGcmFnbWVudFByb3BzKGVsZW1lbnQpO1xuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG52YXIgZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkgPSBmYWxzZTtcbmZ1bmN0aW9uIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbih0eXBlKSB7XG4gIHZhciB2YWxpZGF0ZWRGYWN0b3J5ID0gY3JlYXRlRWxlbWVudFdpdGhWYWxpZGF0aW9uLmJpbmQobnVsbCwgdHlwZSk7XG4gIHZhbGlkYXRlZEZhY3RvcnkudHlwZSA9IHR5cGU7XG5cbiAge1xuICAgIGlmICghZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkpIHtcbiAgICAgIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5ID0gdHJ1ZTtcblxuICAgICAgd2FybignUmVhY3QuY3JlYXRlRmFjdG9yeSgpIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIENvbnNpZGVyIHVzaW5nIEpTWCAnICsgJ29yIHVzZSBSZWFjdC5jcmVhdGVFbGVtZW50KCkgZGlyZWN0bHkgaW5zdGVhZC4nKTtcbiAgICB9IC8vIExlZ2FjeSBob29rOiByZW1vdmUgaXRcblxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZhbGlkYXRlZEZhY3RvcnksICd0eXBlJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2FybignRmFjdG9yeS50eXBlIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB0aGUgY2xhc3MgZGlyZWN0bHkgJyArICdiZWZvcmUgcGFzc2luZyBpdCB0byBjcmVhdGVGYWN0b3J5LicpO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndHlwZScsIHtcbiAgICAgICAgICB2YWx1ZTogdHlwZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVkRmFjdG9yeTtcbn1cbmZ1bmN0aW9uIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uKGVsZW1lbnQsIHByb3BzLCBjaGlsZHJlbikge1xuICB2YXIgbmV3RWxlbWVudCA9IGNsb25lRWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCBuZXdFbGVtZW50LnR5cGUpO1xuICB9XG5cbiAgdmFsaWRhdGVQcm9wVHlwZXMobmV3RWxlbWVudCk7XG4gIHJldHVybiBuZXdFbGVtZW50O1xufVxuXG5mdW5jdGlvbiBzdGFydFRyYW5zaXRpb24oc2NvcGUsIG9wdGlvbnMpIHtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjtcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IHt9O1xuICB2YXIgY3VycmVudFRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBzY29wZSgpO1xuICB9IGZpbmFsbHkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcblxuICAgIHtcbiAgICAgIGlmIChwcmV2VHJhbnNpdGlvbiA9PT0gbnVsbCAmJiBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycykge1xuICAgICAgICB2YXIgdXBkYXRlZEZpYmVyc0NvdW50ID0gY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuc2l6ZTtcblxuICAgICAgICBpZiAodXBkYXRlZEZpYmVyc0NvdW50ID4gMTApIHtcbiAgICAgICAgICB3YXJuKCdEZXRlY3RlZCBhIGxhcmdlIG51bWJlciBvZiB1cGRhdGVzIGluc2lkZSBzdGFydFRyYW5zaXRpb24uICcgKyAnSWYgdGhpcyBpcyBkdWUgdG8gYSBzdWJzY3JpcHRpb24gcGxlYXNlIHJlLXdyaXRlIGl0IHRvIHVzZSBSZWFjdCBwcm92aWRlZCBob29rcy4gJyArICdPdGhlcndpc2UgY29uY3VycmVudCBtb2RlIGd1YXJhbnRlZXMgYXJlIG9mZiB0aGUgdGFibGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPSBmYWxzZTtcbnZhciBlbnF1ZXVlVGFza0ltcGwgPSBudWxsO1xuZnVuY3Rpb24gZW5xdWV1ZVRhc2sodGFzaykge1xuICBpZiAoZW5xdWV1ZVRhc2tJbXBsID09PSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIHJlYWQgcmVxdWlyZSBvZmYgdGhlIG1vZHVsZSBvYmplY3QgdG8gZ2V0IGFyb3VuZCB0aGUgYnVuZGxlcnMuXG4gICAgICAvLyB3ZSBkb24ndCB3YW50IHRoZW0gdG8gZGV0ZWN0IGEgcmVxdWlyZSBhbmQgYnVuZGxlIGEgTm9kZSBwb2x5ZmlsbC5cbiAgICAgIHZhciByZXF1aXJlU3RyaW5nID0gKCdyZXF1aXJlJyArIE1hdGgucmFuZG9tKCkpLnNsaWNlKDAsIDcpO1xuICAgICAgdmFyIG5vZGVSZXF1aXJlID0gbW9kdWxlICYmIG1vZHVsZVtyZXF1aXJlU3RyaW5nXTsgLy8gYXNzdW1pbmcgd2UncmUgaW4gbm9kZSwgbGV0J3MgdHJ5IHRvIGdldCBub2RlJ3NcbiAgICAgIC8vIHZlcnNpb24gb2Ygc2V0SW1tZWRpYXRlLCBieXBhc3NpbmcgZmFrZSB0aW1lcnMgaWYgYW55LlxuXG4gICAgICBlbnF1ZXVlVGFza0ltcGwgPSBub2RlUmVxdWlyZS5jYWxsKG1vZHVsZSwgJ3RpbWVycycpLnNldEltbWVkaWF0ZTtcbiAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAvLyB3ZSdyZSBpbiBhIGJyb3dzZXJcbiAgICAgIC8vIHdlIGNhbid0IHVzZSByZWd1bGFyIHRpbWVycyBiZWNhdXNlIHRoZXkgbWF5IHN0aWxsIGJlIGZha2VkXG4gICAgICAvLyBzbyB3ZSB0cnkgTWVzc2FnZUNoYW5uZWwrcG9zdE1lc3NhZ2UgaW5zdGVhZFxuICAgICAgZW5xdWV1ZVRhc2tJbXBsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBkaWRXYXJuQWJvdXRNZXNzYWdlQ2hhbm5lbCA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgTWVzc2FnZUNoYW5uZWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGVycm9yKCdUaGlzIGJyb3dzZXIgZG9lcyBub3QgaGF2ZSBhIE1lc3NhZ2VDaGFubmVsIGltcGxlbWVudGF0aW9uLCAnICsgJ3NvIGVucXVldWluZyB0YXNrcyB2aWEgYXdhaXQgYWN0KGFzeW5jICgpID0+IC4uLikgd2lsbCBmYWlsLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMgJyArICdpZiB5b3UgZW5jb3VudGVyIHRoaXMgd2FybmluZy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGNhbGxiYWNrO1xuICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKHVuZGVmaW5lZCk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbnF1ZXVlVGFza0ltcGwodGFzayk7XG59XG5cbnZhciBhY3RTY29wZURlcHRoID0gMDtcbnZhciBkaWRXYXJuTm9Bd2FpdEFjdCA9IGZhbHNlO1xuZnVuY3Rpb24gYWN0KGNhbGxiYWNrKSB7XG4gIHtcbiAgICAvLyBgYWN0YCBjYWxscyBjYW4gYmUgbmVzdGVkLCBzbyB3ZSB0cmFjayB0aGUgZGVwdGguIFRoaXMgcmVwcmVzZW50cyB0aGVcbiAgICAvLyBudW1iZXIgb2YgYGFjdGAgc2NvcGVzIG9uIHRoZSBzdGFjay5cbiAgICB2YXIgcHJldkFjdFNjb3BlRGVwdGggPSBhY3RTY29wZURlcHRoO1xuICAgIGFjdFNjb3BlRGVwdGgrKztcblxuICAgIGlmIChSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBvdXRlcm1vc3QgYGFjdGAgc2NvcGUuIEluaXRpYWxpemUgdGhlIHF1ZXVlLiBUaGUgcmVjb25jaWxlclxuICAgICAgLy8gd2lsbCBkZXRlY3QgdGhlIHF1ZXVlIGFuZCB1c2UgaXQgaW5zdGVhZCBvZiBTY2hlZHVsZXIuXG4gICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gW107XG4gICAgfVxuXG4gICAgdmFyIHByZXZJc0JhdGNoaW5nTGVnYWN5ID0gUmVhY3RDdXJyZW50QWN0UXVldWUuaXNCYXRjaGluZ0xlZ2FjeTtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZWQgdG8gcmVwcm9kdWNlIGJlaGF2aW9yIG9mIGBiYXRjaGVkVXBkYXRlc2AgaW4gbGVnYWN5IG1vZGUuIE9ubHlcbiAgICAgIC8vIHNldCB0byBgdHJ1ZWAgd2hpbGUgdGhlIGdpdmVuIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBub3QgZm9yIHVwZGF0ZXNcbiAgICAgIC8vIHRyaWdnZXJlZCBkdXJpbmcgYW4gYXN5bmMgZXZlbnQsIGJlY2F1c2UgdGhpcyBpcyBob3cgdGhlIGxlZ2FjeVxuICAgICAgLy8gaW1wbGVtZW50YXRpb24gb2YgYGFjdGAgYmVoYXZlZC5cbiAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmlzQmF0Y2hpbmdMZWdhY3kgPSB0cnVlO1xuICAgICAgcmVzdWx0ID0gY2FsbGJhY2soKTsgLy8gUmVwbGljYXRlIGJlaGF2aW9yIG9mIG9yaWdpbmFsIGBhY3RgIGltcGxlbWVudGF0aW9uIGluIGxlZ2FjeSBtb2RlLFxuICAgICAgLy8gd2hpY2ggZmx1c2hlZCB1cGRhdGVzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBzY29wZSBmdW5jdGlvbiBleGl0cywgZXZlblxuICAgICAgLy8gaWYgaXQncyBhbiBhc3luYyBmdW5jdGlvbi5cblxuICAgICAgaWYgKCFwcmV2SXNCYXRjaGluZ0xlZ2FjeSAmJiBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSkge1xuICAgICAgICB2YXIgcXVldWUgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50O1xuXG4gICAgICAgIGlmIChxdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmRpZFNjaGVkdWxlTGVnYWN5VXBkYXRlID0gZmFsc2U7XG4gICAgICAgICAgZmx1c2hBY3RRdWV1ZShxdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmlzQmF0Y2hpbmdMZWdhY3kgPSBwcmV2SXNCYXRjaGluZ0xlZ2FjeTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRoZW5hYmxlUmVzdWx0ID0gcmVzdWx0OyAvLyBUaGUgY2FsbGJhY2sgaXMgYW4gYXN5bmMgZnVuY3Rpb24gKGkuZS4gcmV0dXJuZWQgYSBwcm9taXNlKS4gV2FpdFxuICAgICAgLy8gZm9yIGl0IHRvIHJlc29sdmUgYmVmb3JlIGV4aXRpbmcgdGhlIGN1cnJlbnQgc2NvcGUuXG5cbiAgICAgIHZhciB3YXNBd2FpdGVkID0gZmFsc2U7XG4gICAgICB2YXIgdGhlbmFibGUgPSB7XG4gICAgICAgIHRoZW46IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICB3YXNBd2FpdGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGVuYWJsZVJlc3VsdC50aGVuKGZ1bmN0aW9uIChyZXR1cm5WYWx1ZSkge1xuICAgICAgICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuXG4gICAgICAgICAgICBpZiAoYWN0U2NvcGVEZXB0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAvLyBXZSd2ZSBleGl0ZWQgdGhlIG91dGVybW9zdCBhY3Qgc2NvcGUuIFJlY3Vyc2l2ZWx5IGZsdXNoIHRoZVxuICAgICAgICAgICAgICAvLyBxdWV1ZSB1bnRpbCB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLlxuICAgICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBUaGUgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3IuXG4gICAgICAgICAgICBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCk7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB7XG4gICAgICAgIGlmICghZGlkV2Fybk5vQXdhaXRBY3QgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7fSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXdhc0F3YWl0ZWQpIHtcbiAgICAgICAgICAgICAgZGlkV2Fybk5vQXdhaXRBY3QgPSB0cnVlO1xuXG4gICAgICAgICAgICAgIGVycm9yKCdZb3UgY2FsbGVkIGFjdChhc3luYyAoKSA9PiAuLi4pIHdpdGhvdXQgYXdhaXQuICcgKyAnVGhpcyBjb3VsZCBsZWFkIHRvIHVuZXhwZWN0ZWQgdGVzdGluZyBiZWhhdmlvdXIsICcgKyAnaW50ZXJsZWF2aW5nIG11bHRpcGxlIGFjdCBjYWxscyBhbmQgbWl4aW5nIHRoZWlyICcgKyAnc2NvcGVzLiAnICsgJ1lvdSBzaG91bGQgLSBhd2FpdCBhY3QoYXN5bmMgKCkgPT4gLi4uKTsnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhlbmFibGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXR1cm5WYWx1ZSA9IHJlc3VsdDsgLy8gVGhlIGNhbGxiYWNrIGlzIG5vdCBhbiBhc3luYyBmdW5jdGlvbi4gRXhpdCB0aGUgY3VycmVudCBzY29wZVxuICAgICAgLy8gaW1tZWRpYXRlbHksIHdpdGhvdXQgYXdhaXRpbmcuXG5cbiAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcblxuICAgICAgaWYgKGFjdFNjb3BlRGVwdGggPT09IDApIHtcbiAgICAgICAgLy8gRXhpdGluZyB0aGUgb3V0ZXJtb3N0IGFjdCBzY29wZS4gRmx1c2ggdGhlIHF1ZXVlLlxuICAgICAgICB2YXIgX3F1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDtcblxuICAgICAgICBpZiAoX3F1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgZmx1c2hBY3RRdWV1ZShfcXVldWUpO1xuICAgICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICB9IC8vIFJldHVybiBhIHRoZW5hYmxlLiBJZiB0aGUgdXNlciBhd2FpdHMgaXQsIHdlJ2xsIGZsdXNoIGFnYWluIGluXG4gICAgICAgIC8vIGNhc2UgYWRkaXRpb25hbCB3b3JrIHdhcyBzY2hlZHVsZWQgYnkgYSBtaWNyb3Rhc2suXG5cblxuICAgICAgICB2YXIgX3RoZW5hYmxlID0ge1xuICAgICAgICAgIHRoZW46IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIC8vIENvbmZpcm0gd2UgaGF2ZW4ndCByZS1lbnRlcmVkIGFub3RoZXIgYGFjdGAgc2NvcGUsIGluIGNhc2VcbiAgICAgICAgICAgIC8vIHRoZSB1c2VyIGRvZXMgc29tZXRoaW5nIHdlaXJkIGxpa2UgYXdhaXQgdGhlIHRoZW5hYmxlXG4gICAgICAgICAgICAvLyBtdWx0aXBsZSB0aW1lcy5cbiAgICAgICAgICAgIGlmIChSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZsdXNoIHRoZSBxdWV1ZSB1bnRpbCB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLlxuICAgICAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gW107XG4gICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5Rmx1c2hBc3luY0FjdFdvcmsocmV0dXJuVmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhlbmFibGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTaW5jZSB3ZSdyZSBpbnNpZGUgYSBuZXN0ZWQgYGFjdGAgc2NvcGUsIHRoZSByZXR1cm5lZCB0aGVuYWJsZVxuICAgICAgICAvLyBpbW1lZGlhdGVseSByZXNvbHZlcy4gVGhlIG91dGVyIHNjb3BlIHdpbGwgZmx1c2ggdGhlIHF1ZXVlLlxuICAgICAgICB2YXIgX3RoZW5hYmxlMiA9IHtcbiAgICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhlbmFibGUyO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCkge1xuICB7XG4gICAgaWYgKHByZXZBY3RTY29wZURlcHRoICE9PSBhY3RTY29wZURlcHRoIC0gMSkge1xuICAgICAgZXJyb3IoJ1lvdSBzZWVtIHRvIGhhdmUgb3ZlcmxhcHBpbmcgYWN0KCkgY2FsbHMsIHRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdCZSBzdXJlIHRvIGF3YWl0IHByZXZpb3VzIGFjdCgpIGNhbGxzIGJlZm9yZSBtYWtpbmcgYSBuZXcgb25lLiAnKTtcbiAgICB9XG5cbiAgICBhY3RTY29wZURlcHRoID0gcHJldkFjdFNjb3BlRGVwdGg7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gIHtcbiAgICB2YXIgcXVldWUgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50O1xuXG4gICAgaWYgKHF1ZXVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBmbHVzaEFjdFF1ZXVlKHF1ZXVlKTtcbiAgICAgICAgZW5xdWV1ZVRhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIE5vIGFkZGl0aW9uYWwgd29yayB3YXMgc2NoZWR1bGVkLiBGaW5pc2guXG4gICAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBLZWVwIGZsdXNoaW5nIHdvcmsgdW50aWwgdGhlcmUncyBub25lIGxlZnQuXG4gICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGlzRmx1c2hpbmcgPSBmYWxzZTtcblxuZnVuY3Rpb24gZmx1c2hBY3RRdWV1ZShxdWV1ZSkge1xuICB7XG4gICAgaWYgKCFpc0ZsdXNoaW5nKSB7XG4gICAgICAvLyBQcmV2ZW50IHJlLWVudHJhbmNlLlxuICAgICAgaXNGbHVzaGluZyA9IHRydWU7XG4gICAgICB2YXIgaSA9IDA7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBxdWV1ZVtpXTtcblxuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sodHJ1ZSk7XG4gICAgICAgICAgfSB3aGlsZSAoY2FsbGJhY2sgIT09IG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUubGVuZ3RoID0gMDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJvd3MsIGxlYXZlIHRoZSByZW1haW5pbmcgY2FsbGJhY2tzIG9uIHRoZSBxdWV1ZS5cbiAgICAgICAgcXVldWUgPSBxdWV1ZS5zbGljZShpICsgMSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaXNGbHVzaGluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgY3JlYXRlRWxlbWVudCQxID0gIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbiA7XG52YXIgY2xvbmVFbGVtZW50JDEgPSAgY2xvbmVFbGVtZW50V2l0aFZhbGlkYXRpb24gO1xudmFyIGNyZWF0ZUZhY3RvcnkgPSAgY3JlYXRlRmFjdG9yeVdpdGhWYWxpZGF0aW9uIDtcbnZhciBDaGlsZHJlbiA9IHtcbiAgbWFwOiBtYXBDaGlsZHJlbixcbiAgZm9yRWFjaDogZm9yRWFjaENoaWxkcmVuLFxuICBjb3VudDogY291bnRDaGlsZHJlbixcbiAgdG9BcnJheTogdG9BcnJheSxcbiAgb25seTogb25seUNoaWxkXG59O1xuXG5leHBvcnRzLkNoaWxkcmVuID0gQ2hpbGRyZW47XG5leHBvcnRzLkNvbXBvbmVudCA9IENvbXBvbmVudDtcbmV4cG9ydHMuRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xuZXhwb3J0cy5Qcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG5leHBvcnRzLlB1cmVDb21wb25lbnQgPSBQdXJlQ29tcG9uZW50O1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuZXhwb3J0cy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzO1xuZXhwb3J0cy5jbG9uZUVsZW1lbnQgPSBjbG9uZUVsZW1lbnQkMTtcbmV4cG9ydHMuY3JlYXRlQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ7XG5leHBvcnRzLmNyZWF0ZUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50JDE7XG5leHBvcnRzLmNyZWF0ZUZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5O1xuZXhwb3J0cy5jcmVhdGVSZWYgPSBjcmVhdGVSZWY7XG5leHBvcnRzLmZvcndhcmRSZWYgPSBmb3J3YXJkUmVmO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudCA9IGlzVmFsaWRFbGVtZW50O1xuZXhwb3J0cy5sYXp5ID0gbGF6eTtcbmV4cG9ydHMubWVtbyA9IG1lbW87XG5leHBvcnRzLnN0YXJ0VHJhbnNpdGlvbiA9IHN0YXJ0VHJhbnNpdGlvbjtcbmV4cG9ydHMudW5zdGFibGVfYWN0ID0gYWN0O1xuZXhwb3J0cy51c2VDYWxsYmFjayA9IHVzZUNhbGxiYWNrO1xuZXhwb3J0cy51c2VDb250ZXh0ID0gdXNlQ29udGV4dDtcbmV4cG9ydHMudXNlRGVidWdWYWx1ZSA9IHVzZURlYnVnVmFsdWU7XG5leHBvcnRzLnVzZURlZmVycmVkVmFsdWUgPSB1c2VEZWZlcnJlZFZhbHVlO1xuZXhwb3J0cy51c2VFZmZlY3QgPSB1c2VFZmZlY3Q7XG5leHBvcnRzLnVzZUlkID0gdXNlSWQ7XG5leHBvcnRzLnVzZUltcGVyYXRpdmVIYW5kbGUgPSB1c2VJbXBlcmF0aXZlSGFuZGxlO1xuZXhwb3J0cy51c2VJbnNlcnRpb25FZmZlY3QgPSB1c2VJbnNlcnRpb25FZmZlY3Q7XG5leHBvcnRzLnVzZUxheW91dEVmZmVjdCA9IHVzZUxheW91dEVmZmVjdDtcbmV4cG9ydHMudXNlTWVtbyA9IHVzZU1lbW87XG5leHBvcnRzLnVzZVJlZHVjZXIgPSB1c2VSZWR1Y2VyO1xuZXhwb3J0cy51c2VSZWYgPSB1c2VSZWY7XG5leHBvcnRzLnVzZVN0YXRlID0gdXNlU3RhdGU7XG5leHBvcnRzLnVzZVN5bmNFeHRlcm5hbFN0b3JlID0gdXNlU3luY0V4dGVybmFsU3RvcmU7XG5leHBvcnRzLnVzZVRyYW5zaXRpb24gPSB1c2VUcmFuc2l0aW9uO1xuZXhwb3J0cy52ZXJzaW9uID0gUmVhY3RWZXJzaW9uO1xuICAgICAgICAgIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgXG4gIH0pKCk7XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vZnJvbnRlbmQvLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcz8iKTsKCi8qKiovIH0pLAoKLyoqKi8gIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC9pbmRleC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QvaW5kZXguanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKInVzZSBzdHJpY3QiOwpldmFsKCJcblxuaWYgKGZhbHNlKSB7fSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcyAqLyBcIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC9janMvcmVhY3QuZGV2ZWxvcG1lbnQuanNcIik7XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vZnJvbnRlbmQvLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2luZGV4LmpzPyIpOwoKLyoqKi8gfSksCgovKioqLyAiLi4vLi4vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9janMvc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4uLy4uL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvY2pzL3NjaGVkdWxlci5kZXZlbG9wbWVudC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSA9PiB7CgoidXNlIHN0cmljdCI7CmV2YWwoIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHNjaGVkdWxlci5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cblxuXG5pZiAodHJ1ZSkge1xuICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQobmV3IEVycm9yKCkpO1xufVxuICAgICAgICAgIHZhciBlbmFibGVTY2hlZHVsZXJEZWJ1Z2dpbmcgPSBmYWxzZTtcbnZhciBlbmFibGVQcm9maWxpbmcgPSBmYWxzZTtcbnZhciBmcmFtZVlpZWxkTXMgPSA1O1xuXG5mdW5jdGlvbiBwdXNoKGhlYXAsIG5vZGUpIHtcbiAgdmFyIGluZGV4ID0gaGVhcC5sZW5ndGg7XG4gIGhlYXAucHVzaChub2RlKTtcbiAgc2lmdFVwKGhlYXAsIG5vZGUsIGluZGV4KTtcbn1cbmZ1bmN0aW9uIHBlZWsoaGVhcCkge1xuICByZXR1cm4gaGVhcC5sZW5ndGggPT09IDAgPyBudWxsIDogaGVhcFswXTtcbn1cbmZ1bmN0aW9uIHBvcChoZWFwKSB7XG4gIGlmIChoZWFwLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGZpcnN0ID0gaGVhcFswXTtcbiAgdmFyIGxhc3QgPSBoZWFwLnBvcCgpO1xuXG4gIGlmIChsYXN0ICE9PSBmaXJzdCkge1xuICAgIGhlYXBbMF0gPSBsYXN0O1xuICAgIHNpZnREb3duKGhlYXAsIGxhc3QsIDApO1xuICB9XG5cbiAgcmV0dXJuIGZpcnN0O1xufVxuXG5mdW5jdGlvbiBzaWZ0VXAoaGVhcCwgbm9kZSwgaSkge1xuICB2YXIgaW5kZXggPSBpO1xuXG4gIHdoaWxlIChpbmRleCA+IDApIHtcbiAgICB2YXIgcGFyZW50SW5kZXggPSBpbmRleCAtIDEgPj4+IDE7XG4gICAgdmFyIHBhcmVudCA9IGhlYXBbcGFyZW50SW5kZXhdO1xuXG4gICAgaWYgKGNvbXBhcmUocGFyZW50LCBub2RlKSA+IDApIHtcbiAgICAgIC8vIFRoZSBwYXJlbnQgaXMgbGFyZ2VyLiBTd2FwIHBvc2l0aW9ucy5cbiAgICAgIGhlYXBbcGFyZW50SW5kZXhdID0gbm9kZTtcbiAgICAgIGhlYXBbaW5kZXhdID0gcGFyZW50O1xuICAgICAgaW5kZXggPSBwYXJlbnRJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHBhcmVudCBpcyBzbWFsbGVyLiBFeGl0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaWZ0RG93bihoZWFwLCBub2RlLCBpKSB7XG4gIHZhciBpbmRleCA9IGk7XG4gIHZhciBsZW5ndGggPSBoZWFwLmxlbmd0aDtcbiAgdmFyIGhhbGZMZW5ndGggPSBsZW5ndGggPj4+IDE7XG5cbiAgd2hpbGUgKGluZGV4IDwgaGFsZkxlbmd0aCkge1xuICAgIHZhciBsZWZ0SW5kZXggPSAoaW5kZXggKyAxKSAqIDIgLSAxO1xuICAgIHZhciBsZWZ0ID0gaGVhcFtsZWZ0SW5kZXhdO1xuICAgIHZhciByaWdodEluZGV4ID0gbGVmdEluZGV4ICsgMTtcbiAgICB2YXIgcmlnaHQgPSBoZWFwW3JpZ2h0SW5kZXhdOyAvLyBJZiB0aGUgbGVmdCBvciByaWdodCBub2RlIGlzIHNtYWxsZXIsIHN3YXAgd2l0aCB0aGUgc21hbGxlciBvZiB0aG9zZS5cblxuICAgIGlmIChjb21wYXJlKGxlZnQsIG5vZGUpIDwgMCkge1xuICAgICAgaWYgKHJpZ2h0SW5kZXggPCBsZW5ndGggJiYgY29tcGFyZShyaWdodCwgbGVmdCkgPCAwKSB7XG4gICAgICAgIGhlYXBbaW5kZXhdID0gcmlnaHQ7XG4gICAgICAgIGhlYXBbcmlnaHRJbmRleF0gPSBub2RlO1xuICAgICAgICBpbmRleCA9IHJpZ2h0SW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoZWFwW2luZGV4XSA9IGxlZnQ7XG4gICAgICAgIGhlYXBbbGVmdEluZGV4XSA9IG5vZGU7XG4gICAgICAgIGluZGV4ID0gbGVmdEluZGV4O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmlnaHRJbmRleCA8IGxlbmd0aCAmJiBjb21wYXJlKHJpZ2h0LCBub2RlKSA8IDApIHtcbiAgICAgIGhlYXBbaW5kZXhdID0gcmlnaHQ7XG4gICAgICBoZWFwW3JpZ2h0SW5kZXhdID0gbm9kZTtcbiAgICAgIGluZGV4ID0gcmlnaHRJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmVpdGhlciBjaGlsZCBpcyBzbWFsbGVyLiBFeGl0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgLy8gQ29tcGFyZSBzb3J0IGluZGV4IGZpcnN0LCB0aGVuIHRhc2sgaWQuXG4gIHZhciBkaWZmID0gYS5zb3J0SW5kZXggLSBiLnNvcnRJbmRleDtcbiAgcmV0dXJuIGRpZmYgIT09IDAgPyBkaWZmIDogYS5pZCAtIGIuaWQ7XG59XG5cbi8vIFRPRE86IFVzZSBzeW1ib2xzP1xudmFyIEltbWVkaWF0ZVByaW9yaXR5ID0gMTtcbnZhciBVc2VyQmxvY2tpbmdQcmlvcml0eSA9IDI7XG52YXIgTm9ybWFsUHJpb3JpdHkgPSAzO1xudmFyIExvd1ByaW9yaXR5ID0gNDtcbnZhciBJZGxlUHJpb3JpdHkgPSA1O1xuXG5mdW5jdGlvbiBtYXJrVGFza0Vycm9yZWQodGFzaywgbXMpIHtcbn1cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG5cbnZhciBoYXNQZXJmb3JtYW5jZU5vdyA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLm5vdyA9PT0gJ2Z1bmN0aW9uJztcblxuaWYgKGhhc1BlcmZvcm1hbmNlTm93KSB7XG4gIHZhciBsb2NhbFBlcmZvcm1hbmNlID0gcGVyZm9ybWFuY2U7XG5cbiAgZXhwb3J0cy51bnN0YWJsZV9ub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGxvY2FsUGVyZm9ybWFuY2Uubm93KCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgbG9jYWxEYXRlID0gRGF0ZTtcbiAgdmFyIGluaXRpYWxUaW1lID0gbG9jYWxEYXRlLm5vdygpO1xuXG4gIGV4cG9ydHMudW5zdGFibGVfbm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBsb2NhbERhdGUubm93KCkgLSBpbml0aWFsVGltZTtcbiAgfTtcbn0gLy8gTWF4IDMxIGJpdCBpbnRlZ2VyLiBUaGUgbWF4IGludGVnZXIgc2l6ZSBpbiBWOCBmb3IgMzItYml0IHN5c3RlbXMuXG4vLyBNYXRoLnBvdygyLCAzMCkgLSAxXG4vLyAwYjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMVxuXG5cbnZhciBtYXhTaWduZWQzMUJpdEludCA9IDEwNzM3NDE4MjM7IC8vIFRpbWVzIG91dCBpbW1lZGlhdGVseVxuXG52YXIgSU1NRURJQVRFX1BSSU9SSVRZX1RJTUVPVVQgPSAtMTsgLy8gRXZlbnR1YWxseSB0aW1lcyBvdXRcblxudmFyIFVTRVJfQkxPQ0tJTkdfUFJJT1JJVFlfVElNRU9VVCA9IDI1MDtcbnZhciBOT1JNQUxfUFJJT1JJVFlfVElNRU9VVCA9IDUwMDA7XG52YXIgTE9XX1BSSU9SSVRZX1RJTUVPVVQgPSAxMDAwMDsgLy8gTmV2ZXIgdGltZXMgb3V0XG5cbnZhciBJRExFX1BSSU9SSVRZX1RJTUVPVVQgPSBtYXhTaWduZWQzMUJpdEludDsgLy8gVGFza3MgYXJlIHN0b3JlZCBvbiBhIG1pbiBoZWFwXG5cbnZhciB0YXNrUXVldWUgPSBbXTtcbnZhciB0aW1lclF1ZXVlID0gW107IC8vIEluY3JlbWVudGluZyBpZCBjb3VudGVyLiBVc2VkIHRvIG1haW50YWluIGluc2VydGlvbiBvcmRlci5cblxudmFyIHRhc2tJZENvdW50ZXIgPSAxOyAvLyBQYXVzaW5nIHRoZSBzY2hlZHVsZXIgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG52YXIgY3VycmVudFRhc2sgPSBudWxsO1xudmFyIGN1cnJlbnRQcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7IC8vIFRoaXMgaXMgc2V0IHdoaWxlIHBlcmZvcm1pbmcgd29yaywgdG8gcHJldmVudCByZS1lbnRyYW5jZS5cblxudmFyIGlzUGVyZm9ybWluZ1dvcmsgPSBmYWxzZTtcbnZhciBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IGZhbHNlO1xudmFyIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTsgLy8gQ2FwdHVyZSBsb2NhbCByZWZlcmVuY2VzIHRvIG5hdGl2ZSBBUElzLCBpbiBjYXNlIGEgcG9seWZpbGwgb3ZlcnJpZGVzIHRoZW0uXG5cbnZhciBsb2NhbFNldFRpbWVvdXQgPSB0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IHNldFRpbWVvdXQgOiBudWxsO1xudmFyIGxvY2FsQ2xlYXJUaW1lb3V0ID0gdHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IGNsZWFyVGltZW91dCA6IG51bGw7XG52YXIgbG9jYWxTZXRJbW1lZGlhdGUgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJyA/IHNldEltbWVkaWF0ZSA6IG51bGw7IC8vIElFIGFuZCBOb2RlLmpzICsganNkb21cblxudmFyIGlzSW5wdXRQZW5kaW5nID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnNjaGVkdWxpbmcgIT09IHVuZGVmaW5lZCAmJiBuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZyAhPT0gdW5kZWZpbmVkID8gbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcuYmluZChuYXZpZ2F0b3Iuc2NoZWR1bGluZykgOiBudWxsO1xuXG5mdW5jdGlvbiBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKSB7XG4gIC8vIENoZWNrIGZvciB0YXNrcyB0aGF0IGFyZSBubyBsb25nZXIgZGVsYXllZCBhbmQgYWRkIHRoZW0gdG8gdGhlIHF1ZXVlLlxuICB2YXIgdGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuXG4gIHdoaWxlICh0aW1lciAhPT0gbnVsbCkge1xuICAgIGlmICh0aW1lci5jYWxsYmFjayA9PT0gbnVsbCkge1xuICAgICAgLy8gVGltZXIgd2FzIGNhbmNlbGxlZC5cbiAgICAgIHBvcCh0aW1lclF1ZXVlKTtcbiAgICB9IGVsc2UgaWYgKHRpbWVyLnN0YXJ0VGltZSA8PSBjdXJyZW50VGltZSkge1xuICAgICAgLy8gVGltZXIgZmlyZWQuIFRyYW5zZmVyIHRvIHRoZSB0YXNrIHF1ZXVlLlxuICAgICAgcG9wKHRpbWVyUXVldWUpO1xuICAgICAgdGltZXIuc29ydEluZGV4ID0gdGltZXIuZXhwaXJhdGlvblRpbWU7XG4gICAgICBwdXNoKHRhc2tRdWV1ZSwgdGltZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZW1haW5pbmcgdGltZXJzIGFyZSBwZW5kaW5nLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVUaW1lb3V0KGN1cnJlbnRUaW1lKSB7XG4gIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTtcbiAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG5cbiAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCkge1xuICAgIGlmIChwZWVrKHRhc2tRdWV1ZSkgIT09IG51bGwpIHtcbiAgICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGZpcnN0VGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuXG4gICAgICBpZiAoZmlyc3RUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgZmlyc3RUaW1lci5zdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoV29yayhoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSkge1xuXG5cbiAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSBmYWxzZTtcblxuICBpZiAoaXNIb3N0VGltZW91dFNjaGVkdWxlZCkge1xuICAgIC8vIFdlIHNjaGVkdWxlZCBhIHRpbWVvdXQgYnV0IGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZC4gQ2FuY2VsIGl0LlxuICAgIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICBjYW5jZWxIb3N0VGltZW91dCgpO1xuICB9XG5cbiAgaXNQZXJmb3JtaW5nV29yayA9IHRydWU7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcblxuICB0cnkge1xuICAgIGlmIChlbmFibGVQcm9maWxpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB3b3JrTG9vcChoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoY3VycmVudFRhc2sgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuICAgICAgICAgIG1hcmtUYXNrRXJyb3JlZChjdXJyZW50VGFzaywgY3VycmVudFRpbWUpO1xuICAgICAgICAgIGN1cnJlbnRUYXNrLmlzUXVldWVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gY2F0Y2ggaW4gcHJvZCBjb2RlIHBhdGguXG4gICAgICByZXR1cm4gd29ya0xvb3AoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50VGFzayA9IG51bGw7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gICAgaXNQZXJmb3JtaW5nV29yayA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdvcmtMb29wKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKSB7XG4gIHZhciBjdXJyZW50VGltZSA9IGluaXRpYWxUaW1lO1xuICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcbiAgY3VycmVudFRhc2sgPSBwZWVrKHRhc2tRdWV1ZSk7XG5cbiAgd2hpbGUgKGN1cnJlbnRUYXNrICE9PSBudWxsICYmICEoZW5hYmxlU2NoZWR1bGVyRGVidWdnaW5nICkpIHtcbiAgICBpZiAoY3VycmVudFRhc2suZXhwaXJhdGlvblRpbWUgPiBjdXJyZW50VGltZSAmJiAoIWhhc1RpbWVSZW1haW5pbmcgfHwgc2hvdWxkWWllbGRUb0hvc3QoKSkpIHtcbiAgICAgIC8vIFRoaXMgY3VycmVudFRhc2sgaGFzbid0IGV4cGlyZWQsIGFuZCB3ZSd2ZSByZWFjaGVkIHRoZSBkZWFkbGluZS5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBjYWxsYmFjayA9IGN1cnJlbnRUYXNrLmNhbGxiYWNrO1xuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBudWxsO1xuICAgICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBjdXJyZW50VGFzay5wcmlvcml0eUxldmVsO1xuICAgICAgdmFyIGRpZFVzZXJDYWxsYmFja1RpbWVvdXQgPSBjdXJyZW50VGFzay5leHBpcmF0aW9uVGltZSA8PSBjdXJyZW50VGltZTtcblxuICAgICAgdmFyIGNvbnRpbnVhdGlvbkNhbGxiYWNrID0gY2FsbGJhY2soZGlkVXNlckNhbGxiYWNrVGltZW91dCk7XG4gICAgICBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG5cbiAgICAgIGlmICh0eXBlb2YgY29udGludWF0aW9uQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBjb250aW51YXRpb25DYWxsYmFjaztcbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRUYXNrID09PSBwZWVrKHRhc2tRdWV1ZSkpIHtcbiAgICAgICAgICBwb3AodGFza1F1ZXVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9wKHRhc2tRdWV1ZSk7XG4gICAgfVxuXG4gICAgY3VycmVudFRhc2sgPSBwZWVrKHRhc2tRdWV1ZSk7XG4gIH0gLy8gUmV0dXJuIHdoZXRoZXIgdGhlcmUncyBhZGRpdGlvbmFsIHdvcmtcblxuXG4gIGlmIChjdXJyZW50VGFzayAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHZhciBmaXJzdFRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcblxuICAgIGlmIChmaXJzdFRpbWVyICE9PSBudWxsKSB7XG4gICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgZmlyc3RUaW1lci5zdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3J1bldpdGhQcmlvcml0eShwcmlvcml0eUxldmVsLCBldmVudEhhbmRsZXIpIHtcbiAgc3dpdGNoIChwcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgY2FzZSBMb3dQcmlvcml0eTpcbiAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgfVxuXG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmlvcml0eUxldmVsO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGV2ZW50SGFuZGxlcigpO1xuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX25leHQoZXZlbnRIYW5kbGVyKSB7XG4gIHZhciBwcmlvcml0eUxldmVsO1xuXG4gIHN3aXRjaCAoY3VycmVudFByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICAgIC8vIFNoaWZ0IGRvd24gdG8gbm9ybWFsIHByaW9yaXR5XG4gICAgICBwcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBBbnl0aGluZyBsb3dlciB0aGFuIG5vcm1hbCBwcmlvcml0eSBzaG91bGQgcmVtYWluIGF0IHRoZSBjdXJyZW50IGxldmVsLlxuICAgICAgcHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcblxuICB0cnkge1xuICAgIHJldHVybiBldmVudEhhbmRsZXIoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV93cmFwQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgdmFyIHBhcmVudFByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUaGlzIGlzIGEgZm9yayBvZiBydW5XaXRoUHJpb3JpdHksIGlubGluZWQgZm9yIHBlcmZvcm1hbmNlLlxuICAgIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHBhcmVudFByaW9yaXR5TGV2ZWw7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhwcmlvcml0eUxldmVsLCBjYWxsYmFjaywgb3B0aW9ucykge1xuICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuICB2YXIgc3RhcnRUaW1lO1xuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyAhPT0gbnVsbCkge1xuICAgIHZhciBkZWxheSA9IG9wdGlvbnMuZGVsYXk7XG5cbiAgICBpZiAodHlwZW9mIGRlbGF5ID09PSAnbnVtYmVyJyAmJiBkZWxheSA+IDApIHtcbiAgICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lICsgZGVsYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZTtcbiAgfVxuXG4gIHZhciB0aW1lb3V0O1xuXG4gIHN3aXRjaCAocHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gSU1NRURJQVRFX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gVVNFUl9CTE9DS0lOR19QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBJRExFX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgTG93UHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gTE9XX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgZGVmYXVsdDpcbiAgICAgIHRpbWVvdXQgPSBOT1JNQUxfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdmFyIGV4cGlyYXRpb25UaW1lID0gc3RhcnRUaW1lICsgdGltZW91dDtcbiAgdmFyIG5ld1Rhc2sgPSB7XG4gICAgaWQ6IHRhc2tJZENvdW50ZXIrKyxcbiAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgcHJpb3JpdHlMZXZlbDogcHJpb3JpdHlMZXZlbCxcbiAgICBzdGFydFRpbWU6IHN0YXJ0VGltZSxcbiAgICBleHBpcmF0aW9uVGltZTogZXhwaXJhdGlvblRpbWUsXG4gICAgc29ydEluZGV4OiAtMVxuICB9O1xuXG4gIGlmIChzdGFydFRpbWUgPiBjdXJyZW50VGltZSkge1xuICAgIC8vIFRoaXMgaXMgYSBkZWxheWVkIHRhc2suXG4gICAgbmV3VGFzay5zb3J0SW5kZXggPSBzdGFydFRpbWU7XG4gICAgcHVzaCh0aW1lclF1ZXVlLCBuZXdUYXNrKTtcblxuICAgIGlmIChwZWVrKHRhc2tRdWV1ZSkgPT09IG51bGwgJiYgbmV3VGFzayA9PT0gcGVlayh0aW1lclF1ZXVlKSkge1xuICAgICAgLy8gQWxsIHRhc2tzIGFyZSBkZWxheWVkLCBhbmQgdGhpcyBpcyB0aGUgdGFzayB3aXRoIHRoZSBlYXJsaWVzdCBkZWxheS5cbiAgICAgIGlmIChpc0hvc3RUaW1lb3V0U2NoZWR1bGVkKSB7XG4gICAgICAgIC8vIENhbmNlbCBhbiBleGlzdGluZyB0aW1lb3V0LlxuICAgICAgICBjYW5jZWxIb3N0VGltZW91dCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IHRydWU7XG4gICAgICB9IC8vIFNjaGVkdWxlIGEgdGltZW91dC5cblxuXG4gICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgc3RhcnRUaW1lIC0gY3VycmVudFRpbWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXdUYXNrLnNvcnRJbmRleCA9IGV4cGlyYXRpb25UaW1lO1xuICAgIHB1c2godGFza1F1ZXVlLCBuZXdUYXNrKTtcbiAgICAvLyB3YWl0IHVudGlsIHRoZSBuZXh0IHRpbWUgd2UgeWllbGQuXG5cblxuICAgIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgJiYgIWlzUGVyZm9ybWluZ1dvcmspIHtcbiAgICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3VGFzaztcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfcGF1c2VFeGVjdXRpb24oKSB7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uKCkge1xuXG4gIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgJiYgIWlzUGVyZm9ybWluZ1dvcmspIHtcbiAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgcmVxdWVzdEhvc3RDYWxsYmFjayhmbHVzaFdvcmspO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlKCkge1xuICByZXR1cm4gcGVlayh0YXNrUXVldWUpO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9jYW5jZWxDYWxsYmFjayh0YXNrKSB7XG4gIC8vIHJlbW92ZSBmcm9tIHRoZSBxdWV1ZSBiZWNhdXNlIHlvdSBjYW4ndCByZW1vdmUgYXJiaXRyYXJ5IG5vZGVzIGZyb20gYW5cbiAgLy8gYXJyYXkgYmFzZWQgaGVhcCwgb25seSB0aGUgZmlyc3Qgb25lLilcblxuXG4gIHRhc2suY2FsbGJhY2sgPSBudWxsO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCgpIHtcbiAgcmV0dXJuIGN1cnJlbnRQcmlvcml0eUxldmVsO1xufVxuXG52YXIgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSBmYWxzZTtcbnZhciBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBudWxsO1xudmFyIHRhc2tUaW1lb3V0SUQgPSAtMTsgLy8gU2NoZWR1bGVyIHBlcmlvZGljYWxseSB5aWVsZHMgaW4gY2FzZSB0aGVyZSBpcyBvdGhlciB3b3JrIG9uIHRoZSBtYWluXG4vLyB0aHJlYWQsIGxpa2UgdXNlciBldmVudHMuIEJ5IGRlZmF1bHQsIGl0IHlpZWxkcyBtdWx0aXBsZSB0aW1lcyBwZXIgZnJhbWUuXG4vLyBJdCBkb2VzIG5vdCBhdHRlbXB0IHRvIGFsaWduIHdpdGggZnJhbWUgYm91bmRhcmllcywgc2luY2UgbW9zdCB0YXNrcyBkb24ndFxuLy8gbmVlZCB0byBiZSBmcmFtZSBhbGlnbmVkOyBmb3IgdGhvc2UgdGhhdCBkbywgdXNlIHJlcXVlc3RBbmltYXRpb25GcmFtZS5cblxudmFyIGZyYW1lSW50ZXJ2YWwgPSBmcmFtZVlpZWxkTXM7XG52YXIgc3RhcnRUaW1lID0gLTE7XG5cbmZ1bmN0aW9uIHNob3VsZFlpZWxkVG9Ib3N0KCkge1xuICB2YXIgdGltZUVsYXBzZWQgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpIC0gc3RhcnRUaW1lO1xuXG4gIGlmICh0aW1lRWxhcHNlZCA8IGZyYW1lSW50ZXJ2YWwpIHtcbiAgICAvLyBUaGUgbWFpbiB0aHJlYWQgaGFzIG9ubHkgYmVlbiBibG9ja2VkIGZvciBhIHJlYWxseSBzaG9ydCBhbW91bnQgb2YgdGltZTtcbiAgICAvLyBzbWFsbGVyIHRoYW4gYSBzaW5nbGUgZnJhbWUuIERvbid0IHlpZWxkIHlldC5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gVGhlIG1haW4gdGhyZWFkIGhhcyBiZWVuIGJsb2NrZWQgZm9yIGEgbm9uLW5lZ2xpZ2libGUgYW1vdW50IG9mIHRpbWUuIFdlXG5cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdFBhaW50KCkge1xuXG59XG5cbmZ1bmN0aW9uIGZvcmNlRnJhbWVSYXRlKGZwcykge1xuICBpZiAoZnBzIDwgMCB8fCBmcHMgPiAxMjUpIHtcbiAgICAvLyBVc2luZyBjb25zb2xlWydlcnJvciddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcbiAgICBjb25zb2xlWydlcnJvciddKCdmb3JjZUZyYW1lUmF0ZSB0YWtlcyBhIHBvc2l0aXZlIGludCBiZXR3ZWVuIDAgYW5kIDEyNSwgJyArICdmb3JjaW5nIGZyYW1lIHJhdGVzIGhpZ2hlciB0aGFuIDEyNSBmcHMgaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChmcHMgPiAwKSB7XG4gICAgZnJhbWVJbnRlcnZhbCA9IE1hdGguZmxvb3IoMTAwMCAvIGZwcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVzZXQgdGhlIGZyYW1lcmF0ZVxuICAgIGZyYW1lSW50ZXJ2YWwgPSBmcmFtZVlpZWxkTXM7XG4gIH1cbn1cblxudmFyIHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHNjaGVkdWxlZEhvc3RDYWxsYmFjayAhPT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7IC8vIEtlZXAgdHJhY2sgb2YgdGhlIHN0YXJ0IHRpbWUgc28gd2UgY2FuIG1lYXN1cmUgaG93IGxvbmcgdGhlIG1haW4gdGhyZWFkXG4gICAgLy8gaGFzIGJlZW4gYmxvY2tlZC5cblxuICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgIHZhciBoYXNUaW1lUmVtYWluaW5nID0gdHJ1ZTsgLy8gSWYgYSBzY2hlZHVsZXIgdGFzayB0aHJvd3MsIGV4aXQgdGhlIGN1cnJlbnQgYnJvd3NlciB0YXNrIHNvIHRoZVxuICAgIC8vIGVycm9yIGNhbiBiZSBvYnNlcnZlZC5cbiAgICAvL1xuICAgIC8vIEludGVudGlvbmFsbHkgbm90IHVzaW5nIGEgdHJ5LWNhdGNoLCBzaW5jZSB0aGF0IG1ha2VzIHNvbWUgZGVidWdnaW5nXG4gICAgLy8gdGVjaG5pcXVlcyBoYXJkZXIuIEluc3RlYWQsIGlmIGBzY2hlZHVsZWRIb3N0Q2FsbGJhY2tgIGVycm9ycywgdGhlblxuICAgIC8vIGBoYXNNb3JlV29ya2Agd2lsbCByZW1haW4gdHJ1ZSwgYW5kIHdlJ2xsIGNvbnRpbnVlIHRoZSB3b3JrIGxvb3AuXG5cbiAgICB2YXIgaGFzTW9yZVdvcmsgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGhhc01vcmVXb3JrID0gc2NoZWR1bGVkSG9zdENhbGxiYWNrKGhhc1RpbWVSZW1haW5pbmcsIGN1cnJlbnRUaW1lKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGhhc01vcmVXb3JrKSB7XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgbW9yZSB3b3JrLCBzY2hlZHVsZSB0aGUgbmV4dCBtZXNzYWdlIGV2ZW50IGF0IHRoZSBlbmRcbiAgICAgICAgLy8gb2YgdGhlIHByZWNlZGluZyBvbmUuXG4gICAgICAgIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlO1xuICAgICAgICBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlO1xuICB9IC8vIFlpZWxkaW5nIHRvIHRoZSBicm93c2VyIHdpbGwgZ2l2ZSBpdCBhIGNoYW5jZSB0byBwYWludCwgc28gd2UgY2FuXG59O1xuXG52YXIgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmU7XG5cbmlmICh0eXBlb2YgbG9jYWxTZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gTm9kZS5qcyBhbmQgb2xkIElFLlxuICAvLyBUaGVyZSdzIGEgZmV3IHJlYXNvbnMgZm9yIHdoeSB3ZSBwcmVmZXIgc2V0SW1tZWRpYXRlLlxuICAvL1xuICAvLyBVbmxpa2UgTWVzc2FnZUNoYW5uZWwsIGl0IGRvZXNuJ3QgcHJldmVudCBhIE5vZGUuanMgcHJvY2VzcyBmcm9tIGV4aXRpbmcuXG4gIC8vIChFdmVuIHRob3VnaCB0aGlzIGlzIGEgRE9NIGZvcmsgb2YgdGhlIFNjaGVkdWxlciwgeW91IGNvdWxkIGdldCBoZXJlXG4gIC8vIHdpdGggYSBtaXggb2YgTm9kZS5qcyAxNSssIHdoaWNoIGhhcyBhIE1lc3NhZ2VDaGFubmVsLCBhbmQganNkb20uKVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIwNzU2XG4gIC8vXG4gIC8vIEJ1dCBhbHNvLCBpdCBydW5zIGVhcmxpZXIgd2hpY2ggaXMgdGhlIHNlbWFudGljIHdlIHdhbnQuXG4gIC8vIElmIG90aGVyIGJyb3dzZXJzIGV2ZXIgaW1wbGVtZW50IGl0LCBpdCdzIGJldHRlciB0byB1c2UgaXQuXG4gIC8vIEFsdGhvdWdoIGJvdGggb2YgdGhlc2Ugd291bGQgYmUgaW5mZXJpb3IgdG8gbmF0aXZlIHNjaGVkdWxpbmcuXG4gIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lID0gZnVuY3Rpb24gKCkge1xuICAgIGxvY2FsU2V0SW1tZWRpYXRlKHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSk7XG4gIH07XG59IGVsc2UgaWYgKHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy8gRE9NIGFuZCBXb3JrZXIgZW52aXJvbm1lbnRzLlxuICAvLyBXZSBwcmVmZXIgTWVzc2FnZUNoYW5uZWwgYmVjYXVzZSBvZiB0aGUgNG1zIHNldFRpbWVvdXQgY2xhbXBpbmcuXG4gIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gIHZhciBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBwZXJmb3JtV29ya1VudGlsRGVhZGxpbmU7XG5cbiAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcG9ydC5wb3N0TWVzc2FnZShudWxsKTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIFdlIHNob3VsZCBvbmx5IGZhbGxiYWNrIGhlcmUgaW4gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRzLlxuICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsb2NhbFNldFRpbWVvdXQocGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lLCAwKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdEhvc3RDYWxsYmFjayhjYWxsYmFjaykge1xuICBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICBpZiAoIWlzTWVzc2FnZUxvb3BSdW5uaW5nKSB7XG4gICAgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSB0cnVlO1xuICAgIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWVzdEhvc3RUaW1lb3V0KGNhbGxiYWNrLCBtcykge1xuICB0YXNrVGltZW91dElEID0gbG9jYWxTZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBjYWxsYmFjayhleHBvcnRzLnVuc3RhYmxlX25vdygpKTtcbiAgfSwgbXMpO1xufVxuXG5mdW5jdGlvbiBjYW5jZWxIb3N0VGltZW91dCgpIHtcbiAgbG9jYWxDbGVhclRpbWVvdXQodGFza1RpbWVvdXRJRCk7XG4gIHRhc2tUaW1lb3V0SUQgPSAtMTtcbn1cblxudmFyIHVuc3RhYmxlX3JlcXVlc3RQYWludCA9IHJlcXVlc3RQYWludDtcbnZhciB1bnN0YWJsZV9Qcm9maWxpbmcgPSAgbnVsbDtcblxuZXhwb3J0cy51bnN0YWJsZV9JZGxlUHJpb3JpdHkgPSBJZGxlUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5ID0gSW1tZWRpYXRlUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX0xvd1ByaW9yaXR5ID0gTG93UHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5ID0gTm9ybWFsUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX1Byb2ZpbGluZyA9IHVuc3RhYmxlX1Byb2ZpbGluZztcbmV4cG9ydHMudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHkgPSBVc2VyQmxvY2tpbmdQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2sgPSB1bnN0YWJsZV9jYW5jZWxDYWxsYmFjaztcbmV4cG9ydHMudW5zdGFibGVfY29udGludWVFeGVjdXRpb24gPSB1bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbjtcbmV4cG9ydHMudW5zdGFibGVfZm9yY2VGcmFtZVJhdGUgPSBmb3JjZUZyYW1lUmF0ZTtcbmV4cG9ydHMudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSB1bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbDtcbmV4cG9ydHMudW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGUgPSB1bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZTtcbmV4cG9ydHMudW5zdGFibGVfbmV4dCA9IHVuc3RhYmxlX25leHQ7XG5leHBvcnRzLnVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uID0gdW5zdGFibGVfcGF1c2VFeGVjdXRpb247XG5leHBvcnRzLnVuc3RhYmxlX3JlcXVlc3RQYWludCA9IHVuc3RhYmxlX3JlcXVlc3RQYWludDtcbmV4cG9ydHMudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5ID0gdW5zdGFibGVfcnVuV2l0aFByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrID0gdW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaztcbmV4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQgPSBzaG91bGRZaWVsZFRvSG9zdDtcbmV4cG9ydHMudW5zdGFibGVfd3JhcENhbGxiYWNrID0gdW5zdGFibGVfd3JhcENhbGxiYWNrO1xuICAgICAgICAgIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgXG4gIH0pKCk7XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vZnJvbnRlbmQvLi4vLi4vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9janMvc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzPyIpOwoKLyoqKi8gfSksCgovKioqLyAiLi4vLi4vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9pbmRleC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi4vLi4vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9pbmRleC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKInVzZSBzdHJpY3QiOwpldmFsKCJcblxuaWYgKGZhbHNlKSB7fSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Nqcy9zY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanMgKi8gXCIuLi8uLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2Nqcy9zY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanNcIik7XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vZnJvbnRlbmQvLi4vLi4vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9pbmRleC5qcz8iKTsKCi8qKiovIH0pLAoKLyoqKi8gIi4va290bGluL2VsaWRlLWZyb250ZW5kLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9rb3RsaW4vZWxpZGUtZnJvbnRlbmQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpldmFsKCJ2YXIgX19XRUJQQUNLX0FNRF9ERUZJTkVfRkFDVE9SWV9fLCBfX1dFQlBBQ0tfQU1EX0RFRklORV9BUlJBWV9fLCBfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXzsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcbiAgaWYgKHRydWUpXG4gICAgIShfX1dFQlBBQ0tfQU1EX0RFRklORV9BUlJBWV9fID0gW2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18oLyohIHJlYWN0ICovIFwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2luZGV4LmpzXCIpLCBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISByZWFjdC1kb20vY2xpZW50ICovIFwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9jbGllbnQuanNcIiksIF9fd2VicGFja19yZXF1aXJlX18oLyohIC4va290bGluLWtvdGxpbi1zdGRsaWItanMtaXIuanMgKi8gXCIuL2tvdGxpbi9rb3RsaW4ta290bGluLXN0ZGxpYi1qcy1pci5qc1wiKSwgX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9rb3RsaW4td3JhcHBlcnMta290bGluLXJlYWN0LWpzLWlyLmpzICovIFwiLi9rb3RsaW4va290bGluLXdyYXBwZXJzLWtvdGxpbi1yZWFjdC1qcy1pci5qc1wiKSwgX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9rb3RsaW4td3JhcHBlcnMta290bGluLXJlYWN0LWRvbS1qcy1pci5qcyAqLyBcIi4va290bGluL2tvdGxpbi13cmFwcGVycy1rb3RsaW4tcmVhY3QtZG9tLWpzLWlyLmpzXCIpXSwgX19XRUJQQUNLX0FNRF9ERUZJTkVfRkFDVE9SWV9fID0gKGZhY3RvcnkpLFxuXHRcdF9fV0VCUEFDS19BTURfREVGSU5FX1JFU1VMVF9fID0gKHR5cGVvZiBfX1dFQlBBQ0tfQU1EX0RFRklORV9GQUNUT1JZX18gPT09ICdmdW5jdGlvbicgP1xuXHRcdChfX1dFQlBBQ0tfQU1EX0RFRklORV9GQUNUT1JZX18uYXBwbHkoZXhwb3J0cywgX19XRUJQQUNLX0FNRF9ERUZJTkVfQVJSQVlfXykpIDogX19XRUJQQUNLX0FNRF9ERUZJTkVfRkFDVE9SWV9fKSxcblx0XHRfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXyAhPT0gdW5kZWZpbmVkICYmIChtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19BTURfREVGSU5FX1JFU1VMVF9fKSk7XG4gIGVsc2Uge31cbn0odGhpcywgZnVuY3Rpb24gKF8sICRtb2R1bGUkcmVhY3QsICRtb2R1bGUkcmVhY3RfZG9tX2NsaWVudF95NXo1ZXUsIGtvdGxpbl9rb3RsaW4sIGtvdGxpbl9vcmdfamV0YnJhaW5zX2tvdGxpbl93cmFwcGVyc19rb3RsaW5fcmVhY3QsIGtvdGxpbl9vcmdfamV0YnJhaW5zX2tvdGxpbl93cmFwcGVyc19rb3RsaW5fcmVhY3RfZG9tKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgLy9yZWdpb24gYmxvY2s6IGltcG9ydHNcbiAgdmFyIEZyYWdtZW50ID0gJG1vZHVsZSRyZWFjdC5GcmFnbWVudDtcbiAgdmFyIGNyZWF0ZVJvb3QgPSAkbW9kdWxlJHJlYWN0X2RvbV9jbGllbnRfeTV6NWV1LmNyZWF0ZVJvb3Q7XG4gIHZhciBoeWRyYXRlUm9vdCA9ICRtb2R1bGUkcmVhY3RfZG9tX2NsaWVudF95NXo1ZXUuaHlkcmF0ZVJvb3Q7XG4gIHZhciBlbnN1cmVOb3ROdWxsID0ga290bGluX2tvdGxpbi4kXyQuZjtcbiAgdmFyIGNyZWF0ZSA9IGtvdGxpbl9vcmdfamV0YnJhaW5zX2tvdGxpbl93cmFwcGVyc19rb3RsaW5fcmVhY3QuJF8kLmI7XG4gIHZhciBVbml0X2dldEluc3RhbmNlID0ga290bGluX2tvdGxpbi4kXyQuYTtcbiAgdmFyIFJlYWN0SFRNTF9nZXRJbnN0YW5jZSA9IGtvdGxpbl9vcmdfamV0YnJhaW5zX2tvdGxpbl93cmFwcGVyc19rb3RsaW5fcmVhY3RfZG9tLiRfJC5hO1xuICB2YXIgRkMgPSBrb3RsaW5fb3JnX2pldGJyYWluc19rb3RsaW5fd3JhcHBlcnNfa290bGluX3JlYWN0LiRfJC5hO1xuICAvL2VuZHJlZ2lvblxuICAvL3JlZ2lvbiBibG9jazogcHJlLWRlY2xhcmF0aW9uXG4gIC8vZW5kcmVnaW9uXG4gIGZ1bmN0aW9uIG1haW4oKSB7XG4gICAgdmFyIHRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyb290Jyk7XG4gICAgdmFyIHRtcDtcbiAgICBpZiAodGFyZ2V0ID09IG51bGwpIHtcbiAgICAgIHZhciBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBlbnN1cmVOb3ROdWxsKGRvY3VtZW50LmJvZHkpLmFwcGVuZENoaWxkKGMpO1xuICAgICAgdG1wID0gYztcbiAgICB9IGVsc2Uge1xuICAgICAgdG1wID0gdGFyZ2V0O1xuICAgIH1cbiAgICB2YXIgY29udGFpbmVyID0gdG1wO1xuICAgIHZhciB0bXBfMCA9IEZyYWdtZW50O1xuICAgIHZhciBhcHBsaWNhdGlvbiA9IGNyZWF0ZSh0bXBfMCwgbWFpbiRsYW1iZGEoKSk7XG4gICAgaWYgKGNvbnRhaW5lci5oYXNBdHRyaWJ1dGUoJ2RhdGEtc2VydmluZy1tb2RlJykgPyBjb250YWluZXIuZ2V0QXR0cmlidXRlKCdkYXRhLXNlcnZpbmctbW9kZScpID09PSAnc3NyJyA6IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLmxvZygnSHlkcmF0aW5nIGNsaWVudC1zaWRlIChTU1IgZmxhZyBmb3VuZCknKTtcbiAgICAgIGh5ZHJhdGVSb290KGNvbnRhaW5lciwgYXBwbGljYXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygnUmVuZGVyaW5nIGNsaWVudC1zaWRlIChubyBTU1IgZmxhZyknKTtcbiAgICAgIGNyZWF0ZVJvb3QoY29udGFpbmVyKS5yZW5kZXIoYXBwbGljYXRpb24pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBtYWluJGxhbWJkYSRsYW1iZGEoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcyRpbnZva2UpIHtcbiAgICAgICR0aGlzJGludm9rZS5tZXNzYWdlID0gJ0hlbGxvLCBFbGlkZSEgVGhpcyBwYWdlIHdhcyBzZXJ2ZWQgb3ZlciBIeWJyaWQgU1NSLic7XG4gICAgICByZXR1cm4gVW5pdF9nZXRJbnN0YW5jZSgpO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gbWFpbiRsYW1iZGEoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcyRjcmVhdGUpIHtcbiAgICAgIHZhciB0bXAgPSBnZXRfU2FtcGxlQXBwKCk7XG4gICAgICAkdGhpcyRjcmVhdGUudyh0bXAsIG1haW4kbGFtYmRhJGxhbWJkYSgpKTtcbiAgICAgIHJldHVybiBVbml0X2dldEluc3RhbmNlKCk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBnZXRfU2FtcGxlQXBwKCkge1xuICAgIGluaXRfcHJvcGVydGllc19TYW1wbGVBcHBfa3RfYTJrMWE1KCk7XG4gICAgcmV0dXJuIFNhbXBsZUFwcDtcbiAgfVxuICB2YXIgU2FtcGxlQXBwO1xuICBmdW5jdGlvbiBTYW1wbGVBcHAkbGFtYmRhJGxhbWJkYSRsYW1iZGEoJHByb3BzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcyRpbnZva2UpIHtcbiAgICAgICR0aGlzJGludm9rZS52KCRwcm9wcy5tZXNzYWdlKTtcbiAgICAgIHJldHVybiBVbml0X2dldEluc3RhbmNlKCk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBTYW1wbGVBcHAkbGFtYmRhJGxhbWJkYSgkcHJvcHMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzJGludm9rZSkge1xuICAgICAgdmFyIHRtcCRyZXQkMjtcbiAgICAgIHtcbiAgICAgICAgdmFyIHRtcCRyZXQkMTtcbiAgICAgICAge1xuICAgICAgICAgIHZhciB0bXAkcmV0JDA7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdG1wJHJldCQwID0gJ3NhbXBsZS1hcHAtY29udGFpbmVyJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdG1wJHJldCQxID0gdG1wJHJldCQwO1xuICAgICAgICB9XG4gICAgICAgIHRtcCRyZXQkMiA9IHRtcCRyZXQkMTtcbiAgICAgIH1cbiAgICAgICR0aGlzJGludm9rZS5jbGFzc05hbWUgPSB0bXAkcmV0JDI7XG4gICAgICB2YXIgdG1wJHJldCQ2O1xuICAgICAge1xuICAgICAgICB2YXIgdG1wMF9fZ2V0X3N0cm9uZ19fOXc0dzg2ID0gUmVhY3RIVE1MX2dldEluc3RhbmNlKCk7XG4gICAgICAgIHZhciB0bXAkcmV0JDU7XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgdG1wJHJldCQ0O1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciB0bXAkcmV0JDM7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRtcCRyZXQkMyA9ICdzdHJvbmcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG1wJHJldCQ0ID0gdG1wJHJldCQzO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0bXAkcmV0JDUgPSB0bXAkcmV0JDQ7XG4gICAgICAgIH1cbiAgICAgICAgdG1wJHJldCQ2ID0gdG1wJHJldCQ1O1xuICAgICAgfVxuICAgICAgdmFyIHRtcCA9IHRtcCRyZXQkNjtcbiAgICAgICR0aGlzJGludm9rZS53KHRtcCwgU2FtcGxlQXBwJGxhbWJkYSRsYW1iZGEkbGFtYmRhKCRwcm9wcykpO1xuICAgICAgcmV0dXJuIFVuaXRfZ2V0SW5zdGFuY2UoKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIFNhbXBsZUFwcCRsYW1iZGEoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcyRGQywgcHJvcHMpIHtcbiAgICAgIHZhciB0bXAkcmV0JDM7XG4gICAgICB7XG4gICAgICAgIHZhciB0bXAwX19nZXRfZGl2X18yazJvOW0gPSBSZWFjdEhUTUxfZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgdmFyIHRtcCRyZXQkMjtcbiAgICAgICAge1xuICAgICAgICAgIHZhciB0bXAkcmV0JDE7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHRtcCRyZXQkMDtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdG1wJHJldCQwID0gJ2Rpdic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0bXAkcmV0JDEgPSB0bXAkcmV0JDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRtcCRyZXQkMiA9IHRtcCRyZXQkMTtcbiAgICAgICAgfVxuICAgICAgICB0bXAkcmV0JDMgPSB0bXAkcmV0JDI7XG4gICAgICB9XG4gICAgICB2YXIgdG1wID0gdG1wJHJldCQzO1xuICAgICAgJHRoaXMkRkMudyh0bXAsIFNhbXBsZUFwcCRsYW1iZGEkbGFtYmRhKHByb3BzKSk7XG4gICAgICByZXR1cm4gVW5pdF9nZXRJbnN0YW5jZSgpO1xuICAgIH07XG4gIH1cbiAgdmFyIHByb3BlcnRpZXNfaW5pdGlhbGl6ZWRfU2FtcGxlQXBwX2t0X3F2bXcyaDtcbiAgZnVuY3Rpb24gaW5pdF9wcm9wZXJ0aWVzX1NhbXBsZUFwcF9rdF9hMmsxYTUoKSB7XG4gICAgaWYgKHByb3BlcnRpZXNfaW5pdGlhbGl6ZWRfU2FtcGxlQXBwX2t0X3F2bXcyaCkge1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wZXJ0aWVzX2luaXRpYWxpemVkX1NhbXBsZUFwcF9rdF9xdm13MmggPSB0cnVlO1xuICAgICAgU2FtcGxlQXBwID0gRkMoU2FtcGxlQXBwJGxhbWJkYSgpKTtcbiAgICB9XG4gIH1cbiAgbWFpbigpO1xuICByZXR1cm4gXztcbn0pKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZWxpZGUtZnJvbnRlbmQuanMubWFwXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2Zyb250ZW5kLy4va290bGluL2VsaWRlLWZyb250ZW5kLmpzPyIpOwoKLyoqKi8gfSksCgovKioqLyAiLi9rb3RsaW4va290bGluLWtvdGxpbi1zdGRsaWItanMtaXIuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL2tvdGxpbi9rb3RsaW4ta290bGluLXN0ZGxpYi1qcy1pci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCmV2YWwoInZhciBfX1dFQlBBQ0tfQU1EX0RFRklORV9GQUNUT1JZX18sIF9fV0VCUEFDS19BTURfREVGSU5FX0FSUkFZX18sIF9fV0VCUEFDS19BTURfREVGSU5FX1JFU1VMVF9fOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuICBpZiAodHJ1ZSlcbiAgICAhKF9fV0VCUEFDS19BTURfREVGSU5FX0FSUkFZX18gPSBbZXhwb3J0c10sIF9fV0VCUEFDS19BTURfREVGSU5FX0ZBQ1RPUllfXyA9IChmYWN0b3J5KSxcblx0XHRfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXyA9ICh0eXBlb2YgX19XRUJQQUNLX0FNRF9ERUZJTkVfRkFDVE9SWV9fID09PSAnZnVuY3Rpb24nID9cblx0XHQoX19XRUJQQUNLX0FNRF9ERUZJTkVfRkFDVE9SWV9fLmFwcGx5KGV4cG9ydHMsIF9fV0VCUEFDS19BTURfREVGSU5FX0FSUkFZX18pKSA6IF9fV0VCUEFDS19BTURfREVGSU5FX0ZBQ1RPUllfXyksXG5cdFx0X19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX18gIT09IHVuZGVmaW5lZCAmJiAobW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXykpO1xuICBlbHNlIHt9XG59KHRoaXMsIGZ1bmN0aW9uIChfKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgLy9yZWdpb24gYmxvY2s6IHByZS1kZWNsYXJhdGlvblxuICBMb25nLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTnVtYmVyXzAucHJvdG90eXBlKTtcbiAgTG9uZy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMb25nO1xuICBFeGNlcHRpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuICBFeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRXhjZXB0aW9uO1xuICBSdW50aW1lRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXhjZXB0aW9uLnByb3RvdHlwZSk7XG4gIFJ1bnRpbWVFeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUnVudGltZUV4Y2VwdGlvbjtcbiAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoUnVudGltZUV4Y2VwdGlvbi5wcm90b3R5cGUpO1xuICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO1xuICBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoUnVudGltZUV4Y2VwdGlvbi5wcm90b3R5cGUpO1xuICBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE5vU3VjaEVsZW1lbnRFeGNlcHRpb247XG4gIE51bGxQb2ludGVyRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoUnVudGltZUV4Y2VwdGlvbi5wcm90b3R5cGUpO1xuICBOdWxsUG9pbnRlckV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbjtcbiAgQ2xhc3NDYXN0RXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoUnVudGltZUV4Y2VwdGlvbi5wcm90b3R5cGUpO1xuICBDbGFzc0Nhc3RFeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2xhc3NDYXN0RXhjZXB0aW9uO1xuICAvL2VuZHJlZ2lvblxuICBmdW5jdGlvbiBpc0VtcHR5KF90aGlzX191OGUzczQpIHtcbiAgICByZXR1cm4gX3RoaXNfX3U4ZTNzNC5sZW5ndGggPT09IDA7XG4gIH1cbiAgZnVuY3Rpb24gc2luZ2xlKF90aGlzX191OGUzczQpIHtcbiAgICB2YXIgdG1wMF9zdWJqZWN0ID0gX3RoaXNfX3U4ZTNzNC5sZW5ndGg7XG4gICAgdmFyIHRtcDtcbiAgICBzd2l0Y2ggKHRtcDBfc3ViamVjdCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICB0aHJvdyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uX2luaXRfJENyZWF0ZSQoJ0FycmF5IGlzIGVtcHR5LicpO1xuICAgICAgY2FzZSAxOlxuICAgICAgICB0bXAgPSBfdGhpc19fdThlM3M0WzBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbl9pbml0XyRDcmVhdGUkKCdBcnJheSBoYXMgbW9yZSB0aGFuIG9uZSBlbGVtZW50LicpO1xuICAgIH1cbiAgICByZXR1cm4gdG1wO1xuICB9XG4gIGZ1bmN0aW9uIGNvbnRyYWN0KGJ1aWxkZXIpIHtcbiAgfVxuICBmdW5jdGlvbiBhcHBseShfdGhpc19fdThlM3M0LCBibG9jaykge1xuICAgIHtcbiAgICB9XG4gICAgYmxvY2soX3RoaXNfX3U4ZTNzNCk7XG4gICAgcmV0dXJuIF90aGlzX191OGUzczQ7XG4gIH1cbiAgZnVuY3Rpb24gQ29tcGFyYWJsZSgpIHtcbiAgfVxuICBDb21wYXJhYmxlLiRtZXRhZGF0YSQgPSBpbnRlcmZhY2VNZXRhKCdDb21wYXJhYmxlJyk7XG4gIGZ1bmN0aW9uIE51bWJlcl8wKCkge1xuICB9XG4gIE51bWJlcl8wLiRtZXRhZGF0YSQgPSBjbGFzc01ldGEoJ051bWJlcicpO1xuICBmdW5jdGlvbiBVbml0KCkge1xuICAgIFVuaXRfaW5zdGFuY2UgPSB0aGlzO1xuICB9XG4gIFVuaXQuJG1ldGFkYXRhJCA9IG9iamVjdE1ldGEoJ1VuaXQnKTtcbiAgdmFyIFVuaXRfaW5zdGFuY2U7XG4gIGZ1bmN0aW9uIFVuaXRfZ2V0SW5zdGFuY2UoKSB7XG4gICAgaWYgKFVuaXRfaW5zdGFuY2UgPT0gbnVsbClcbiAgICAgIG5ldyBVbml0KCk7XG4gICAgcmV0dXJuIFVuaXRfaW5zdGFuY2U7XG4gIH1cbiAgZnVuY3Rpb24gYXNEeW5hbWljKF90aGlzX191OGUzczQpIHtcbiAgICByZXR1cm4gX3RoaXNfX3U4ZTNzNDtcbiAgfVxuICBmdW5jdGlvbiB1bnNhZmVDYXN0RHluYW1pYyhfdGhpc19fdThlM3M0KSB7XG4gICAgcmV0dXJuIF90aGlzX191OGUzczQ7XG4gIH1cbiAgZnVuY3Rpb24gdW5zYWZlQ2FzdChfdGhpc19fdThlM3M0KSB7XG4gICAgdmFyIHRtcCRyZXQkMDtcbiAgICB7XG4gICAgICB0bXAkcmV0JDAgPSBfdGhpc19fdThlM3M0O1xuICAgIH1cbiAgICByZXR1cm4gdG1wJHJldCQwO1xuICB9XG4gIGZ1bmN0aW9uIEVudW0oKSB7XG4gIH1cbiAgRW51bS5wcm90b3R5cGUuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5iXzE7XG4gIH07XG4gIEVudW0ucHJvdG90eXBlLmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY18xO1xuICB9O1xuICBFbnVtLnByb3RvdHlwZS5mID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gICAgcmV0dXJuIGNvbXBhcmVUbyh0aGlzLmNfMSwgb3RoZXIuY18xKTtcbiAgfTtcbiAgRW51bS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gICAgcmV0dXJuIHRoaXMgPT09IG90aGVyO1xuICB9O1xuICBFbnVtLnByb3RvdHlwZS5oYXNoQ29kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaWRlbnRpdHlIYXNoQ29kZSh0aGlzKTtcbiAgfTtcbiAgRW51bS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuYl8xO1xuICB9O1xuICBFbnVtLiRtZXRhZGF0YSQgPSBjbGFzc01ldGEoJ0VudW0nLCBbQ29tcGFyYWJsZV0pO1xuICBmdW5jdGlvbiBhcnJheU9mKGVsZW1lbnRzKSB7XG4gICAgdmFyIHRtcCRyZXQkMTtcbiAgICB7XG4gICAgICB2YXIgdG1wJHJldCQwO1xuICAgICAge1xuICAgICAgICB0bXAkcmV0JDAgPSBlbGVtZW50cztcbiAgICAgIH1cbiAgICAgIHRtcCRyZXQkMSA9IHRtcCRyZXQkMDtcbiAgICB9XG4gICAgcmV0dXJuIHRtcCRyZXQkMTtcbiAgfVxuICBmdW5jdGlvbiBjb21wYXJlVG8oYSwgYikge1xuICAgIHZhciB0bXAwX3N1YmplY3QgPSB0eXBlb2YgYTtcbiAgICB2YXIgdG1wO1xuICAgIHN3aXRjaCAodG1wMF9zdWJqZWN0KSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICB2YXIgdG1wXzA7XG4gICAgICAgIGlmICh0eXBlb2YgYiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0bXBfMCA9IGRvdWJsZUNvbXBhcmVUbyhhLCBiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoYiBpbnN0YW5jZW9mIExvbmcpIHtcbiAgICAgICAgICAgIHRtcF8wID0gZG91YmxlQ29tcGFyZVRvKGEsIGIuaSgpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdG1wXzAgPSBwcmltaXRpdmVDb21wYXJlVG8oYSwgYik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdG1wID0gdG1wXzA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICB0bXAgPSBwcmltaXRpdmVDb21wYXJlVG8oYSwgYik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdG1wID0gY29tcGFyZVRvRG9Ob3RJbnRyaW5zaWNpZnkoYSwgYik7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gdG1wO1xuICB9XG4gIGZ1bmN0aW9uIGRvdWJsZUNvbXBhcmVUbyhhLCBiKSB7XG4gICAgdmFyIHRtcDtcbiAgICBpZiAoYSA8IGIpIHtcbiAgICAgIHRtcCA9IC0xO1xuICAgIH0gZWxzZSBpZiAoYSA+IGIpIHtcbiAgICAgIHRtcCA9IDE7XG4gICAgfSBlbHNlIGlmIChhID09PSBiKSB7XG4gICAgICB2YXIgdG1wXzA7XG4gICAgICBpZiAoYSAhPT0gMCkge1xuICAgICAgICB0bXBfMCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgdG1wJHJldCQwO1xuICAgICAgICB7XG4gICAgICAgICAgdG1wJHJldCQwID0gMTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaWEgPSB0bXAkcmV0JDAgLyBhO1xuICAgICAgICB2YXIgdG1wXzE7XG4gICAgICAgIHZhciB0bXAkcmV0JDE7XG4gICAgICAgIHtcbiAgICAgICAgICB0bXAkcmV0JDEgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpYSA9PT0gdG1wJHJldCQxIC8gYikge1xuICAgICAgICAgIHRtcF8xID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaWEgPCAwKSB7XG4gICAgICAgICAgICB0bXBfMSA9IC0xO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0bXBfMSA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRtcF8wID0gdG1wXzE7XG4gICAgICB9XG4gICAgICB0bXAgPSB0bXBfMDtcbiAgICB9IGVsc2UgaWYgKGEgIT09IGEpIHtcbiAgICAgIHRtcCA9IGIgIT09IGIgPyAwIDogMTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG1wID0gLTE7XG4gICAgfVxuICAgIHJldHVybiB0bXA7XG4gIH1cbiAgZnVuY3Rpb24gcHJpbWl0aXZlQ29tcGFyZVRvKGEsIGIpIHtcbiAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDA7XG4gIH1cbiAgZnVuY3Rpb24gY29tcGFyZVRvRG9Ob3RJbnRyaW5zaWNpZnkoYSwgYikge1xuICAgIHJldHVybiBhLmEoYik7XG4gIH1cbiAgZnVuY3Rpb24gaWRlbnRpdHlIYXNoQ29kZShvYmopIHtcbiAgICByZXR1cm4gZ2V0T2JqZWN0SGFzaENvZGUob2JqKTtcbiAgfVxuICBmdW5jdGlvbiBnZXRPYmplY3RIYXNoQ29kZShvYmopIHtcbiAgICBpZiAoIWpzSW4oJ2tvdGxpbkhhc2hDb2RlVmFsdWUkJywgb2JqKSkge1xuICAgICAgdmFyIGhhc2ggPSBqc0JpdHdpc2VPcihNYXRoLnJhbmRvbSgpICogNC4yOTQ5NjcyOTZFOSwgMCk7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IG5ldyBPYmplY3QoKTtcbiAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBoYXNoO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZmFsc2U7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCAna290bGluSGFzaENvZGVWYWx1ZSQnLCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gICAgdmFyIHRtcCRyZXQkMDtcbiAgICB7XG4gICAgICB2YXIgdG1wMF91bnNhZmVDYXN0ID0gb2JqWydrb3RsaW5IYXNoQ29kZVZhbHVlJCddO1xuICAgICAgdG1wJHJldCQwID0gdG1wMF91bnNhZmVDYXN0O1xuICAgIH1cbiAgICByZXR1cm4gdG1wJHJldCQwO1xuICB9XG4gIGZ1bmN0aW9uIGNhcHR1cmVTdGFjayhpbnN0YW5jZSwgY29uc3RydWN0b3JGdW5jdGlvbikge1xuICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSAhPSBudWxsKSB7XG4gICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShpbnN0YW5jZSwgY29uc3RydWN0b3JGdW5jdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0bXAkcmV0JDA7XG4gICAgICB7XG4gICAgICAgIHRtcCRyZXQkMCA9IGluc3RhbmNlO1xuICAgICAgfVxuICAgICAgdG1wJHJldCQwLnN0YWNrID0gKG5ldyBFcnJvcigpKS5zdGFjaztcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZXh0ZW5kVGhyb3dhYmxlKHRoaXNfLCBtZXNzYWdlLCBjYXVzZSkge1xuICAgIEVycm9yLmNhbGwodGhpc18pO1xuICAgIHNldFByb3BlcnRpZXNUb1Rocm93YWJsZUluc3RhbmNlKHRoaXNfLCBtZXNzYWdlLCBjYXVzZSk7XG4gIH1cbiAgZnVuY3Rpb24gc2V0UHJvcGVydGllc1RvVGhyb3dhYmxlSW5zdGFuY2UodGhpc18sIG1lc3NhZ2UsIGNhdXNlKSB7XG4gICAgaWYgKCFoYXNPd25Qcm90b3R5cGVQcm9wZXJ0eSh0aGlzXywgJ21lc3NhZ2UnKSkge1xuICAgICAgdmFyIHRtcDtcbiAgICAgIGlmIChtZXNzYWdlID09IG51bGwpIHtcbiAgICAgICAgdmFyIHRtcF8wO1xuICAgICAgICBpZiAoIShtZXNzYWdlID09PSBudWxsKSkge1xuICAgICAgICAgIHZhciB0bXAwX3NhZmVfcmVjZWl2ZXIgPSBjYXVzZTtcbiAgICAgICAgICB2YXIgdG1wMV9lbHZpc19saHMgPSB0bXAwX3NhZmVfcmVjZWl2ZXIgPT0gbnVsbCA/IG51bGwgOiB0bXAwX3NhZmVfcmVjZWl2ZXIudG9TdHJpbmcoKTtcbiAgICAgICAgICB0bXBfMCA9IHRtcDFfZWx2aXNfbGhzID09IG51bGwgPyB1bmRlZmluZWQgOiB0bXAxX2VsdmlzX2xocztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0bXBfMCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0bXAgPSB0bXBfMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRtcCA9IG1lc3NhZ2U7XG4gICAgICB9XG4gICAgICB0aGlzXy5tZXNzYWdlID0gdG1wO1xuICAgIH1cbiAgICBpZiAoIWhhc093blByb3RvdHlwZVByb3BlcnR5KHRoaXNfLCAnY2F1c2UnKSkge1xuICAgICAgdGhpc18uY2F1c2UgPSBjYXVzZTtcbiAgICB9XG4gICAgdGhpc18ubmFtZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzXykuY29uc3RydWN0b3IubmFtZTtcbiAgfVxuICBmdW5jdGlvbiBoYXNPd25Qcm90b3R5cGVQcm9wZXJ0eShvLCBuYW1lKSB7XG4gICAgdmFyIHRtcCRyZXQkMDtcbiAgICB7XG4gICAgICB2YXIgdG1wMF91bnNhZmVDYXN0ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pLmhhc093blByb3BlcnR5KG5hbWUpO1xuICAgICAgdG1wJHJldCQwID0gdG1wMF91bnNhZmVDYXN0O1xuICAgIH1cbiAgICByZXR1cm4gdG1wJHJldCQwO1xuICB9XG4gIGZ1bmN0aW9uIGVuc3VyZU5vdE51bGwodikge1xuICAgIHZhciB0bXA7XG4gICAgaWYgKHYgPT0gbnVsbCkge1xuICAgICAgVEhST1dfTlBFKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRtcCA9IHY7XG4gICAgfVxuICAgIHJldHVybiB0bXA7XG4gIH1cbiAgZnVuY3Rpb24gVEhST1dfTlBFKCkge1xuICAgIHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uX2luaXRfJENyZWF0ZSQoKTtcbiAgfVxuICBmdW5jdGlvbiBUSFJPV19DQ0UoKSB7XG4gICAgdGhyb3cgQ2xhc3NDYXN0RXhjZXB0aW9uX2luaXRfJENyZWF0ZSQoKTtcbiAgfVxuICBmdW5jdGlvbiBlbXB0eUFycmF5KCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBmdW5jdGlvbiBDb21wYW5pb24oKSB7XG4gICAgQ29tcGFuaW9uX2luc3RhbmNlID0gdGhpcztcbiAgICB0aGlzLmpfMSA9IG5ldyBMb25nKDAsIC0yMTQ3NDgzNjQ4KTtcbiAgICB0aGlzLmtfMSA9IG5ldyBMb25nKC0xLCAyMTQ3NDgzNjQ3KTtcbiAgICB0aGlzLmxfMSA9IDg7XG4gICAgdGhpcy5tXzEgPSA2NDtcbiAgfVxuICBDb21wYW5pb24uJG1ldGFkYXRhJCA9IG9iamVjdE1ldGEoJ0NvbXBhbmlvbicpO1xuICB2YXIgQ29tcGFuaW9uX2luc3RhbmNlO1xuICBmdW5jdGlvbiBDb21wYW5pb25fZ2V0SW5zdGFuY2UoKSB7XG4gICAgaWYgKENvbXBhbmlvbl9pbnN0YW5jZSA9PSBudWxsKVxuICAgICAgbmV3IENvbXBhbmlvbigpO1xuICAgIHJldHVybiBDb21wYW5pb25faW5zdGFuY2U7XG4gIH1cbiAgZnVuY3Rpb24gTG9uZyhsb3csIGhpZ2gpIHtcbiAgICBDb21wYW5pb25fZ2V0SW5zdGFuY2UoKTtcbiAgICBOdW1iZXJfMC5jYWxsKHRoaXMpO1xuICAgIHRoaXMuZ18xID0gbG93O1xuICAgIHRoaXMuaF8xID0gaGlnaDtcbiAgfVxuICBMb25nLnByb3RvdHlwZS5uID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gICAgcmV0dXJuIGNvbXBhcmUodGhpcywgb3RoZXIpO1xuICB9O1xuICBMb25nLnByb3RvdHlwZS5hID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gICAgcmV0dXJuIHRoaXMubihvdGhlciBpbnN0YW5jZW9mIExvbmcgPyBvdGhlciA6IFRIUk9XX0NDRSgpKTtcbiAgfTtcbiAgTG9uZy5wcm90b3R5cGUubyA9IGZ1bmN0aW9uIChvdGhlcikge1xuICAgIHJldHVybiBhZGQodGhpcywgb3RoZXIpO1xuICB9O1xuICBMb25nLnByb3RvdHlwZS5wID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnEoKS5vKG5ldyBMb25nKDEsIDApKTtcbiAgfTtcbiAgTG9uZy5wcm90b3R5cGUucSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IExvbmcofnRoaXMuZ18xLCB+dGhpcy5oXzEpO1xuICB9O1xuICBMb25nLnByb3RvdHlwZS5pID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0b051bWJlcih0aGlzKTtcbiAgfTtcbiAgTG9uZy5wcm90b3R5cGUudmFsdWVPZiA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5pKCk7XG4gIH07XG4gIExvbmcuJG1ldGFkYXRhJCA9IGNsYXNzTWV0YSgnTG9uZycsIFtDb21wYXJhYmxlXSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgTnVtYmVyXzAucHJvdG90eXBlKTtcbiAgdmFyIFpFUk87XG4gIHZhciBPTkU7XG4gIHZhciBORUdfT05FO1xuICB2YXIgTUFYX1ZBTFVFO1xuICB2YXIgTUlOX1ZBTFVFO1xuICB2YXIgVFdPX1BXUl8yNF87XG4gIGZ1bmN0aW9uIGNvbXBhcmUoX3RoaXNfX3U4ZTNzNCwgb3RoZXIpIHtcbiAgICBpbml0X3Byb3BlcnRpZXNfbG9uZ2pzX2t0X3R0azhydigpO1xuICAgIGlmIChlcXVhbHNMb25nKF90aGlzX191OGUzczQsIG90aGVyKSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHZhciB0aGlzTmVnID0gaXNOZWdhdGl2ZShfdGhpc19fdThlM3M0KTtcbiAgICB2YXIgb3RoZXJOZWcgPSBpc05lZ2F0aXZlKG90aGVyKTtcbiAgICByZXR1cm4gKHRoaXNOZWcgPyAhb3RoZXJOZWcgOiBmYWxzZSkgPyAtMSA6ICghdGhpc05lZyA/IG90aGVyTmVnIDogZmFsc2UpID8gMSA6IGlzTmVnYXRpdmUoc3VidHJhY3QoX3RoaXNfX3U4ZTNzNCwgb3RoZXIpKSA/IC0xIDogMTtcbiAgfVxuICBmdW5jdGlvbiBhZGQoX3RoaXNfX3U4ZTNzNCwgb3RoZXIpIHtcbiAgICBpbml0X3Byb3BlcnRpZXNfbG9uZ2pzX2t0X3R0azhydigpO1xuICAgIHZhciBhNDggPSBfdGhpc19fdThlM3M0LmhfMSA+Pj4gMTYgfCAwO1xuICAgIHZhciBhMzIgPSBfdGhpc19fdThlM3M0LmhfMSAmIDY1NTM1O1xuICAgIHZhciBhMTYgPSBfdGhpc19fdThlM3M0LmdfMSA+Pj4gMTYgfCAwO1xuICAgIHZhciBhMDAgPSBfdGhpc19fdThlM3M0LmdfMSAmIDY1NTM1O1xuICAgIHZhciBiNDggPSBvdGhlci5oXzEgPj4+IDE2IHwgMDtcbiAgICB2YXIgYjMyID0gb3RoZXIuaF8xICYgNjU1MzU7XG4gICAgdmFyIGIxNiA9IG90aGVyLmdfMSA+Pj4gMTYgfCAwO1xuICAgIHZhciBiMDAgPSBvdGhlci5nXzEgJiA2NTUzNTtcbiAgICB2YXIgYzQ4ID0gMDtcbiAgICB2YXIgYzMyID0gMDtcbiAgICB2YXIgYzE2ID0gMDtcbiAgICB2YXIgYzAwID0gMDtcbiAgICBjMDAgPSBjMDAgKyAoYTAwICsgYjAwIHwgMCkgfCAwO1xuICAgIGMxNiA9IGMxNiArIChjMDAgPj4+IDE2IHwgMCkgfCAwO1xuICAgIGMwMCA9IGMwMCAmIDY1NTM1O1xuICAgIGMxNiA9IGMxNiArIChhMTYgKyBiMTYgfCAwKSB8IDA7XG4gICAgYzMyID0gYzMyICsgKGMxNiA+Pj4gMTYgfCAwKSB8IDA7XG4gICAgYzE2ID0gYzE2ICYgNjU1MzU7XG4gICAgYzMyID0gYzMyICsgKGEzMiArIGIzMiB8IDApIHwgMDtcbiAgICBjNDggPSBjNDggKyAoYzMyID4+PiAxNiB8IDApIHwgMDtcbiAgICBjMzIgPSBjMzIgJiA2NTUzNTtcbiAgICBjNDggPSBjNDggKyAoYTQ4ICsgYjQ4IHwgMCkgfCAwO1xuICAgIGM0OCA9IGM0OCAmIDY1NTM1O1xuICAgIHJldHVybiBuZXcgTG9uZyhjMTYgPDwgMTYgfCBjMDAsIGM0OCA8PCAxNiB8IGMzMik7XG4gIH1cbiAgZnVuY3Rpb24gc3VidHJhY3QoX3RoaXNfX3U4ZTNzNCwgb3RoZXIpIHtcbiAgICBpbml0X3Byb3BlcnRpZXNfbG9uZ2pzX2t0X3R0azhydigpO1xuICAgIHJldHVybiBhZGQoX3RoaXNfX3U4ZTNzNCwgb3RoZXIucCgpKTtcbiAgfVxuICBmdW5jdGlvbiB0b051bWJlcihfdGhpc19fdThlM3M0KSB7XG4gICAgaW5pdF9wcm9wZXJ0aWVzX2xvbmdqc19rdF90dGs4cnYoKTtcbiAgICByZXR1cm4gX3RoaXNfX3U4ZTNzNC5oXzEgKiA0LjI5NDk2NzI5NkU5ICsgZ2V0TG93Qml0c1Vuc2lnbmVkKF90aGlzX191OGUzczQpO1xuICB9XG4gIGZ1bmN0aW9uIGVxdWFsc0xvbmcoX3RoaXNfX3U4ZTNzNCwgb3RoZXIpIHtcbiAgICBpbml0X3Byb3BlcnRpZXNfbG9uZ2pzX2t0X3R0azhydigpO1xuICAgIHJldHVybiBfdGhpc19fdThlM3M0LmhfMSA9PT0gb3RoZXIuaF8xID8gX3RoaXNfX3U4ZTNzNC5nXzEgPT09IG90aGVyLmdfMSA6IGZhbHNlO1xuICB9XG4gIGZ1bmN0aW9uIGZyb21JbnQodmFsdWUpIHtcbiAgICBpbml0X3Byb3BlcnRpZXNfbG9uZ2pzX2t0X3R0azhydigpO1xuICAgIHJldHVybiBuZXcgTG9uZyh2YWx1ZSwgdmFsdWUgPCAwID8gLTEgOiAwKTtcbiAgfVxuICBmdW5jdGlvbiBpc05lZ2F0aXZlKF90aGlzX191OGUzczQpIHtcbiAgICBpbml0X3Byb3BlcnRpZXNfbG9uZ2pzX2t0X3R0azhydigpO1xuICAgIHJldHVybiBfdGhpc19fdThlM3M0LmhfMSA8IDA7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0TG93Qml0c1Vuc2lnbmVkKF90aGlzX191OGUzczQpIHtcbiAgICBpbml0X3Byb3BlcnRpZXNfbG9uZ2pzX2t0X3R0azhydigpO1xuICAgIHJldHVybiBfdGhpc19fdThlM3M0LmdfMSA+PSAwID8gX3RoaXNfX3U4ZTNzNC5nXzEgOiA0LjI5NDk2NzI5NkU5ICsgX3RoaXNfX3U4ZTNzNC5nXzE7XG4gIH1cbiAgdmFyIHByb3BlcnRpZXNfaW5pdGlhbGl6ZWRfbG9uZ2pzX2t0XzVhanU3dDtcbiAgZnVuY3Rpb24gaW5pdF9wcm9wZXJ0aWVzX2xvbmdqc19rdF90dGs4cnYoKSB7XG4gICAgaWYgKHByb3BlcnRpZXNfaW5pdGlhbGl6ZWRfbG9uZ2pzX2t0XzVhanU3dCkge1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wZXJ0aWVzX2luaXRpYWxpemVkX2xvbmdqc19rdF81YWp1N3QgPSB0cnVlO1xuICAgICAgWkVSTyA9IGZyb21JbnQoMCk7XG4gICAgICBPTkUgPSBmcm9tSW50KDEpO1xuICAgICAgTkVHX09ORSA9IGZyb21JbnQoLTEpO1xuICAgICAgTUFYX1ZBTFVFID0gbmV3IExvbmcoLTEsIDIxNDc0ODM2NDcpO1xuICAgICAgTUlOX1ZBTFVFID0gbmV3IExvbmcoMCwgLTIxNDc0ODM2NDgpO1xuICAgICAgVFdPX1BXUl8yNF8gPSBmcm9tSW50KDE2Nzc3MjE2KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gY2xhc3NNZXRhKG5hbWUsIGludGVyZmFjZXMsIGFzc29jaWF0ZWRPYmplY3RLZXksIGFzc29jaWF0ZWRPYmplY3RzLCBzdXNwZW5kQXJpdHksIGZhc3RQcm90b3R5cGUpIHtcbiAgICByZXR1cm4gY3JlYXRlTWV0YWRhdGEoJ2NsYXNzJywgbmFtZSwgaW50ZXJmYWNlcywgYXNzb2NpYXRlZE9iamVjdEtleSwgYXNzb2NpYXRlZE9iamVjdHMsIHN1c3BlbmRBcml0eSwgZmFzdFByb3RvdHlwZSk7XG4gIH1cbiAgZnVuY3Rpb24gY3JlYXRlTWV0YWRhdGEoa2luZCwgbmFtZSwgaW50ZXJmYWNlcywgYXNzb2NpYXRlZE9iamVjdEtleSwgYXNzb2NpYXRlZE9iamVjdHMsIHN1c3BlbmRBcml0eSwgZmFzdFByb3RvdHlwZSkge1xuICAgIHJldHVybiB7a2luZDoga2luZCwgc2ltcGxlTmFtZTogbmFtZSwgaW50ZXJmYWNlSWQ6IGtpbmQgPT09ICdpbnRlcmZhY2UnID8gLTEgOiB1bmRlZmluZWQsIGludGVyZmFjZXM6IGludGVyZmFjZXMgfHwgW10sIGFzc29jaWF0ZWRPYmplY3RLZXk6IGFzc29jaWF0ZWRPYmplY3RLZXksIGFzc29jaWF0ZWRPYmplY3RzOiBhc3NvY2lhdGVkT2JqZWN0cywgc3VzcGVuZEFyaXR5OiBzdXNwZW5kQXJpdHksIGZhc3RQcm90b3R5cGU6IGZhc3RQcm90b3R5cGUsICRrQ2xhc3MkOiB1bmRlZmluZWQsIGludGVyZmFjZXNDYWNoZToge2lzQ29tcGxldGU6IGZhc3RQcm90b3R5cGUgPT09IHVuZGVmaW5lZCAmJiAoaW50ZXJmYWNlcyA9PT0gdW5kZWZpbmVkIHx8IGludGVyZmFjZXMubGVuZ3RoID09PSAwKSwgaW1wbGVtZW50SW50ZXJmYWNlTWVtbzoge319fTtcbiAgfVxuICBmdW5jdGlvbiBpbnRlcmZhY2VNZXRhKG5hbWUsIGludGVyZmFjZXMsIGFzc29jaWF0ZWRPYmplY3RLZXksIGFzc29jaWF0ZWRPYmplY3RzLCBzdXNwZW5kQXJpdHkpIHtcbiAgICByZXR1cm4gY3JlYXRlTWV0YWRhdGEoJ2ludGVyZmFjZScsIG5hbWUsIGludGVyZmFjZXMsIGFzc29jaWF0ZWRPYmplY3RLZXksIGFzc29jaWF0ZWRPYmplY3RzLCBzdXNwZW5kQXJpdHksIHVuZGVmaW5lZCk7XG4gIH1cbiAgZnVuY3Rpb24gb2JqZWN0TWV0YShuYW1lLCBpbnRlcmZhY2VzLCBhc3NvY2lhdGVkT2JqZWN0S2V5LCBhc3NvY2lhdGVkT2JqZWN0cywgc3VzcGVuZEFyaXR5LCBmYXN0UHJvdG90eXBlKSB7XG4gICAgcmV0dXJuIGNyZWF0ZU1ldGFkYXRhKCdvYmplY3QnLCBuYW1lLCBpbnRlcmZhY2VzLCBhc3NvY2lhdGVkT2JqZWN0S2V5LCBhc3NvY2lhdGVkT2JqZWN0cywgc3VzcGVuZEFyaXR5LCBmYXN0UHJvdG90eXBlKTtcbiAgfVxuICBmdW5jdGlvbiBFeGNlcHRpb25faW5pdF8kSW5pdCQoJHRoaXMpIHtcbiAgICBleHRlbmRUaHJvd2FibGUoJHRoaXMsIHZvaWQgMSwgdm9pZCAxKTtcbiAgICBFeGNlcHRpb24uY2FsbCgkdGhpcyk7XG4gICAgcmV0dXJuICR0aGlzO1xuICB9XG4gIGZ1bmN0aW9uIEV4Y2VwdGlvbl9pbml0XyRJbml0JF8wKG1lc3NhZ2UsICR0aGlzKSB7XG4gICAgZXh0ZW5kVGhyb3dhYmxlKCR0aGlzLCBtZXNzYWdlLCB2b2lkIDEpO1xuICAgIEV4Y2VwdGlvbi5jYWxsKCR0aGlzKTtcbiAgICByZXR1cm4gJHRoaXM7XG4gIH1cbiAgZnVuY3Rpb24gRXhjZXB0aW9uKCkge1xuICAgIGNhcHR1cmVTdGFjayh0aGlzLCBFeGNlcHRpb24pO1xuICB9XG4gIEV4Y2VwdGlvbi4kbWV0YWRhdGEkID0gY2xhc3NNZXRhKCdFeGNlcHRpb24nLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIEVycm9yLnByb3RvdHlwZSk7XG4gIGZ1bmN0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbl9pbml0XyRJbml0JChtZXNzYWdlLCAkdGhpcykge1xuICAgIFJ1bnRpbWVFeGNlcHRpb25faW5pdF8kSW5pdCRfMChtZXNzYWdlLCAkdGhpcyk7XG4gICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNhbGwoJHRoaXMpO1xuICAgIHJldHVybiAkdGhpcztcbiAgfVxuICBmdW5jdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25faW5pdF8kQ3JlYXRlJChtZXNzYWdlKSB7XG4gICAgdmFyIHRtcCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbl9pbml0XyRJbml0JChtZXNzYWdlLCBPYmplY3QuY3JlYXRlKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5wcm90b3R5cGUpKTtcbiAgICBjYXB0dXJlU3RhY2sodG1wLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25faW5pdF8kQ3JlYXRlJCk7XG4gICAgcmV0dXJuIHRtcDtcbiAgfVxuICBmdW5jdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSB7XG4gICAgY2FwdHVyZVN0YWNrKHRoaXMsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbik7XG4gIH1cbiAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiRtZXRhZGF0YSQgPSBjbGFzc01ldGEoJ0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbicsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgUnVudGltZUV4Y2VwdGlvbi5wcm90b3R5cGUpO1xuICBmdW5jdGlvbiBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uX2luaXRfJEluaXQkKG1lc3NhZ2UsICR0aGlzKSB7XG4gICAgUnVudGltZUV4Y2VwdGlvbl9pbml0XyRJbml0JF8wKG1lc3NhZ2UsICR0aGlzKTtcbiAgICBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLmNhbGwoJHRoaXMpO1xuICAgIHJldHVybiAkdGhpcztcbiAgfVxuICBmdW5jdGlvbiBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uX2luaXRfJENyZWF0ZSQobWVzc2FnZSkge1xuICAgIHZhciB0bXAgPSBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uX2luaXRfJEluaXQkKG1lc3NhZ2UsIE9iamVjdC5jcmVhdGUoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbi5wcm90b3R5cGUpKTtcbiAgICBjYXB0dXJlU3RhY2sodG1wLCBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uX2luaXRfJENyZWF0ZSQpO1xuICAgIHJldHVybiB0bXA7XG4gIH1cbiAgZnVuY3Rpb24gTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHtcbiAgICBjYXB0dXJlU3RhY2sodGhpcywgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbik7XG4gIH1cbiAgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbi4kbWV0YWRhdGEkID0gY2xhc3NNZXRhKCdOb1N1Y2hFbGVtZW50RXhjZXB0aW9uJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBSdW50aW1lRXhjZXB0aW9uLnByb3RvdHlwZSk7XG4gIGZ1bmN0aW9uIFJ1bnRpbWVFeGNlcHRpb25faW5pdF8kSW5pdCQoJHRoaXMpIHtcbiAgICBFeGNlcHRpb25faW5pdF8kSW5pdCQoJHRoaXMpO1xuICAgIFJ1bnRpbWVFeGNlcHRpb24uY2FsbCgkdGhpcyk7XG4gICAgcmV0dXJuICR0aGlzO1xuICB9XG4gIGZ1bmN0aW9uIFJ1bnRpbWVFeGNlcHRpb25faW5pdF8kSW5pdCRfMChtZXNzYWdlLCAkdGhpcykge1xuICAgIEV4Y2VwdGlvbl9pbml0XyRJbml0JF8wKG1lc3NhZ2UsICR0aGlzKTtcbiAgICBSdW50aW1lRXhjZXB0aW9uLmNhbGwoJHRoaXMpO1xuICAgIHJldHVybiAkdGhpcztcbiAgfVxuICBmdW5jdGlvbiBSdW50aW1lRXhjZXB0aW9uKCkge1xuICAgIGNhcHR1cmVTdGFjayh0aGlzLCBSdW50aW1lRXhjZXB0aW9uKTtcbiAgfVxuICBSdW50aW1lRXhjZXB0aW9uLiRtZXRhZGF0YSQgPSBjbGFzc01ldGEoJ1J1bnRpbWVFeGNlcHRpb24nLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIEV4Y2VwdGlvbi5wcm90b3R5cGUpO1xuICBmdW5jdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbl9pbml0XyRJbml0JCgkdGhpcykge1xuICAgIFJ1bnRpbWVFeGNlcHRpb25faW5pdF8kSW5pdCQoJHRoaXMpO1xuICAgIE51bGxQb2ludGVyRXhjZXB0aW9uLmNhbGwoJHRoaXMpO1xuICAgIHJldHVybiAkdGhpcztcbiAgfVxuICBmdW5jdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbl9pbml0XyRDcmVhdGUkKCkge1xuICAgIHZhciB0bXAgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbl9pbml0XyRJbml0JChPYmplY3QuY3JlYXRlKE51bGxQb2ludGVyRXhjZXB0aW9uLnByb3RvdHlwZSkpO1xuICAgIGNhcHR1cmVTdGFjayh0bXAsIE51bGxQb2ludGVyRXhjZXB0aW9uX2luaXRfJENyZWF0ZSQpO1xuICAgIHJldHVybiB0bXA7XG4gIH1cbiAgZnVuY3Rpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24oKSB7XG4gICAgY2FwdHVyZVN0YWNrKHRoaXMsIE51bGxQb2ludGVyRXhjZXB0aW9uKTtcbiAgfVxuICBOdWxsUG9pbnRlckV4Y2VwdGlvbi4kbWV0YWRhdGEkID0gY2xhc3NNZXRhKCdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgUnVudGltZUV4Y2VwdGlvbi5wcm90b3R5cGUpO1xuICBmdW5jdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb25faW5pdF8kSW5pdCQoJHRoaXMpIHtcbiAgICBSdW50aW1lRXhjZXB0aW9uX2luaXRfJEluaXQkKCR0aGlzKTtcbiAgICBDbGFzc0Nhc3RFeGNlcHRpb24uY2FsbCgkdGhpcyk7XG4gICAgcmV0dXJuICR0aGlzO1xuICB9XG4gIGZ1bmN0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbl9pbml0XyRDcmVhdGUkKCkge1xuICAgIHZhciB0bXAgPSBDbGFzc0Nhc3RFeGNlcHRpb25faW5pdF8kSW5pdCQoT2JqZWN0LmNyZWF0ZShDbGFzc0Nhc3RFeGNlcHRpb24ucHJvdG90eXBlKSk7XG4gICAgY2FwdHVyZVN0YWNrKHRtcCwgQ2xhc3NDYXN0RXhjZXB0aW9uX2luaXRfJENyZWF0ZSQpO1xuICAgIHJldHVybiB0bXA7XG4gIH1cbiAgZnVuY3Rpb24gQ2xhc3NDYXN0RXhjZXB0aW9uKCkge1xuICAgIGNhcHR1cmVTdGFjayh0aGlzLCBDbGFzc0Nhc3RFeGNlcHRpb24pO1xuICB9XG4gIENsYXNzQ2FzdEV4Y2VwdGlvbi4kbWV0YWRhdGEkID0gY2xhc3NNZXRhKCdDbGFzc0Nhc3RFeGNlcHRpb24nLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFJ1bnRpbWVFeGNlcHRpb24ucHJvdG90eXBlKTtcbiAgZnVuY3Rpb24ganNJbihsaHNfaGFjaywgcmhzX2hhY2spIHtcbiAgICB2YXIgdG1wJHJldCQwO1xuICAgIHtcbiAgICAgIHZhciB0bXAwX3Vuc2FmZUNhc3QgPSBsaHNfaGFjayBpbiByaHNfaGFjaztcbiAgICAgIHRtcCRyZXQkMCA9IHRtcDBfdW5zYWZlQ2FzdDtcbiAgICB9XG4gICAgcmV0dXJuIHRtcCRyZXQkMDtcbiAgfVxuICBmdW5jdGlvbiBqc0JpdHdpc2VPcihsaHNfaGFjaywgcmhzX2hhY2spIHtcbiAgICB2YXIgdG1wJHJldCQwO1xuICAgIHtcbiAgICAgIHZhciB0bXAwX3Vuc2FmZUNhc3QgPSBsaHNfaGFjayB8IHJoc19oYWNrO1xuICAgICAgdG1wJHJldCQwID0gdG1wMF91bnNhZmVDYXN0O1xuICAgIH1cbiAgICByZXR1cm4gdG1wJHJldCQwO1xuICB9XG4gIGZ1bmN0aW9uIGpzVHlwZU9mKHZhbHVlX2hhY2spIHtcbiAgICB2YXIgdG1wJHJldCQwO1xuICAgIHtcbiAgICAgIHZhciB0bXAwX3Vuc2FmZUNhc3QgPSB0eXBlb2YgdmFsdWVfaGFjaztcbiAgICAgIHRtcCRyZXQkMCA9IHRtcDBfdW5zYWZlQ2FzdDtcbiAgICB9XG4gICAgcmV0dXJuIHRtcCRyZXQkMDtcbiAgfVxuICAvL3JlZ2lvbiBibG9jazogZXhwb3J0c1xuICBfLiRfJCA9IF8uJF8kIHx8IHt9O1xuICBfLiRfJC5hID0gVW5pdF9nZXRJbnN0YW5jZTtcbiAgXy4kXyQuYiA9IHNpbmdsZTtcbiAgXy4kXyQuYyA9IGNsYXNzTWV0YTtcbiAgXy4kXyQuZCA9IGludGVyZmFjZU1ldGE7XG4gIF8uJF8kLmUgPSBvYmplY3RNZXRhO1xuICBfLiRfJC5mID0gZW5zdXJlTm90TnVsbDtcbiAgLy9lbmRyZWdpb25cbiAgcmV0dXJuIF87XG59KSk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWtvdGxpbi1rb3RsaW4tc3RkbGliLWpzLWlyLmpzLm1hcFxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9mcm9udGVuZC8uL2tvdGxpbi9rb3RsaW4ta290bGluLXN0ZGxpYi1qcy1pci5qcz8iKTsKCi8qKiovIH0pLAoKLyoqKi8gIi4va290bGluL2tvdGxpbi13cmFwcGVycy1rb3RsaW4tcmVhY3QtZG9tLWpzLWlyLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9rb3RsaW4va290bGluLXdyYXBwZXJzLWtvdGxpbi1yZWFjdC1kb20tanMtaXIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpldmFsKCJ2YXIgX19XRUJQQUNLX0FNRF9ERUZJTkVfRkFDVE9SWV9fLCBfX1dFQlBBQ0tfQU1EX0RFRklORV9BUlJBWV9fLCBfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXzsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcbiAgaWYgKHRydWUpXG4gICAgIShfX1dFQlBBQ0tfQU1EX0RFRklORV9BUlJBWV9fID0gW2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18oLyohIC4va290bGluLWtvdGxpbi1zdGRsaWItanMtaXIuanMgKi8gXCIuL2tvdGxpbi9rb3RsaW4ta290bGluLXN0ZGxpYi1qcy1pci5qc1wiKV0sIF9fV0VCUEFDS19BTURfREVGSU5FX0ZBQ1RPUllfXyA9IChmYWN0b3J5KSxcblx0XHRfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXyA9ICh0eXBlb2YgX19XRUJQQUNLX0FNRF9ERUZJTkVfRkFDVE9SWV9fID09PSAnZnVuY3Rpb24nID9cblx0XHQoX19XRUJQQUNLX0FNRF9ERUZJTkVfRkFDVE9SWV9fLmFwcGx5KGV4cG9ydHMsIF9fV0VCUEFDS19BTURfREVGSU5FX0FSUkFZX18pKSA6IF9fV0VCUEFDS19BTURfREVGSU5FX0ZBQ1RPUllfXyksXG5cdFx0X19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX18gIT09IHVuZGVmaW5lZCAmJiAobW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXykpO1xuICBlbHNlIHt9XG59KHRoaXMsIGZ1bmN0aW9uIChfLCBrb3RsaW5fa290bGluKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgLy9yZWdpb24gYmxvY2s6IGltcG9ydHNcbiAgdmFyIFVuaXRfZ2V0SW5zdGFuY2UgPSBrb3RsaW5fa290bGluLiRfJC5hO1xuICB2YXIgb2JqZWN0TWV0YSA9IGtvdGxpbl9rb3RsaW4uJF8kLmU7XG4gIC8vZW5kcmVnaW9uXG4gIC8vcmVnaW9uIGJsb2NrOiBwcmUtZGVjbGFyYXRpb25cbiAgLy9lbmRyZWdpb25cbiAgZnVuY3Rpb24gUmVhY3RIVE1MKCkge1xuICAgIFJlYWN0SFRNTF9pbnN0YW5jZSA9IHRoaXM7XG4gIH1cbiAgUmVhY3RIVE1MLnByb3RvdHlwZS54ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0bXAkcmV0JDI7XG4gICAge1xuICAgICAgdmFyIHRtcCRyZXQkMTtcbiAgICAgIHtcbiAgICAgICAgdmFyIHRtcCRyZXQkMDtcbiAgICAgICAge1xuICAgICAgICAgIHRtcCRyZXQkMCA9ICdkaXYnO1xuICAgICAgICB9XG4gICAgICAgIHRtcCRyZXQkMSA9IHRtcCRyZXQkMDtcbiAgICAgIH1cbiAgICAgIHRtcCRyZXQkMiA9IHRtcCRyZXQkMTtcbiAgICB9XG4gICAgcmV0dXJuIHRtcCRyZXQkMjtcbiAgfTtcbiAgUmVhY3RIVE1MLnByb3RvdHlwZS55ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0bXAkcmV0JDI7XG4gICAge1xuICAgICAgdmFyIHRtcCRyZXQkMTtcbiAgICAgIHtcbiAgICAgICAgdmFyIHRtcCRyZXQkMDtcbiAgICAgICAge1xuICAgICAgICAgIHRtcCRyZXQkMCA9ICdzdHJvbmcnO1xuICAgICAgICB9XG4gICAgICAgIHRtcCRyZXQkMSA9IHRtcCRyZXQkMDtcbiAgICAgIH1cbiAgICAgIHRtcCRyZXQkMiA9IHRtcCRyZXQkMTtcbiAgICB9XG4gICAgcmV0dXJuIHRtcCRyZXQkMjtcbiAgfTtcbiAgUmVhY3RIVE1MLiRtZXRhZGF0YSQgPSBvYmplY3RNZXRhKCdSZWFjdEhUTUwnKTtcbiAgdmFyIFJlYWN0SFRNTF9pbnN0YW5jZTtcbiAgZnVuY3Rpb24gUmVhY3RIVE1MX2dldEluc3RhbmNlKCkge1xuICAgIGlmIChSZWFjdEhUTUxfaW5zdGFuY2UgPT0gbnVsbClcbiAgICAgIG5ldyBSZWFjdEhUTUwoKTtcbiAgICByZXR1cm4gUmVhY3RIVE1MX2luc3RhbmNlO1xuICB9XG4gIC8vcmVnaW9uIGJsb2NrOiBleHBvcnRzXG4gIF8uJF8kID0gXy4kXyQgfHwge307XG4gIF8uJF8kLmEgPSBSZWFjdEhUTUxfZ2V0SW5zdGFuY2U7XG4gIC8vZW5kcmVnaW9uXG4gIHJldHVybiBfO1xufSkpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1rb3RsaW4td3JhcHBlcnMta290bGluLXJlYWN0LWRvbS1qcy1pci5qcy5tYXBcblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vZnJvbnRlbmQvLi9rb3RsaW4va290bGluLXdyYXBwZXJzLWtvdGxpbi1yZWFjdC1kb20tanMtaXIuanM/Iik7CgovKioqLyB9KSwKCi8qKiovICIuL2tvdGxpbi9rb3RsaW4td3JhcHBlcnMta290bGluLXJlYWN0LWpzLWlyLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL2tvdGxpbi9rb3RsaW4td3JhcHBlcnMta290bGluLXJlYWN0LWpzLWlyLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpldmFsKCJ2YXIgX19XRUJQQUNLX0FNRF9ERUZJTkVfRkFDVE9SWV9fLCBfX1dFQlBBQ0tfQU1EX0RFRklORV9BUlJBWV9fLCBfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXzsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcbiAgaWYgKHRydWUpXG4gICAgIShfX1dFQlBBQ0tfQU1EX0RFRklORV9BUlJBWV9fID0gW2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18oLyohIHJlYWN0ICovIFwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2luZGV4LmpzXCIpLCBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2tvdGxpbi1rb3RsaW4tc3RkbGliLWpzLWlyLmpzICovIFwiLi9rb3RsaW4va290bGluLWtvdGxpbi1zdGRsaWItanMtaXIuanNcIildLCBfX1dFQlBBQ0tfQU1EX0RFRklORV9GQUNUT1JZX18gPSAoZmFjdG9yeSksXG5cdFx0X19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX18gPSAodHlwZW9mIF9fV0VCUEFDS19BTURfREVGSU5FX0ZBQ1RPUllfXyA9PT0gJ2Z1bmN0aW9uJyA/XG5cdFx0KF9fV0VCUEFDS19BTURfREVGSU5FX0ZBQ1RPUllfXy5hcHBseShleHBvcnRzLCBfX1dFQlBBQ0tfQU1EX0RFRklORV9BUlJBWV9fKSkgOiBfX1dFQlBBQ0tfQU1EX0RFRklORV9GQUNUT1JZX18pLFxuXHRcdF9fV0VCUEFDS19BTURfREVGSU5FX1JFU1VMVF9fICE9PSB1bmRlZmluZWQgJiYgKG1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX18pKTtcbiAgZWxzZSB7fVxufSh0aGlzLCBmdW5jdGlvbiAoXywgJG1vZHVsZSRyZWFjdCwga290bGluX2tvdGxpbikge1xuICAndXNlIHN0cmljdCc7XG4gIC8vcmVnaW9uIGJsb2NrOiBpbXBvcnRzXG4gIHZhciBjcmVhdGVFbGVtZW50ID0gJG1vZHVsZSRyZWFjdC5jcmVhdGVFbGVtZW50O1xuICB2YXIgaXNWYWxpZEVsZW1lbnQgPSAkbW9kdWxlJHJlYWN0LmlzVmFsaWRFbGVtZW50O1xuICB2YXIgRnJhZ21lbnQgPSAkbW9kdWxlJHJlYWN0LkZyYWdtZW50O1xuICB2YXIgVW5pdF9nZXRJbnN0YW5jZSA9IGtvdGxpbl9rb3RsaW4uJF8kLmE7XG4gIHZhciBpbnRlcmZhY2VNZXRhID0ga290bGluX2tvdGxpbi4kXyQuZDtcbiAgdmFyIGNsYXNzTWV0YSA9IGtvdGxpbl9rb3RsaW4uJF8kLmM7XG4gIHZhciBzaW5nbGUgPSBrb3RsaW5fa290bGluLiRfJC5iO1xuICAvL2VuZHJlZ2lvblxuICAvL3JlZ2lvbiBibG9jazogcHJlLWRlY2xhcmF0aW9uXG4gIGZ1bmN0aW9uIGNoaWxkKGVsZW1lbnQpIHtcbiAgICB2YXIgdG1wJHJldCQxO1xuICAgIHtcbiAgICAgIHZhciB0bXAkcmV0JDA7XG4gICAgICB7XG4gICAgICAgIHRtcCRyZXQkMCA9IHRoaXM7XG4gICAgICB9XG4gICAgICB0bXAkcmV0JDEgPSB0bXAkcmV0JDBbZ2V0X0NISUxEUkVOKCldO1xuICAgIH1cbiAgICBpZiAoISh0bXAkcmV0JDEgPT0gbnVsbCkpIHtcbiAgICAgIHZhciB0bXAkcmV0JDQ7XG4gICAgICB7XG4gICAgICAgIHZhciB0bXAkcmV0JDM7XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgdG1wJHJldCQyO1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRtcCRyZXQkMiA9IHRoaXM7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRtcCRyZXQkMyA9IHRtcCRyZXQkMltnZXRfQ0hJTERSRU4oKV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRtcDBfYXNEeW5hbWljID0gdG1wJHJldCQzO1xuICAgICAgICB0bXAkcmV0JDQgPSB0bXAwX2FzRHluYW1pYztcbiAgICAgIH1cbiAgICAgIHRtcCRyZXQkNC5wdXNoKGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB7XG4gICAgICAgIHZhciB0bXAkcmV0JDc7XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgdG1wJHJldCQ2O1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciB0bXAkcmV0JDU7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRtcCRyZXQkNSA9IFtlbGVtZW50XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRtcCRyZXQkNiA9IHRtcCRyZXQkNTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdG1wJHJldCQ3ID0gdG1wJHJldCQ2O1xuICAgICAgICB9XG4gICAgICAgIHZhciB0bXAxX19zZXRfY2hpbGRyZW5fX2VkbzJvdCA9IHRtcCRyZXQkNztcbiAgICAgICAgdmFyIHRtcCRyZXQkODtcbiAgICAgICAge1xuICAgICAgICAgIHRtcCRyZXQkOCA9IHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdG1wJHJldCQ4W2dldF9DSElMRFJFTigpXSA9IHRtcDFfX3NldF9jaGlsZHJlbl9fZWRvMm90O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB1bmFyeVBsdXMoX3RoaXNfX3U4ZTNzNCkge1xuICAgIHRoaXMudChfdGhpc19fdThlM3M0KTtcbiAgfVxuICBmdW5jdGlvbiB1bmFyeVBsdXNfMChfdGhpc19fdThlM3M0KSB7XG4gICAgdmFyIHRtcCRyZXQkMjtcbiAgICB7XG4gICAgICB2YXIgdG1wJHJldCQxO1xuICAgICAge1xuICAgICAgICB2YXIgdG1wJHJldCQwO1xuICAgICAgICB7XG4gICAgICAgICAgdG1wJHJldCQwID0gX3RoaXNfX3U4ZTNzNDtcbiAgICAgICAgfVxuICAgICAgICB0bXAkcmV0JDEgPSB0bXAkcmV0JDA7XG4gICAgICB9XG4gICAgICB0bXAkcmV0JDIgPSB0bXAkcmV0JDE7XG4gICAgfVxuICAgIHRoaXMudSh0bXAkcmV0JDIpO1xuICB9XG4gIGZ1bmN0aW9uIGludm9rZShfdGhpc19fdThlM3M0LCBibG9jaykge1xuICAgIHRoaXMudShjcmVhdGUoX3RoaXNfX3U4ZTNzNCwgYmxvY2spKTtcbiAgfVxuICAvL2VuZHJlZ2lvblxuICBmdW5jdGlvbiBnZXRfQ0hJTERSRU4oKSB7XG4gICAgaW5pdF9wcm9wZXJ0aWVzX0NoaWxkcmVuQnVpbGRlcl9rdF83eXJra28oKTtcbiAgICByZXR1cm4gQ0hJTERSRU47XG4gIH1cbiAgdmFyIENISUxEUkVOO1xuICBmdW5jdGlvbiBDaGlsZHJlbkJ1aWxkZXIoKSB7XG4gIH1cbiAgQ2hpbGRyZW5CdWlsZGVyLiRtZXRhZGF0YSQgPSBpbnRlcmZhY2VNZXRhKCdDaGlsZHJlbkJ1aWxkZXInKTtcbiAgZnVuY3Rpb24gY3JlYXRlQ2hpbGRyZW5CdWlsZGVyKCkge1xuICAgIGluaXRfcHJvcGVydGllc19DaGlsZHJlbkJ1aWxkZXJfa3RfN3lya2tvKCk7XG4gICAgcmV0dXJuIG5ldyBDaGlsZHJlbkJ1aWxkZXJJbXBsKCk7XG4gIH1cbiAgZnVuY3Rpb24gc2V0X2NoaWxkcmVuKF90aGlzX191OGUzczQsIHZhbHVlKSB7XG4gICAgaW5pdF9wcm9wZXJ0aWVzX0NoaWxkcmVuQnVpbGRlcl9rdF83eXJra28oKTtcbiAgICB2YXIgdG1wJHJldCQwO1xuICAgIHtcbiAgICAgIHRtcCRyZXQkMCA9IF90aGlzX191OGUzczQ7XG4gICAgfVxuICAgIHRtcCRyZXQkMFtnZXRfQ0hJTERSRU4oKV0gPSB2YWx1ZTtcbiAgfVxuICBmdW5jdGlvbiBnZXRfY2hpbGRyZW4oX3RoaXNfX3U4ZTNzNCkge1xuICAgIGluaXRfcHJvcGVydGllc19DaGlsZHJlbkJ1aWxkZXJfa3RfN3lya2tvKCk7XG4gICAgdmFyIHRtcCRyZXQkMDtcbiAgICB7XG4gICAgICB0bXAkcmV0JDAgPSBfdGhpc19fdThlM3M0O1xuICAgIH1cbiAgICByZXR1cm4gdG1wJHJldCQwW2dldF9DSElMRFJFTigpXTtcbiAgfVxuICBmdW5jdGlvbiBDaGlsZHJlbkJ1aWxkZXJJbXBsKCkge1xuICB9XG4gIENoaWxkcmVuQnVpbGRlckltcGwuJG1ldGFkYXRhJCA9IGNsYXNzTWV0YSgnQ2hpbGRyZW5CdWlsZGVySW1wbCcsIFtDaGlsZHJlbkJ1aWxkZXJdKTtcbiAgdmFyIHByb3BlcnRpZXNfaW5pdGlhbGl6ZWRfQ2hpbGRyZW5CdWlsZGVyX2t0X2dieTJ6MDtcbiAgZnVuY3Rpb24gaW5pdF9wcm9wZXJ0aWVzX0NoaWxkcmVuQnVpbGRlcl9rdF83eXJra28oKSB7XG4gICAgaWYgKHByb3BlcnRpZXNfaW5pdGlhbGl6ZWRfQ2hpbGRyZW5CdWlsZGVyX2t0X2dieTJ6MCkge1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wZXJ0aWVzX2luaXRpYWxpemVkX0NoaWxkcmVuQnVpbGRlcl9rdF9nYnkyejAgPSB0cnVlO1xuICAgICAgQ0hJTERSRU4gPSBTeW1ib2woJ0BAY2hpbGRyZW4nKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gRkMoYmxvY2spIHtcbiAgICB2YXIgY29tcG9uZW50ID0gRkMkbGFtYmRhKGJsb2NrKTtcbiAgICB2YXIgdG1wJHJldCQxO1xuICAgIHtcbiAgICAgIHZhciB0bXAkcmV0JDA7XG4gICAgICB7XG4gICAgICAgIHRtcCRyZXQkMCA9IGNvbXBvbmVudDtcbiAgICAgIH1cbiAgICAgIHRtcCRyZXQkMSA9IHRtcCRyZXQkMDtcbiAgICB9XG4gICAgcmV0dXJuIHRtcCRyZXQkMTtcbiAgfVxuICBmdW5jdGlvbiBGQyRsYW1iZGEkbGFtYmRhKCRibG9jaywgJHByb3BzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcyRjcmVhdGVFbGVtZW50T3JOdWxsKSB7XG4gICAgICAkYmxvY2soJHRoaXMkY3JlYXRlRWxlbWVudE9yTnVsbCwgJHByb3BzKTtcbiAgICAgIHJldHVybiBVbml0X2dldEluc3RhbmNlKCk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBGQyRsYW1iZGEoJGJsb2NrKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChwcm9wcykge1xuICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnRPck51bGwoRkMkbGFtYmRhJGxhbWJkYSgkYmxvY2ssIHByb3BzKSk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBjcmVhdGUoX3RoaXNfX3U4ZTNzNCwgYmxvY2spIHtcbiAgICB2YXIgYnVpbGRlciA9IGNyZWF0ZUNoaWxkcmVuQnVpbGRlcigpO1xuICAgIHZhciB0bXAkcmV0JDI7XG4gICAge1xuICAgICAgdmFyIHRtcCRyZXQkMTtcbiAgICAgIHtcbiAgICAgICAgdmFyIHRtcCRyZXQkMDtcbiAgICAgICAge1xuICAgICAgICAgIHRtcCRyZXQkMCA9IGJ1aWxkZXI7XG4gICAgICAgIH1cbiAgICAgICAgdG1wJHJldCQxID0gdG1wJHJldCQwO1xuICAgICAgfVxuICAgICAgdmFyIHRtcDBfYXBwbHkgPSB0bXAkcmV0JDE7XG4gICAgICB7XG4gICAgICB9XG4gICAgICBibG9jayh0bXAwX2FwcGx5KTtcbiAgICAgIHRtcCRyZXQkMiA9IHRtcDBfYXBwbHk7XG4gICAgfVxuICAgIHZhciBwcm9wcyA9IHRtcCRyZXQkMjtcbiAgICB2YXIgdG1wJHJldCQ0O1xuICAgIHtcbiAgICAgIHZhciB0bXAkcmV0JDM7XG4gICAgICB7XG4gICAgICAgIHRtcCRyZXQkMyA9IGJ1aWxkZXI7XG4gICAgICB9XG4gICAgICB0bXAkcmV0JDQgPSB0bXAkcmV0JDNbZ2V0X0NISUxEUkVOKCldO1xuICAgIH1cbiAgICB2YXIgdG1wMF9lbHZpc19saHMgPSB0bXAkcmV0JDQ7XG4gICAgdmFyIHRtcDtcbiAgICBpZiAodG1wMF9lbHZpc19saHMgPT0gbnVsbCkge1xuICAgICAgdmFyIHRtcCRyZXQkNTtcbiAgICAgIHtcbiAgICAgICAgdG1wJHJldCQ1ID0gW107XG4gICAgICB9XG4gICAgICB0bXAgPSB0bXAkcmV0JDU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRtcCA9IHRtcDBfZWx2aXNfbGhzO1xuICAgIH1cbiAgICB2YXIgY2hpbGRyZW4gPSB0bXA7XG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQuYXBwbHkobnVsbCwgW190aGlzX191OGUzczQsIHByb3BzXS5jb25jYXQoW10uc2xpY2UuY2FsbChjaGlsZHJlbi5zbGljZSgpKSkpO1xuICB9XG4gIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRPck51bGwoYmxvY2spIHtcbiAgICB2YXIgdG1wJHJldCQyO1xuICAgIHtcbiAgICAgIHZhciB0bXAkcmV0JDA7XG4gICAgICB7XG4gICAgICAgIHZhciB0bXAwX2FwcGx5ID0gY3JlYXRlQ2hpbGRyZW5CdWlsZGVyKCk7XG4gICAgICAgIHtcbiAgICAgICAgfVxuICAgICAgICBibG9jayh0bXAwX2FwcGx5KTtcbiAgICAgICAgdG1wJHJldCQwID0gdG1wMF9hcHBseTtcbiAgICAgIH1cbiAgICAgIHZhciB0bXAxX19nZXRfY2hpbGRyZW5fXzFrcnI4MSA9IHRtcCRyZXQkMDtcbiAgICAgIHZhciB0bXAkcmV0JDE7XG4gICAgICB7XG4gICAgICAgIHRtcCRyZXQkMSA9IHRtcDFfX2dldF9jaGlsZHJlbl9fMWtycjgxO1xuICAgICAgfVxuICAgICAgdG1wJHJldCQyID0gdG1wJHJldCQxW2dldF9DSElMRFJFTigpXTtcbiAgICB9XG4gICAgdmFyIHRtcDBfZWx2aXNfbGhzID0gdG1wJHJldCQyO1xuICAgIHZhciB0bXA7XG4gICAgaWYgKHRtcDBfZWx2aXNfbGhzID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0bXAgPSB0bXAwX2VsdmlzX2xocztcbiAgICB9XG4gICAgdmFyIGNoaWxkcmVuID0gdG1wO1xuICAgIHZhciB0bXAkcmV0JDM7XG4gICAge1xuICAgICAgdG1wJHJldCQzID0gY2hpbGRyZW4ubGVuZ3RoID09PSAwO1xuICAgIH1cbiAgICBpZiAodG1wJHJldCQzKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIHRtcDFfZWx2aXNfbGhzID0gc2luZ2xlKGNoaWxkcmVuKTtcbiAgICAgIHZhciB0bXBfMDtcbiAgICAgIGlmICh0bXAxX2VsdmlzX2xocyA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG1wXzAgPSB0bXAxX2VsdmlzX2xocztcbiAgICAgIH1cbiAgICAgIHZhciBjaGlsZCA9IHRtcF8wO1xuICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICB2YXIgdG1wJHJldCQ1O1xuICAgICAgICB7XG4gICAgICAgICAgdmFyIHRtcCRyZXQkNDtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0bXAkcmV0JDQgPSBjaGlsZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdG1wJHJldCQ1ID0gdG1wJHJldCQ0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0bXAkcmV0JDU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVFbGVtZW50LmFwcGx5KG51bGwsIFtGcmFnbWVudCwgdm9pZCAxXS5jb25jYXQoW10uc2xpY2UuY2FsbChjaGlsZHJlbi5zbGljZSgpKSkpO1xuICB9XG4gIC8vcmVnaW9uIGJsb2NrOiBwb3N0LWRlY2xhcmF0aW9uXG4gIENoaWxkcmVuQnVpbGRlckltcGwucHJvdG90eXBlLnUgPSB1bmFyeVBsdXM7XG4gIENoaWxkcmVuQnVpbGRlckltcGwucHJvdG90eXBlLnYgPSB1bmFyeVBsdXNfMDtcbiAgQ2hpbGRyZW5CdWlsZGVySW1wbC5wcm90b3R5cGUudCA9IGNoaWxkO1xuICBDaGlsZHJlbkJ1aWxkZXJJbXBsLnByb3RvdHlwZS53ID0gaW52b2tlO1xuICAvL2VuZHJlZ2lvblxuICAvL3JlZ2lvbiBibG9jazogZXhwb3J0c1xuICBfLiRfJCA9IF8uJF8kIHx8IHt9O1xuICBfLiRfJC5hID0gRkM7XG4gIF8uJF8kLmIgPSBjcmVhdGU7XG4gIC8vZW5kcmVnaW9uXG4gIHJldHVybiBfO1xufSkpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1rb3RsaW4td3JhcHBlcnMta290bGluLXJlYWN0LWpzLWlyLmpzLm1hcFxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9mcm9udGVuZC8uL2tvdGxpbi9rb3RsaW4td3JhcHBlcnMta290bGluLXJlYWN0LWpzLWlyLmpzPyIpOwoKLyoqKi8gfSkKCi8qKioqKiovIAl9KTsKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKi8gCS8vIFRoZSBtb2R1bGUgY2FjaGUKLyoqKioqKi8gCXZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTsKLyoqKioqKi8gCQovKioqKioqLyAJLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KLyoqKioqKi8gCWZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHsKLyoqKioqKi8gCQkvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGUKLyoqKioqKi8gCQl2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTsKLyoqKioqKi8gCQlpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHsKLyoqKioqKi8gCQkJcmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzOwovKioqKioqLyAJCX0KLyoqKioqKi8gCQkvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQovKioqKioqLyAJCXZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0gewovKioqKioqLyAJCQlpZDogbW9kdWxlSWQsCi8qKioqKiovIAkJCWxvYWRlZDogZmFsc2UsCi8qKioqKiovIAkJCWV4cG9ydHM6IHt9Ci8qKioqKiovIAkJfTsKLyoqKioqKi8gCQovKioqKioqLyAJCS8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvbgovKioqKioqLyAJCV9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pOwovKioqKioqLyAJCi8qKioqKiovIAkJLy8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZAovKioqKioqLyAJCW1vZHVsZS5sb2FkZWQgPSB0cnVlOwovKioqKioqLyAJCi8qKioqKiovIAkJLy8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGUKLyoqKioqKi8gCQlyZXR1cm4gbW9kdWxlLmV4cG9ydHM7Ci8qKioqKiovIAl9Ci8qKioqKiovIAkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKi8gCS8qIHdlYnBhY2svcnVudGltZS9ub2RlIG1vZHVsZSBkZWNvcmF0b3IgKi8KLyoqKioqKi8gCSgoKSA9PiB7Ci8qKioqKiovIAkJX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSAobW9kdWxlKSA9PiB7Ci8qKioqKiovIAkJCW1vZHVsZS5wYXRocyA9IFtdOwovKioqKioqLyAJCQlpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107Ci8qKioqKiovIAkJCXJldHVybiBtb2R1bGU7Ci8qKioqKiovIAkJfTsKLyoqKioqKi8gCX0pKCk7Ci8qKioqKiovIAkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKi8gCQovKioqKioqLyAJLy8gc3RhcnR1cAovKioqKioqLyAJLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzCi8qKioqKiovIAkvLyBUaGlzIGVudHJ5IG1vZHVsZSBpcyByZWZlcmVuY2VkIGJ5IG90aGVyIG1vZHVsZXMgc28gaXQgY2FuJ3QgYmUgaW5saW5lZAovKioqKioqLyAJdmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuL2tvdGxpbi9lbGlkZS1mcm9udGVuZC5qcyIpOwovKioqKioqLyAJCi8qKioqKiovIAlyZXR1cm4gX193ZWJwYWNrX2V4cG9ydHNfXzsKLyoqKioqKi8gfSkoKQo7Cn0pOw==","integrity":[{"hash":"SHA256","salt":"","fingerprint":"RzcGqZL74v6e3j3g9TU7x2Zk37AFy4Q8Y2hMy2NoqUw="}]},"size":"1206049","integrity":[]},{"compression":"BROTLI","data":{"raw":"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","integrity":[]},"size":"202007","integrity":[{"hash":"SHA256","salt":"","fingerprint":"EHotbPdiw9x+qmb8yfej4aKO2DBCBcmKmLKb+ni3u6g="}]},{"compression":"DEFLATE","data":{"raw":"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","integrity":[]},"size":"266017","integrity":[{"hash":"SHA256","salt":"","fingerprint":"6mwesEtkawcvApIb34f1Nu4ghLcIFgm1i/S9FrRkJeI="}]},{"compression":"GZIP","data":{"raw":"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","integrity":[]},"size":"266029","integrity":[{"hash":"SHA256","salt":"","fingerprint":"KQw7x95v0GbCjHDpoZPJTeJ/VNvWrU4Uwv6F/Hb0G/k="}]}]}]} \ No newline at end of file +{ + "version": 2, + "settings": { + "minify": false, + "prepack": false, + "rewriting": false, + "compression": [], + "digestSettings": { "algorithm": "SHA256", "tail": 8, "rounds": 1 } + }, + "generated": "2022-07-11T22:02:27.047363Z", + "digest": "uXDYHuoLU8mD7HzEP8oH7yLRKJapNfV76MEXPagCzcc=", + "styles": { + "styles.base": { + "module": "styles.base", + "dependencies": { "direct": [], "transitive": [] }, + "asset": [ + { + "token": "dfc596ab194ad356f6e9dd562c43f4fb4c3c86d26eb9d6caf33fe06a753eb23d", + "filename": "basestyles.css", + "stylesheet": { + "id": "", + "media": "", + "prefetch": false, + "preload": false, + "push": false + }, + "renaming": false + } + ], + "compressable": false, + "cacheable": false + } + }, + "scripts": { + "scripts.ui": { + "module": "scripts.ui", + "asset": [ + { + "token": "473706a992fbe2fe9ede3de0f5353bc76664dfb005cb843c63684ccb6368a94c", + "filename": "frontend.js", + "script": { + "id": "", + "defer": false, + "async": false, + "module": false, + "noModule": false, + "prefetch": false, + "preload": false, + "push": false + } + } + ], + "dependencies": { "direct": [], "transitive": [] }, + "compressable": false, + "cacheable": false, + "external": false + } + }, + "generic": {}, + "asset": [ + { + "module": "styles.base", + "filename": "basestyles.css", + "token": "dfc596ab194ad356f6e9dd562c43f4fb4c3c86d26eb9d6caf33fe06a753eb23d", + "variant": [ + { + "compression": "IDENTITY", + "data": { + "raw": "CkBpbXBvcnQgdXJsKCdodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUpldEJyYWlucytNb25vJmRpc3BsYXk9c3dhcCcpOwoKQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICJjb2xvci1lbW9qaSI7CiAgc3JjOiBsb2NhbCgiQXBwbGUgQ29sb3IgRW1vamkiKSwKICAgICAgIGxvY2FsKCJUd2Vtb2ppIE1vemlsbGEiKSwKICAgICAgIGxvY2FsKCJTZWdvZSBVSSBFbW9qaSIpLAogICAgICAgbG9jYWwoIlNlZ29lIFVJIFN5bWJvbCIpLAogICAgICAgbG9jYWwoIk5vdG8gQ29sb3IgRW1vamkiKSwKICAgICAgIGxvY2FsKCJFbW9qaU9uZSBDb2xvciIpLAogICAgICAgbG9jYWwoIkFuZHJvaWQgRW1vamkiKTsKfQoKaHRtbCB7CiAgLS1lbGlkZS1jb2xvci1wcmltYXJ5OiAjNWEwMGZmOwogIC0tZWxpZGUtY29sb3Itc2Vjb25kYXJ5OiAjOWIwOWFiOwp9Cgpib2R5IHsKICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMjI1ZGVnLCB2YXIoLS1lbGlkZS1jb2xvci1wcmltYXJ5KSAwJSwgdmFyKC0tZWxpZGUtY29sb3Itc2Vjb25kYXJ5KSAxMDAlKTsKICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBTZWdvZSBVSSwgc2Fucy1zZXJpZiwgY29sb3ItZW1vamk7Cn0KCnByZSB7CiAgZm9udC1mYW1pbHk6ICdKZXRCcmFpbnMgTW9ubycsIHVpLW1vbm9zcGFjZSwKICAgIE1lbmxvLCBNb25hY28sCiAgICAiQ2FzY2FkaWEgTW9ubyIsICJTZWdvZSBVSSBNb25vIiwKICAgICJSb2JvdG8gTW9ubyIsCiAgICAiT3h5Z2VuIE1vbm8iLAogICAgIlVidW50dSBNb25vc3BhY2UiLAogICAgIlNvdXJjZSBDb2RlIFBybyIsCiAgICAiRmlyYSBNb25vIiwKICAgICJEcm9pZCBTYW5zIE1vbm8iLAogICAgIkNvdXJpZXIgTmV3IiwgbW9ub3NwYWNlOwp9Cg==", + "integrity": [ + { + "hash": "SHA256", + "salt": "", + "fingerprint": "38WWqxlK01b26d1WLEP0+0w8htJuudbK8z/ganU+sj0=" + } + ] + }, + "size": "910", + "integrity": [] + }, + { + "compression": "BROTLI", + "data": { + "raw": "H40DABwFblszFKETwhGkP5n/SgFENxeTYDGYFKaP/uAt/f1L20p1mLxrMwlpwOD19ohNXO7Xsg30/KyB/Z7atC7rojm0gKZIl4XTIRvmrPkLiF9qspXcG31w1J7xQqa6p4XpbznQwf8rdWLPT9Ouad9Z7Ck7NWwwdU4sWDeru0hL/N9u23dd/IbDT+C7qhHI1n7VoB+/X/JMSBN/+qMlB/KeFR9SLGRmuaUMAFDcUrn1mclLhgc1RUwwO02czrxF05L0huKM7WGwqouw7RIZCwCWFsYNv/U4ZfjISIPo+wqo4RfWPz1zf0WwzWE4kzLhYtZ96rUVPT31IIXnoon1XJk/b0QJBi8SmdntDgKK3AUmptkXrW1NxJr0UcftQWsWlEEjEkSNDSl/i/vOCf0HTf/qVtuzd9z3DpmFgOGWYy8BSmKgjIInhjt/NX4sGOOml0snEr4ro5IZHpaBqY/BC1USshPgJtGSNM4u3Oex5q7qiIRivFxkuW2yzTNnKfo19PWTcHG6XglqGwQMThtFmv0A58mLEigqZbe7dP8A", + "integrity": [] + }, + "size": "414", + "integrity": [ + { + "hash": "SHA256", + "salt": "", + "fingerprint": "xn0VXHBRx0PvPQYbu9Kk/USjlH/L6dA2lNXsoNx2ciE=" + } + ] + }, + { + "compression": "DEFLATE", + "data": { + "raw": "eNp9Uttu00AQffdXjIxKYmE3JlIfGquibaASSGkRph8w3l27S9c71q5NcBH/znqdmJYE/OQ9c85czkxwKeuGTAudUfPZQ9s2drVYlKRbe1oRVUpgI+0po3rBrF2+K7GWqr/4JNprg1LbNxvS9JpL2yjsL+wWm1mUBcHlkCEpkQn4GQDsXoN0BSEjRSYRNX2TYeai1rAVKGKo5uFV0ygB64EBHzwjih3FfzvK162XwoaepFJ4SMhFRQLuP/4rwRTP+7ogdUi4pZb+34OH7/Su08P4leaGJN/Ls+BXEDy0tfJuJIlQkotk9KExskbjfHl1hmlaltkBwwpGmo+c8yI9x8LnK4j3Pl+B7LEy1GnubJRaoEkqg1wK3c6XyzMuqhi+o5kfrRtBenIsPBWN4G2ankTZ32tMcFhVYnvbijqGa1f5cYMs9+8bx4xhb3QMFrV1KY0sY3i2fj9HY44cyWy6MBgubBZDJ5Pa/dnGHdVo90ZoRfEQR0YjFK7RMjc6elUYw59lj8DI+kLFsOLn0N2PvhL6BXRfdLrtPOSr7vGcOsOG1XMBn81Ev5EGX+jf+xPIcTfDHl47uRQGbsXWNTjNNHjxGxd9GQ0=", + "integrity": [] + }, + "size": "455", + "integrity": [ + { + "hash": "SHA256", + "salt": "", + "fingerprint": "i1CaombANv8D7V3MywL0YPTpuCbso0miSpm2lb3ludw=" + } + ] + }, + { + "compression": "GZIP", + "data": { + "raw": "H4sIAAAAAAAAAH1S227TQBB991eMjEpiYTcmUh8aq6JtoBJIaRGmHzDeXbtL1zvWrk1wEf/Oep2YlgT85D1zzlzOTHAp64ZMC51R89lD2zZ2tViUpFt7WhFVSmAj7SmjesGsXb4rsZaqv/gk2muDUts3G9L0mkvbKOwv7BabWZQFweWQISmRCfgZAOxeg3QFISNFJhE1fZNh5qLWsBUoYqjm4VXTKAHrgQEfPCOKHcV/O8rXrZfChp6kUnhIyEVFAu4//ivBFM/7uiB1SLillv7fg4fv9K7Tw/iV5oYk38uz4FcQPLS18m4kiVCSi2T0oTGyRuN8eXWGaVqW2QHDCkaaj5zzIj3HwucriPc+X4HssTLUae5slFqgSSqDXArdzpfLMy6qGL6jmR+tG0F6ciw8FY3gbZqeRNnfa0xwWFVie9uKOoZrV/lxgyz37xvHjGFvdAwWtXUpjSxjeLZ+P0djjhzJbLowGC5sFkMnk9r92cYd1Wj3RmhF8RBHRiMUrtEyNzp6VRjDn2WPwMj6QsWw4ufQ3Y++EvoFdF90uu085Kvu8Zw6w4bVcwGfzUS/kQZf6N/7E8hxN8MeXju5FAZuxdY1OM00ePEbFKpyVI4DAAA=", + "integrity": [] + }, + "size": "467", + "integrity": [ + { + "hash": "SHA256", + "salt": "", + "fingerprint": "QJiXnajP5WiceSDE0hXfnS19Lb6jaeEWw0K++2q3Qo0=" + } + ] + } + ] + }, + { + "module": "scripts.ui", + "filename": "frontend.js", + "token": "473706a992fbe2fe9ede3de0f5353bc76664dfb005cb843c63684ccb6368a94c", + "variant": [ + { + "compression": "IDENTITY", + "data": { + "raw": "LyoKICogQVRURU5USU9OOiBUaGUgImV2YWwiIGRldnRvb2wgaGFzIGJlZW4gdXNlZCAobWF5YmUgYnkgZGVmYXVsdCBpbiBtb2RlOiAiZGV2ZWxvcG1lbnQiKS4KICogVGhpcyBkZXZ0b29sIGlzIG5laXRoZXIgbWFkZSBmb3IgcHJvZHVjdGlvbiBub3IgZm9yIHJlYWRhYmxlIG91dHB1dCBmaWxlcy4KICogSXQgdXNlcyAiZXZhbCgpIiBjYWxscyB0byBjcmVhdGUgYSBzZXBhcmF0ZSBzb3VyY2UgZmlsZSBpbiB0aGUgYnJvd3NlciBkZXZ0b29scy4KICogSWYgeW91IGFyZSB0cnlpbmcgdG8gcmVhZCB0aGUgb3V0cHV0IGZpbGUsIHNlbGVjdCBhIGRpZmZlcmVudCBkZXZ0b29sIChodHRwczovL3dlYnBhY2suanMub3JnL2NvbmZpZ3VyYXRpb24vZGV2dG9vbC8pCiAqIG9yIGRpc2FibGUgdGhlIGRlZmF1bHQgZGV2dG9vbCB3aXRoICJkZXZ0b29sOiBmYWxzZSIuCiAqIElmIHlvdSBhcmUgbG9va2luZyBmb3IgcHJvZHVjdGlvbi1yZWFkeSBvdXRwdXQgZmlsZXMsIHNlZSBtb2RlOiAicHJvZHVjdGlvbiIgKGh0dHBzOi8vd2VicGFjay5qcy5vcmcvY29uZmlndXJhdGlvbi9tb2RlLykuCiAqLwooZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkgewoJaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKQoJCW1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOwoJZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpCgkJZGVmaW5lKFtdLCBmYWN0b3J5KTsKCWVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKQoJCWV4cG9ydHNbImZyb250ZW5kIl0gPSBmYWN0b3J5KCk7CgllbHNlCgkJcm9vdFsiZnJvbnRlbmQiXSA9IGZhY3RvcnkoKTsKfSkodGhpcywgZnVuY3Rpb24oKSB7CnJldHVybiAvKioqKioqLyAoKCkgPT4geyAvLyB3ZWJwYWNrQm9vdHN0cmFwCi8qKioqKiovIAl2YXIgX193ZWJwYWNrX21vZHVsZXNfXyA9ICh7CgovKioqLyAiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vY2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoidXNlIHN0cmljdCI7CmV2YWwoIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LWRvbS5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cblxuXG5pZiAodHJ1ZSkge1xuICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQobmV3IEVycm9yKCkpO1xufVxuICAgICAgICAgIHZhciBSZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIHJlYWN0ICovIFwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2luZGV4LmpzXCIpO1xudmFyIFNjaGVkdWxlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIHNjaGVkdWxlciAqLyBcIi4uLy4uL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvaW5kZXguanNcIik7XG5cbnZhciBSZWFjdFNoYXJlZEludGVybmFscyA9IFJlYWN0Ll9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEO1xuXG52YXIgc3VwcHJlc3NXYXJuaW5nID0gZmFsc2U7XG5mdW5jdGlvbiBzZXRTdXBwcmVzc1dhcm5pbmcobmV3U3VwcHJlc3NXYXJuaW5nKSB7XG4gIHtcbiAgICBzdXBwcmVzc1dhcm5pbmcgPSBuZXdTdXBwcmVzc1dhcm5pbmc7XG4gIH1cbn0gLy8gSW4gREVWLCBjYWxscyB0byBjb25zb2xlLndhcm4gYW5kIGNvbnNvbGUuZXJyb3IgZ2V0IHJlcGxhY2VkXG4vLyBieSBjYWxscyB0byB0aGVzZSBtZXRob2RzIGJ5IGEgQmFiZWwgcGx1Z2luLlxuLy9cbi8vIEluIFBST0QgKG9yIGluIHBhY2thZ2VzIHdpdGhvdXQgYWNjZXNzIHRvIFJlYWN0IGludGVybmFscyksXG4vLyB0aGV5IGFyZSBsZWZ0IGFzIHRoZXkgYXJlIGluc3RlYWQuXG5cbmZ1bmN0aW9uIHdhcm4oZm9ybWF0KSB7XG4gIHtcbiAgICBpZiAoIXN1cHByZXNzV2FybmluZykge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgcHJpbnRXYXJuaW5nKCd3YXJuJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGVycm9yKGZvcm1hdCkge1xuICB7XG4gICAgaWYgKCFzdXBwcmVzc1dhcm5pbmcpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnZXJyb3InLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykge1xuICAvLyBXaGVuIGNoYW5naW5nIHRoaXMgbG9naWMsIHlvdSBtaWdodCB3YW50IHRvIGFsc29cbiAgLy8gdXBkYXRlIGNvbnNvbGVXaXRoU3RhY2tEZXYud3d3LmpzIGFzIHdlbGwuXG4gIHtcbiAgICB2YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gICAgdmFyIHN0YWNrID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKCk7XG5cbiAgICBpZiAoc3RhY2sgIT09ICcnKSB7XG4gICAgICBmb3JtYXQgKz0gJyVzJztcbiAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChbc3RhY2tdKTtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuXG5cbiAgICB2YXIgYXJnc1dpdGhGb3JtYXQgPSBhcmdzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIFN0cmluZyhpdGVtKTtcbiAgICB9KTsgLy8gQ2FyZWZ1bDogUk4gY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcmVmaXhcblxuICAgIGFyZ3NXaXRoRm9ybWF0LnVuc2hpZnQoJ1dhcm5pbmc6ICcgKyBmb3JtYXQpOyAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBzcHJlYWQgKG9yIC5hcHBseSkgZGlyZWN0bHkgYmVjYXVzZSBpdFxuICAgIC8vIGJyZWFrcyBJRTk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2MTBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG5cbiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlW2xldmVsXSwgY29uc29sZSwgYXJnc1dpdGhGb3JtYXQpO1xuICB9XG59XG5cbnZhciBGdW5jdGlvbkNvbXBvbmVudCA9IDA7XG52YXIgQ2xhc3NDb21wb25lbnQgPSAxO1xudmFyIEluZGV0ZXJtaW5hdGVDb21wb25lbnQgPSAyOyAvLyBCZWZvcmUgd2Uga25vdyB3aGV0aGVyIGl0IGlzIGZ1bmN0aW9uIG9yIGNsYXNzXG5cbnZhciBIb3N0Um9vdCA9IDM7IC8vIFJvb3Qgb2YgYSBob3N0IHRyZWUuIENvdWxkIGJlIG5lc3RlZCBpbnNpZGUgYW5vdGhlciBub2RlLlxuXG52YXIgSG9zdFBvcnRhbCA9IDQ7IC8vIEEgc3VidHJlZS4gQ291bGQgYmUgYW4gZW50cnkgcG9pbnQgdG8gYSBkaWZmZXJlbnQgcmVuZGVyZXIuXG5cbnZhciBIb3N0Q29tcG9uZW50ID0gNTtcbnZhciBIb3N0VGV4dCA9IDY7XG52YXIgRnJhZ21lbnQgPSA3O1xudmFyIE1vZGUgPSA4O1xudmFyIENvbnRleHRDb25zdW1lciA9IDk7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gMTA7XG52YXIgRm9yd2FyZFJlZiA9IDExO1xudmFyIFByb2ZpbGVyID0gMTI7XG52YXIgU3VzcGVuc2VDb21wb25lbnQgPSAxMztcbnZhciBNZW1vQ29tcG9uZW50ID0gMTQ7XG52YXIgU2ltcGxlTWVtb0NvbXBvbmVudCA9IDE1O1xudmFyIExhenlDb21wb25lbnQgPSAxNjtcbnZhciBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQgPSAxNztcbnZhciBEZWh5ZHJhdGVkRnJhZ21lbnQgPSAxODtcbnZhciBTdXNwZW5zZUxpc3RDb21wb25lbnQgPSAxOTtcbnZhciBTY29wZUNvbXBvbmVudCA9IDIxO1xudmFyIE9mZnNjcmVlbkNvbXBvbmVudCA9IDIyO1xudmFyIExlZ2FjeUhpZGRlbkNvbXBvbmVudCA9IDIzO1xudmFyIENhY2hlQ29tcG9uZW50ID0gMjQ7XG52YXIgVHJhY2luZ01hcmtlckNvbXBvbmVudCA9IDI1O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgZW5hYmxlQ2xpZW50UmVuZGVyRmFsbGJhY2tPblRleHRNaXNtYXRjaCA9IHRydWU7IC8vIFRPRE86IE5lZWQgdG8gcmV2aWV3IHRoaXMgY29kZSBvbmUgbW9yZSB0aW1lIGJlZm9yZSBsYW5kaW5nXG4vLyB0aGUgcmVhY3QtcmVjb25jaWxlciBwYWNrYWdlLlxuXG52YXIgZW5hYmxlTmV3UmVjb25jaWxlciA9IGZhbHNlOyAvLyBTdXBwb3J0IGxlZ2FjeSBQcmltZXIgc3VwcG9ydCBvbiBpbnRlcm5hbCBGQiB3d3dcblxudmFyIGVuYWJsZUxhenlDb250ZXh0UHJvcGFnYXRpb24gPSBmYWxzZTsgLy8gRkItb25seSB1c2FnZS4gVGhlIG5ldyBBUEkgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MuXG5cbnZhciBlbmFibGVMZWdhY3lIaWRkZW4gPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpYmVyXG5cbnZhciBlbmFibGVTdXNwZW5zZUF2b2lkVGhpc0ZhbGxiYWNrID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaXp6XG4vLyBSZWFjdCBET00gQ2hvcHBpbmcgQmxvY2tcbi8vXG4vLyBTaW1pbGFyIHRvIG1haW4gQ2hvcHBpbmcgQmxvY2sgYnV0IG9ubHkgZmxhZ3MgcmVsYXRlZCB0byBSZWFjdCBET00uIFRoZXNlIGFyZVxuLy8gZ3JvdXBlZCBiZWNhdXNlIHdlIHdpbGwgbGlrZWx5IGJhdGNoIGFsbCBvZiB0aGVtIGludG8gYSBzaW5nbGUgbWFqb3IgcmVsZWFzZS5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBEaXNhYmxlIHN1cHBvcnQgZm9yIGNvbW1lbnQgbm9kZXMgYXMgUmVhY3QgRE9NIGNvbnRhaW5lcnMuIEFscmVhZHkgZGlzYWJsZWRcbi8vIGluIG9wZW4gc291cmNlLCBidXQgd3d3IGNvZGViYXNlIHN0aWxsIHJlbGllcyBvbiBpdC4gTmVlZCB0byByZW1vdmUuXG5cbnZhciBkaXNhYmxlQ29tbWVudHNBc0RPTUNvbnRhaW5lcnMgPSB0cnVlOyAvLyBEaXNhYmxlIGphdmFzY3JpcHQ6IFVSTCBzdHJpbmdzIGluIGhyZWYgZm9yIFhTUyBwcm90ZWN0aW9uLlxuLy8gYW5kIGNsaWVudCByZW5kZXJpbmcsIG1vc3RseSB0byBhbGxvdyBKU1ggYXR0cmlidXRlcyB0byBhcHBseSB0byB0aGUgY3VzdG9tXG4vLyBlbGVtZW50J3Mgb2JqZWN0IHByb3BlcnRpZXMgaW5zdGVhZCBvZiBvbmx5IEhUTUwgYXR0cmlidXRlcy5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTEzNDdcblxudmFyIGVuYWJsZUN1c3RvbUVsZW1lbnRQcm9wZXJ0eVN1cHBvcnQgPSBmYWxzZTsgLy8gRGlzYWJsZXMgY2hpbGRyZW4gZm9yIDx0ZXh0YXJlYT4gZWxlbWVudHNcbnZhciB3YXJuQWJvdXRTdHJpbmdSZWZzID0gZmFsc2U7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBEZWJ1Z2dpbmcgYW5kIERldlRvb2xzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQWRkcyB1c2VyIHRpbWluZyBtYXJrcyBmb3IgZS5nLiBzdGF0ZSB1cGRhdGVzLCBzdXNwZW5zZSwgYW5kIHdvcmsgbG9vcCBzdHVmZixcbi8vIGZvciBhbiBleHBlcmltZW50YWwgdGltZWxpbmUgdG9vbC5cblxudmFyIGVuYWJsZVNjaGVkdWxpbmdQcm9maWxlciA9IHRydWU7IC8vIEhlbHBzIGlkZW50aWZ5IHNpZGUgZWZmZWN0cyBpbiByZW5kZXItcGhhc2UgbGlmZWN5Y2xlIGhvb2tzIGFuZCBzZXRTdGF0ZVxuXG52YXIgZW5hYmxlUHJvZmlsZXJUaW1lciA9IHRydWU7IC8vIFJlY29yZCBkdXJhdGlvbnMgZm9yIGNvbW1pdCBhbmQgcGFzc2l2ZSBlZmZlY3RzIHBoYXNlcy5cblxudmFyIGVuYWJsZVByb2ZpbGVyQ29tbWl0SG9va3MgPSB0cnVlOyAvLyBQaGFzZSBwYXJhbSBwYXNzZWQgdG8gb25SZW5kZXIgY2FsbGJhY2sgZGlmZmVyZW50aWF0ZXMgYmV0d2VlbiBhbiBcInVwZGF0ZVwiIGFuZCBhIFwiY2FzY2FkaW5nLXVwZGF0ZVwiLlxuXG52YXIgYWxsTmF0aXZlRXZlbnRzID0gbmV3IFNldCgpO1xuLyoqXG4gKiBNYXBwaW5nIGZyb20gcmVnaXN0cmF0aW9uIG5hbWUgdG8gZXZlbnQgbmFtZVxuICovXG5cblxudmFyIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMgPSB7fTtcbi8qKlxuICogTWFwcGluZyBmcm9tIGxvd2VyY2FzZSByZWdpc3RyYXRpb24gbmFtZXMgdG8gdGhlIHByb3Blcmx5IGNhc2VkIHZlcnNpb24sXG4gKiB1c2VkIHRvIHdhcm4gaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBldmVudCBoYW5kbGVycy4gQXZhaWxhYmxlXG4gKiBvbmx5IGluIHRydWUuXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5cbnZhciBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzID0gIHt9IDsgLy8gVHJ1c3QgdGhlIGRldmVsb3BlciB0byBvbmx5IHVzZSBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzIGluIHRydWVcblxuZnVuY3Rpb24gcmVnaXN0ZXJUd29QaGFzZUV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGRlcGVuZGVuY2llcykge1xuICByZWdpc3RlckRpcmVjdEV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGRlcGVuZGVuY2llcyk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQocmVnaXN0cmF0aW9uTmFtZSArICdDYXB0dXJlJywgZGVwZW5kZW5jaWVzKTtcbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyRGlyZWN0RXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKSB7XG4gIHtcbiAgICBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tyZWdpc3RyYXRpb25OYW1lXSkge1xuICAgICAgZXJyb3IoJ0V2ZW50UmVnaXN0cnk6IE1vcmUgdGhhbiBvbmUgcGx1Z2luIGF0dGVtcHRlZCB0byBwdWJsaXNoIHRoZSBzYW1lICcgKyAncmVnaXN0cmF0aW9uIG5hbWUsIGAlc2AuJywgcmVnaXN0cmF0aW9uTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tyZWdpc3RyYXRpb25OYW1lXSA9IGRlcGVuZGVuY2llcztcblxuICB7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gcmVnaXN0cmF0aW9uTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNbbG93ZXJDYXNlZE5hbWVdID0gcmVnaXN0cmF0aW9uTmFtZTtcblxuICAgIGlmIChyZWdpc3RyYXRpb25OYW1lID09PSAnb25Eb3VibGVDbGljaycpIHtcbiAgICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMub25kYmxjbGljayA9IHJlZ2lzdHJhdGlvbk5hbWU7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXBlbmRlbmNpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBhbGxOYXRpdmVFdmVudHMuYWRkKGRlcGVuZGVuY2llc1tpXSk7XG4gIH1cbn1cblxudmFyIGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpO1xuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG4vKlxuICogVGhlIGAnJyArIHZhbHVlYCBwYXR0ZXJuICh1c2VkIGluIGluIHBlcmYtc2Vuc2l0aXZlIGNvZGUpIHRocm93cyBmb3IgU3ltYm9sXG4gKiBhbmQgVGVtcG9yYWwuKiB0eXBlcy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzIyMDY0LlxuICpcbiAqIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgd2lsbCB0aHJvdyBhbiBlYXNpZXItdG8tdW5kZXJzdGFuZCxcbiAqIGVhc2llci10by1kZWJ1ZyBleGNlcHRpb24gd2l0aCBhIGNsZWFyIGVycm9ycyBtZXNzYWdlIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGVcbiAqIHByb2JsZW0uIChJbnN0ZWFkIG9mIGEgY29uZnVzaW5nIGV4Y2VwdGlvbiB0aHJvd24gaW5zaWRlIHRoZSBpbXBsZW1lbnRhdGlvblxuICogb2YgdGhlIGB2YWx1ZWAgb2JqZWN0KS5cbiAqL1xuLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cbmZ1bmN0aW9uIHR5cGVOYW1lKHZhbHVlKSB7XG4gIHtcbiAgICAvLyB0b1N0cmluZ1RhZyBpcyBuZWVkZWQgZm9yIG5hbWVzcGFjZWQgdHlwZXMgbGlrZSBUZW1wb3JhbC5JbnN0YW50XG4gICAgdmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wudG9TdHJpbmdUYWc7XG4gICAgdmFyIHR5cGUgPSBoYXNUb1N0cmluZ1RhZyAmJiB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddIHx8IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgfHwgJ09iamVjdCc7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cbn0gLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cblxuXG5mdW5jdGlvbiB3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkge1xuICB7XG4gICAgdHJ5IHtcbiAgICAgIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICAvLyBJZiB5b3UgZW5kZWQgdXAgaGVyZSBieSBmb2xsb3dpbmcgYW4gZXhjZXB0aW9uIGNhbGwgc3RhY2ssIGhlcmUncyB3aGF0J3NcbiAgLy8gaGFwcGVuZWQ6IHlvdSBzdXBwbGllZCBhbiBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIFJlYWN0IChhcyBhIHByb3AsIGtleSxcbiAgLy8gRE9NIGF0dHJpYnV0ZSwgQ1NTIHByb3BlcnR5LCBzdHJpbmcgcmVmLCBldGMuKSBhbmQgd2hlbiBSZWFjdCB0cmllZCB0b1xuICAvLyBjb2VyY2UgaXQgdG8gYSBzdHJpbmcgdXNpbmcgYCcnICsgdmFsdWVgLCBhbiBleGNlcHRpb24gd2FzIHRocm93bi5cbiAgLy9cbiAgLy8gVGhlIG1vc3QgY29tbW9uIHR5cGVzIHRoYXQgd2lsbCBjYXVzZSB0aGlzIGV4Y2VwdGlvbiBhcmUgYFN5bWJvbGAgaW5zdGFuY2VzXG4gIC8vIGFuZCBUZW1wb3JhbCBvYmplY3RzIGxpa2UgYFRlbXBvcmFsLkluc3RhbnRgLiBCdXQgYW55IG9iamVjdCB0aGF0IGhhcyBhXG4gIC8vIGB2YWx1ZU9mYCBvciBgW1N5bWJvbC50b1ByaW1pdGl2ZV1gIG1ldGhvZCB0aGF0IHRocm93cyB3aWxsIGFsc28gY2F1c2UgdGhpc1xuICAvLyBleGNlcHRpb24uIChMaWJyYXJ5IGF1dGhvcnMgZG8gdGhpcyB0byBwcmV2ZW50IHVzZXJzIGZyb20gdXNpbmcgYnVpbHQtaW5cbiAgLy8gbnVtZXJpYyBvcGVyYXRvcnMgbGlrZSBgK2Agb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMgbGlrZSBgPj1gIGJlY2F1c2UgY3VzdG9tXG4gIC8vIG1ldGhvZHMgYXJlIG5lZWRlZCB0byBwZXJmb3JtIGFjY3VyYXRlIGFyaXRobWV0aWMgb3IgY29tcGFyaXNvbi4pXG4gIC8vXG4gIC8vIFRvIGZpeCB0aGUgcHJvYmxlbSwgY29lcmNlIHRoaXMgb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZyBiZWZvcmVcbiAgLy8gcGFzc2luZyBpdCB0byBSZWFjdC4gVGhlIG1vc3QgcmVsaWFibGUgd2F5IGlzIHVzdWFsbHkgYFN0cmluZyh2YWx1ZSlgLlxuICAvL1xuICAvLyBUbyBmaW5kIHdoaWNoIHZhbHVlIGlzIHRocm93aW5nLCBjaGVjayB0aGUgYnJvd3NlciBvciBkZWJ1Z2dlciBjb25zb2xlLlxuICAvLyBCZWZvcmUgdGhpcyBleGNlcHRpb24gd2FzIHRocm93biwgdGhlcmUgc2hvdWxkIGJlIGBjb25zb2xlLmVycm9yYCBvdXRwdXRcbiAgLy8gdGhhdCBzaG93cyB0aGUgdHlwZSAoU3ltYm9sLCBUZW1wb3JhbC5QbGFpbkRhdGUsIGV0Yy4pIHRoYXQgY2F1c2VkIHRoZVxuICAvLyBwcm9ibGVtIGFuZCBob3cgdGhhdCB0eXBlIHdhcyB1c2VkOiBrZXksIGF0cnJpYnV0ZSwgaW5wdXQgdmFsdWUgcHJvcCwgZXRjLlxuICAvLyBJbiBtb3N0IGNhc2VzLCB0aGlzIGNvbnNvbGUgb3V0cHV0IGFsc28gc2hvd3MgdGhlIGNvbXBvbmVudCBhbmQgaXRzXG4gIC8vIGFuY2VzdG9yIGNvbXBvbmVudHMgd2hlcmUgdGhlIGV4Y2VwdGlvbiBoYXBwZW5lZC5cbiAgLy9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gIHJldHVybiAnJyArIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBhdHRyaWJ1dGVOYW1lKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGAlc2AgYXR0cmlidXRlIGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIGF0dHJpYnV0ZU5hbWUsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tLZXlTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBrZXkgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja1Byb3BTdHJpbmdDb2VyY2lvbih2YWx1ZSwgcHJvcE5hbWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQgYCVzYCBwcm9wIGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHByb3BOYW1lLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrQ1NTUHJvcGVydHlTdHJpbmdDb2VyY2lvbih2YWx1ZSwgcHJvcE5hbWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQgYCVzYCBDU1MgcHJvcGVydHkgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgcHJvcE5hbWUsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tIdG1sU3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQgSFRNTCBtYXJrdXAgdXNlcyBhIHZhbHVlIG9mIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignRm9ybSBmaWVsZCB2YWx1ZXMgKHZhbHVlLCBjaGVja2VkLCBkZWZhdWx0VmFsdWUsIG9yIGRlZmF1bHRDaGVja2VkIHByb3BzKScgKyAnIG11c3QgYmUgc3RyaW5ncywgbm90ICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cblxuLy8gQSByZXNlcnZlZCBhdHRyaWJ1dGUuXG4vLyBJdCBpcyBoYW5kbGVkIGJ5IFJlYWN0IHNlcGFyYXRlbHkgYW5kIHNob3VsZG4ndCBiZSB3cml0dGVuIHRvIHRoZSBET00uXG52YXIgUkVTRVJWRUQgPSAwOyAvLyBBIHNpbXBsZSBzdHJpbmcgYXR0cmlidXRlLlxuLy8gQXR0cmlidXRlcyB0aGF0IGFyZW4ndCBpbiB0aGUgZmlsdGVyIGFyZSBwcmVzdW1lZCB0byBoYXZlIHRoaXMgdHlwZS5cblxudmFyIFNUUklORyA9IDE7IC8vIEEgc3RyaW5nIGF0dHJpYnV0ZSB0aGF0IGFjY2VwdHMgYm9vbGVhbnMgaW4gUmVhY3QuIEluIEhUTUwsIHRoZXNlIGFyZSBjYWxsZWRcbi8vIFwiZW51bWVyYXRlZFwiIGF0dHJpYnV0ZXMgd2l0aCBcInRydWVcIiBhbmQgXCJmYWxzZVwiIGFzIHBvc3NpYmxlIHZhbHVlcy5cbi8vIFdoZW4gdHJ1ZSwgaXQgc2hvdWxkIGJlIHNldCB0byBhIFwidHJ1ZVwiIHN0cmluZy5cbi8vIFdoZW4gZmFsc2UsIGl0IHNob3VsZCBiZSBzZXQgdG8gYSBcImZhbHNlXCIgc3RyaW5nLlxuXG52YXIgQk9PTEVBTklTSF9TVFJJTkcgPSAyOyAvLyBBIHJlYWwgYm9vbGVhbiBhdHRyaWJ1dGUuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBwcmVzZW50IChzZXQgZWl0aGVyIHRvIGFuIGVtcHR5IHN0cmluZyBvciBpdHMgbmFtZSkuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgb21pdHRlZC5cblxudmFyIEJPT0xFQU4gPSAzOyAvLyBBbiBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIGZsYWcgYXMgd2VsbCBhcyB3aXRoIGEgdmFsdWUuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBwcmVzZW50IChzZXQgZWl0aGVyIHRvIGFuIGVtcHR5IHN0cmluZyBvciBpdHMgbmFtZSkuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgb21pdHRlZC5cbi8vIEZvciBhbnkgb3RoZXIgdmFsdWUsIHNob3VsZCBiZSBwcmVzZW50IHdpdGggdGhhdCB2YWx1ZS5cblxudmFyIE9WRVJMT0FERURfQk9PTEVBTiA9IDQ7IC8vIEFuIGF0dHJpYnV0ZSB0aGF0IG11c3QgYmUgbnVtZXJpYyBvciBwYXJzZSBhcyBhIG51bWVyaWMuXG4vLyBXaGVuIGZhbHN5LCBpdCBzaG91bGQgYmUgcmVtb3ZlZC5cblxudmFyIE5VTUVSSUMgPSA1OyAvLyBBbiBhdHRyaWJ1dGUgdGhhdCBtdXN0IGJlIHBvc2l0aXZlIG51bWVyaWMgb3IgcGFyc2UgYXMgYSBwb3NpdGl2ZSBudW1lcmljLlxuLy8gV2hlbiBmYWxzeSwgaXQgc2hvdWxkIGJlIHJlbW92ZWQuXG5cbnZhciBQT1NJVElWRV9OVU1FUklDID0gNjtcblxuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xudmFyIEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgPSBcIjpBLVpfYS16XFxcXHUwMEMwLVxcXFx1MDBENlxcXFx1MDBEOC1cXFxcdTAwRjZcXFxcdTAwRjgtXFxcXHUwMkZGXFxcXHUwMzcwLVxcXFx1MDM3RFxcXFx1MDM3Ri1cXFxcdTFGRkZcXFxcdTIwMEMtXFxcXHUyMDBEXFxcXHUyMDcwLVxcXFx1MjE4RlxcXFx1MkMwMC1cXFxcdTJGRUZcXFxcdTMwMDEtXFxcXHVEN0ZGXFxcXHVGOTAwLVxcXFx1RkRDRlxcXFx1RkRGMC1cXFxcdUZGRkRcIjtcbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiAqL1xuXG52YXIgQVRUUklCVVRFX05BTUVfQ0hBUiA9IEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgKyBcIlxcXFwtLjAtOVxcXFx1MDBCN1xcXFx1MDMwMC1cXFxcdTAzNkZcXFxcdTIwM0YtXFxcXHUyMDQwXCI7XG52YXIgVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVggPSBuZXcgUmVnRXhwKCdeWycgKyBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSICsgJ11bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG52YXIgaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZSA9IHt9O1xudmFyIHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZSA9IHt9O1xuZnVuY3Rpb24gaXNBdHRyaWJ1dGVOYW1lU2FmZShhdHRyaWJ1dGVOYW1lKSB7XG4gIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZSwgYXR0cmlidXRlTmFtZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUsIGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYLnRlc3QoYXR0cmlidXRlTmFtZSkpIHtcbiAgICB2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGVbYXR0cmlidXRlTmFtZV0gPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG5cbiAge1xuICAgIGVycm9yKCdJbnZhbGlkIGF0dHJpYnV0ZSBuYW1lOiBgJXNgJywgYXR0cmlidXRlTmFtZSk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzaG91bGRJZ25vcmVBdHRyaWJ1dGUobmFtZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHByb3BlcnR5SW5mby50eXBlID09PSBSRVNFUlZFRDtcbiAgfVxuXG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChuYW1lLmxlbmd0aCA+IDIgJiYgKG5hbWVbMF0gPT09ICdvJyB8fCBuYW1lWzBdID09PSAnTycpICYmIChuYW1lWzFdID09PSAnbicgfHwgbmFtZVsxXSA9PT0gJ04nKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCAmJiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gUkVTRVJWRUQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgIGNhc2UgJ2Z1bmN0aW9uJzogLy8gJEZsb3dJc3N1ZSBzeW1ib2wgaXMgcGVyZmVjdGx5IHZhbGlkIGhlcmVcblxuICAgIGNhc2UgJ3N5bWJvbCc6XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAge1xuICAgICAgICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuICFwcm9wZXJ0eUluZm8uYWNjZXB0c0Jvb2xlYW5zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBwcmVmaXggPSBuYW1lLnRvTG93ZXJDYXNlKCkuc2xpY2UoMCwgNSk7XG4gICAgICAgICAgcmV0dXJuIHByZWZpeCAhPT0gJ2RhdGEtJyAmJiBwcmVmaXggIT09ICdhcmlhLSc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG5cbiAgICBzd2l0Y2ggKHByb3BlcnR5SW5mby50eXBlKSB7XG4gICAgICBjYXNlIEJPT0xFQU46XG4gICAgICAgIHJldHVybiAhdmFsdWU7XG5cbiAgICAgIGNhc2UgT1ZFUkxPQURFRF9CT09MRUFOOlxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IGZhbHNlO1xuXG4gICAgICBjYXNlIE5VTUVSSUM6XG4gICAgICAgIHJldHVybiBpc05hTih2YWx1ZSk7XG5cbiAgICAgIGNhc2UgUE9TSVRJVkVfTlVNRVJJQzpcbiAgICAgICAgcmV0dXJuIGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA8IDE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0UHJvcGVydHlJbmZvKG5hbWUpIHtcbiAgcmV0dXJuIHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBwcm9wZXJ0aWVzW25hbWVdIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIHR5cGUsIG11c3RVc2VQcm9wZXJ0eSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZXNwYWNlLCBzYW5pdGl6ZVVSTCwgcmVtb3ZlRW1wdHlTdHJpbmcpIHtcbiAgdGhpcy5hY2NlcHRzQm9vbGVhbnMgPSB0eXBlID09PSBCT09MRUFOSVNIX1NUUklORyB8fCB0eXBlID09PSBCT09MRUFOIHx8IHR5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTjtcbiAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTtcbiAgdGhpcy5hdHRyaWJ1dGVOYW1lc3BhY2UgPSBhdHRyaWJ1dGVOYW1lc3BhY2U7XG4gIHRoaXMubXVzdFVzZVByb3BlcnR5ID0gbXVzdFVzZVByb3BlcnR5O1xuICB0aGlzLnByb3BlcnR5TmFtZSA9IG5hbWU7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMuc2FuaXRpemVVUkwgPSBzYW5pdGl6ZVVSTDtcbiAgdGhpcy5yZW1vdmVFbXB0eVN0cmluZyA9IHJlbW92ZUVtcHR5U3RyaW5nO1xufSAvLyBXaGVuIGFkZGluZyBhdHRyaWJ1dGVzIHRvIHRoaXMgbGlzdCwgYmUgc3VyZSB0byBhbHNvIGFkZCB0aGVtIHRvXG4vLyB0aGUgYHBvc3NpYmxlU3RhbmRhcmROYW1lc2AgbW9kdWxlIHRvIGVuc3VyZSBjYXNpbmcgYW5kIGluY29ycmVjdFxuLy8gbmFtZSB3YXJuaW5ncy5cblxuXG52YXIgcHJvcGVydGllcyA9IHt9OyAvLyBUaGVzZSBwcm9wcyBhcmUgcmVzZXJ2ZWQgYnkgUmVhY3QuIFRoZXkgc2hvdWxkbid0IGJlIHdyaXR0ZW4gdG8gdGhlIERPTS5cblxudmFyIHJlc2VydmVkUHJvcHMgPSBbJ2NoaWxkcmVuJywgJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJywgLy8gVE9ETzogVGhpcyBwcmV2ZW50cyB0aGUgYXNzaWdubWVudCBvZiBkZWZhdWx0VmFsdWUgdG8gcmVndWxhclxuLy8gZWxlbWVudHMgKG5vdCBqdXN0IGlucHV0cykuIE5vdyB0aGF0IFJlYWN0RE9NSW5wdXQgYXNzaWducyB0byB0aGVcbi8vIGRlZmF1bHRWYWx1ZSBwcm9wZXJ0eSAtLSBkbyB3ZSBuZWVkIHRoaXM/XG4nZGVmYXVsdFZhbHVlJywgJ2RlZmF1bHRDaGVja2VkJywgJ2lubmVySFRNTCcsICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLCAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJywgJ3N0eWxlJ107XG5cbnJlc2VydmVkUHJvcHMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBSRVNFUlZFRCwgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIEEgZmV3IFJlYWN0IHN0cmluZyBhdHRyaWJ1dGVzIGhhdmUgYSBkaWZmZXJlbnQgbmFtZS5cbi8vIFRoaXMgaXMgYSBtYXBwaW5nIGZyb20gUmVhY3QgcHJvcCBuYW1lcyB0byB0aGUgYXR0cmlidXRlIG5hbWVzLlxuXG5bWydhY2NlcHRDaGFyc2V0JywgJ2FjY2VwdC1jaGFyc2V0J10sIFsnY2xhc3NOYW1lJywgJ2NsYXNzJ10sIFsnaHRtbEZvcicsICdmb3InXSwgWydodHRwRXF1aXYnLCAnaHR0cC1lcXVpdiddXS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gIHZhciBuYW1lID0gX3JlZlswXSxcbiAgICAgIGF0dHJpYnV0ZU5hbWUgPSBfcmVmWzFdO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgXCJlbnVtZXJhdGVkXCIgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgYWNjZXB0IFwidHJ1ZVwiIGFuZCBcImZhbHNlXCIuXG4vLyBJbiBSZWFjdCwgd2UgbGV0IHVzZXJzIHBhc3MgYHRydWVgIGFuZCBgZmFsc2VgIGV2ZW4gdGhvdWdoIHRlY2huaWNhbGx5XG4vLyB0aGVzZSBhcmVuJ3QgYm9vbGVhbiBhdHRyaWJ1dGVzICh0aGV5IGFyZSBjb2VyY2VkIHRvIHN0cmluZ3MpLlxuXG5bJ2NvbnRlbnRFZGl0YWJsZScsICdkcmFnZ2FibGUnLCAnc3BlbGxDaGVjaycsICd2YWx1ZSddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTklTSF9TVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSBcImVudW1lcmF0ZWRcIiBTVkcgYXR0cmlidXRlcyB0aGF0IGFjY2VwdCBcInRydWVcIiBhbmQgXCJmYWxzZVwiLlxuLy8gSW4gUmVhY3QsIHdlIGxldCB1c2VycyBwYXNzIGB0cnVlYCBhbmQgYGZhbHNlYCBldmVuIHRob3VnaCB0ZWNobmljYWxseVxuLy8gdGhlc2UgYXJlbid0IGJvb2xlYW4gYXR0cmlidXRlcyAodGhleSBhcmUgY29lcmNlZCB0byBzdHJpbmdzKS5cbi8vIFNpbmNlIHRoZXNlIGFyZSBTVkcgYXR0cmlidXRlcywgdGhlaXIgYXR0cmlidXRlIG5hbWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cblxuWydhdXRvUmV2ZXJzZScsICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJywgJ2ZvY3VzYWJsZScsICdwcmVzZXJ2ZUFscGhhJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOSVNIX1NUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSBIVE1MIGJvb2xlYW4gYXR0cmlidXRlcy5cblxuWydhbGxvd0Z1bGxTY3JlZW4nLCAnYXN5bmMnLCAvLyBOb3RlOiB0aGVyZSBpcyBhIHNwZWNpYWwgY2FzZSB0aGF0IHByZXZlbnRzIGl0IGZyb20gYmVpbmcgd3JpdHRlbiB0byB0aGUgRE9NXG4vLyBvbiB0aGUgY2xpZW50IHNpZGUgYmVjYXVzZSB0aGUgYnJvd3NlcnMgYXJlIGluY29uc2lzdGVudC4gSW5zdGVhZCB3ZSBjYWxsIGZvY3VzKCkuXG4nYXV0b0ZvY3VzJywgJ2F1dG9QbGF5JywgJ2NvbnRyb2xzJywgJ2RlZmF1bHQnLCAnZGVmZXInLCAnZGlzYWJsZWQnLCAnZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUnLCAnZGlzYWJsZVJlbW90ZVBsYXliYWNrJywgJ2Zvcm1Ob1ZhbGlkYXRlJywgJ2hpZGRlbicsICdsb29wJywgJ25vTW9kdWxlJywgJ25vVmFsaWRhdGUnLCAnb3BlbicsICdwbGF5c0lubGluZScsICdyZWFkT25seScsICdyZXF1aXJlZCcsICdyZXZlcnNlZCcsICdzY29wZWQnLCAnc2VhbWxlc3MnLCAvLyBNaWNyb2RhdGFcbidpdGVtU2NvcGUnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU4sIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSB0aGUgZmV3IFJlYWN0IHByb3BzIHRoYXQgd2Ugc2V0IGFzIERPTSBwcm9wZXJ0aWVzXG4vLyByYXRoZXIgdGhhbiBhdHRyaWJ1dGVzLiBUaGVzZSBhcmUgYWxsIGJvb2xlYW5zLlxuXG5bJ2NoZWNrZWQnLCAvLyBOb3RlOiBgb3B0aW9uLnNlbGVjdGVkYCBpcyBub3QgdXBkYXRlZCBpZiBgc2VsZWN0Lm11bHRpcGxlYCBpc1xuLy8gZGlzYWJsZWQgd2l0aCBgcmVtb3ZlQXR0cmlidXRlYC4gV2UgaGF2ZSBzcGVjaWFsIGxvZ2ljIGZvciBoYW5kbGluZyB0aGlzLlxuJ211bHRpcGxlJywgJ211dGVkJywgJ3NlbGVjdGVkJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOLCB0cnVlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgYXJlIFwib3ZlcmxvYWRlZCBib29sZWFuc1wiOiB0aGV5IGJlaGF2ZSBsaWtlXG4vLyBib29sZWFucywgYnV0IGNhbiBhbHNvIGFjY2VwdCBhIHN0cmluZyB2YWx1ZS5cblxuWydjYXB0dXJlJywgJ2Rvd25sb2FkJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBPVkVSTE9BREVEX0JPT0xFQU4sIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgbXVzdCBiZSBwb3NpdGl2ZSBudW1iZXJzLlxuXG5bJ2NvbHMnLCAncm93cycsICdzaXplJywgJ3NwYW4nIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFBPU0lUSVZFX05VTUVSSUMsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgbXVzdCBiZSBudW1iZXJzLlxuXG5bJ3Jvd1NwYW4nLCAnc3RhcnQnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIE5VTUVSSUMsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7XG52YXIgQ0FNRUxJWkUgPSAvW1xcLVxcOl0oW2Etel0pL2c7XG5cbnZhciBjYXBpdGFsaXplID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gIHJldHVybiB0b2tlblsxXS50b1VwcGVyQ2FzZSgpO1xufTsgLy8gVGhpcyBpcyBhIGxpc3Qgb2YgYWxsIFNWRyBhdHRyaWJ1dGVzIHRoYXQgbmVlZCBzcGVjaWFsIGNhc2luZywgbmFtZXNwYWNpbmcsXG4vLyBvciBib29sZWFuIHZhbHVlIGFzc2lnbm1lbnQuIFJlZ3VsYXIgYXR0cmlidXRlcyB0aGF0IGp1c3QgYWNjZXB0IHN0cmluZ3Ncbi8vIGFuZCBoYXZlIHRoZSBzYW1lIG5hbWVzIGFyZSBvbWl0dGVkLCBqdXN0IGxpa2UgaW4gdGhlIEhUTUwgYXR0cmlidXRlIGZpbHRlci5cbi8vIFNvbWUgb2YgdGhlc2UgYXR0cmlidXRlcyBjYW4gYmUgaGFyZCB0byBmaW5kLiBUaGlzIGxpc3Qgd2FzIGNyZWF0ZWQgYnlcbi8vIHNjcmFwaW5nIHRoZSBNRE4gZG9jdW1lbnRhdGlvbi5cblxuXG5bJ2FjY2VudC1oZWlnaHQnLCAnYWxpZ25tZW50LWJhc2VsaW5lJywgJ2FyYWJpYy1mb3JtJywgJ2Jhc2VsaW5lLXNoaWZ0JywgJ2NhcC1oZWlnaHQnLCAnY2xpcC1wYXRoJywgJ2NsaXAtcnVsZScsICdjb2xvci1pbnRlcnBvbGF0aW9uJywgJ2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVycycsICdjb2xvci1wcm9maWxlJywgJ2NvbG9yLXJlbmRlcmluZycsICdkb21pbmFudC1iYXNlbGluZScsICdlbmFibGUtYmFja2dyb3VuZCcsICdmaWxsLW9wYWNpdHknLCAnZmlsbC1ydWxlJywgJ2Zsb29kLWNvbG9yJywgJ2Zsb29kLW9wYWNpdHknLCAnZm9udC1mYW1pbHknLCAnZm9udC1zaXplJywgJ2ZvbnQtc2l6ZS1hZGp1c3QnLCAnZm9udC1zdHJldGNoJywgJ2ZvbnQtc3R5bGUnLCAnZm9udC12YXJpYW50JywgJ2ZvbnQtd2VpZ2h0JywgJ2dseXBoLW5hbWUnLCAnZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCcsICdnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCcsICdob3Jpei1hZHYteCcsICdob3Jpei1vcmlnaW4teCcsICdpbWFnZS1yZW5kZXJpbmcnLCAnbGV0dGVyLXNwYWNpbmcnLCAnbGlnaHRpbmctY29sb3InLCAnbWFya2VyLWVuZCcsICdtYXJrZXItbWlkJywgJ21hcmtlci1zdGFydCcsICdvdmVybGluZS1wb3NpdGlvbicsICdvdmVybGluZS10aGlja25lc3MnLCAncGFpbnQtb3JkZXInLCAncGFub3NlLTEnLCAncG9pbnRlci1ldmVudHMnLCAncmVuZGVyaW5nLWludGVudCcsICdzaGFwZS1yZW5kZXJpbmcnLCAnc3RvcC1jb2xvcicsICdzdG9wLW9wYWNpdHknLCAnc3RyaWtldGhyb3VnaC1wb3NpdGlvbicsICdzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcycsICdzdHJva2UtZGFzaGFycmF5JywgJ3N0cm9rZS1kYXNob2Zmc2V0JywgJ3N0cm9rZS1saW5lY2FwJywgJ3N0cm9rZS1saW5lam9pbicsICdzdHJva2UtbWl0ZXJsaW1pdCcsICdzdHJva2Utb3BhY2l0eScsICdzdHJva2Utd2lkdGgnLCAndGV4dC1hbmNob3InLCAndGV4dC1kZWNvcmF0aW9uJywgJ3RleHQtcmVuZGVyaW5nJywgJ3VuZGVybGluZS1wb3NpdGlvbicsICd1bmRlcmxpbmUtdGhpY2tuZXNzJywgJ3VuaWNvZGUtYmlkaScsICd1bmljb2RlLXJhbmdlJywgJ3VuaXRzLXBlci1lbScsICd2LWFscGhhYmV0aWMnLCAndi1oYW5naW5nJywgJ3YtaWRlb2dyYXBoaWMnLCAndi1tYXRoZW1hdGljYWwnLCAndmVjdG9yLWVmZmVjdCcsICd2ZXJ0LWFkdi15JywgJ3ZlcnQtb3JpZ2luLXgnLCAndmVydC1vcmlnaW4teScsICd3b3JkLXNwYWNpbmcnLCAnd3JpdGluZy1tb2RlJywgJ3htbG5zOnhsaW5rJywgJ3gtaGVpZ2h0JyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICB2YXIgbmFtZSA9IGF0dHJpYnV0ZU5hbWUucmVwbGFjZShDQU1FTElaRSwgY2FwaXRhbGl6ZSk7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLCBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBTdHJpbmcgU1ZHIGF0dHJpYnV0ZXMgd2l0aCB0aGUgeGxpbmsgbmFtZXNwYWNlLlxuXG5bJ3hsaW5rOmFjdHVhdGUnLCAneGxpbms6YXJjcm9sZScsICd4bGluazpyb2xlJywgJ3hsaW5rOnNob3cnLCAneGxpbms6dGl0bGUnLCAneGxpbms6dHlwZScgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFN0cmluZyBTVkcgYXR0cmlidXRlcyB3aXRoIHRoZSB4bWwgbmFtZXNwYWNlLlxuXG5bJ3htbDpiYXNlJywgJ3htbDpsYW5nJywgJ3htbDpzcGFjZScgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScsIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXR0cmlidXRlIGV4aXN0cyBib3RoIGluIEhUTUwgYW5kIFNWRy5cbi8vIFRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBjYXNlLXNlbnNpdGl2ZSBpbiBTVkcgc28gd2UgY2FuJ3QganVzdCB1c2Vcbi8vIHRoZSBSZWFjdCBuYW1lIGxpa2Ugd2UgZG8gZm9yIGF0dHJpYnV0ZXMgdGhhdCBleGlzdCBvbmx5IGluIEhUTUwuXG5cblsndGFiSW5kZXgnLCAnY3Jvc3NPcmlnaW4nXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHByb3BlcnRpZXNbYXR0cmlidXRlTmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKGF0dHJpYnV0ZU5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXR0cmlidXRlcyBhY2NlcHQgVVJMcy4gVGhlc2UgbXVzdCBub3QgYWxsb3cgamF2YXNjcmlwdDogVVJMUy5cbi8vIFRoZXNlIHdpbGwgYWxzbyBuZWVkIHRvIGFjY2VwdCBUcnVzdGVkIFR5cGVzIG9iamVjdCBpbiB0aGUgZnV0dXJlLlxuXG52YXIgeGxpbmtIcmVmID0gJ3hsaW5rSHJlZic7XG5wcm9wZXJ0aWVzW3hsaW5rSHJlZl0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKCd4bGlua0hyZWYnLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbid4bGluazpocmVmJywgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCB0cnVlLCAvLyBzYW5pdGl6ZVVSTFxuZmFsc2UpO1xuWydzcmMnLCAnaHJlZicsICdhY3Rpb24nLCAnZm9ybUFjdGlvbiddLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgcHJvcGVydGllc1thdHRyaWJ1dGVOYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQoYXR0cmlidXRlTmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgdHJ1ZSwgLy8gc2FuaXRpemVVUkxcbiAgdHJ1ZSk7XG59KTtcblxuLy8gYW5kIGFueSBuZXdsaW5lIG9yIHRhYiBhcmUgZmlsdGVyZWQgb3V0IGFzIGlmIHRoZXkncmUgbm90IHBhcnQgb2YgdGhlIFVSTC5cbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsLXBhcnNpbmdcbi8vIFRhYiBvciBuZXdsaW5lIGFyZSBkZWZpbmVkIGFzIFxcclxcblxcdDpcbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNhc2NpaS10YWItb3ItbmV3bGluZVxuLy8gQSBDMCBjb250cm9sIGlzIGEgY29kZSBwb2ludCBpbiB0aGUgcmFuZ2UgXFx1MDAwMCBOVUxMIHRvIFxcdTAwMUZcbi8vIElORk9STUFUSU9OIFNFUEFSQVRPUiBPTkUsIGluY2x1c2l2ZTpcbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNjMC1jb250cm9sLW9yLXNwYWNlXG5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cblxudmFyIGlzSmF2YVNjcmlwdFByb3RvY29sID0gL15bXFx1MDAwMC1cXHUwMDFGIF0qaltcXHJcXG5cXHRdKmFbXFxyXFxuXFx0XSp2W1xcclxcblxcdF0qYVtcXHJcXG5cXHRdKnNbXFxyXFxuXFx0XSpjW1xcclxcblxcdF0qcltcXHJcXG5cXHRdKmlbXFxyXFxuXFx0XSpwW1xcclxcblxcdF0qdFtcXHJcXG5cXHRdKlxcOi9pO1xudmFyIGRpZFdhcm4gPSBmYWxzZTtcblxuZnVuY3Rpb24gc2FuaXRpemVVUkwodXJsKSB7XG4gIHtcbiAgICBpZiAoIWRpZFdhcm4gJiYgaXNKYXZhU2NyaXB0UHJvdG9jb2wudGVzdCh1cmwpKSB7XG4gICAgICBkaWRXYXJuID0gdHJ1ZTtcblxuICAgICAgZXJyb3IoJ0EgZnV0dXJlIHZlcnNpb24gb2YgUmVhY3Qgd2lsbCBibG9jayBqYXZhc2NyaXB0OiBVUkxzIGFzIGEgc2VjdXJpdHkgcHJlY2F1dGlvbi4gJyArICdVc2UgZXZlbnQgaGFuZGxlcnMgaW5zdGVhZCBpZiB5b3UgY2FuLiBJZiB5b3UgbmVlZCB0byBnZW5lcmF0ZSB1bnNhZmUgSFRNTCB0cnkgJyArICd1c2luZyBkYW5nZXJvdXNseVNldElubmVySFRNTCBpbnN0ZWFkLiBSZWFjdCB3YXMgcGFzc2VkICVzLicsIEpTT04uc3RyaW5naWZ5KHVybCkpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9yIGEgcHJvcGVydHkgb24gYSBub2RlLiBPbmx5IHVzZWQgaW4gREVWIGZvciBTU1IgdmFsaWRhdGlvbi5cbiAqIFRoZSBcImV4cGVjdGVkXCIgYXJndW1lbnQgaXMgdXNlZCBhcyBhIGhpbnQgb2Ygd2hhdCB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMuXG4gKiBTb21lIHByb3BlcnRpZXMgaGF2ZSBtdWx0aXBsZSBlcXVpdmFsZW50IHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCBuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvKSB7XG4gIHtcbiAgICBpZiAocHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eSkge1xuICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWU7XG4gICAgICByZXR1cm4gbm9kZVtwcm9wZXJ0eU5hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGNoZWNrIHByb3RlY3RzIG11bHRpcGxlIHVzZXMgb2YgYGV4cGVjdGVkYCwgd2hpY2ggaXMgd2h5IHRoZVxuICAgICAgLy8gcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb24gcnVsZSBpcyBkaXNhYmxlZCBpbiBzZXZlcmFsIHNwb3RzXG4gICAgICAvLyBiZWxvdy5cbiAgICAgIHtcbiAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihleHBlY3RlZCwgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICggcHJvcGVydHlJbmZvLnNhbml0aXplVVJMKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmVuJ3QgZnVsbHkgZGlzYWJsZWQgamF2YXNjcmlwdDogVVJMcywgYW5kIGlmXG4gICAgICAgIC8vIHRoZSBoeWRyYXRpb24gaXMgc3VjY2Vzc2Z1bCBvZiBhIGphdmFzY3JpcHQ6IFVSTCwgd2VcbiAgICAgICAgLy8gc3RpbGwgd2FudCB0byB3YXJuIG9uIHRoZSBjbGllbnQuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgICBzYW5pdGl6ZVVSTCgnJyArIGV4cGVjdGVkKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZTtcbiAgICAgIHZhciBzdHJpbmdWYWx1ZSA9IG51bGw7XG5cbiAgICAgIGlmIChwcm9wZXJ0eUluZm8udHlwZSA9PT0gT1ZFUkxPQURFRF9CT09MRUFOKSB7XG4gICAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuXG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09ICcnICsgZXhwZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgICAgICAvLyBXZSBoYWQgYW4gYXR0cmlidXRlIGJ1dCBzaG91bGRuJ3QgaGF2ZSBoYWQgb25lLCBzbyByZWFkIGl0XG4gICAgICAgICAgLy8gZm9yIHRoZSBlcnJvciBtZXNzYWdlLlxuICAgICAgICAgIHJldHVybiBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8udHlwZSA9PT0gQk9PTEVBTikge1xuICAgICAgICAgIC8vIElmIHRoaXMgd2FzIGEgYm9vbGVhbiwgaXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgdmFsdWUgaXNcbiAgICAgICAgICAvLyB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgaXQgaXMgdGhlIHNhbWUgYXMgdGhlIGV4cGVjdGVkLlxuICAgICAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICAgICAgfSAvLyBFdmVuIGlmIHRoaXMgcHJvcGVydHkgdXNlcyBhIG5hbWVzcGFjZSB3ZSB1c2UgZ2V0QXR0cmlidXRlXG4gICAgICAgIC8vIGJlY2F1c2Ugd2UgYXNzdW1lIGl0cyBuYW1lc3BhY2VkIG5hbWUgaXMgdGhlIHNhbWUgYXMgb3VyIGNvbmZpZy5cbiAgICAgICAgLy8gVG8gdXNlIGdldEF0dHJpYnV0ZU5TIHdlIG5lZWQgdGhlIGxvY2FsIG5hbWUgd2hpY2ggd2UgZG9uJ3QgaGF2ZVxuICAgICAgICAvLyBpbiBvdXIgY29uZmlnIGF0bS5cblxuXG4gICAgICAgIHN0cmluZ1ZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdWYWx1ZSA9PT0gbnVsbCA/IGV4cGVjdGVkIDogc3RyaW5nVmFsdWU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgfSBlbHNlIGlmIChzdHJpbmdWYWx1ZSA9PT0gJycgKyBleHBlY3RlZCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9yIGEgYXR0cmlidXRlIG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdXNlZCBhcyBhIGhpbnQgb2Ygd2hhdCB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMuIFNvbWVcbiAqIGF0dHJpYnV0ZXMgaGF2ZSBtdWx0aXBsZSBlcXVpdmFsZW50IHZhbHVlcy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRWYWx1ZUZvckF0dHJpYnV0ZShub2RlLCBuYW1lLCBleHBlY3RlZCwgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAge1xuICAgIGlmICghaXNBdHRyaWJ1dGVOYW1lU2FmZShuYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghbm9kZS5oYXNBdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgIHJldHVybiBleHBlY3RlZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShuYW1lKTtcblxuICAgIHtcbiAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24oZXhwZWN0ZWQsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gJycgKyBleHBlY3RlZCkge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBmb3IgYSBwcm9wZXJ0eSBvbiBhIG5vZGUuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICovXG5cbmZ1bmN0aW9uIHNldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgbmFtZSwgdmFsdWUsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIHZhciBwcm9wZXJ0eUluZm8gPSBnZXRQcm9wZXJ0eUluZm8obmFtZSk7XG5cbiAgaWYgKHNob3VsZElnbm9yZUF0dHJpYnV0ZShuYW1lLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgdmFsdWUgPSBudWxsO1xuICB9XG5cblxuICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcgfHwgcHJvcGVydHlJbmZvID09PSBudWxsKSB7XG4gICAgaWYgKGlzQXR0cmlidXRlTmFtZVNhZmUobmFtZSkpIHtcbiAgICAgIHZhciBfYXR0cmlidXRlTmFtZSA9IG5hbWU7XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShfYXR0cmlidXRlTmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB7XG4gICAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwgbmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShfYXR0cmlidXRlTmFtZSwgICcnICsgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBtdXN0VXNlUHJvcGVydHkgPSBwcm9wZXJ0eUluZm8ubXVzdFVzZVByb3BlcnR5O1xuXG4gIGlmIChtdXN0VXNlUHJvcGVydHkpIHtcbiAgICB2YXIgcHJvcGVydHlOYW1lID0gcHJvcGVydHlJbmZvLnByb3BlcnR5TmFtZTtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdmFyIHR5cGUgPSBwcm9wZXJ0eUluZm8udHlwZTtcbiAgICAgIG5vZGVbcHJvcGVydHlOYW1lXSA9IHR5cGUgPT09IEJPT0xFQU4gPyBmYWxzZSA6ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb250cmFyeSB0byBgc2V0QXR0cmlidXRlYCwgb2JqZWN0IHByb3BlcnRpZXMgYXJlIHByb3Blcmx5XG4gICAgICAvLyBgdG9TdHJpbmdgZWQgYnkgSUU4LzkuXG4gICAgICBub2RlW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0gLy8gVGhlIHJlc3QgYXJlIHRyZWF0ZWQgYXMgYXR0cmlidXRlcyB3aXRoIHNwZWNpYWwgY2FzZXMuXG5cblxuICB2YXIgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lLFxuICAgICAgYXR0cmlidXRlTmFtZXNwYWNlID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWVzcGFjZTtcblxuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgX3R5cGUgPSBwcm9wZXJ0eUluZm8udHlwZTtcbiAgICB2YXIgYXR0cmlidXRlVmFsdWU7XG5cbiAgICBpZiAoX3R5cGUgPT09IEJPT0xFQU4gfHwgX3R5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTiAmJiB2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgLy8gSWYgYXR0cmlidXRlIHR5cGUgaXMgYm9vbGVhbiwgd2Uga25vdyBmb3Igc3VyZSBpdCB3b24ndCBiZSBhbiBleGVjdXRpb24gc2lua1xuICAgICAgLy8gYW5kIHdlIHdvbid0IHJlcXVpcmUgVHJ1c3RlZCBUeXBlIGhlcmUuXG4gICAgICBhdHRyaWJ1dGVWYWx1ZSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBgc2V0QXR0cmlidXRlYCB3aXRoIG9iamVjdHMgYmVjb21lcyBvbmx5IGBbb2JqZWN0XWAgaW4gSUU4LzksXG4gICAgICAvLyAoJycgKyB2YWx1ZSkgbWFrZXMgaXQgb3V0cHV0IHRoZSBjb3JyZWN0IHRvU3RyaW5nKCktdmFsdWUuXG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BlcnR5SW5mby5zYW5pdGl6ZVVSTCkge1xuICAgICAgICBzYW5pdGl6ZVVSTChhdHRyaWJ1dGVWYWx1ZS50b1N0cmluZygpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYXR0cmlidXRlTmFtZXNwYWNlKSB7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZU5TKGF0dHJpYnV0ZU5hbWVzcGFjZSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbi8vIEFUVEVOVElPTlxuLy8gV2hlbiBhZGRpbmcgbmV3IHN5bWJvbHMgdG8gdGhpcyBmaWxlLFxuLy8gUGxlYXNlIGNvbnNpZGVyIGFsc28gYWRkaW5nIHRvICdyZWFjdC1kZXZ0b29scy1zaGFyZWQvc3JjL2JhY2tlbmQvUmVhY3RTeW1ib2xzJ1xuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpO1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJyk7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJyk7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubGF6eScpO1xudmFyIFJFQUNUX1NDT1BFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zY29wZScpO1xudmFyIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZGVidWdfdHJhY2VfbW9kZScpO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Qub2Zmc2NyZWVuJyk7XG52YXIgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubGVnYWN5X2hpZGRlbicpO1xudmFyIFJFQUNUX0NBQ0hFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jYWNoZScpO1xudmFyIFJFQUNUX1RSQUNJTkdfTUFSS0VSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC50cmFjaW5nX21hcmtlcicpO1xudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcblxuLy8gSGVscGVycyB0byBwYXRjaCBjb25zb2xlLmxvZ3MgdG8gYXZvaWQgbG9nZ2luZyBkdXJpbmcgc2lkZS1lZmZlY3QgZnJlZVxuLy8gcmVwbGF5aW5nIG9uIHJlbmRlciBmdW5jdGlvbi4gVGhpcyBjdXJyZW50bHkgb25seSBwYXRjaGVzIHRoZSBvYmplY3Rcbi8vIGxhemlseSB3aGljaCB3b24ndCBjb3ZlciBpZiB0aGUgbG9nIGZ1bmN0aW9uIHdhcyBleHRyYWN0ZWQgZWFnZXJseS5cbi8vIFdlIGNvdWxkIGFsc28gZWFnZXJseSBwYXRjaCB0aGUgbWV0aG9kLlxudmFyIGRpc2FibGVkRGVwdGggPSAwO1xudmFyIHByZXZMb2c7XG52YXIgcHJldkluZm87XG52YXIgcHJldldhcm47XG52YXIgcHJldkVycm9yO1xudmFyIHByZXZHcm91cDtcbnZhciBwcmV2R3JvdXBDb2xsYXBzZWQ7XG52YXIgcHJldkdyb3VwRW5kO1xuXG5mdW5jdGlvbiBkaXNhYmxlZExvZygpIHt9XG5cbmRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9IHRydWU7XG5mdW5jdGlvbiBkaXNhYmxlTG9ncygpIHtcbiAge1xuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHByZXZMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgIHByZXZJbmZvID0gY29uc29sZS5pbmZvO1xuICAgICAgcHJldldhcm4gPSBjb25zb2xlLndhcm47XG4gICAgICBwcmV2RXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgcHJldkdyb3VwID0gY29uc29sZS5ncm91cDtcbiAgICAgIHByZXZHcm91cENvbGxhcHNlZCA9IGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQ7XG4gICAgICBwcmV2R3JvdXBFbmQgPSBjb25zb2xlLmdyb3VwRW5kOyAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5MDk5XG5cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogZGlzYWJsZWRMb2csXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGluZm86IHByb3BzLFxuICAgICAgICBsb2c6IHByb3BzLFxuICAgICAgICB3YXJuOiBwcm9wcyxcbiAgICAgICAgZXJyb3I6IHByb3BzLFxuICAgICAgICBncm91cDogcHJvcHMsXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBFbmQ6IHByb3BzXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgZGlzYWJsZWREZXB0aCsrO1xuICB9XG59XG5mdW5jdGlvbiByZWVuYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBkaXNhYmxlZERlcHRoLS07XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgbG9nOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZMb2dcbiAgICAgICAgfSksXG4gICAgICAgIGluZm86IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldldhcm5cbiAgICAgICAgfSksXG4gICAgICAgIGVycm9yOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZFcnJvclxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXA6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWRcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwRW5kOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZERlcHRoIDwgMCkge1xuICAgICAgZXJyb3IoJ2Rpc2FibGVkRGVwdGggZmVsbCBiZWxvdyB6ZXJvLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG52YXIgcHJlZml4O1xuZnVuY3Rpb24gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEV4dHJhY3QgdGhlIFZNIHNwZWNpZmljIHByZWZpeCB1c2VkIGJ5IGVhY2ggbGluZS5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIHZhciBtYXRjaCA9IHguc3RhY2sudHJpbSgpLm1hdGNoKC9cXG4oICooYXQgKT8pLyk7XG4gICAgICAgIHByZWZpeCA9IG1hdGNoICYmIG1hdGNoWzFdIHx8ICcnO1xuICAgICAgfVxuICAgIH0gLy8gV2UgdXNlIHRoZSBwcmVmaXggdG8gZW5zdXJlIG91ciBzdGFja3MgbGluZSB1cCB3aXRoIG5hdGl2ZSBzdGFjayBmcmFtZXMuXG5cblxuICAgIHJldHVybiAnXFxuJyArIHByZWZpeCArIG5hbWU7XG4gIH1cbn1cbnZhciByZWVudHJ5ID0gZmFsc2U7XG52YXIgY29tcG9uZW50RnJhbWVDYWNoZTtcblxue1xuICB2YXIgUG9zc2libHlXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwO1xuICBjb21wb25lbnRGcmFtZUNhY2hlID0gbmV3IFBvc3NpYmx5V2Vha01hcCgpO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBjb25zdHJ1Y3QpIHtcbiAgLy8gSWYgc29tZXRoaW5nIGFza2VkIGZvciBhIHN0YWNrIGluc2lkZSBhIGZha2UgcmVuZGVyLCBpdCBzaG91bGQgZ2V0IGlnbm9yZWQuXG4gIGlmICggIWZuIHx8IHJlZW50cnkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB7XG4gICAgdmFyIGZyYW1lID0gY29tcG9uZW50RnJhbWVDYWNoZS5nZXQoZm4pO1xuXG4gICAgaWYgKGZyYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmcmFtZTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29udHJvbDtcbiAgcmVlbnRyeSA9IHRydWU7XG4gIHZhciBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7IC8vICRGbG93Rml4TWUgSXQgZG9lcyBhY2NlcHQgdW5kZWZpbmVkLlxuXG4gIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gdW5kZWZpbmVkO1xuICB2YXIgcHJldmlvdXNEaXNwYXRjaGVyO1xuXG4gIHtcbiAgICBwcmV2aW91c0Rpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQ7IC8vIFNldCB0aGUgZGlzcGF0Y2hlciBpbiBERVYgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGNhbGwgaW4gdGhlIHJlbmRlciBmdW5jdGlvblxuICAgIC8vIGZvciB3YXJuaW5ncy5cblxuICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IG51bGw7XG4gICAgZGlzYWJsZUxvZ3MoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBzaG91bGQgdGhyb3cuXG4gICAgaWYgKGNvbnN0cnVjdCkge1xuICAgICAgLy8gU29tZXRoaW5nIHNob3VsZCBiZSBzZXR0aW5nIHRoZSBwcm9wcyBpbiB0aGUgY29uc3RydWN0b3IuXG4gICAgICB2YXIgRmFrZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH07IC8vICRGbG93Rml4TWVcblxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmFrZS5wcm90b3R5cGUsICdwcm9wcycsIHtcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gV2UgdXNlIGEgdGhyb3dpbmcgc2V0dGVyIGluc3RlYWQgb2YgZnJvemVuIG9yIG5vbi13cml0YWJsZSBwcm9wc1xuICAgICAgICAgIC8vIGJlY2F1c2UgdGhhdCB3b24ndCB0aHJvdyBpbiBhIG5vbi1zdHJpY3QgbW9kZSBmdW5jdGlvbi5cbiAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmNvbnN0cnVjdCkge1xuICAgICAgICAvLyBXZSBjb25zdHJ1Y3QgYSBkaWZmZXJlbnQgY29udHJvbCBmb3IgdGhpcyBjYXNlIHRvIGluY2x1ZGUgYW55IGV4dHJhXG4gICAgICAgIC8vIGZyYW1lcyBhZGRlZCBieSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoRmFrZSwgW10pO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChmbiwgW10sIEZha2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBGYWtlLmNhbGwoKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgZm4uY2FsbChGYWtlLnByb3RvdHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgfVxuXG4gICAgICBmbigpO1xuICAgIH1cbiAgfSBjYXRjaCAoc2FtcGxlKSB7XG4gICAgLy8gVGhpcyBpcyBpbmxpbmVkIG1hbnVhbGx5IGJlY2F1c2UgY2xvc3VyZSBkb2Vzbid0IGRvIGl0IGZvciB1cy5cbiAgICBpZiAoc2FtcGxlICYmIGNvbnRyb2wgJiYgdHlwZW9mIHNhbXBsZS5zdGFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlIGZpcnN0IGZyYW1lIGZyb20gdGhlIHNhbXBsZSB0aGF0IGlzbid0IGFsc28gaW4gdGhlIGNvbnRyb2wuXG4gICAgICAvLyBTa2lwcGluZyBvbmUgZnJhbWUgdGhhdCB3ZSBhc3N1bWUgaXMgdGhlIGZyYW1lIHRoYXQgY2FsbHMgdGhlIHR3by5cbiAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZS5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgY29udHJvbExpbmVzID0gY29udHJvbC5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgcyA9IHNhbXBsZUxpbmVzLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgYyA9IGNvbnRyb2xMaW5lcy5sZW5ndGggLSAxO1xuXG4gICAgICB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCAmJiBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgIC8vIFdlIGV4cGVjdCBhdCBsZWFzdCBvbmUgc3RhY2sgZnJhbWUgdG8gYmUgc2hhcmVkLlxuICAgICAgICAvLyBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIHRoZSByb290IG1vc3Qgb25lLiBIb3dldmVyLCBzdGFjayBmcmFtZXMgbWF5IGJlXG4gICAgICAgIC8vIGN1dCBvZmYgZHVlIHRvIG1heGltdW0gc3RhY2sgbGltaXRzLiBJbiB0aGlzIGNhc2UsIG9uZSBtYXliZSBjdXQgb2ZmXG4gICAgICAgIC8vIGVhcmxpZXIgdGhhbiB0aGUgb3RoZXIuIFdlIGFzc3VtZSB0aGF0IHRoZSBzYW1wbGUgaXMgbG9uZ2VyIG9yIHRoZSBzYW1lXG4gICAgICAgIC8vIGFuZCB0aGVyZSBmb3IgY3V0IG9mZiBlYXJsaWVyLiBTbyB3ZSBzaG91bGQgZmluZCB0aGUgcm9vdCBtb3N0IGZyYW1lIGluXG4gICAgICAgIC8vIHRoZSBzYW1wbGUgc29tZXdoZXJlIGluIHRoZSBjb250cm9sLlxuICAgICAgICBjLS07XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBzID49IDEgJiYgYyA+PSAwOyBzLS0sIGMtLSkge1xuICAgICAgICAvLyBOZXh0IHdlIGZpbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHdoaWNoIHNob3VsZCBiZSB0aGVcbiAgICAgICAgLy8gZnJhbWUgdGhhdCBjYWxsZWQgb3VyIHNhbXBsZSBmdW5jdGlvbiBhbmQgdGhlIGNvbnRyb2wuXG4gICAgICAgIGlmIChzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgLy8gSW4gVjgsIHRoZSBmaXJzdCBsaW5lIGlzIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgYnV0IG90aGVyIFZNcyBkb24ndC5cbiAgICAgICAgICAvLyBJZiB3ZSdyZSBhYm91dCB0byByZXR1cm4gdGhlIGZpcnN0IGxpbmUsIGFuZCB0aGUgY29udHJvbCBpcyBhbHNvIG9uIHRoZSBzYW1lXG4gICAgICAgICAgLy8gbGluZSwgdGhhdCdzIGEgcHJldHR5IGdvb2QgaW5kaWNhdG9yIHRoYXQgb3VyIHNhbXBsZSB0aHJldyBhdCBzYW1lIGxpbmUgYXNcbiAgICAgICAgICAvLyB0aGUgY29udHJvbC4gSS5lLiBiZWZvcmUgd2UgZW50ZXJlZCB0aGUgc2FtcGxlIGZyYW1lLiBTbyB3ZSBpZ25vcmUgdGhpcyByZXN1bHQuXG4gICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBwYXNzZWQgYSBjbGFzcyB0byBmdW5jdGlvbiBjb21wb25lbnQsIG9yIG5vbi1mdW5jdGlvbi5cbiAgICAgICAgICBpZiAocyAhPT0gMSB8fCBjICE9PSAxKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgIHMtLTtcbiAgICAgICAgICAgICAgYy0tOyAvLyBXZSBtYXkgc3RpbGwgaGF2ZSBzaW1pbGFyIGludGVybWVkaWF0ZSBmcmFtZXMgZnJvbSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgICAgICAgIC8vIFRoZSBuZXh0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHNob3VsZCBiZSBvdXIgbWF0Y2ggdGhvdWdoLlxuXG4gICAgICAgICAgICAgIGlmIChjIDwgMCB8fCBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgICAgICAgLy8gVjggYWRkcyBhIFwibmV3XCIgcHJlZml4IGZvciBuYXRpdmUgY2xhc3Nlcy4gTGV0J3MgcmVtb3ZlIGl0IHRvIG1ha2UgaXQgcHJldHRpZXIuXG4gICAgICAgICAgICAgICAgdmFyIF9mcmFtZSA9ICdcXG4nICsgc2FtcGxlTGluZXNbc10ucmVwbGFjZSgnIGF0IG5ldyAnLCAnIGF0ICcpOyAvLyBJZiBvdXIgY29tcG9uZW50IGZyYW1lIGlzIGxhYmVsZWQgXCI8YW5vbnltb3VzPlwiXG4gICAgICAgICAgICAgICAgLy8gYnV0IHdlIGhhdmUgYSB1c2VyLXByb3ZpZGVkIFwiZGlzcGxheU5hbWVcIlxuICAgICAgICAgICAgICAgIC8vIHNwbGljZSBpdCBpbiB0byBtYWtlIHRoZSBzdGFjayBtb3JlIHJlYWRhYmxlLlxuXG5cbiAgICAgICAgICAgICAgICBpZiAoZm4uZGlzcGxheU5hbWUgJiYgX2ZyYW1lLmluY2x1ZGVzKCc8YW5vbnltb3VzPicpKSB7XG4gICAgICAgICAgICAgICAgICBfZnJhbWUgPSBfZnJhbWUucmVwbGFjZSgnPGFub255bW91cz4nLCBmbi5kaXNwbGF5TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgX2ZyYW1lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IC8vIFJldHVybiB0aGUgbGluZSB3ZSBmb3VuZC5cblxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mcmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcmVlbnRyeSA9IGZhbHNlO1xuXG4gICAge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50ID0gcHJldmlvdXNEaXNwYXRjaGVyO1xuICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgfVxuXG4gICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlO1xuICB9IC8vIEZhbGxiYWNrIHRvIGp1c3QgdXNpbmcgdGhlIG5hbWUgaWYgd2UgY291bGRuJ3QgbWFrZSBpdCB0aHJvdy5cblxuXG4gIHZhciBuYW1lID0gZm4gPyBmbi5kaXNwbGF5TmFtZSB8fCBmbi5uYW1lIDogJyc7XG4gIHZhciBzeW50aGV0aWNGcmFtZSA9IG5hbWUgPyBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lKSA6ICcnO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgc3ludGhldGljRnJhbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzeW50aGV0aWNGcmFtZTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVDbGFzc0NvbXBvbmVudEZyYW1lKGN0b3IsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoY3RvciwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmbiwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgZmFsc2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZENvbnN0cnVjdChDb21wb25lbnQpIHtcbiAgdmFyIHByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4gIHJldHVybiAhIShwcm90b3R5cGUgJiYgcHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZSwgc291cmNlLCBvd25lckZuKSB7XG5cbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHtcbiAgICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKHR5cGUsIHNob3VsZENvbnN0cnVjdCh0eXBlKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSh0eXBlKTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2UnKTtcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZUxpc3QnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLnJlbmRlcik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAvLyBNZW1vIG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUudHlwZSwgc291cmNlLCBvd25lckZuKTtcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBMYXp5IG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihpbml0KHBheWxvYWQpLCBzb3VyY2UsIG93bmVyRm4pO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHt9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlRmliZXIoZmliZXIpIHtcbiAgdmFyIG93bmVyID0gIGZpYmVyLl9kZWJ1Z093bmVyID8gZmliZXIuX2RlYnVnT3duZXIudHlwZSA6IG51bGwgO1xuICB2YXIgc291cmNlID0gIGZpYmVyLl9kZWJ1Z1NvdXJjZSA7XG5cbiAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSk7XG5cbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ0xhenknKTtcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG5cbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUpO1xuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmaWJlci50eXBlLnJlbmRlcik7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQ2xhc3NDb21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHdvcmtJblByb2dyZXNzKSB7XG4gIHRyeSB7XG4gICAgdmFyIGluZm8gPSAnJztcbiAgICB2YXIgbm9kZSA9IHdvcmtJblByb2dyZXNzO1xuXG4gICAgZG8ge1xuICAgICAgaW5mbyArPSBkZXNjcmliZUZpYmVyKG5vZGUpO1xuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH0gd2hpbGUgKG5vZGUpO1xuXG4gICAgcmV0dXJuIGluZm87XG4gIH0gY2F0Y2ggKHgpIHtcbiAgICByZXR1cm4gJ1xcbkVycm9yIGdlbmVyYXRpbmcgc3RhY2s6ICcgKyB4Lm1lc3NhZ2UgKyAnXFxuJyArIHguc3RhY2s7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBkaXNwbGF5TmFtZSA9IG91dGVyVHlwZS5kaXNwbGF5TmFtZTtcblxuICBpZiAoZGlzcGxheU5hbWUpIHtcbiAgICByZXR1cm4gZGlzcGxheU5hbWU7XG4gIH1cblxuICB2YXIgZnVuY3Rpb25OYW1lID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8ICcnO1xuICByZXR1cm4gZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgXCIoXCIgKyBmdW5jdGlvbk5hbWUgKyBcIilcIiA6IHdyYXBwZXJOYW1lO1xufSAvLyBLZWVwIGluIHN5bmMgd2l0aCByZWFjdC1yZWNvbmNpbGVyL2dldENvbXBvbmVudE5hbWVGcm9tRmliZXJcblxuXG5mdW5jdGlvbiBnZXRDb250ZXh0TmFtZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8ICdDb250ZXh0Jztcbn0gLy8gTm90ZSB0aGF0IHRoZSByZWNvbmNpbGVyIHBhY2thZ2Ugc2hvdWxkIGdlbmVyYWxseSBwcmVmZXIgdG8gdXNlIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoKSBpbnN0ZWFkLlxuXG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICAvLyBIb3N0IHJvb3QsIHRleHQgbm9kZSBvciBqdXN0IGludmFsaWQgdHlwZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBpZiAodHlwZW9mIHR5cGUudGFnID09PSAnbnVtYmVyJykge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgb2JqZWN0IGluIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSgpLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG5cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgIHZhciBwcm92aWRlciA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJztcblxuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICB2YXIgb3V0ZXJOYW1lID0gdHlwZS5kaXNwbGF5TmFtZSB8fCBudWxsO1xuXG4gICAgICAgIGlmIChvdXRlck5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gb3V0ZXJOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdNZW1vJztcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUkMShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIG91dGVyVHlwZS5kaXNwbGF5TmFtZSB8fCAoZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgXCIoXCIgKyBmdW5jdGlvbk5hbWUgKyBcIilcIiA6IHdyYXBwZXJOYW1lKTtcbn0gLy8gS2VlcCBpbiBzeW5jIHdpdGggc2hhcmVkL2dldENvbXBvbmVudE5hbWVGcm9tVHlwZVxuXG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lJDEodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59XG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHtcbiAgdmFyIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgIHR5cGUgPSBmaWJlci50eXBlO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSBDYWNoZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnQ2FjaGUnO1xuXG4gICAgY2FzZSBDb250ZXh0Q29uc3VtZXI6XG4gICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUkMShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lJDEocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICBjYXNlIERlaHlkcmF0ZWRGcmFnbWVudDpcbiAgICAgIHJldHVybiAnRGVoeWRyYXRlZEZyYWdtZW50JztcblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHJldHVybiBnZXRXcmFwcGVkTmFtZSQxKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgY2FzZSBGcmFnbWVudDpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgLy8gSG9zdCBjb21wb25lbnQgdHlwZSBpcyB0aGUgZGlzcGxheSBuYW1lIChlLmcuIFwiZGl2XCIsIFwiVmlld1wiKVxuICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAgcmV0dXJuICdSb290JztcblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICByZXR1cm4gJ1RleHQnO1xuXG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgICAgLy8gTmFtZSBjb21lcyBmcm9tIHRoZSB0eXBlIGluIHRoaXMgY2FzZTsgd2UgZG9uJ3QgaGF2ZSBhIHRhZy5cbiAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG5cbiAgICBjYXNlIE1vZGU6XG4gICAgICBpZiAodHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSkge1xuICAgICAgICAvLyBEb24ndCBiZSBsZXNzIHNwZWNpZmljIHRoYW4gc2hhcmVkL2dldENvbXBvbmVudE5hbWVGcm9tVHlwZVxuICAgICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJ01vZGUnO1xuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICByZXR1cm4gJ09mZnNjcmVlbic7XG5cbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdTY29wZSc7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcblxuICAgIGNhc2UgVHJhY2luZ01hcmtlckNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnVHJhY2luZ01hcmtlcic7XG4gICAgLy8gVGhlIGRpc3BsYXkgbmFtZSBmb3IgdGhpcyB0YWdzIGNvbWUgZnJvbSB0aGUgdXNlci1wcm92aWRlZCB0eXBlOlxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbnZhciBjdXJyZW50ID0gbnVsbDtcbnZhciBpc1JlbmRlcmluZyA9IGZhbHNlO1xuZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB7XG4gIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIG93bmVyID0gY3VycmVudC5fZGVidWdPd25lcjtcblxuICAgIGlmIChvd25lciAhPT0gbnVsbCAmJiB0eXBlb2Ygb3duZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihvd25lcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlclN0YWNrSW5EZXYoKSB7XG4gIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0gLy8gU2FmZSBiZWNhdXNlIGlmIGN1cnJlbnQgZmliZXIgZXhpc3RzLCB3ZSBhcmUgcmVjb25jaWxpbmcsXG4gICAgLy8gYW5kIGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgdmVyc2lvbi5cblxuXG4gICAgcmV0dXJuIGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChjdXJyZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldEN1cnJlbnRGaWJlcigpIHtcbiAge1xuICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gbnVsbDtcbiAgICBjdXJyZW50ID0gbnVsbDtcbiAgICBpc1JlbmRlcmluZyA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBzZXRDdXJyZW50RmliZXIoZmliZXIpIHtcbiAge1xuICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gZmliZXIgPT09IG51bGwgPyBudWxsIDogZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldjtcbiAgICBjdXJyZW50ID0gZmliZXI7XG4gICAgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyKCkge1xuICB7XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldElzUmVuZGVyaW5nKHJlbmRlcmluZykge1xuICB7XG4gICAgaXNSZW5kZXJpbmcgPSByZW5kZXJpbmc7XG4gIH1cbn1cblxuLy8gRmxvdyBkb2VzIG5vdCBhbGxvdyBzdHJpbmcgY29uY2F0ZW5hdGlvbiBvZiBtb3N0IG5vbi1zdHJpbmcgdHlwZXMuIFRvIHdvcmtcbi8vIGFyb3VuZCB0aGlzIGxpbWl0YXRpb24sIHdlIHVzZSBhbiBvcGFxdWUgdHlwZSB0aGF0IGNhbiBvbmx5IGJlIG9idGFpbmVkIGJ5XG4vLyBwYXNzaW5nIHRoZSB2YWx1ZSB0aHJvdWdoIGdldFRvU3RyaW5nVmFsdWUgZmlyc3QuXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICAvLyBUaGUgY29lcmNpb24gc2FmZXR5IGNoZWNrIGlzIHBlcmZvcm1lZCBpbiBnZXRUb1N0cmluZ1ZhbHVlKCkuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldFRvU3RyaW5nVmFsdWUodmFsdWUpIHtcbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICB7XG4gICAgICAgIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBmdW5jdGlvbiwgc3ltYm9sIGFyZSBhc3NpZ25lZCBhcyBlbXB0eSBzdHJpbmdzXG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxudmFyIGhhc1JlYWRPbmx5VmFsdWUgPSB7XG4gIGJ1dHRvbjogdHJ1ZSxcbiAgY2hlY2tib3g6IHRydWUsXG4gIGltYWdlOiB0cnVlLFxuICBoaWRkZW46IHRydWUsXG4gIHJhZGlvOiB0cnVlLFxuICByZXNldDogdHJ1ZSxcbiAgc3VibWl0OiB0cnVlXG59O1xuZnVuY3Rpb24gY2hlY2tDb250cm9sbGVkVmFsdWVQcm9wcyh0YWdOYW1lLCBwcm9wcykge1xuICB7XG4gICAgaWYgKCEoaGFzUmVhZE9ubHlWYWx1ZVtwcm9wcy50eXBlXSB8fCBwcm9wcy5vbkNoYW5nZSB8fCBwcm9wcy5vbklucHV0IHx8IHByb3BzLnJlYWRPbmx5IHx8IHByb3BzLmRpc2FibGVkIHx8IHByb3BzLnZhbHVlID09IG51bGwpKSB7XG4gICAgICBlcnJvcignWW91IHByb3ZpZGVkIGEgYHZhbHVlYCBwcm9wIHRvIGEgZm9ybSBmaWVsZCB3aXRob3V0IGFuICcgKyAnYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiAnICsgJ3RoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRWYWx1ZWAuIE90aGVyd2lzZSwgJyArICdzZXQgZWl0aGVyIGBvbkNoYW5nZWAgb3IgYHJlYWRPbmx5YC4nKTtcbiAgICB9XG5cbiAgICBpZiAoIShwcm9wcy5vbkNoYW5nZSB8fCBwcm9wcy5yZWFkT25seSB8fCBwcm9wcy5kaXNhYmxlZCB8fCBwcm9wcy5jaGVja2VkID09IG51bGwpKSB7XG4gICAgICBlcnJvcignWW91IHByb3ZpZGVkIGEgYGNoZWNrZWRgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gJyArICdgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmICcgKyAndGhlIGZpZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVsdENoZWNrZWRgLiBPdGhlcndpc2UsICcgKyAnc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ2hlY2thYmxlKGVsZW0pIHtcbiAgdmFyIHR5cGUgPSBlbGVtLnR5cGU7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWU7XG4gIHJldHVybiBub2RlTmFtZSAmJiBub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmICh0eXBlID09PSAnY2hlY2tib3gnIHx8IHR5cGUgPT09ICdyYWRpbycpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFja2VyKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuX3ZhbHVlVHJhY2tlcjtcbn1cblxuZnVuY3Rpb24gZGV0YWNoVHJhY2tlcihub2RlKSB7XG4gIG5vZGUuX3ZhbHVlVHJhY2tlciA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlRnJvbU5vZGUobm9kZSkge1xuICB2YXIgdmFsdWUgPSAnJztcblxuICBpZiAoIW5vZGUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBpZiAoaXNDaGVja2FibGUobm9kZSkpIHtcbiAgICB2YWx1ZSA9IG5vZGUuY2hlY2tlZCA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBub2RlLnZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiB0cmFja1ZhbHVlT25Ob2RlKG5vZGUpIHtcbiAgdmFyIHZhbHVlRmllbGQgPSBpc0NoZWNrYWJsZShub2RlKSA/ICdjaGVja2VkJyA6ICd2YWx1ZSc7XG4gIHZhciBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihub2RlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgdmFsdWVGaWVsZCk7XG5cbiAge1xuICAgIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbihub2RlW3ZhbHVlRmllbGRdKTtcbiAgfVxuXG4gIHZhciBjdXJyZW50VmFsdWUgPSAnJyArIG5vZGVbdmFsdWVGaWVsZF07IC8vIGlmIHNvbWVvbmUgaGFzIGFscmVhZHkgZGVmaW5lZCBhIHZhbHVlIG9yIFNhZmFyaSwgdGhlbiBiYWlsXG4gIC8vIGFuZCBkb24ndCB0cmFjayB2YWx1ZSB3aWxsIGNhdXNlIG92ZXIgcmVwb3J0aW5nIG9mIGNoYW5nZXMsXG4gIC8vIGJ1dCBpdCdzIGJldHRlciB0aGVuIGEgaGFyZCBmYWlsdXJlXG4gIC8vIChuZWVkZWQgZm9yIGNlcnRhaW4gdGVzdHMgdGhhdCBzcHlPbiBpbnB1dCB2YWx1ZXMgYW5kIFNhZmFyaSlcblxuICBpZiAobm9kZS5oYXNPd25Qcm9wZXJ0eSh2YWx1ZUZpZWxkKSB8fCB0eXBlb2YgZGVzY3JpcHRvciA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIGRlc2NyaXB0b3IuZ2V0ICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBkZXNjcmlwdG9yLnNldCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBnZXQgPSBkZXNjcmlwdG9yLmdldCxcbiAgICAgIHNldCA9IGRlc2NyaXB0b3Iuc2V0O1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobm9kZSwgdmFsdWVGaWVsZCwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXQuY2FsbCh0aGlzKTtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICBzZXQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgfVxuICB9KTsgLy8gV2UgY291bGQndmUgcGFzc2VkIHRoaXMgdGhlIGZpcnN0IHRpbWVcbiAgLy8gYnV0IGl0IHRyaWdnZXJzIGEgYnVnIGluIElFMTEgYW5kIEVkZ2UgMTQvMTUuXG4gIC8vIENhbGxpbmcgZGVmaW5lUHJvcGVydHkoKSBhZ2FpbiBzaG91bGQgYmUgZXF1aXZhbGVudC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTc2OFxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCB2YWx1ZUZpZWxkLCB7XG4gICAgZW51bWVyYWJsZTogZGVzY3JpcHRvci5lbnVtZXJhYmxlXG4gIH0pO1xuICB2YXIgdHJhY2tlciA9IHtcbiAgICBnZXRWYWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICB9LFxuICAgIHNldFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHtcbiAgICAgICAgY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudFZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICB9LFxuICAgIHN0b3BUcmFja2luZzogZnVuY3Rpb24gKCkge1xuICAgICAgZGV0YWNoVHJhY2tlcihub2RlKTtcbiAgICAgIGRlbGV0ZSBub2RlW3ZhbHVlRmllbGRdO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHRyYWNrZXI7XG59XG5cbmZ1bmN0aW9uIHRyYWNrKG5vZGUpIHtcbiAgaWYgKGdldFRyYWNrZXIobm9kZSkpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gVE9ETzogT25jZSBpdCdzIGp1c3QgRmliZXIgd2UgY2FuIG1vdmUgdGhpcyB0byBub2RlLl93cmFwcGVyU3RhdGVcblxuXG4gIG5vZGUuX3ZhbHVlVHJhY2tlciA9IHRyYWNrVmFsdWVPbk5vZGUobm9kZSk7XG59XG5mdW5jdGlvbiB1cGRhdGVWYWx1ZUlmQ2hhbmdlZChub2RlKSB7XG4gIGlmICghbm9kZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB0cmFja2VyID0gZ2V0VHJhY2tlcihub2RlKTsgLy8gaWYgdGhlcmUgaXMgbm8gdHJhY2tlciBhdCB0aGlzIHBvaW50IGl0J3MgdW5saWtlbHlcbiAgLy8gdGhhdCB0cnlpbmcgYWdhaW4gd2lsbCBzdWNjZWVkXG5cbiAgaWYgKCF0cmFja2VyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgbGFzdFZhbHVlID0gdHJhY2tlci5nZXRWYWx1ZSgpO1xuICB2YXIgbmV4dFZhbHVlID0gZ2V0VmFsdWVGcm9tTm9kZShub2RlKTtcblxuICBpZiAobmV4dFZhbHVlICE9PSBsYXN0VmFsdWUpIHtcbiAgICB0cmFja2VyLnNldFZhbHVlKG5leHRWYWx1ZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEFjdGl2ZUVsZW1lbnQoZG9jKSB7XG4gIGRvYyA9IGRvYyB8fCAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IGRvY3VtZW50IDogdW5kZWZpbmVkKTtcblxuICBpZiAodHlwZW9mIGRvYyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGRvYy5hY3RpdmVFbGVtZW50IHx8IGRvYy5ib2R5O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGRvYy5ib2R5O1xuICB9XG59XG5cbnZhciBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSBmYWxzZTtcbnZhciBkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkID0gZmFsc2U7XG52YXIgZGlkV2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gaXNDb250cm9sbGVkKHByb3BzKSB7XG4gIHZhciB1c2VzQ2hlY2tlZCA9IHByb3BzLnR5cGUgPT09ICdjaGVja2JveCcgfHwgcHJvcHMudHlwZSA9PT0gJ3JhZGlvJztcbiAgcmV0dXJuIHVzZXNDaGVja2VkID8gcHJvcHMuY2hlY2tlZCAhPSBudWxsIDogcHJvcHMudmFsdWUgIT0gbnVsbDtcbn1cbi8qKlxuICogSW1wbGVtZW50cyBhbiA8aW5wdXQ+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIHNldHRpbmcgdGhlc2Ugb3B0aW9uYWxcbiAqIHByb3BzOiBgY2hlY2tlZGAsIGB2YWx1ZWAsIGBkZWZhdWx0Q2hlY2tlZGAsIGFuZCBgZGVmYXVsdFZhbHVlYC5cbiAqXG4gKiBJZiBgY2hlY2tlZGAgb3IgYHZhbHVlYCBhcmUgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9uc1xuICogdGhhdCBhZmZlY3QgdGhlIGNoZWNrZWQgc3RhdGUgb3IgdmFsdWUgd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogSWYgdGhleSBhcmUgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIG5vdFxuICogdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LiBJbnN0ZWFkLCB0aGUgcHJvcHMgbXVzdCBjaGFuZ2UgaW4gb3JkZXIgZm9yXG4gKiB0aGUgcmVuZGVyZWQgZWxlbWVudCB0byBiZSB1cGRhdGVkLlxuICpcbiAqIFRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgYmUgaW5pdGlhbGl6ZWQgYXMgdW5jaGVja2VkIChvciBgZGVmYXVsdENoZWNrZWRgKVxuICogd2l0aCBhbiBlbXB0eSB2YWx1ZSAob3IgYGRlZmF1bHRWYWx1ZWApLlxuICpcbiAqIFNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEyL1dELWh0bWw1LTIwMTIxMDI1L3RoZS1pbnB1dC1lbGVtZW50Lmh0bWxcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyhlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciBjaGVja2VkID0gcHJvcHMuY2hlY2tlZDtcbiAgdmFyIGhvc3RQcm9wcyA9IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBkZWZhdWx0Q2hlY2tlZDogdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRWYWx1ZTogdW5kZWZpbmVkLFxuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgY2hlY2tlZDogY2hlY2tlZCAhPSBudWxsID8gY2hlY2tlZCA6IG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZFxuICB9KTtcbiAgcmV0dXJuIGhvc3RQcm9wcztcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUoZWxlbWVudCwgcHJvcHMpIHtcbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ2lucHV0JywgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLmNoZWNrZWQgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkKSB7XG4gICAgICBlcnJvcignJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggY2hlY2tlZCBhbmQgZGVmYXVsdENoZWNrZWQgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIGNoZWNrZWQgcHJvcCwgb3IgdGhlIGRlZmF1bHRDaGVja2VkIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKTtcblxuICAgICAgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSkge1xuICAgICAgZXJyb3IoJyVzIGNvbnRhaW5zIGFuIGlucHV0IG9mIHR5cGUgJXMgd2l0aCBib3RoIHZhbHVlIGFuZCBkZWZhdWx0VmFsdWUgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnLCBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8ICdBIGNvbXBvbmVudCcsIHByb3BzLnR5cGUpO1xuXG4gICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZSA9PSBudWxsID8gJycgOiBwcm9wcy5kZWZhdWx0VmFsdWU7XG4gIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICBpbml0aWFsQ2hlY2tlZDogcHJvcHMuY2hlY2tlZCAhPSBudWxsID8gcHJvcHMuY2hlY2tlZCA6IHByb3BzLmRlZmF1bHRDaGVja2VkLFxuICAgIGluaXRpYWxWYWx1ZTogZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSAhPSBudWxsID8gcHJvcHMudmFsdWUgOiBkZWZhdWx0VmFsdWUpLFxuICAgIGNvbnRyb2xsZWQ6IGlzQ29udHJvbGxlZChwcm9wcylcbiAgfTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUNoZWNrZWQoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG5cbiAgaWYgKGNoZWNrZWQgIT0gbnVsbCkge1xuICAgIHNldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgJ2NoZWNrZWQnLCBjaGVja2VkLCBmYWxzZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHVwZGF0ZVdyYXBwZXIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIHtcbiAgICB2YXIgY29udHJvbGxlZCA9IGlzQ29udHJvbGxlZChwcm9wcyk7XG5cbiAgICBpZiAoIW5vZGUuX3dyYXBwZXJTdGF0ZS5jb250cm9sbGVkICYmIGNvbnRyb2xsZWQgJiYgIWRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyBhbiB1bmNvbnRyb2xsZWQgaW5wdXQgdG8gYmUgY29udHJvbGxlZC4gJyArICdUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgdGhlIHZhbHVlIGNoYW5naW5nIGZyb20gdW5kZWZpbmVkIHRvICcgKyAnYSBkZWZpbmVkIHZhbHVlLCB3aGljaCBzaG91bGQgbm90IGhhcHBlbi4gJyArICdEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycpO1xuXG4gICAgICBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5fd3JhcHBlclN0YXRlLmNvbnRyb2xsZWQgJiYgIWNvbnRyb2xsZWQgJiYgIWRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyBhIGNvbnRyb2xsZWQgaW5wdXQgdG8gYmUgdW5jb250cm9sbGVkLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSB0aGUgdmFsdWUgY2hhbmdpbmcgZnJvbSBhIGRlZmluZWQgdG8gJyArICd1bmRlZmluZWQsIHdoaWNoIHNob3VsZCBub3QgaGFwcGVuLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJyk7XG5cbiAgICAgIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNoZWNrZWQoZWxlbWVudCwgcHJvcHMpO1xuICB2YXIgdmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlKTtcbiAgdmFyIHR5cGUgPSBwcm9wcy50eXBlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgaWYgKHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAodmFsdWUgPT09IDAgJiYgbm9kZS52YWx1ZSA9PT0gJycgfHwgLy8gV2UgZXhwbGljaXRseSB3YW50IHRvIGNvZXJjZSB0byBudW1iZXIgaGVyZSBpZiBwb3NzaWJsZS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgbm9kZS52YWx1ZSAhPSB2YWx1ZSkge1xuICAgICAgICBub2RlLnZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS52YWx1ZSAhPT0gdG9TdHJpbmcodmFsdWUpKSB7XG4gICAgICBub2RlLnZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlID09PSAnc3VibWl0JyB8fCB0eXBlID09PSAncmVzZXQnKSB7XG4gICAgLy8gU3VibWl0L3Jlc2V0IGlucHV0cyBuZWVkIHRoZSBhdHRyaWJ1dGUgcmVtb3ZlZCBjb21wbGV0ZWx5IHRvIGF2b2lkXG4gICAgLy8gYmxhbmstdGV4dCBidXR0b25zLlxuICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIHZhbHVlIGF0dHJpYnV0ZSwgdGhlIHZhbHVlIGNvbWVzIGZyb20gYSBjYXNjYWRlIG9mXG4gICAgLy8gcHJvcGVydGllczpcbiAgICAvLyAgMS4gVGhlIHZhbHVlIFJlYWN0IHByb3BlcnR5XG4gICAgLy8gIDIuIFRoZSBkZWZhdWx0VmFsdWUgUmVhY3QgcHJvcGVydHlcbiAgICAvLyAgMy4gT3RoZXJ3aXNlIHRoZXJlIHNob3VsZCBiZSBubyBjaGFuZ2VcbiAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykpIHtcbiAgICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCBwcm9wcy50eXBlLCB2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdFZhbHVlJykpIHtcbiAgICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCBwcm9wcy50eXBlLCBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLmRlZmF1bHRWYWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIGNoZWNrZWQgYXR0cmlidXRlLCBpdCBvbmx5IGNoYW5nZXMgd2hlbiBpdCBuZWVkc1xuICAgIC8vIHRvIGJlIHJlbW92ZWQsIHN1Y2ggYXMgdHJhbnNpdGlvbmluZyBmcm9tIGEgY2hlY2tib3ggaW50byBhIHRleHQgaW5wdXRcbiAgICBpZiAocHJvcHMuY2hlY2tlZCA9PSBudWxsICYmIHByb3BzLmRlZmF1bHRDaGVja2VkICE9IG51bGwpIHtcbiAgICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhIXByb3BzLmRlZmF1bHRDaGVja2VkO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlcihlbGVtZW50LCBwcm9wcywgaXNIeWRyYXRpbmcpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50OyAvLyBEbyBub3QgYXNzaWduIHZhbHVlIGlmIGl0IGlzIGFscmVhZHkgc2V0LiBUaGlzIHByZXZlbnRzIHVzZXIgdGV4dCBpbnB1dFxuICAvLyBmcm9tIGJlaW5nIGxvc3QgZHVyaW5nIFNTUiBoeWRyYXRpb24uXG5cbiAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCd2YWx1ZScpIHx8IHByb3BzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmFsdWUnKSkge1xuICAgIHZhciB0eXBlID0gcHJvcHMudHlwZTtcbiAgICB2YXIgaXNCdXR0b24gPSB0eXBlID09PSAnc3VibWl0JyB8fCB0eXBlID09PSAncmVzZXQnOyAvLyBBdm9pZCBzZXR0aW5nIHZhbHVlIGF0dHJpYnV0ZSBvbiBzdWJtaXQvcmVzZXQgaW5wdXRzIGFzIGl0IG92ZXJyaWRlcyB0aGVcbiAgICAvLyBkZWZhdWx0IHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBicm93c2VyLiBTZWU6ICMxMjg3MlxuXG4gICAgaWYgKGlzQnV0dG9uICYmIChwcm9wcy52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHByb3BzLnZhbHVlID09PSBudWxsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBpbml0aWFsVmFsdWUgPSB0b1N0cmluZyhub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKTsgLy8gRG8gbm90IGFzc2lnbiB2YWx1ZSBpZiBpdCBpcyBhbHJlYWR5IHNldC4gVGhpcyBwcmV2ZW50cyB1c2VyIHRleHQgaW5wdXRcbiAgICAvLyBmcm9tIGJlaW5nIGxvc3QgZHVyaW5nIFNTUiBoeWRyYXRpb24uXG5cbiAgICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgICB7XG4gICAgICAgIC8vIFdoZW4gc3luY2luZyB0aGUgdmFsdWUgYXR0cmlidXRlLCB0aGUgdmFsdWUgcHJvcGVydHkgc2hvdWxkIHVzZVxuICAgICAgICAvLyB0aGUgd3JhcHBlclN0YXRlLl9pbml0aWFsVmFsdWUgcHJvcGVydHkuIFRoaXMgdXNlczpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAxLiBUaGUgdmFsdWUgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgICAgIC8vICAgMi4gVGhlIGRlZmF1bHRWYWx1ZSBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnRcbiAgICAgICAgLy8gICAzLiBBbiBlbXB0eSBzdHJpbmdcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSAhPT0gbm9kZS52YWx1ZSkge1xuICAgICAgICAgIG5vZGUudmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBPdGhlcndpc2UsIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgaXMgc3luY2hyb25pemVkIHRvIHRoZSBwcm9wZXJ0eSxcbiAgICAgIC8vIHNvIHdlIGFzc2lnbiBkZWZhdWx0VmFsdWUgdG8gdGhlIHNhbWUgdGhpbmcgYXMgdGhlIHZhbHVlIHByb3BlcnR5XG4gICAgICAvLyBhc3NpZ25tZW50IHN0ZXAgYWJvdmUuXG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICB9XG4gIH0gLy8gTm9ybWFsbHksIHdlJ2QganVzdCBkbyBgbm9kZS5jaGVja2VkID0gbm9kZS5jaGVja2VkYCB1cG9uIGluaXRpYWwgbW91bnQsIGxlc3MgdGhpcyBidWdcbiAgLy8gdGhpcyBpcyBuZWVkZWQgdG8gd29yayBhcm91bmQgYSBjaHJvbWUgYnVnIHdoZXJlIHNldHRpbmcgZGVmYXVsdENoZWNrZWRcbiAgLy8gd2lsbCBzb21ldGltZXMgaW5mbHVlbmNlIHRoZSB2YWx1ZSBvZiBjaGVja2VkIChldmVuIGFmdGVyIGRldGFjaG1lbnQpLlxuICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTYwODQxNlxuICAvLyBXZSBuZWVkIHRvIHRlbXBvcmFyaWx5IHVuc2V0IG5hbWUgdG8gYXZvaWQgZGlzcnVwdGluZyByYWRpbyBidXR0b24gZ3JvdXBzLlxuXG5cbiAgdmFyIG5hbWUgPSBub2RlLm5hbWU7XG5cbiAgaWYgKG5hbWUgIT09ICcnKSB7XG4gICAgbm9kZS5uYW1lID0gJyc7XG4gIH1cblxuICB7XG4gICAgLy8gV2hlbiBzeW5jaW5nIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSwgYm90aCB0aGUgY2hlY2tlZCBwcm9wZXJ0eSBhbmRcbiAgICAvLyBhdHRyaWJ1dGUgYXJlIGFzc2lnbmVkIGF0IHRoZSBzYW1lIHRpbWUgdXNpbmcgZGVmYXVsdENoZWNrZWQuIFRoaXMgdXNlczpcbiAgICAvL1xuICAgIC8vICAgMS4gVGhlIGNoZWNrZWQgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgLy8gICAyLiBUaGUgZGVmYXVsdENoZWNrZWQgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgLy8gICAzLiBPdGhlcndpc2UsIGZhbHNlXG4gICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICFub2RlLmRlZmF1bHRDaGVja2VkO1xuICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhIW5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZDtcbiAgfVxuXG4gIGlmIChuYW1lICE9PSAnJykge1xuICAgIG5vZGUubmFtZSA9IG5hbWU7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB1cGRhdGVXcmFwcGVyKG5vZGUsIHByb3BzKTtcbiAgdXBkYXRlTmFtZWRDb3VzaW5zKG5vZGUsIHByb3BzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTmFtZWRDb3VzaW5zKHJvb3ROb2RlLCBwcm9wcykge1xuICB2YXIgbmFtZSA9IHByb3BzLm5hbWU7XG5cbiAgaWYgKHByb3BzLnR5cGUgPT09ICdyYWRpbycgJiYgbmFtZSAhPSBudWxsKSB7XG4gICAgdmFyIHF1ZXJ5Um9vdCA9IHJvb3ROb2RlO1xuXG4gICAgd2hpbGUgKHF1ZXJ5Um9vdC5wYXJlbnROb2RlKSB7XG4gICAgICBxdWVyeVJvb3QgPSBxdWVyeVJvb3QucGFyZW50Tm9kZTtcbiAgICB9IC8vIElmIGByb290Tm9kZS5mb3JtYCB3YXMgbm9uLW51bGwsIHRoZW4gd2UgY291bGQgdHJ5IGBmb3JtLmVsZW1lbnRzYCxcbiAgICAvLyBidXQgdGhhdCBzb21ldGltZXMgYmVoYXZlcyBzdHJhbmdlbHkgaW4gSUU4LiBXZSBjb3VsZCBhbHNvIHRyeSB1c2luZ1xuICAgIC8vIGBmb3JtLmdldEVsZW1lbnRzQnlOYW1lYCwgYnV0IHRoYXQgd2lsbCBvbmx5IHJldHVybiBkaXJlY3QgY2hpbGRyZW5cbiAgICAvLyBhbmQgd29uJ3QgaW5jbHVkZSBpbnB1dHMgdGhhdCB1c2UgdGhlIEhUTUw1IGBmb3JtPWAgYXR0cmlidXRlLiBTaW5jZVxuICAgIC8vIHRoZSBpbnB1dCBtaWdodCBub3QgZXZlbiBiZSBpbiBhIGZvcm0uIEl0IG1pZ2h0IG5vdCBldmVuIGJlIGluIHRoZVxuICAgIC8vIGRvY3VtZW50LiBMZXQncyBqdXN0IHVzZSB0aGUgbG9jYWwgYHF1ZXJ5U2VsZWN0b3JBbGxgIHRvIGVuc3VyZSB3ZSBkb24ndFxuICAgIC8vIG1pc3MgYW55dGhpbmcuXG5cblxuICAgIHtcbiAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24obmFtZSwgJ25hbWUnKTtcbiAgICB9XG5cbiAgICB2YXIgZ3JvdXAgPSBxdWVyeVJvb3QucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbbmFtZT0nICsgSlNPTi5zdHJpbmdpZnkoJycgKyBuYW1lKSArICddW3R5cGU9XCJyYWRpb1wiXScpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG90aGVyTm9kZSA9IGdyb3VwW2ldO1xuXG4gICAgICBpZiAob3RoZXJOb2RlID09PSByb290Tm9kZSB8fCBvdGhlck5vZGUuZm9ybSAhPT0gcm9vdE5vZGUuZm9ybSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gVGhpcyB3aWxsIHRocm93IGlmIHJhZGlvIGJ1dHRvbnMgcmVuZGVyZWQgYnkgZGlmZmVyZW50IGNvcGllcyBvZiBSZWFjdFxuICAgICAgLy8gYW5kIHRoZSBzYW1lIG5hbWUgYXJlIHJlbmRlcmVkIGludG8gdGhlIHNhbWUgZm9ybSAoc2FtZSBhcyAjMTkzOSkuXG4gICAgICAvLyBUaGF0J3MgcHJvYmFibHkgb2theTsgd2UgZG9uJ3Qgc3VwcG9ydCBpdCBqdXN0IGFzIHdlIGRvbid0IHN1cHBvcnRcbiAgICAgIC8vIG1peGluZyBSZWFjdCByYWRpbyBidXR0b25zIHdpdGggbm9uLVJlYWN0IG9uZXMuXG5cblxuICAgICAgdmFyIG90aGVyUHJvcHMgPSBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlKG90aGVyTm9kZSk7XG5cbiAgICAgIGlmICghb3RoZXJQcm9wcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0RE9NSW5wdXQ6IE1peGluZyBSZWFjdCBhbmQgbm9uLVJlYWN0IHJhZGlvIGlucHV0cyB3aXRoIHRoZSAnICsgJ3NhbWUgYG5hbWVgIGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgICB9IC8vIFdlIG5lZWQgdXBkYXRlIHRoZSB0cmFja2VkIHZhbHVlIG9uIHRoZSBuYW1lZCBjb3VzaW4gc2luY2UgdGhlIHZhbHVlXG4gICAgICAvLyB3YXMgY2hhbmdlZCBidXQgdGhlIGlucHV0IHNhdyBubyBldmVudCBvciB2YWx1ZSBzZXRcblxuXG4gICAgICB1cGRhdGVWYWx1ZUlmQ2hhbmdlZChvdGhlck5vZGUpOyAvLyBJZiB0aGlzIGlzIGEgY29udHJvbGxlZCByYWRpbyBidXR0b24gZ3JvdXAsIGZvcmNpbmcgdGhlIGlucHV0IHRoYXRcbiAgICAgIC8vIHdhcyBwcmV2aW91c2x5IGNoZWNrZWQgdG8gdXBkYXRlIHdpbGwgY2F1c2UgaXQgdG8gYmUgY29tZSByZS1jaGVja2VkXG4gICAgICAvLyBhcyBhcHByb3ByaWF0ZS5cblxuICAgICAgdXBkYXRlV3JhcHBlcihvdGhlck5vZGUsIG90aGVyUHJvcHMpO1xuICAgIH1cbiAgfVxufSAvLyBJbiBDaHJvbWUsIGFzc2lnbmluZyBkZWZhdWx0VmFsdWUgdG8gY2VydGFpbiBpbnB1dCB0eXBlcyB0cmlnZ2VycyBpbnB1dCB2YWxpZGF0aW9uLlxuLy8gRm9yIG51bWJlciBpbnB1dHMsIHRoZSBkaXNwbGF5IHZhbHVlIGxvc2VzIHRyYWlsaW5nIGRlY2ltYWwgcG9pbnRzLiBGb3IgZW1haWwgaW5wdXRzLFxuLy8gQ2hyb21lIHJhaXNlcyBcIlRoZSBzcGVjaWZpZWQgdmFsdWUgPHg+IGlzIG5vdCBhIHZhbGlkIGVtYWlsIGFkZHJlc3NcIi5cbi8vXG4vLyBIZXJlIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUgZGVmYXVsdFZhbHVlIGhhcyBhY3R1YWxseSBjaGFuZ2VkLCBhdm9pZGluZyB0aGVzZSBwcm9ibGVtc1xuLy8gd2hlbiB0aGUgdXNlciBpcyBpbnB1dHRpbmcgdGV4dFxuLy9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzI1M1xuXG5cbmZ1bmN0aW9uIHNldERlZmF1bHRWYWx1ZShub2RlLCB0eXBlLCB2YWx1ZSkge1xuICBpZiAoIC8vIEZvY3VzZWQgbnVtYmVyIGlucHV0cyBzeW5jaHJvbml6ZSBvbiBibHVyLiBTZWUgQ2hhbmdlRXZlbnRQbHVnaW4uanNcbiAgdHlwZSAhPT0gJ251bWJlcicgfHwgZ2V0QWN0aXZlRWxlbWVudChub2RlLm93bmVyRG9jdW1lbnQpICE9PSBub2RlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChub2RlLmRlZmF1bHRWYWx1ZSAhPT0gdG9TdHJpbmcodmFsdWUpKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TZWxlY3RlZFNldE9uT3B0aW9uID0gZmFsc2U7XG52YXIgZGlkV2FybkludmFsaWRDaGlsZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5JbnZhbGlkSW5uZXJIVE1MID0gZmFsc2U7XG4vKipcbiAqIEltcGxlbWVudHMgYW4gPG9wdGlvbj4gaG9zdCBjb21wb25lbnQgdGhhdCB3YXJucyB3aGVuIGBzZWxlY3RlZGAgaXMgc2V0LlxuICovXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcHMoZWxlbWVudCwgcHJvcHMpIHtcbiAge1xuICAgIC8vIElmIGEgdmFsdWUgaXMgbm90IHByb3ZpZGVkLCB0aGVuIHRoZSBjaGlsZHJlbiBtdXN0IGJlIHNpbXBsZS5cbiAgICBpZiAocHJvcHMudmFsdWUgPT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ29iamVjdCcgJiYgcHJvcHMuY2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgICAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChwcm9wcy5jaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgaWYgKGNoaWxkID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgY2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZENoaWxkKSB7XG4gICAgICAgICAgICBkaWRXYXJuSW52YWxpZENoaWxkID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ0Nhbm5vdCBpbmZlciB0aGUgb3B0aW9uIHZhbHVlIG9mIGNvbXBsZXggY2hpbGRyZW4uICcgKyAnUGFzcyBhIGB2YWx1ZWAgcHJvcCBvciB1c2UgYSBwbGFpbiBzdHJpbmcgYXMgY2hpbGRyZW4gdG8gPG9wdGlvbj4uJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgICAgICBpZiAoIWRpZFdhcm5JbnZhbGlkSW5uZXJIVE1MKSB7XG4gICAgICAgICAgZGlkV2FybkludmFsaWRJbm5lckhUTUwgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1Bhc3MgYSBgdmFsdWVgIHByb3AgaWYgeW91IHNldCBkYW5nZXJvdXNseUlubmVySFRNTCBzbyBSZWFjdCBrbm93cyAnICsgJ3doaWNoIHZhbHVlIHNob3VsZCBiZSBzZWxlY3RlZC4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gVE9ETzogUmVtb3ZlIHN1cHBvcnQgZm9yIGBzZWxlY3RlZGAgaW4gPG9wdGlvbj4uXG5cblxuICAgIGlmIChwcm9wcy5zZWxlY3RlZCAhPSBudWxsICYmICFkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbikge1xuICAgICAgZXJyb3IoJ1VzZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBvbiA8c2VsZWN0PiBpbnN0ZWFkIG9mICcgKyAnc2V0dGluZyBgc2VsZWN0ZWRgIG9uIDxvcHRpb24+LicpO1xuXG4gICAgICBkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbiA9IHRydWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgLy8gdmFsdWU9XCJcIiBzaG91bGQgbWFrZSBhIHZhbHVlIGF0dHJpYnV0ZSAoIzYyMTkpXG4gIGlmIChwcm9wcy52YWx1ZSAhPSBudWxsKSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgdG9TdHJpbmcoZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSkpKTtcbiAgfVxufVxuXG52YXIgaXNBcnJheUltcGwgPSBBcnJheS5pc0FycmF5OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG5cbmZ1bmN0aW9uIGlzQXJyYXkoYSkge1xuICByZXR1cm4gaXNBcnJheUltcGwoYSk7XG59XG5cbnZhciBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMTtcblxue1xuICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMSA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSB7XG4gIHZhciBvd25lck5hbWUgPSBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpO1xuXG4gIGlmIChvd25lck5hbWUpIHtcbiAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgb3duZXJOYW1lICsgJ2AuJztcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxudmFyIHZhbHVlUHJvcE5hbWVzID0gWyd2YWx1ZScsICdkZWZhdWx0VmFsdWUnXTtcbi8qKlxuICogVmFsaWRhdGlvbiBmdW5jdGlvbiBmb3IgYHZhbHVlYCBhbmQgYGRlZmF1bHRWYWx1ZWAuXG4gKi9cblxuZnVuY3Rpb24gY2hlY2tTZWxlY3RQcm9wVHlwZXMocHJvcHMpIHtcbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ3NlbGVjdCcsIHByb3BzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVQcm9wTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wTmFtZSA9IHZhbHVlUHJvcE5hbWVzW2ldO1xuXG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBwcm9wTmFtZUlzQXJyYXkgPSBpc0FycmF5KHByb3BzW3Byb3BOYW1lXSk7XG5cbiAgICAgIGlmIChwcm9wcy5tdWx0aXBsZSAmJiAhcHJvcE5hbWVJc0FycmF5KSB7XG4gICAgICAgIGVycm9yKCdUaGUgYCVzYCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11c3QgYmUgYW4gYXJyYXkgaWYgJyArICdgbXVsdGlwbGVgIGlzIHRydWUuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkpO1xuICAgICAgfSBlbHNlIGlmICghcHJvcHMubXVsdGlwbGUgJiYgcHJvcE5hbWVJc0FycmF5KSB7XG4gICAgICAgIGVycm9yKCdUaGUgYCVzYCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11c3QgYmUgYSBzY2FsYXIgJyArICd2YWx1ZSBpZiBgbXVsdGlwbGVgIGlzIGZhbHNlLiVzJywgcHJvcE5hbWUsIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlT3B0aW9ucyhub2RlLCBtdWx0aXBsZSwgcHJvcFZhbHVlLCBzZXREZWZhdWx0U2VsZWN0ZWQpIHtcbiAgdmFyIG9wdGlvbnMgPSBub2RlLm9wdGlvbnM7XG5cbiAgaWYgKG11bHRpcGxlKSB7XG4gICAgdmFyIHNlbGVjdGVkVmFsdWVzID0gcHJvcFZhbHVlO1xuICAgIHZhciBzZWxlY3RlZFZhbHVlID0ge307XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBQcmVmaXggdG8gYXZvaWQgY2hhb3Mgd2l0aCBzcGVjaWFsIGtleXMuXG4gICAgICBzZWxlY3RlZFZhbHVlWyckJyArIHNlbGVjdGVkVmFsdWVzW2ldXSA9IHRydWU7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG9wdGlvbnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgc2VsZWN0ZWQgPSBzZWxlY3RlZFZhbHVlLmhhc093blByb3BlcnR5KCckJyArIG9wdGlvbnNbX2ldLnZhbHVlKTtcblxuICAgICAgaWYgKG9wdGlvbnNbX2ldLnNlbGVjdGVkICE9PSBzZWxlY3RlZCkge1xuICAgICAgICBvcHRpb25zW19pXS5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VsZWN0ZWQgJiYgc2V0RGVmYXVsdFNlbGVjdGVkKSB7XG4gICAgICAgIG9wdGlvbnNbX2ldLmRlZmF1bHRTZWxlY3RlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIERvIG5vdCBzZXQgYHNlbGVjdC52YWx1ZWAgYXMgZXhhY3QgYmVoYXZpb3IgaXNuJ3QgY29uc2lzdGVudCBhY3Jvc3MgYWxsXG4gICAgLy8gYnJvd3NlcnMgZm9yIGFsbCBjYXNlcy5cbiAgICB2YXIgX3NlbGVjdGVkVmFsdWUgPSB0b1N0cmluZyhnZXRUb1N0cmluZ1ZhbHVlKHByb3BWYWx1ZSkpO1xuXG4gICAgdmFyIGRlZmF1bHRTZWxlY3RlZCA9IG51bGw7XG5cbiAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBvcHRpb25zLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgIGlmIChvcHRpb25zW19pMl0udmFsdWUgPT09IF9zZWxlY3RlZFZhbHVlKSB7XG4gICAgICAgIG9wdGlvbnNbX2kyXS5zZWxlY3RlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHNldERlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgICAgIG9wdGlvbnNbX2kyXS5kZWZhdWx0U2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGVmYXVsdFNlbGVjdGVkID09PSBudWxsICYmICFvcHRpb25zW19pMl0uZGlzYWJsZWQpIHtcbiAgICAgICAgZGVmYXVsdFNlbGVjdGVkID0gb3B0aW9uc1tfaTJdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkZWZhdWx0U2VsZWN0ZWQgIT09IG51bGwpIHtcbiAgICAgIGRlZmF1bHRTZWxlY3RlZC5zZWxlY3RlZCA9IHRydWU7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEltcGxlbWVudHMgYSA8c2VsZWN0PiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBvcHRpb25hbGx5IHNldHRpbmcgdGhlXG4gKiBwcm9wcyBgdmFsdWVgIGFuZCBgZGVmYXVsdFZhbHVlYC4gSWYgYG11bHRpcGxlYCBpcyBmYWxzZSwgdGhlIHByb3AgbXVzdCBiZSBhXG4gKiBzdHJpbmdhYmxlLiBJZiBgbXVsdGlwbGVgIGlzIHRydWUsIHRoZSBwcm9wIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5nYWJsZXMuXG4gKlxuICogSWYgYHZhbHVlYCBpcyBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zIHRoYXQgY2hhbmdlIHRoZVxuICogc2VsZWN0ZWQgb3B0aW9uIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSByZW5kZXJlZCBvcHRpb25zLlxuICpcbiAqIElmIGl0IGlzIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIG9wdGlvbnMgd2lsbCBub3RcbiAqIHVwZGF0ZSBpbiByZXNwb25zZSB0byB1c2VyIGFjdGlvbnMuIEluc3RlYWQsIHRoZSBgdmFsdWVgIHByb3AgbXVzdCBjaGFuZ2UgaW5cbiAqIG9yZGVyIGZvciB0aGUgcmVuZGVyZWQgb3B0aW9ucyB0byB1cGRhdGUuXG4gKlxuICogSWYgYGRlZmF1bHRWYWx1ZWAgaXMgcHJvdmlkZWQsIGFueSBvcHRpb25zIHdpdGggdGhlIHN1cHBsaWVkIHZhbHVlcyB3aWxsIGJlXG4gKiBzZWxlY3RlZC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHJldHVybiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZFxuICB9KTtcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUkMShlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAge1xuICAgIGNoZWNrU2VsZWN0UHJvcFR5cGVzKHByb3BzKTtcbiAgfVxuXG4gIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICB3YXNNdWx0aXBsZTogISFwcm9wcy5tdWx0aXBsZVxuICB9O1xuXG4gIHtcbiAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEpIHtcbiAgICAgIGVycm9yKCdTZWxlY3QgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIHNlbGVjdCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJyk7XG5cbiAgICAgIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIkMihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIG5vZGUubXVsdGlwbGUgPSAhIXByb3BzLm11bHRpcGxlO1xuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgdmFsdWUsIGZhbHNlKTtcbiAgfSBlbHNlIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgcHJvcHMuZGVmYXVsdFZhbHVlLCB0cnVlKTtcbiAgfVxufVxuZnVuY3Rpb24gcG9zdFVwZGF0ZVdyYXBwZXIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgd2FzTXVsdGlwbGUgPSBub2RlLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU7XG4gIG5vZGUuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZSA9ICEhcHJvcHMubXVsdGlwbGU7XG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCB2YWx1ZSwgZmFsc2UpO1xuICB9IGVsc2UgaWYgKHdhc011bHRpcGxlICE9PSAhIXByb3BzLm11bHRpcGxlKSB7XG4gICAgLy8gRm9yIHNpbXBsaWNpdHksIHJlYXBwbHkgYGRlZmF1bHRWYWx1ZWAgaWYgYG11bHRpcGxlYCBpcyB0b2dnbGVkLlxuICAgIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5kZWZhdWx0VmFsdWUsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXZlcnQgdGhlIHNlbGVjdCBiYWNrIHRvIGl0cyBkZWZhdWx0IHVuc2VsZWN0ZWQgc3RhdGUuXG4gICAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHByb3BzLm11bHRpcGxlID8gW10gOiAnJywgZmFsc2UpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHZhbHVlLCBmYWxzZSk7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5WYWxEZWZhdWx0VmFsID0gZmFsc2U7XG5cbi8qKlxuICogSW1wbGVtZW50cyBhIDx0ZXh0YXJlYT4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgc2V0dGluZyBgdmFsdWVgLCBhbmRcbiAqIGBkZWZhdWx0VmFsdWVgLiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgdHJhZGl0aW9uYWwgRE9NIEFQSSBiZWNhdXNlIHZhbHVlIGlzXG4gKiB1c3VhbGx5IHNldCBhcyBQQ0RBVEEgY2hpbGRyZW4uXG4gKlxuICogSWYgYHZhbHVlYCBpcyBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zIHRoYXQgYWZmZWN0IHRoZVxuICogdmFsdWUgd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogSWYgYHZhbHVlYCBpcyBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGxcbiAqIG5vdCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuIEluc3RlYWQsIHRoZSBgdmFsdWVgIHByb3AgbXVzdCBjaGFuZ2UgaW5cbiAqIG9yZGVyIGZvciB0aGUgcmVuZGVyZWQgZWxlbWVudCB0byBiZSB1cGRhdGVkLlxuICpcbiAqIFRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhbiBlbXB0eSB2YWx1ZSwgdGhlIHByb3BcbiAqIGBkZWZhdWx0VmFsdWVgIGlmIHNwZWNpZmllZCwgb3IgdGhlIGNoaWxkcmVuIGNvbnRlbnQgKGRlcHJlY2F0ZWQpLlxuICovXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMkMihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAgaWYgKHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2BkYW5nZXJvdXNseVNldElubmVySFRNTGAgZG9lcyBub3QgbWFrZSBzZW5zZSBvbiA8dGV4dGFyZWE+LicpO1xuICB9IC8vIEFsd2F5cyBzZXQgY2hpbGRyZW4gdG8gdGhlIHNhbWUgdGhpbmcuIEluIElFOSwgdGhlIHNlbGVjdGlvbiByYW5nZSB3aWxsXG4gIC8vIGdldCByZXNldCBpZiBgdGV4dENvbnRlbnRgIGlzIG11dGF0ZWQuICBXZSBjb3VsZCBhZGQgYSBjaGVjayBpbiBzZXRUZXh0Q29udGVudFxuICAvLyB0byBvbmx5IHNldCB0aGUgdmFsdWUgaWYvd2hlbiB0aGUgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBub2RlIHZhbHVlICh3aGljaCB3b3VsZFxuICAvLyBjb21wbGV0ZWx5IHNvbHZlIHRoaXMgSUU5IGJ1ZyksIGJ1dCBTZWJhc3RpYW4rU29waGllIHNlZW1lZCB0byBsaWtlIHRoaXNcbiAgLy8gc29sdXRpb24uIFRoZSB2YWx1ZSBjYW4gYmUgYSBib29sZWFuIG9yIG9iamVjdCBzbyB0aGF0J3Mgd2h5IGl0J3MgZm9yY2VkXG4gIC8vIHRvIGJlIGEgc3RyaW5nLlxuXG5cbiAgdmFyIGhvc3RQcm9wcyA9IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRWYWx1ZTogdW5kZWZpbmVkLFxuICAgIGNoaWxkcmVuOiB0b1N0cmluZyhub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKVxuICB9KTtcblxuICByZXR1cm4gaG9zdFByb3BzO1xufVxuZnVuY3Rpb24gaW5pdFdyYXBwZXJTdGF0ZSQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICB7XG4gICAgY2hlY2tDb250cm9sbGVkVmFsdWVQcm9wcygndGV4dGFyZWEnLCBwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbERlZmF1bHRWYWwpIHtcbiAgICAgIGVycm9yKCclcyBjb250YWlucyBhIHRleHRhcmVhIHdpdGggYm90aCB2YWx1ZSBhbmQgZGVmYXVsdFZhbHVlIHByb3BzLiAnICsgJ1RleHRhcmVhIGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCB0ZXh0YXJlYSAnICsgJ2FuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycsIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkgfHwgJ0EgY29tcG9uZW50Jyk7XG5cbiAgICAgIGRpZFdhcm5WYWxEZWZhdWx0VmFsID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgaW5pdGlhbFZhbHVlID0gcHJvcHMudmFsdWU7IC8vIE9ubHkgYm90aGVyIGZldGNoaW5nIGRlZmF1bHQgdmFsdWUgaWYgd2UncmUgZ29pbmcgdG8gdXNlIGl0XG5cbiAgaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZTtcblxuICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIGVycm9yKCdVc2UgdGhlIGBkZWZhdWx0VmFsdWVgIG9yIGB2YWx1ZWAgcHJvcHMgaW5zdGVhZCBvZiBzZXR0aW5nICcgKyAnY2hpbGRyZW4gb24gPHRleHRhcmVhPi4nKTtcbiAgICAgIH1cblxuICAgICAge1xuICAgICAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lmIHlvdSBzdXBwbHkgYGRlZmF1bHRWYWx1ZWAgb24gYSA8dGV4dGFyZWE+LCBkbyBub3QgcGFzcyBjaGlsZHJlbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJzx0ZXh0YXJlYT4gY2FuIG9ubHkgaGF2ZSBhdCBtb3N0IG9uZSBjaGlsZC4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdFZhbHVlID0gY2hpbGRyZW47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRlZmF1bHRWYWx1ZSA9PSBudWxsKSB7XG4gICAgICBkZWZhdWx0VmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICBpbml0aWFsVmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gIH1cblxuICBub2RlLl93cmFwcGVyU3RhdGUgPSB7XG4gICAgaW5pdGlhbFZhbHVlOiBnZXRUb1N0cmluZ1ZhbHVlKGluaXRpYWxWYWx1ZSlcbiAgfTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZVdyYXBwZXIkMShlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciB2YWx1ZSA9IGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUpO1xuICB2YXIgZGVmYXVsdFZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy5kZWZhdWx0VmFsdWUpO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgLy8gQ2FzdCBgdmFsdWVgIHRvIGEgc3RyaW5nIHRvIGVuc3VyZSB0aGUgdmFsdWUgaXMgc2V0IGNvcnJlY3RseS4gV2hpbGVcbiAgICAvLyBicm93c2VycyB0eXBpY2FsbHkgZG8gdGhpcyBhcyBuZWNlc3NhcnksIGpzZG9tIGRvZXNuJ3QuXG4gICAgdmFyIG5ld1ZhbHVlID0gdG9TdHJpbmcodmFsdWUpOyAvLyBUbyBhdm9pZCBzaWRlIGVmZmVjdHMgKHN1Y2ggYXMgbG9zaW5nIHRleHQgc2VsZWN0aW9uKSwgb25seSBzZXQgdmFsdWUgaWYgY2hhbmdlZFxuXG4gICAgaWYgKG5ld1ZhbHVlICE9PSBub2RlLnZhbHVlKSB7XG4gICAgICBub2RlLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSA9PSBudWxsICYmIG5vZGUuZGVmYXVsdFZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IHRvU3RyaW5nKGRlZmF1bHRWYWx1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIkMyhlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7IC8vIFRoaXMgaXMgaW4gcG9zdE1vdW50IGJlY2F1c2Ugd2UgbmVlZCBhY2Nlc3MgdG8gdGhlIERPTSBub2RlLCB3aGljaCBpcyBub3RcbiAgLy8gYXZhaWxhYmxlIHVudGlsIGFmdGVyIHRoZSBjb21wb25lbnQgaGFzIG1vdW50ZWQuXG5cbiAgdmFyIHRleHRDb250ZW50ID0gbm9kZS50ZXh0Q29udGVudDsgLy8gT25seSBzZXQgbm9kZS52YWx1ZSBpZiB0ZXh0Q29udGVudCBpcyBlcXVhbCB0byB0aGUgZXhwZWN0ZWRcbiAgLy8gaW5pdGlhbCB2YWx1ZS4gSW4gSUUxMC9JRTExIHRoZXJlIGlzIGEgYnVnIHdoZXJlIHRoZSBwbGFjZWhvbGRlciBhdHRyaWJ1dGVcbiAgLy8gd2lsbCBwb3B1bGF0ZSB0ZXh0Q29udGVudCBhcyB3ZWxsLlxuICAvLyBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL2lzc3Vlcy8xMDE1MjUvXG5cbiAgaWYgKHRleHRDb250ZW50ID09PSBub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKSB7XG4gICAgaWYgKHRleHRDb250ZW50ICE9PSAnJyAmJiB0ZXh0Q29udGVudCAhPT0gbnVsbCkge1xuICAgICAgbm9kZS52YWx1ZSA9IHRleHRDb250ZW50O1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIC8vIERPTSBjb21wb25lbnQgaXMgc3RpbGwgbW91bnRlZDsgdXBkYXRlXG4gIHVwZGF0ZVdyYXBwZXIkMShlbGVtZW50LCBwcm9wcyk7XG59XG5cbnZhciBIVE1MX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbnZhciBNQVRIX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MJztcbnZhciBTVkdfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJzsgLy8gQXNzdW1lcyB0aGVyZSBpcyBubyBwYXJlbnQgbmFtZXNwYWNlLlxuXG5mdW5jdGlvbiBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodHlwZSkge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdzdmcnOlxuICAgICAgcmV0dXJuIFNWR19OQU1FU1BBQ0U7XG5cbiAgICBjYXNlICdtYXRoJzpcbiAgICAgIHJldHVybiBNQVRIX05BTUVTUEFDRTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gSFRNTF9OQU1FU1BBQ0U7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldENoaWxkTmFtZXNwYWNlKHBhcmVudE5hbWVzcGFjZSwgdHlwZSkge1xuICBpZiAocGFyZW50TmFtZXNwYWNlID09IG51bGwgfHwgcGFyZW50TmFtZXNwYWNlID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgIC8vIE5vIChvciBkZWZhdWx0KSBwYXJlbnQgbmFtZXNwYWNlOiBwb3RlbnRpYWwgZW50cnkgcG9pbnQuXG4gICAgcmV0dXJuIGdldEludHJpbnNpY05hbWVzcGFjZSh0eXBlKTtcbiAgfVxuXG4gIGlmIChwYXJlbnROYW1lc3BhY2UgPT09IFNWR19OQU1FU1BBQ0UgJiYgdHlwZSA9PT0gJ2ZvcmVpZ25PYmplY3QnKSB7XG4gICAgLy8gV2UncmUgbGVhdmluZyBTVkcuXG4gICAgcmV0dXJuIEhUTUxfTkFNRVNQQUNFO1xuICB9IC8vIEJ5IGRlZmF1bHQsIHBhc3MgbmFtZXNwYWNlIGJlbG93LlxuXG5cbiAgcmV0dXJuIHBhcmVudE5hbWVzcGFjZTtcbn1cblxuLyogZ2xvYmFscyBNU0FwcCAqL1xuXG4vKipcbiAqIENyZWF0ZSBhIGZ1bmN0aW9uIHdoaWNoIGhhcyAndW5zYWZlJyBwcml2aWxlZ2VzIChyZXF1aXJlZCBieSB3aW5kb3dzOCBhcHBzKVxuICovXG52YXIgY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbiA9IGZ1bmN0aW9uIChmdW5jKSB7XG4gIGlmICh0eXBlb2YgTVNBcHAgIT09ICd1bmRlZmluZWQnICYmIE1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgICBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmdW5jKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZnVuYztcbiAgfVxufTtcblxudmFyIHJldXNhYmxlU1ZHQ29udGFpbmVyO1xuLyoqXG4gKiBTZXQgdGhlIGlubmVySFRNTCBwcm9wZXJ0eSBvZiBhIG5vZGVcbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBodG1sXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG52YXIgc2V0SW5uZXJIVE1MID0gY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbiAobm9kZSwgaHRtbCkge1xuICBpZiAobm9kZS5uYW1lc3BhY2VVUkkgPT09IFNWR19OQU1FU1BBQ0UpIHtcblxuICAgIGlmICghKCdpbm5lckhUTUwnIGluIG5vZGUpKSB7XG4gICAgICAvLyBJRSBkb2VzIG5vdCBoYXZlIGlubmVySFRNTCBmb3IgU1ZHIG5vZGVzLCBzbyBpbnN0ZWFkIHdlIGluamVjdCB0aGVcbiAgICAgIC8vIG5ldyBtYXJrdXAgaW4gYSB0ZW1wIG5vZGUgYW5kIHRoZW4gbW92ZSB0aGUgY2hpbGQgbm9kZXMgYWNyb3NzIGludG9cbiAgICAgIC8vIHRoZSB0YXJnZXQgbm9kZVxuICAgICAgcmV1c2FibGVTVkdDb250YWluZXIgPSByZXVzYWJsZVNWR0NvbnRhaW5lciB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHJldXNhYmxlU1ZHQ29udGFpbmVyLmlubmVySFRNTCA9ICc8c3ZnPicgKyBodG1sLnZhbHVlT2YoKS50b1N0cmluZygpICsgJzwvc3ZnPic7XG4gICAgICB2YXIgc3ZnTm9kZSA9IHJldXNhYmxlU1ZHQ29udGFpbmVyLmZpcnN0Q2hpbGQ7XG5cbiAgICAgIHdoaWxlIChub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbm9kZS5yZW1vdmVDaGlsZChub2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAoc3ZnTm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoc3ZnTm9kZS5maXJzdENoaWxkKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIG5vZGUuaW5uZXJIVE1MID0gaHRtbDtcbn0pO1xuXG4vKipcbiAqIEhUTUwgbm9kZVR5cGUgdmFsdWVzIHRoYXQgcmVwcmVzZW50IHRoZSB0eXBlIG9mIHRoZSBub2RlXG4gKi9cbnZhciBFTEVNRU5UX05PREUgPSAxO1xudmFyIFRFWFRfTk9ERSA9IDM7XG52YXIgQ09NTUVOVF9OT0RFID0gODtcbnZhciBET0NVTUVOVF9OT0RFID0gOTtcbnZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFID0gMTE7XG5cbi8qKlxuICogU2V0IHRoZSB0ZXh0Q29udGVudCBwcm9wZXJ0eSBvZiBhIG5vZGUuIEZvciB0ZXh0IHVwZGF0ZXMsIGl0J3MgZmFzdGVyXG4gKiB0byBzZXQgdGhlIGBub2RlVmFsdWVgIG9mIHRoZSBUZXh0IG5vZGUgZGlyZWN0bHkgaW5zdGVhZCBvZiB1c2luZ1xuICogYC50ZXh0Q29udGVudGAgd2hpY2ggd2lsbCByZW1vdmUgdGhlIGV4aXN0aW5nIG5vZGUgYW5kIGNyZWF0ZSBhIG5ldyBvbmUuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICogQGludGVybmFsXG4gKi9cblxudmFyIHNldFRleHRDb250ZW50ID0gZnVuY3Rpb24gKG5vZGUsIHRleHQpIHtcbiAgaWYgKHRleHQpIHtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcblxuICAgIGlmIChmaXJzdENoaWxkICYmIGZpcnN0Q2hpbGQgPT09IG5vZGUubGFzdENoaWxkICYmIGZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSB0ZXh0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIG5vZGUudGV4dENvbnRlbnQgPSB0ZXh0O1xufTtcblxuLy8gTGlzdCBkZXJpdmVkIGZyb20gR2Vja28gc291cmNlIGNvZGU6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9nZWNrby1kZXYvYmxvYi80ZTYzOGVmYzcxL2xheW91dC9zdHlsZS90ZXN0L3Byb3BlcnR5X2RhdGFiYXNlLmpzXG52YXIgc2hvcnRoYW5kVG9Mb25naGFuZCA9IHtcbiAgYW5pbWF0aW9uOiBbJ2FuaW1hdGlvbkRlbGF5JywgJ2FuaW1hdGlvbkRpcmVjdGlvbicsICdhbmltYXRpb25EdXJhdGlvbicsICdhbmltYXRpb25GaWxsTW9kZScsICdhbmltYXRpb25JdGVyYXRpb25Db3VudCcsICdhbmltYXRpb25OYW1lJywgJ2FuaW1hdGlvblBsYXlTdGF0ZScsICdhbmltYXRpb25UaW1pbmdGdW5jdGlvbiddLFxuICBiYWNrZ3JvdW5kOiBbJ2JhY2tncm91bmRBdHRhY2htZW50JywgJ2JhY2tncm91bmRDbGlwJywgJ2JhY2tncm91bmRDb2xvcicsICdiYWNrZ3JvdW5kSW1hZ2UnLCAnYmFja2dyb3VuZE9yaWdpbicsICdiYWNrZ3JvdW5kUG9zaXRpb25YJywgJ2JhY2tncm91bmRQb3NpdGlvblknLCAnYmFja2dyb3VuZFJlcGVhdCcsICdiYWNrZ3JvdW5kU2l6ZSddLFxuICBiYWNrZ3JvdW5kUG9zaXRpb246IFsnYmFja2dyb3VuZFBvc2l0aW9uWCcsICdiYWNrZ3JvdW5kUG9zaXRpb25ZJ10sXG4gIGJvcmRlcjogWydib3JkZXJCb3R0b21Db2xvcicsICdib3JkZXJCb3R0b21TdHlsZScsICdib3JkZXJCb3R0b21XaWR0aCcsICdib3JkZXJJbWFnZU91dHNldCcsICdib3JkZXJJbWFnZVJlcGVhdCcsICdib3JkZXJJbWFnZVNsaWNlJywgJ2JvcmRlckltYWdlU291cmNlJywgJ2JvcmRlckltYWdlV2lkdGgnLCAnYm9yZGVyTGVmdENvbG9yJywgJ2JvcmRlckxlZnRTdHlsZScsICdib3JkZXJMZWZ0V2lkdGgnLCAnYm9yZGVyUmlnaHRDb2xvcicsICdib3JkZXJSaWdodFN0eWxlJywgJ2JvcmRlclJpZ2h0V2lkdGgnLCAnYm9yZGVyVG9wQ29sb3InLCAnYm9yZGVyVG9wU3R5bGUnLCAnYm9yZGVyVG9wV2lkdGgnXSxcbiAgYm9yZGVyQmxvY2tFbmQ6IFsnYm9yZGVyQmxvY2tFbmRDb2xvcicsICdib3JkZXJCbG9ja0VuZFN0eWxlJywgJ2JvcmRlckJsb2NrRW5kV2lkdGgnXSxcbiAgYm9yZGVyQmxvY2tTdGFydDogWydib3JkZXJCbG9ja1N0YXJ0Q29sb3InLCAnYm9yZGVyQmxvY2tTdGFydFN0eWxlJywgJ2JvcmRlckJsb2NrU3RhcnRXaWR0aCddLFxuICBib3JkZXJCb3R0b206IFsnYm9yZGVyQm90dG9tQ29sb3InLCAnYm9yZGVyQm90dG9tU3R5bGUnLCAnYm9yZGVyQm90dG9tV2lkdGgnXSxcbiAgYm9yZGVyQ29sb3I6IFsnYm9yZGVyQm90dG9tQ29sb3InLCAnYm9yZGVyTGVmdENvbG9yJywgJ2JvcmRlclJpZ2h0Q29sb3InLCAnYm9yZGVyVG9wQ29sb3InXSxcbiAgYm9yZGVySW1hZ2U6IFsnYm9yZGVySW1hZ2VPdXRzZXQnLCAnYm9yZGVySW1hZ2VSZXBlYXQnLCAnYm9yZGVySW1hZ2VTbGljZScsICdib3JkZXJJbWFnZVNvdXJjZScsICdib3JkZXJJbWFnZVdpZHRoJ10sXG4gIGJvcmRlcklubGluZUVuZDogWydib3JkZXJJbmxpbmVFbmRDb2xvcicsICdib3JkZXJJbmxpbmVFbmRTdHlsZScsICdib3JkZXJJbmxpbmVFbmRXaWR0aCddLFxuICBib3JkZXJJbmxpbmVTdGFydDogWydib3JkZXJJbmxpbmVTdGFydENvbG9yJywgJ2JvcmRlcklubGluZVN0YXJ0U3R5bGUnLCAnYm9yZGVySW5saW5lU3RhcnRXaWR0aCddLFxuICBib3JkZXJMZWZ0OiBbJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyTGVmdFdpZHRoJ10sXG4gIGJvcmRlclJhZGl1czogWydib3JkZXJCb3R0b21MZWZ0UmFkaXVzJywgJ2JvcmRlckJvdHRvbVJpZ2h0UmFkaXVzJywgJ2JvcmRlclRvcExlZnRSYWRpdXMnLCAnYm9yZGVyVG9wUmlnaHRSYWRpdXMnXSxcbiAgYm9yZGVyUmlnaHQ6IFsnYm9yZGVyUmlnaHRDb2xvcicsICdib3JkZXJSaWdodFN0eWxlJywgJ2JvcmRlclJpZ2h0V2lkdGgnXSxcbiAgYm9yZGVyU3R5bGU6IFsnYm9yZGVyQm90dG9tU3R5bGUnLCAnYm9yZGVyTGVmdFN0eWxlJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyVG9wU3R5bGUnXSxcbiAgYm9yZGVyVG9wOiBbJ2JvcmRlclRvcENvbG9yJywgJ2JvcmRlclRvcFN0eWxlJywgJ2JvcmRlclRvcFdpZHRoJ10sXG4gIGJvcmRlcldpZHRoOiBbJ2JvcmRlckJvdHRvbVdpZHRoJywgJ2JvcmRlckxlZnRXaWR0aCcsICdib3JkZXJSaWdodFdpZHRoJywgJ2JvcmRlclRvcFdpZHRoJ10sXG4gIGNvbHVtblJ1bGU6IFsnY29sdW1uUnVsZUNvbG9yJywgJ2NvbHVtblJ1bGVTdHlsZScsICdjb2x1bW5SdWxlV2lkdGgnXSxcbiAgY29sdW1uczogWydjb2x1bW5Db3VudCcsICdjb2x1bW5XaWR0aCddLFxuICBmbGV4OiBbJ2ZsZXhCYXNpcycsICdmbGV4R3JvdycsICdmbGV4U2hyaW5rJ10sXG4gIGZsZXhGbG93OiBbJ2ZsZXhEaXJlY3Rpb24nLCAnZmxleFdyYXAnXSxcbiAgZm9udDogWydmb250RmFtaWx5JywgJ2ZvbnRGZWF0dXJlU2V0dGluZ3MnLCAnZm9udEtlcm5pbmcnLCAnZm9udExhbmd1YWdlT3ZlcnJpZGUnLCAnZm9udFNpemUnLCAnZm9udFNpemVBZGp1c3QnLCAnZm9udFN0cmV0Y2gnLCAnZm9udFN0eWxlJywgJ2ZvbnRWYXJpYW50JywgJ2ZvbnRWYXJpYW50QWx0ZXJuYXRlcycsICdmb250VmFyaWFudENhcHMnLCAnZm9udFZhcmlhbnRFYXN0QXNpYW4nLCAnZm9udFZhcmlhbnRMaWdhdHVyZXMnLCAnZm9udFZhcmlhbnROdW1lcmljJywgJ2ZvbnRWYXJpYW50UG9zaXRpb24nLCAnZm9udFdlaWdodCcsICdsaW5lSGVpZ2h0J10sXG4gIGZvbnRWYXJpYW50OiBbJ2ZvbnRWYXJpYW50QWx0ZXJuYXRlcycsICdmb250VmFyaWFudENhcHMnLCAnZm9udFZhcmlhbnRFYXN0QXNpYW4nLCAnZm9udFZhcmlhbnRMaWdhdHVyZXMnLCAnZm9udFZhcmlhbnROdW1lcmljJywgJ2ZvbnRWYXJpYW50UG9zaXRpb24nXSxcbiAgZ2FwOiBbJ2NvbHVtbkdhcCcsICdyb3dHYXAnXSxcbiAgZ3JpZDogWydncmlkQXV0b0NvbHVtbnMnLCAnZ3JpZEF1dG9GbG93JywgJ2dyaWRBdXRvUm93cycsICdncmlkVGVtcGxhdGVBcmVhcycsICdncmlkVGVtcGxhdGVDb2x1bW5zJywgJ2dyaWRUZW1wbGF0ZVJvd3MnXSxcbiAgZ3JpZEFyZWE6IFsnZ3JpZENvbHVtbkVuZCcsICdncmlkQ29sdW1uU3RhcnQnLCAnZ3JpZFJvd0VuZCcsICdncmlkUm93U3RhcnQnXSxcbiAgZ3JpZENvbHVtbjogWydncmlkQ29sdW1uRW5kJywgJ2dyaWRDb2x1bW5TdGFydCddLFxuICBncmlkQ29sdW1uR2FwOiBbJ2NvbHVtbkdhcCddLFxuICBncmlkR2FwOiBbJ2NvbHVtbkdhcCcsICdyb3dHYXAnXSxcbiAgZ3JpZFJvdzogWydncmlkUm93RW5kJywgJ2dyaWRSb3dTdGFydCddLFxuICBncmlkUm93R2FwOiBbJ3Jvd0dhcCddLFxuICBncmlkVGVtcGxhdGU6IFsnZ3JpZFRlbXBsYXRlQXJlYXMnLCAnZ3JpZFRlbXBsYXRlQ29sdW1ucycsICdncmlkVGVtcGxhdGVSb3dzJ10sXG4gIGxpc3RTdHlsZTogWydsaXN0U3R5bGVJbWFnZScsICdsaXN0U3R5bGVQb3NpdGlvbicsICdsaXN0U3R5bGVUeXBlJ10sXG4gIG1hcmdpbjogWydtYXJnaW5Cb3R0b20nLCAnbWFyZ2luTGVmdCcsICdtYXJnaW5SaWdodCcsICdtYXJnaW5Ub3AnXSxcbiAgbWFya2VyOiBbJ21hcmtlckVuZCcsICdtYXJrZXJNaWQnLCAnbWFya2VyU3RhcnQnXSxcbiAgbWFzazogWydtYXNrQ2xpcCcsICdtYXNrQ29tcG9zaXRlJywgJ21hc2tJbWFnZScsICdtYXNrTW9kZScsICdtYXNrT3JpZ2luJywgJ21hc2tQb3NpdGlvblgnLCAnbWFza1Bvc2l0aW9uWScsICdtYXNrUmVwZWF0JywgJ21hc2tTaXplJ10sXG4gIG1hc2tQb3NpdGlvbjogWydtYXNrUG9zaXRpb25YJywgJ21hc2tQb3NpdGlvblknXSxcbiAgb3V0bGluZTogWydvdXRsaW5lQ29sb3InLCAnb3V0bGluZVN0eWxlJywgJ291dGxpbmVXaWR0aCddLFxuICBvdmVyZmxvdzogWydvdmVyZmxvd1gnLCAnb3ZlcmZsb3dZJ10sXG4gIHBhZGRpbmc6IFsncGFkZGluZ0JvdHRvbScsICdwYWRkaW5nTGVmdCcsICdwYWRkaW5nUmlnaHQnLCAncGFkZGluZ1RvcCddLFxuICBwbGFjZUNvbnRlbnQ6IFsnYWxpZ25Db250ZW50JywgJ2p1c3RpZnlDb250ZW50J10sXG4gIHBsYWNlSXRlbXM6IFsnYWxpZ25JdGVtcycsICdqdXN0aWZ5SXRlbXMnXSxcbiAgcGxhY2VTZWxmOiBbJ2FsaWduU2VsZicsICdqdXN0aWZ5U2VsZiddLFxuICB0ZXh0RGVjb3JhdGlvbjogWyd0ZXh0RGVjb3JhdGlvbkNvbG9yJywgJ3RleHREZWNvcmF0aW9uTGluZScsICd0ZXh0RGVjb3JhdGlvblN0eWxlJ10sXG4gIHRleHRFbXBoYXNpczogWyd0ZXh0RW1waGFzaXNDb2xvcicsICd0ZXh0RW1waGFzaXNTdHlsZSddLFxuICB0cmFuc2l0aW9uOiBbJ3RyYW5zaXRpb25EZWxheScsICd0cmFuc2l0aW9uRHVyYXRpb24nLCAndHJhbnNpdGlvblByb3BlcnR5JywgJ3RyYW5zaXRpb25UaW1pbmdGdW5jdGlvbiddLFxuICB3b3JkV3JhcDogWydvdmVyZmxvd1dyYXAnXVxufTtcblxuLyoqXG4gKiBDU1MgcHJvcGVydGllcyB3aGljaCBhY2NlcHQgbnVtYmVycyBidXQgYXJlIG5vdCBpbiB1bml0cyBvZiBcInB4XCIuXG4gKi9cbnZhciBpc1VuaXRsZXNzTnVtYmVyID0ge1xuICBhbmltYXRpb25JdGVyYXRpb25Db3VudDogdHJ1ZSxcbiAgYXNwZWN0UmF0aW86IHRydWUsXG4gIGJvcmRlckltYWdlT3V0c2V0OiB0cnVlLFxuICBib3JkZXJJbWFnZVNsaWNlOiB0cnVlLFxuICBib3JkZXJJbWFnZVdpZHRoOiB0cnVlLFxuICBib3hGbGV4OiB0cnVlLFxuICBib3hGbGV4R3JvdXA6IHRydWUsXG4gIGJveE9yZGluYWxHcm91cDogdHJ1ZSxcbiAgY29sdW1uQ291bnQ6IHRydWUsXG4gIGNvbHVtbnM6IHRydWUsXG4gIGZsZXg6IHRydWUsXG4gIGZsZXhHcm93OiB0cnVlLFxuICBmbGV4UG9zaXRpdmU6IHRydWUsXG4gIGZsZXhTaHJpbms6IHRydWUsXG4gIGZsZXhOZWdhdGl2ZTogdHJ1ZSxcbiAgZmxleE9yZGVyOiB0cnVlLFxuICBncmlkQXJlYTogdHJ1ZSxcbiAgZ3JpZFJvdzogdHJ1ZSxcbiAgZ3JpZFJvd0VuZDogdHJ1ZSxcbiAgZ3JpZFJvd1NwYW46IHRydWUsXG4gIGdyaWRSb3dTdGFydDogdHJ1ZSxcbiAgZ3JpZENvbHVtbjogdHJ1ZSxcbiAgZ3JpZENvbHVtbkVuZDogdHJ1ZSxcbiAgZ3JpZENvbHVtblNwYW46IHRydWUsXG4gIGdyaWRDb2x1bW5TdGFydDogdHJ1ZSxcbiAgZm9udFdlaWdodDogdHJ1ZSxcbiAgbGluZUNsYW1wOiB0cnVlLFxuICBsaW5lSGVpZ2h0OiB0cnVlLFxuICBvcGFjaXR5OiB0cnVlLFxuICBvcmRlcjogdHJ1ZSxcbiAgb3JwaGFuczogdHJ1ZSxcbiAgdGFiU2l6ZTogdHJ1ZSxcbiAgd2lkb3dzOiB0cnVlLFxuICB6SW5kZXg6IHRydWUsXG4gIHpvb206IHRydWUsXG4gIC8vIFNWRy1yZWxhdGVkIHByb3BlcnRpZXNcbiAgZmlsbE9wYWNpdHk6IHRydWUsXG4gIGZsb29kT3BhY2l0eTogdHJ1ZSxcbiAgc3RvcE9wYWNpdHk6IHRydWUsXG4gIHN0cm9rZURhc2hhcnJheTogdHJ1ZSxcbiAgc3Ryb2tlRGFzaG9mZnNldDogdHJ1ZSxcbiAgc3Ryb2tlTWl0ZXJsaW1pdDogdHJ1ZSxcbiAgc3Ryb2tlT3BhY2l0eTogdHJ1ZSxcbiAgc3Ryb2tlV2lkdGg6IHRydWVcbn07XG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXggdmVuZG9yLXNwZWNpZmljIHByZWZpeCwgZWc6IFdlYmtpdFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBzdHlsZSBuYW1lLCBlZzogdHJhbnNpdGlvbkR1cmF0aW9uXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHN0eWxlIG5hbWUgcHJlZml4ZWQgd2l0aCBgcHJlZml4YCwgcHJvcGVybHkgY2FtZWxDYXNlZCwgZWc6XG4gKiBXZWJraXRUcmFuc2l0aW9uRHVyYXRpb25cbiAqL1xuXG5mdW5jdGlvbiBwcmVmaXhLZXkocHJlZml4LCBrZXkpIHtcbiAgcmV0dXJuIHByZWZpeCArIGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zdWJzdHJpbmcoMSk7XG59XG4vKipcbiAqIFN1cHBvcnQgc3R5bGUgbmFtZXMgdGhhdCBtYXkgY29tZSBwYXNzZWQgaW4gcHJlZml4ZWQgYnkgYWRkaW5nIHBlcm11dGF0aW9uc1xuICogb2YgdmVuZG9yIHByZWZpeGVzLlxuICovXG5cblxudmFyIHByZWZpeGVzID0gWydXZWJraXQnLCAnbXMnLCAnTW96JywgJ08nXTsgLy8gVXNpbmcgT2JqZWN0LmtleXMgaGVyZSwgb3IgZWxzZSB0aGUgdmFuaWxsYSBmb3ItaW4gbG9vcCBtYWtlcyBJRTggZ28gaW50byBhblxuLy8gaW5maW5pdGUgbG9vcCwgYmVjYXVzZSBpdCBpdGVyYXRlcyBvdmVyIHRoZSBuZXdseSBhZGRlZCBwcm9wcyB0b28uXG5cbk9iamVjdC5rZXlzKGlzVW5pdGxlc3NOdW1iZXIpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgcHJlZml4ZXMuZm9yRWFjaChmdW5jdGlvbiAocHJlZml4KSB7XG4gICAgaXNVbml0bGVzc051bWJlcltwcmVmaXhLZXkocHJlZml4LCBwcm9wKV0gPSBpc1VuaXRsZXNzTnVtYmVyW3Byb3BdO1xuICB9KTtcbn0pO1xuXG4vKipcbiAqIENvbnZlcnQgYSB2YWx1ZSBpbnRvIHRoZSBwcm9wZXIgY3NzIHdyaXRhYmxlIHZhbHVlLiBUaGUgc3R5bGUgbmFtZSBgbmFtZWBcbiAqIHNob3VsZCBiZSBsb2dpY2FsIChubyBoeXBoZW5zKSwgYXMgc3BlY2lmaWVkXG4gKiBpbiBgQ1NTUHJvcGVydHkuaXNVbml0bGVzc051bWJlcmAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgQ1NTIHByb3BlcnR5IG5hbWUgc3VjaCBhcyBgdG9wTWFyZ2luYC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQ1NTIHByb3BlcnR5IHZhbHVlIHN1Y2ggYXMgYDEwcHhgLlxuICogQHJldHVybiB7c3RyaW5nfSBOb3JtYWxpemVkIHN0eWxlIHZhbHVlIHdpdGggZGltZW5zaW9ucyBhcHBsaWVkLlxuICovXG5cbmZ1bmN0aW9uIGRhbmdlcm91c1N0eWxlVmFsdWUobmFtZSwgdmFsdWUsIGlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgLy8gTm90ZSB0aGF0IHdlJ3ZlIHJlbW92ZWQgZXNjYXBlVGV4dEZvckJyb3dzZXIoKSBjYWxscyBoZXJlIHNpbmNlIHRoZVxuICAvLyB3aG9sZSBzdHJpbmcgd2lsbCBiZSBlc2NhcGVkIHdoZW4gdGhlIGF0dHJpYnV0ZSBpcyBpbmplY3RlZCBpbnRvXG4gIC8vIHRoZSBtYXJrdXAuIElmIHlvdSBwcm92aWRlIHVuc2FmZSB1c2VyIGRhdGEgaGVyZSB0aGV5IGNhbiBpbmplY3RcbiAgLy8gYXJiaXRyYXJ5IENTUyB3aGljaCBtYXkgYmUgcHJvYmxlbWF0aWMgKEkgY291bGRuJ3QgcmVwcm8gdGhpcyk6XG4gIC8vIGh0dHBzOi8vd3d3Lm93YXNwLm9yZy9pbmRleC5waHAvWFNTX0ZpbHRlcl9FdmFzaW9uX0NoZWF0X1NoZWV0XG4gIC8vIGh0dHA6Ly93d3cudGhlc3Bhbm5lci5jby51ay8yMDA3LzExLzI2L3VsdGltYXRlLXhzcy1jc3MtaW5qZWN0aW9uL1xuICAvLyBUaGlzIGlzIG5vdCBhbiBYU1MgaG9sZSBidXQgaW5zdGVhZCBhIHBvdGVudGlhbCBDU1MgaW5qZWN0aW9uIGlzc3VlXG4gIC8vIHdoaWNoIGhhcyBsZWFkIHRvIGEgZ3JlYXRlciBkaXNjdXNzaW9uIGFib3V0IGhvdyB3ZSdyZSBnb2luZyB0b1xuICAvLyB0cnVzdCBVUkxzIG1vdmluZyBmb3J3YXJkLiBTZWUgIzIxMTU5MDFcbiAgdmFyIGlzRW1wdHkgPSB2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHZhbHVlID09PSAnJztcblxuICBpZiAoaXNFbXB0eSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmICghaXNDdXN0b21Qcm9wZXJ0eSAmJiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHZhbHVlICE9PSAwICYmICEoaXNVbml0bGVzc051bWJlci5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiBpc1VuaXRsZXNzTnVtYmVyW25hbWVdKSkge1xuICAgIHJldHVybiB2YWx1ZSArICdweCc7IC8vIFByZXN1bWVzIGltcGxpY2l0ICdweCcgc3VmZml4IGZvciB1bml0bGVzcyBudW1iZXJzXG4gIH1cblxuICB7XG4gICAgY2hlY2tDU1NQcm9wZXJ0eVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBuYW1lKTtcbiAgfVxuXG4gIHJldHVybiAoJycgKyB2YWx1ZSkudHJpbSgpO1xufVxuXG52YXIgdXBwZXJjYXNlUGF0dGVybiA9IC8oW0EtWl0pL2c7XG52YXIgbXNQYXR0ZXJuID0gL15tcy0vO1xuLyoqXG4gKiBIeXBoZW5hdGVzIGEgY2FtZWxjYXNlZCBDU1MgcHJvcGVydHkgbmFtZSwgZm9yIGV4YW1wbGU6XG4gKlxuICogICA+IGh5cGhlbmF0ZVN0eWxlTmFtZSgnYmFja2dyb3VuZENvbG9yJylcbiAqICAgPCBcImJhY2tncm91bmQtY29sb3JcIlxuICogICA+IGh5cGhlbmF0ZVN0eWxlTmFtZSgnTW96VHJhbnNpdGlvbicpXG4gKiAgIDwgXCItbW96LXRyYW5zaXRpb25cIlxuICogICA+IGh5cGhlbmF0ZVN0eWxlTmFtZSgnbXNUcmFuc2l0aW9uJylcbiAqICAgPCBcIi1tcy10cmFuc2l0aW9uXCJcbiAqXG4gKiBBcyBNb2Rlcm5penIgc3VnZ2VzdHMgKGh0dHA6Ly9tb2Rlcm5penIuY29tL2RvY3MvI3ByZWZpeGVkKSwgYW4gYG1zYCBwcmVmaXhcbiAqIGlzIGNvbnZlcnRlZCB0byBgLW1zLWAuXG4gKi9cblxuZnVuY3Rpb24gaHlwaGVuYXRlU3R5bGVOYW1lKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWUucmVwbGFjZSh1cHBlcmNhc2VQYXR0ZXJuLCAnLSQxJykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKG1zUGF0dGVybiwgJy1tcy0nKTtcbn1cblxudmFyIHdhcm5WYWxpZFN0eWxlID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgLy8gJ21zVHJhbnNmb3JtJyBpcyBjb3JyZWN0LCBidXQgdGhlIG90aGVyIHByZWZpeGVzIHNob3VsZCBiZSBjYXBpdGFsaXplZFxuICB2YXIgYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuID0gL14oPzp3ZWJraXR8bW96fG8pW0EtWl0vO1xuICB2YXIgbXNQYXR0ZXJuJDEgPSAvXi1tcy0vO1xuICB2YXIgaHlwaGVuUGF0dGVybiA9IC8tKC4pL2c7IC8vIHN0eWxlIHZhbHVlcyBzaG91bGRuJ3QgY29udGFpbiBhIHNlbWljb2xvblxuXG4gIHZhciBiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4gPSAvO1xccyokLztcbiAgdmFyIHdhcm5lZFN0eWxlTmFtZXMgPSB7fTtcbiAgdmFyIHdhcm5lZFN0eWxlVmFsdWVzID0ge307XG4gIHZhciB3YXJuZWRGb3JOYU5WYWx1ZSA9IGZhbHNlO1xuICB2YXIgd2FybmVkRm9ySW5maW5pdHlWYWx1ZSA9IGZhbHNlO1xuXG4gIHZhciBjYW1lbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoaHlwaGVuUGF0dGVybiwgZnVuY3Rpb24gKF8sIGNoYXJhY3Rlcikge1xuICAgICAgcmV0dXJuIGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpO1xuICAgIH0pO1xuICB9O1xuXG4gIHZhciB3YXJuSHlwaGVuYXRlZFN0eWxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlTmFtZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ1Vuc3VwcG9ydGVkIHN0eWxlIHByb3BlcnR5ICVzLiBEaWQgeW91IG1lYW4gJXM/JywgbmFtZSwgLy8gQXMgQW5kaSBTbWl0aCBzdWdnZXN0c1xuICAgIC8vIChodHRwOi8vd3d3LmFuZGlzbWl0aC5jb20vYmxvZy8yMDEyLzAyL21vZGVybml6ci1wcmVmaXhlZC8pLCBhbiBgLW1zYCBwcmVmaXhcbiAgICAvLyBpcyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGBtc2AuXG4gICAgY2FtZWxpemUobmFtZS5yZXBsYWNlKG1zUGF0dGVybiQxLCAnbXMtJykpKTtcbiAgfTtcblxuICB2YXIgd2FybkJhZFZlbmRvcmVkU3R5bGVOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRTdHlsZU5hbWVzW25hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignVW5zdXBwb3J0ZWQgdmVuZG9yLXByZWZpeGVkIHN0eWxlIHByb3BlcnR5ICVzLiBEaWQgeW91IG1lYW4gJXM/JywgbmFtZSwgbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSkpO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZVdpdGhTZW1pY29sb24gPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAod2FybmVkU3R5bGVWYWx1ZXMuaGFzT3duUHJvcGVydHkodmFsdWUpICYmIHdhcm5lZFN0eWxlVmFsdWVzW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZFN0eWxlVmFsdWVzW3ZhbHVlXSA9IHRydWU7XG5cbiAgICBlcnJvcihcIlN0eWxlIHByb3BlcnR5IHZhbHVlcyBzaG91bGRuJ3QgY29udGFpbiBhIHNlbWljb2xvbi4gXCIgKyAnVHJ5IFwiJXM6ICVzXCIgaW5zdGVhZC4nLCBuYW1lLCB2YWx1ZS5yZXBsYWNlKGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybiwgJycpKTtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVJc05hTiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmICh3YXJuZWRGb3JOYU5WYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZEZvck5hTlZhbHVlID0gdHJ1ZTtcblxuICAgIGVycm9yKCdgTmFOYCBpcyBhbiBpbnZhbGlkIHZhbHVlIGZvciB0aGUgYCVzYCBjc3Mgc3R5bGUgcHJvcGVydHkuJywgbmFtZSk7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlSXNJbmZpbml0eSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmICh3YXJuZWRGb3JJbmZpbml0eVZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkRm9ySW5maW5pdHlWYWx1ZSA9IHRydWU7XG5cbiAgICBlcnJvcignYEluZmluaXR5YCBpcyBhbiBpbnZhbGlkIHZhbHVlIGZvciB0aGUgYCVzYCBjc3Mgc3R5bGUgcHJvcGVydHkuJywgbmFtZSk7XG4gIH07XG5cbiAgd2FyblZhbGlkU3R5bGUgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAobmFtZS5pbmRleE9mKCctJykgPiAtMSkge1xuICAgICAgd2Fybkh5cGhlbmF0ZWRTdHlsZU5hbWUobmFtZSk7XG4gICAgfSBlbHNlIGlmIChiYWRWZW5kb3JlZFN0eWxlTmFtZVBhdHRlcm4udGVzdChuYW1lKSkge1xuICAgICAgd2FybkJhZFZlbmRvcmVkU3R5bGVOYW1lKG5hbWUpO1xuICAgIH0gZWxzZSBpZiAoYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICB3YXJuU3R5bGVWYWx1ZVdpdGhTZW1pY29sb24obmFtZSwgdmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICAgIHdhcm5TdHlsZVZhbHVlSXNOYU4obmFtZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmICghaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgIHdhcm5TdHlsZVZhbHVlSXNJbmZpbml0eShuYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG52YXIgd2FyblZhbGlkU3R5bGUkMSA9IHdhcm5WYWxpZFN0eWxlO1xuXG4vKipcbiAqIE9wZXJhdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCBDU1MgcHJvcGVydGllcy5cbiAqL1xuXG4vKipcbiAqIFRoaXMgY3JlYXRlcyBhIHN0cmluZyB0aGF0IGlzIGV4cGVjdGVkIHRvIGJlIGVxdWl2YWxlbnQgdG8gdGhlIHN0eWxlXG4gKiBhdHRyaWJ1dGUgZ2VuZXJhdGVkIGJ5IHNlcnZlci1zaWRlIHJlbmRlcmluZy4gSXQgYnktcGFzc2VzIHdhcm5pbmdzIGFuZFxuICogc2VjdXJpdHkgY2hlY2tzIHNvIGl0J3Mgbm90IHNhZmUgdG8gdXNlIHRoaXMgdmFsdWUgZm9yIGFueXRoaW5nIG90aGVyIHRoYW5cbiAqIGNvbXBhcmlzb24uIEl0IGlzIG9ubHkgdXNlZCBpbiBERVYgZm9yIFNTUiB2YWxpZGF0aW9uLlxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZURhbmdlcm91c1N0cmluZ0ZvclN0eWxlcyhzdHlsZXMpIHtcbiAge1xuICAgIHZhciBzZXJpYWxpemVkID0gJyc7XG4gICAgdmFyIGRlbGltaXRlciA9ICcnO1xuXG4gICAgZm9yICh2YXIgc3R5bGVOYW1lIGluIHN0eWxlcykge1xuICAgICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0eWxlVmFsdWUgPSBzdHlsZXNbc3R5bGVOYW1lXTtcblxuICAgICAgaWYgKHN0eWxlVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICB2YXIgaXNDdXN0b21Qcm9wZXJ0eSA9IHN0eWxlTmFtZS5pbmRleE9mKCctLScpID09PSAwO1xuICAgICAgICBzZXJpYWxpemVkICs9IGRlbGltaXRlciArIChpc0N1c3RvbVByb3BlcnR5ID8gc3R5bGVOYW1lIDogaHlwaGVuYXRlU3R5bGVOYW1lKHN0eWxlTmFtZSkpICsgJzonO1xuICAgICAgICBzZXJpYWxpemVkICs9IGRhbmdlcm91c1N0eWxlVmFsdWUoc3R5bGVOYW1lLCBzdHlsZVZhbHVlLCBpc0N1c3RvbVByb3BlcnR5KTtcbiAgICAgICAgZGVsaW1pdGVyID0gJzsnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZXJpYWxpemVkIHx8IG51bGw7XG4gIH1cbn1cbi8qKlxuICogU2V0cyB0aGUgdmFsdWUgZm9yIG11bHRpcGxlIHN0eWxlcyBvbiBhIG5vZGUuICBJZiBhIHZhbHVlIGlzIHNwZWNpZmllZCBhc1xuICogJycgKGVtcHR5IHN0cmluZyksIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlIHByb3BlcnR5IHdpbGwgYmUgdW5zZXQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge29iamVjdH0gc3R5bGVzXG4gKi9cblxuZnVuY3Rpb24gc2V0VmFsdWVGb3JTdHlsZXMobm9kZSwgc3R5bGVzKSB7XG4gIHZhciBzdHlsZSA9IG5vZGUuc3R5bGU7XG5cbiAgZm9yICh2YXIgc3R5bGVOYW1lIGluIHN0eWxlcykge1xuICAgIGlmICghc3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBpc0N1c3RvbVByb3BlcnR5ID0gc3R5bGVOYW1lLmluZGV4T2YoJy0tJykgPT09IDA7XG5cbiAgICB7XG4gICAgICBpZiAoIWlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgICAgICAgd2FyblZhbGlkU3R5bGUkMShzdHlsZU5hbWUsIHN0eWxlc1tzdHlsZU5hbWVdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc3R5bGVWYWx1ZSA9IGRhbmdlcm91c1N0eWxlVmFsdWUoc3R5bGVOYW1lLCBzdHlsZXNbc3R5bGVOYW1lXSwgaXNDdXN0b21Qcm9wZXJ0eSk7XG5cbiAgICBpZiAoc3R5bGVOYW1lID09PSAnZmxvYXQnKSB7XG4gICAgICBzdHlsZU5hbWUgPSAnY3NzRmxvYXQnO1xuICAgIH1cblxuICAgIGlmIChpc0N1c3RvbVByb3BlcnR5KSB7XG4gICAgICBzdHlsZS5zZXRQcm9wZXJ0eShzdHlsZU5hbWUsIHN0eWxlVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHlsZVtzdHlsZU5hbWVdID0gc3R5bGVWYWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNWYWx1ZUVtcHR5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHZhbHVlID09PSAnJztcbn1cbi8qKlxuICogR2l2ZW4ge2NvbG9yOiAncmVkJywgb3ZlcmZsb3c6ICdoaWRkZW4nfSByZXR1cm5zIHtcbiAqICAgY29sb3I6ICdjb2xvcicsXG4gKiAgIG92ZXJmbG93WDogJ292ZXJmbG93JyxcbiAqICAgb3ZlcmZsb3dZOiAnb3ZlcmZsb3cnLFxuICogfS4gVGhpcyBjYW4gYmUgcmVhZCBhcyBcInRoZSBvdmVyZmxvd1kgcHJvcGVydHkgd2FzIHNldCBieSB0aGUgb3ZlcmZsb3dcbiAqIHNob3J0aGFuZFwiLiBUaGF0IGlzLCB0aGUgdmFsdWVzIGFyZSB0aGUgcHJvcGVydHkgdGhhdCBlYWNoIHdhcyBkZXJpdmVkIGZyb20uXG4gKi9cblxuXG5mdW5jdGlvbiBleHBhbmRTaG9ydGhhbmRNYXAoc3R5bGVzKSB7XG4gIHZhciBleHBhbmRlZCA9IHt9O1xuXG4gIGZvciAodmFyIGtleSBpbiBzdHlsZXMpIHtcbiAgICB2YXIgbG9uZ2hhbmRzID0gc2hvcnRoYW5kVG9Mb25naGFuZFtrZXldIHx8IFtrZXldO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb25naGFuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGV4cGFuZGVkW2xvbmdoYW5kc1tpXV0gPSBrZXk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4cGFuZGVkO1xufVxuLyoqXG4gKiBXaGVuIG1peGluZyBzaG9ydGhhbmQgYW5kIGxvbmdoYW5kIHByb3BlcnR5IG5hbWVzLCB3ZSB3YXJuIGR1cmluZyB1cGRhdGVzIGlmXG4gKiB3ZSBleHBlY3QgYW4gaW5jb3JyZWN0IHJlc3VsdCB0byBvY2N1ci4gSW4gcGFydGljdWxhciwgd2Ugd2FybiBmb3I6XG4gKlxuICogVXBkYXRpbmcgYSBzaG9ydGhhbmQgcHJvcGVydHkgKGxvbmdoYW5kIGdldHMgb3ZlcndyaXR0ZW4pOlxuICogICB7Zm9udDogJ2ZvbycsIGZvbnRWYXJpYW50OiAnYmFyJ30gLT4ge2ZvbnQ6ICdiYXonLCBmb250VmFyaWFudDogJ2Jhcid9XG4gKiAgIGJlY29tZXMgLnN0eWxlLmZvbnQgPSAnYmF6J1xuICogUmVtb3ZpbmcgYSBzaG9ydGhhbmQgcHJvcGVydHkgKGxvbmdoYW5kIGdldHMgbG9zdCB0b28pOlxuICogICB7Zm9udDogJ2ZvbycsIGZvbnRWYXJpYW50OiAnYmFyJ30gLT4ge2ZvbnRWYXJpYW50OiAnYmFyJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udCA9ICcnXG4gKiBSZW1vdmluZyBhIGxvbmdoYW5kIHByb3BlcnR5IChzaG91bGQgcmV2ZXJ0IHRvIHNob3J0aGFuZDsgZG9lc24ndCk6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udDogJ2Zvbyd9XG4gKiAgIGJlY29tZXMgLnN0eWxlLmZvbnRWYXJpYW50ID0gJydcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlU2hvcnRoYW5kUHJvcGVydHlDb2xsaXNpb25JbkRldihzdHlsZVVwZGF0ZXMsIG5leHRTdHlsZXMpIHtcbiAge1xuICAgIGlmICghbmV4dFN0eWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBleHBhbmRlZFVwZGF0ZXMgPSBleHBhbmRTaG9ydGhhbmRNYXAoc3R5bGVVcGRhdGVzKTtcbiAgICB2YXIgZXhwYW5kZWRTdHlsZXMgPSBleHBhbmRTaG9ydGhhbmRNYXAobmV4dFN0eWxlcyk7XG4gICAgdmFyIHdhcm5lZEFib3V0ID0ge307XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gZXhwYW5kZWRVcGRhdGVzKSB7XG4gICAgICB2YXIgb3JpZ2luYWxLZXkgPSBleHBhbmRlZFVwZGF0ZXNba2V5XTtcbiAgICAgIHZhciBjb3JyZWN0T3JpZ2luYWxLZXkgPSBleHBhbmRlZFN0eWxlc1trZXldO1xuXG4gICAgICBpZiAoY29ycmVjdE9yaWdpbmFsS2V5ICYmIG9yaWdpbmFsS2V5ICE9PSBjb3JyZWN0T3JpZ2luYWxLZXkpIHtcbiAgICAgICAgdmFyIHdhcm5pbmdLZXkgPSBvcmlnaW5hbEtleSArICcsJyArIGNvcnJlY3RPcmlnaW5hbEtleTtcblxuICAgICAgICBpZiAod2FybmVkQWJvdXRbd2FybmluZ0tleV0pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdhcm5lZEFib3V0W3dhcm5pbmdLZXldID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXMgYSBzdHlsZSBwcm9wZXJ0eSBkdXJpbmcgcmVyZW5kZXIgKCVzKSB3aGVuIGEgJyArICdjb25mbGljdGluZyBwcm9wZXJ0eSBpcyBzZXQgKCVzKSBjYW4gbGVhZCB0byBzdHlsaW5nIGJ1Z3MuIFRvICcgKyBcImF2b2lkIHRoaXMsIGRvbid0IG1peCBzaG9ydGhhbmQgYW5kIG5vbi1zaG9ydGhhbmQgcHJvcGVydGllcyBcIiArICdmb3IgdGhlIHNhbWUgdmFsdWU7IGluc3RlYWQsIHJlcGxhY2UgdGhlIHNob3J0aGFuZCB3aXRoICcgKyAnc2VwYXJhdGUgdmFsdWVzLicsIGlzVmFsdWVFbXB0eShzdHlsZVVwZGF0ZXNbb3JpZ2luYWxLZXldKSA/ICdSZW1vdmluZycgOiAnVXBkYXRpbmcnLCBvcmlnaW5hbEtleSwgY29ycmVjdE9yaWdpbmFsS2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gRm9yIEhUTUwsIGNlcnRhaW4gdGFncyBzaG91bGQgb21pdCB0aGVpciBjbG9zZSB0YWcuIFdlIGtlZXAgYSBsaXN0IGZvclxuLy8gdGhvc2Ugc3BlY2lhbC1jYXNlIHRhZ3MuXG52YXIgb21pdHRlZENsb3NlVGFncyA9IHtcbiAgYXJlYTogdHJ1ZSxcbiAgYmFzZTogdHJ1ZSxcbiAgYnI6IHRydWUsXG4gIGNvbDogdHJ1ZSxcbiAgZW1iZWQ6IHRydWUsXG4gIGhyOiB0cnVlLFxuICBpbWc6IHRydWUsXG4gIGlucHV0OiB0cnVlLFxuICBrZXlnZW46IHRydWUsXG4gIGxpbms6IHRydWUsXG4gIG1ldGE6IHRydWUsXG4gIHBhcmFtOiB0cnVlLFxuICBzb3VyY2U6IHRydWUsXG4gIHRyYWNrOiB0cnVlLFxuICB3YnI6IHRydWUgLy8gTk9URTogbWVudWl0ZW0ncyBjbG9zZSB0YWcgc2hvdWxkIGJlIG9taXR0ZWQsIGJ1dCB0aGF0IGNhdXNlcyBwcm9ibGVtcy5cblxufTtcblxuLy8gYG9taXR0ZWRDbG9zZVRhZ3NgIGV4Y2VwdCB0aGF0IGBtZW51aXRlbWAgc2hvdWxkIHN0aWxsIGhhdmUgaXRzIGNsb3NpbmcgdGFnLlxuXG52YXIgdm9pZEVsZW1lbnRUYWdzID0gYXNzaWduKHtcbiAgbWVudWl0ZW06IHRydWVcbn0sIG9taXR0ZWRDbG9zZVRhZ3MpO1xuXG52YXIgSFRNTCA9ICdfX2h0bWwnO1xuXG5mdW5jdGlvbiBhc3NlcnRWYWxpZFByb3BzKHRhZywgcHJvcHMpIHtcbiAgaWYgKCFwcm9wcykge1xuICAgIHJldHVybjtcbiAgfSAvLyBOb3RlIHRoZSB1c2Ugb2YgYD09YCB3aGljaCBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkLlxuXG5cbiAgaWYgKHZvaWRFbGVtZW50VGFnc1t0YWddKSB7XG4gICAgaWYgKHByb3BzLmNoaWxkcmVuICE9IG51bGwgfHwgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHRhZyArIFwiIGlzIGEgdm9pZCBlbGVtZW50IHRhZyBhbmQgbXVzdCBuZWl0aGVyIGhhdmUgYGNoaWxkcmVuYCBub3IgXCIgKyAndXNlIGBkYW5nZXJvdXNseVNldElubmVySFRNTGAuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICBpZiAocHJvcHMuY2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSBzZXQgb25lIG9mIGBjaGlsZHJlbmAgb3IgYHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9PSAnb2JqZWN0JyB8fCAhKEhUTUwgaW4gcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Bwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAgbXVzdCBiZSBpbiB0aGUgZm9ybSBge19faHRtbDogLi4ufWAuICcgKyAnUGxlYXNlIHZpc2l0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9kYW5nZXJvdXNseS1zZXQtaW5uZXItaHRtbCAnICsgJ2ZvciBtb3JlIGluZm9ybWF0aW9uLicpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoIXByb3BzLnN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyAmJiBwcm9wcy5jb250ZW50RWRpdGFibGUgJiYgcHJvcHMuY2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0EgY29tcG9uZW50IGlzIGBjb250ZW50RWRpdGFibGVgIGFuZCBjb250YWlucyBgY2hpbGRyZW5gIG1hbmFnZWQgYnkgJyArICdSZWFjdC4gSXQgaXMgbm93IHlvdXIgcmVzcG9uc2liaWxpdHkgdG8gZ3VhcmFudGVlIHRoYXQgbm9uZSBvZiAnICsgJ3Rob3NlIG5vZGVzIGFyZSB1bmV4cGVjdGVkbHkgbW9kaWZpZWQgb3IgZHVwbGljYXRlZC4gVGhpcyBpcyAnICsgJ3Byb2JhYmx5IG5vdCBpbnRlbnRpb25hbC4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJvcHMuc3R5bGUgIT0gbnVsbCAmJiB0eXBlb2YgcHJvcHMuc3R5bGUgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYHN0eWxlYCBwcm9wIGV4cGVjdHMgYSBtYXBwaW5nIGZyb20gc3R5bGUgcHJvcGVydGllcyB0byB2YWx1ZXMsICcgKyBcIm5vdCBhIHN0cmluZy4gRm9yIGV4YW1wbGUsIHN0eWxlPXt7bWFyZ2luUmlnaHQ6IHNwYWNpbmcgKyAnZW0nfX0gd2hlbiBcIiArICd1c2luZyBKU1guJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDdXN0b21Db21wb25lbnQodGFnTmFtZSwgcHJvcHMpIHtcbiAgaWYgKHRhZ05hbWUuaW5kZXhPZignLScpID09PSAtMSkge1xuICAgIHJldHVybiB0eXBlb2YgcHJvcHMuaXMgPT09ICdzdHJpbmcnO1xuICB9XG5cbiAgc3dpdGNoICh0YWdOYW1lKSB7XG4gICAgLy8gVGhlc2UgYXJlIHJlc2VydmVkIFNWRyBhbmQgTWF0aE1MIGVsZW1lbnRzLlxuICAgIC8vIFdlIGRvbid0IG1pbmQgdGhpcyBsaXN0IHRvbyBtdWNoIGJlY2F1c2Ugd2UgZXhwZWN0IGl0IHRvIG5ldmVyIGdyb3cuXG4gICAgLy8gVGhlIGFsdGVybmF0aXZlIGlzIHRvIHRyYWNrIHRoZSBuYW1lc3BhY2UgaW4gYSBmZXcgcGxhY2VzIHdoaWNoIGlzIGNvbnZvbHV0ZWQuXG4gICAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmNvbXBvbmVudHMvc3BlYy9jdXN0b20vI2N1c3RvbS1lbGVtZW50cy1jb3JlLWNvbmNlcHRzXG4gICAgY2FzZSAnYW5ub3RhdGlvbi14bWwnOlxuICAgIGNhc2UgJ2NvbG9yLXByb2ZpbGUnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZSc6XG4gICAgY2FzZSAnZm9udC1mYWNlLXNyYyc6XG4gICAgY2FzZSAnZm9udC1mYWNlLXVyaSc6XG4gICAgY2FzZSAnZm9udC1mYWNlLWZvcm1hdCc6XG4gICAgY2FzZSAnZm9udC1mYWNlLW5hbWUnOlxuICAgIGNhc2UgJ21pc3NpbmctZ2x5cGgnOlxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8vIFdoZW4gYWRkaW5nIGF0dHJpYnV0ZXMgdG8gdGhlIEhUTUwgb3IgU1ZHIGFsbG93ZWQgYXR0cmlidXRlIGxpc3QsIGJlIHN1cmUgdG9cbi8vIGFsc28gYWRkIHRoZW0gdG8gdGhpcyBtb2R1bGUgdG8gZW5zdXJlIGNhc2luZyBhbmQgaW5jb3JyZWN0IG5hbWVcbi8vIHdhcm5pbmdzLlxudmFyIHBvc3NpYmxlU3RhbmRhcmROYW1lcyA9IHtcbiAgLy8gSFRNTFxuICBhY2NlcHQ6ICdhY2NlcHQnLFxuICBhY2NlcHRjaGFyc2V0OiAnYWNjZXB0Q2hhcnNldCcsXG4gICdhY2NlcHQtY2hhcnNldCc6ICdhY2NlcHRDaGFyc2V0JyxcbiAgYWNjZXNza2V5OiAnYWNjZXNzS2V5JyxcbiAgYWN0aW9uOiAnYWN0aW9uJyxcbiAgYWxsb3dmdWxsc2NyZWVuOiAnYWxsb3dGdWxsU2NyZWVuJyxcbiAgYWx0OiAnYWx0JyxcbiAgYXM6ICdhcycsXG4gIGFzeW5jOiAnYXN5bmMnLFxuICBhdXRvY2FwaXRhbGl6ZTogJ2F1dG9DYXBpdGFsaXplJyxcbiAgYXV0b2NvbXBsZXRlOiAnYXV0b0NvbXBsZXRlJyxcbiAgYXV0b2NvcnJlY3Q6ICdhdXRvQ29ycmVjdCcsXG4gIGF1dG9mb2N1czogJ2F1dG9Gb2N1cycsXG4gIGF1dG9wbGF5OiAnYXV0b1BsYXknLFxuICBhdXRvc2F2ZTogJ2F1dG9TYXZlJyxcbiAgY2FwdHVyZTogJ2NhcHR1cmUnLFxuICBjZWxscGFkZGluZzogJ2NlbGxQYWRkaW5nJyxcbiAgY2VsbHNwYWNpbmc6ICdjZWxsU3BhY2luZycsXG4gIGNoYWxsZW5nZTogJ2NoYWxsZW5nZScsXG4gIGNoYXJzZXQ6ICdjaGFyU2V0JyxcbiAgY2hlY2tlZDogJ2NoZWNrZWQnLFxuICBjaGlsZHJlbjogJ2NoaWxkcmVuJyxcbiAgY2l0ZTogJ2NpdGUnLFxuICBjbGFzczogJ2NsYXNzTmFtZScsXG4gIGNsYXNzaWQ6ICdjbGFzc0lEJyxcbiAgY2xhc3NuYW1lOiAnY2xhc3NOYW1lJyxcbiAgY29sczogJ2NvbHMnLFxuICBjb2xzcGFuOiAnY29sU3BhbicsXG4gIGNvbnRlbnQ6ICdjb250ZW50JyxcbiAgY29udGVudGVkaXRhYmxlOiAnY29udGVudEVkaXRhYmxlJyxcbiAgY29udGV4dG1lbnU6ICdjb250ZXh0TWVudScsXG4gIGNvbnRyb2xzOiAnY29udHJvbHMnLFxuICBjb250cm9sc2xpc3Q6ICdjb250cm9sc0xpc3QnLFxuICBjb29yZHM6ICdjb29yZHMnLFxuICBjcm9zc29yaWdpbjogJ2Nyb3NzT3JpZ2luJyxcbiAgZGFuZ2Vyb3VzbHlzZXRpbm5lcmh0bWw6ICdkYW5nZXJvdXNseVNldElubmVySFRNTCcsXG4gIGRhdGE6ICdkYXRhJyxcbiAgZGF0ZXRpbWU6ICdkYXRlVGltZScsXG4gIGRlZmF1bHQ6ICdkZWZhdWx0JyxcbiAgZGVmYXVsdGNoZWNrZWQ6ICdkZWZhdWx0Q2hlY2tlZCcsXG4gIGRlZmF1bHR2YWx1ZTogJ2RlZmF1bHRWYWx1ZScsXG4gIGRlZmVyOiAnZGVmZXInLFxuICBkaXI6ICdkaXInLFxuICBkaXNhYmxlZDogJ2Rpc2FibGVkJyxcbiAgZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmU6ICdkaXNhYmxlUGljdHVyZUluUGljdHVyZScsXG4gIGRpc2FibGVyZW1vdGVwbGF5YmFjazogJ2Rpc2FibGVSZW1vdGVQbGF5YmFjaycsXG4gIGRvd25sb2FkOiAnZG93bmxvYWQnLFxuICBkcmFnZ2FibGU6ICdkcmFnZ2FibGUnLFxuICBlbmN0eXBlOiAnZW5jVHlwZScsXG4gIGVudGVya2V5aGludDogJ2VudGVyS2V5SGludCcsXG4gIGZvcjogJ2h0bWxGb3InLFxuICBmb3JtOiAnZm9ybScsXG4gIGZvcm1tZXRob2Q6ICdmb3JtTWV0aG9kJyxcbiAgZm9ybWFjdGlvbjogJ2Zvcm1BY3Rpb24nLFxuICBmb3JtZW5jdHlwZTogJ2Zvcm1FbmNUeXBlJyxcbiAgZm9ybW5vdmFsaWRhdGU6ICdmb3JtTm9WYWxpZGF0ZScsXG4gIGZvcm10YXJnZXQ6ICdmb3JtVGFyZ2V0JyxcbiAgZnJhbWVib3JkZXI6ICdmcmFtZUJvcmRlcicsXG4gIGhlYWRlcnM6ICdoZWFkZXJzJyxcbiAgaGVpZ2h0OiAnaGVpZ2h0JyxcbiAgaGlkZGVuOiAnaGlkZGVuJyxcbiAgaGlnaDogJ2hpZ2gnLFxuICBocmVmOiAnaHJlZicsXG4gIGhyZWZsYW5nOiAnaHJlZkxhbmcnLFxuICBodG1sZm9yOiAnaHRtbEZvcicsXG4gIGh0dHBlcXVpdjogJ2h0dHBFcXVpdicsXG4gICdodHRwLWVxdWl2JzogJ2h0dHBFcXVpdicsXG4gIGljb246ICdpY29uJyxcbiAgaWQ6ICdpZCcsXG4gIGltYWdlc2l6ZXM6ICdpbWFnZVNpemVzJyxcbiAgaW1hZ2VzcmNzZXQ6ICdpbWFnZVNyY1NldCcsXG4gIGlubmVyaHRtbDogJ2lubmVySFRNTCcsXG4gIGlucHV0bW9kZTogJ2lucHV0TW9kZScsXG4gIGludGVncml0eTogJ2ludGVncml0eScsXG4gIGlzOiAnaXMnLFxuICBpdGVtaWQ6ICdpdGVtSUQnLFxuICBpdGVtcHJvcDogJ2l0ZW1Qcm9wJyxcbiAgaXRlbXJlZjogJ2l0ZW1SZWYnLFxuICBpdGVtc2NvcGU6ICdpdGVtU2NvcGUnLFxuICBpdGVtdHlwZTogJ2l0ZW1UeXBlJyxcbiAga2V5cGFyYW1zOiAna2V5UGFyYW1zJyxcbiAga2V5dHlwZTogJ2tleVR5cGUnLFxuICBraW5kOiAna2luZCcsXG4gIGxhYmVsOiAnbGFiZWwnLFxuICBsYW5nOiAnbGFuZycsXG4gIGxpc3Q6ICdsaXN0JyxcbiAgbG9vcDogJ2xvb3AnLFxuICBsb3c6ICdsb3cnLFxuICBtYW5pZmVzdDogJ21hbmlmZXN0JyxcbiAgbWFyZ2lud2lkdGg6ICdtYXJnaW5XaWR0aCcsXG4gIG1hcmdpbmhlaWdodDogJ21hcmdpbkhlaWdodCcsXG4gIG1heDogJ21heCcsXG4gIG1heGxlbmd0aDogJ21heExlbmd0aCcsXG4gIG1lZGlhOiAnbWVkaWEnLFxuICBtZWRpYWdyb3VwOiAnbWVkaWFHcm91cCcsXG4gIG1ldGhvZDogJ21ldGhvZCcsXG4gIG1pbjogJ21pbicsXG4gIG1pbmxlbmd0aDogJ21pbkxlbmd0aCcsXG4gIG11bHRpcGxlOiAnbXVsdGlwbGUnLFxuICBtdXRlZDogJ211dGVkJyxcbiAgbmFtZTogJ25hbWUnLFxuICBub21vZHVsZTogJ25vTW9kdWxlJyxcbiAgbm9uY2U6ICdub25jZScsXG4gIG5vdmFsaWRhdGU6ICdub1ZhbGlkYXRlJyxcbiAgb3BlbjogJ29wZW4nLFxuICBvcHRpbXVtOiAnb3B0aW11bScsXG4gIHBhdHRlcm46ICdwYXR0ZXJuJyxcbiAgcGxhY2Vob2xkZXI6ICdwbGFjZWhvbGRlcicsXG4gIHBsYXlzaW5saW5lOiAncGxheXNJbmxpbmUnLFxuICBwb3N0ZXI6ICdwb3N0ZXInLFxuICBwcmVsb2FkOiAncHJlbG9hZCcsXG4gIHByb2ZpbGU6ICdwcm9maWxlJyxcbiAgcmFkaW9ncm91cDogJ3JhZGlvR3JvdXAnLFxuICByZWFkb25seTogJ3JlYWRPbmx5JyxcbiAgcmVmZXJyZXJwb2xpY3k6ICdyZWZlcnJlclBvbGljeScsXG4gIHJlbDogJ3JlbCcsXG4gIHJlcXVpcmVkOiAncmVxdWlyZWQnLFxuICByZXZlcnNlZDogJ3JldmVyc2VkJyxcbiAgcm9sZTogJ3JvbGUnLFxuICByb3dzOiAncm93cycsXG4gIHJvd3NwYW46ICdyb3dTcGFuJyxcbiAgc2FuZGJveDogJ3NhbmRib3gnLFxuICBzY29wZTogJ3Njb3BlJyxcbiAgc2NvcGVkOiAnc2NvcGVkJyxcbiAgc2Nyb2xsaW5nOiAnc2Nyb2xsaW5nJyxcbiAgc2VhbWxlc3M6ICdzZWFtbGVzcycsXG4gIHNlbGVjdGVkOiAnc2VsZWN0ZWQnLFxuICBzaGFwZTogJ3NoYXBlJyxcbiAgc2l6ZTogJ3NpemUnLFxuICBzaXplczogJ3NpemVzJyxcbiAgc3BhbjogJ3NwYW4nLFxuICBzcGVsbGNoZWNrOiAnc3BlbGxDaGVjaycsXG4gIHNyYzogJ3NyYycsXG4gIHNyY2RvYzogJ3NyY0RvYycsXG4gIHNyY2xhbmc6ICdzcmNMYW5nJyxcbiAgc3Jjc2V0OiAnc3JjU2V0JyxcbiAgc3RhcnQ6ICdzdGFydCcsXG4gIHN0ZXA6ICdzdGVwJyxcbiAgc3R5bGU6ICdzdHlsZScsXG4gIHN1bW1hcnk6ICdzdW1tYXJ5JyxcbiAgdGFiaW5kZXg6ICd0YWJJbmRleCcsXG4gIHRhcmdldDogJ3RhcmdldCcsXG4gIHRpdGxlOiAndGl0bGUnLFxuICB0eXBlOiAndHlwZScsXG4gIHVzZW1hcDogJ3VzZU1hcCcsXG4gIHZhbHVlOiAndmFsdWUnLFxuICB3aWR0aDogJ3dpZHRoJyxcbiAgd21vZGU6ICd3bW9kZScsXG4gIHdyYXA6ICd3cmFwJyxcbiAgLy8gU1ZHXG4gIGFib3V0OiAnYWJvdXQnLFxuICBhY2NlbnRoZWlnaHQ6ICdhY2NlbnRIZWlnaHQnLFxuICAnYWNjZW50LWhlaWdodCc6ICdhY2NlbnRIZWlnaHQnLFxuICBhY2N1bXVsYXRlOiAnYWNjdW11bGF0ZScsXG4gIGFkZGl0aXZlOiAnYWRkaXRpdmUnLFxuICBhbGlnbm1lbnRiYXNlbGluZTogJ2FsaWdubWVudEJhc2VsaW5lJyxcbiAgJ2FsaWdubWVudC1iYXNlbGluZSc6ICdhbGlnbm1lbnRCYXNlbGluZScsXG4gIGFsbG93cmVvcmRlcjogJ2FsbG93UmVvcmRlcicsXG4gIGFscGhhYmV0aWM6ICdhbHBoYWJldGljJyxcbiAgYW1wbGl0dWRlOiAnYW1wbGl0dWRlJyxcbiAgYXJhYmljZm9ybTogJ2FyYWJpY0Zvcm0nLFxuICAnYXJhYmljLWZvcm0nOiAnYXJhYmljRm9ybScsXG4gIGFzY2VudDogJ2FzY2VudCcsXG4gIGF0dHJpYnV0ZW5hbWU6ICdhdHRyaWJ1dGVOYW1lJyxcbiAgYXR0cmlidXRldHlwZTogJ2F0dHJpYnV0ZVR5cGUnLFxuICBhdXRvcmV2ZXJzZTogJ2F1dG9SZXZlcnNlJyxcbiAgYXppbXV0aDogJ2F6aW11dGgnLFxuICBiYXNlZnJlcXVlbmN5OiAnYmFzZUZyZXF1ZW5jeScsXG4gIGJhc2VsaW5lc2hpZnQ6ICdiYXNlbGluZVNoaWZ0JyxcbiAgJ2Jhc2VsaW5lLXNoaWZ0JzogJ2Jhc2VsaW5lU2hpZnQnLFxuICBiYXNlcHJvZmlsZTogJ2Jhc2VQcm9maWxlJyxcbiAgYmJveDogJ2Jib3gnLFxuICBiZWdpbjogJ2JlZ2luJyxcbiAgYmlhczogJ2JpYXMnLFxuICBieTogJ2J5JyxcbiAgY2FsY21vZGU6ICdjYWxjTW9kZScsXG4gIGNhcGhlaWdodDogJ2NhcEhlaWdodCcsXG4gICdjYXAtaGVpZ2h0JzogJ2NhcEhlaWdodCcsXG4gIGNsaXA6ICdjbGlwJyxcbiAgY2xpcHBhdGg6ICdjbGlwUGF0aCcsXG4gICdjbGlwLXBhdGgnOiAnY2xpcFBhdGgnLFxuICBjbGlwcGF0aHVuaXRzOiAnY2xpcFBhdGhVbml0cycsXG4gIGNsaXBydWxlOiAnY2xpcFJ1bGUnLFxuICAnY2xpcC1ydWxlJzogJ2NsaXBSdWxlJyxcbiAgY29sb3I6ICdjb2xvcicsXG4gIGNvbG9yaW50ZXJwb2xhdGlvbjogJ2NvbG9ySW50ZXJwb2xhdGlvbicsXG4gICdjb2xvci1pbnRlcnBvbGF0aW9uJzogJ2NvbG9ySW50ZXJwb2xhdGlvbicsXG4gIGNvbG9yaW50ZXJwb2xhdGlvbmZpbHRlcnM6ICdjb2xvckludGVycG9sYXRpb25GaWx0ZXJzJyxcbiAgJ2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyc6ICdjb2xvckludGVycG9sYXRpb25GaWx0ZXJzJyxcbiAgY29sb3Jwcm9maWxlOiAnY29sb3JQcm9maWxlJyxcbiAgJ2NvbG9yLXByb2ZpbGUnOiAnY29sb3JQcm9maWxlJyxcbiAgY29sb3JyZW5kZXJpbmc6ICdjb2xvclJlbmRlcmluZycsXG4gICdjb2xvci1yZW5kZXJpbmcnOiAnY29sb3JSZW5kZXJpbmcnLFxuICBjb250ZW50c2NyaXB0dHlwZTogJ2NvbnRlbnRTY3JpcHRUeXBlJyxcbiAgY29udGVudHN0eWxldHlwZTogJ2NvbnRlbnRTdHlsZVR5cGUnLFxuICBjdXJzb3I6ICdjdXJzb3InLFxuICBjeDogJ2N4JyxcbiAgY3k6ICdjeScsXG4gIGQ6ICdkJyxcbiAgZGF0YXR5cGU6ICdkYXRhdHlwZScsXG4gIGRlY2VsZXJhdGU6ICdkZWNlbGVyYXRlJyxcbiAgZGVzY2VudDogJ2Rlc2NlbnQnLFxuICBkaWZmdXNlY29uc3RhbnQ6ICdkaWZmdXNlQ29uc3RhbnQnLFxuICBkaXJlY3Rpb246ICdkaXJlY3Rpb24nLFxuICBkaXNwbGF5OiAnZGlzcGxheScsXG4gIGRpdmlzb3I6ICdkaXZpc29yJyxcbiAgZG9taW5hbnRiYXNlbGluZTogJ2RvbWluYW50QmFzZWxpbmUnLFxuICAnZG9taW5hbnQtYmFzZWxpbmUnOiAnZG9taW5hbnRCYXNlbGluZScsXG4gIGR1cjogJ2R1cicsXG4gIGR4OiAnZHgnLFxuICBkeTogJ2R5JyxcbiAgZWRnZW1vZGU6ICdlZGdlTW9kZScsXG4gIGVsZXZhdGlvbjogJ2VsZXZhdGlvbicsXG4gIGVuYWJsZWJhY2tncm91bmQ6ICdlbmFibGVCYWNrZ3JvdW5kJyxcbiAgJ2VuYWJsZS1iYWNrZ3JvdW5kJzogJ2VuYWJsZUJhY2tncm91bmQnLFxuICBlbmQ6ICdlbmQnLFxuICBleHBvbmVudDogJ2V4cG9uZW50JyxcbiAgZXh0ZXJuYWxyZXNvdXJjZXNyZXF1aXJlZDogJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLFxuICBmaWxsOiAnZmlsbCcsXG4gIGZpbGxvcGFjaXR5OiAnZmlsbE9wYWNpdHknLFxuICAnZmlsbC1vcGFjaXR5JzogJ2ZpbGxPcGFjaXR5JyxcbiAgZmlsbHJ1bGU6ICdmaWxsUnVsZScsXG4gICdmaWxsLXJ1bGUnOiAnZmlsbFJ1bGUnLFxuICBmaWx0ZXI6ICdmaWx0ZXInLFxuICBmaWx0ZXJyZXM6ICdmaWx0ZXJSZXMnLFxuICBmaWx0ZXJ1bml0czogJ2ZpbHRlclVuaXRzJyxcbiAgZmxvb2RvcGFjaXR5OiAnZmxvb2RPcGFjaXR5JyxcbiAgJ2Zsb29kLW9wYWNpdHknOiAnZmxvb2RPcGFjaXR5JyxcbiAgZmxvb2Rjb2xvcjogJ2Zsb29kQ29sb3InLFxuICAnZmxvb2QtY29sb3InOiAnZmxvb2RDb2xvcicsXG4gIGZvY3VzYWJsZTogJ2ZvY3VzYWJsZScsXG4gIGZvbnRmYW1pbHk6ICdmb250RmFtaWx5JyxcbiAgJ2ZvbnQtZmFtaWx5JzogJ2ZvbnRGYW1pbHknLFxuICBmb250c2l6ZTogJ2ZvbnRTaXplJyxcbiAgJ2ZvbnQtc2l6ZSc6ICdmb250U2l6ZScsXG4gIGZvbnRzaXplYWRqdXN0OiAnZm9udFNpemVBZGp1c3QnLFxuICAnZm9udC1zaXplLWFkanVzdCc6ICdmb250U2l6ZUFkanVzdCcsXG4gIGZvbnRzdHJldGNoOiAnZm9udFN0cmV0Y2gnLFxuICAnZm9udC1zdHJldGNoJzogJ2ZvbnRTdHJldGNoJyxcbiAgZm9udHN0eWxlOiAnZm9udFN0eWxlJyxcbiAgJ2ZvbnQtc3R5bGUnOiAnZm9udFN0eWxlJyxcbiAgZm9udHZhcmlhbnQ6ICdmb250VmFyaWFudCcsXG4gICdmb250LXZhcmlhbnQnOiAnZm9udFZhcmlhbnQnLFxuICBmb250d2VpZ2h0OiAnZm9udFdlaWdodCcsXG4gICdmb250LXdlaWdodCc6ICdmb250V2VpZ2h0JyxcbiAgZm9ybWF0OiAnZm9ybWF0JyxcbiAgZnJvbTogJ2Zyb20nLFxuICBmeDogJ2Z4JyxcbiAgZnk6ICdmeScsXG4gIGcxOiAnZzEnLFxuICBnMjogJ2cyJyxcbiAgZ2x5cGhuYW1lOiAnZ2x5cGhOYW1lJyxcbiAgJ2dseXBoLW5hbWUnOiAnZ2x5cGhOYW1lJyxcbiAgZ2x5cGhvcmllbnRhdGlvbmhvcml6b250YWw6ICdnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbCcsXG4gICdnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsJzogJ2dseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsJyxcbiAgZ2x5cGhvcmllbnRhdGlvbnZlcnRpY2FsOiAnZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsJyxcbiAgJ2dseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsJzogJ2dseXBoT3JpZW50YXRpb25WZXJ0aWNhbCcsXG4gIGdseXBocmVmOiAnZ2x5cGhSZWYnLFxuICBncmFkaWVudHRyYW5zZm9ybTogJ2dyYWRpZW50VHJhbnNmb3JtJyxcbiAgZ3JhZGllbnR1bml0czogJ2dyYWRpZW50VW5pdHMnLFxuICBoYW5naW5nOiAnaGFuZ2luZycsXG4gIGhvcml6YWR2eDogJ2hvcml6QWR2WCcsXG4gICdob3Jpei1hZHYteCc6ICdob3JpekFkdlgnLFxuICBob3Jpem9yaWdpbng6ICdob3Jpek9yaWdpblgnLFxuICAnaG9yaXotb3JpZ2luLXgnOiAnaG9yaXpPcmlnaW5YJyxcbiAgaWRlb2dyYXBoaWM6ICdpZGVvZ3JhcGhpYycsXG4gIGltYWdlcmVuZGVyaW5nOiAnaW1hZ2VSZW5kZXJpbmcnLFxuICAnaW1hZ2UtcmVuZGVyaW5nJzogJ2ltYWdlUmVuZGVyaW5nJyxcbiAgaW4yOiAnaW4yJyxcbiAgaW46ICdpbicsXG4gIGlubGlzdDogJ2lubGlzdCcsXG4gIGludGVyY2VwdDogJ2ludGVyY2VwdCcsXG4gIGsxOiAnazEnLFxuICBrMjogJ2syJyxcbiAgazM6ICdrMycsXG4gIGs0OiAnazQnLFxuICBrOiAnaycsXG4gIGtlcm5lbG1hdHJpeDogJ2tlcm5lbE1hdHJpeCcsXG4gIGtlcm5lbHVuaXRsZW5ndGg6ICdrZXJuZWxVbml0TGVuZ3RoJyxcbiAga2VybmluZzogJ2tlcm5pbmcnLFxuICBrZXlwb2ludHM6ICdrZXlQb2ludHMnLFxuICBrZXlzcGxpbmVzOiAna2V5U3BsaW5lcycsXG4gIGtleXRpbWVzOiAna2V5VGltZXMnLFxuICBsZW5ndGhhZGp1c3Q6ICdsZW5ndGhBZGp1c3QnLFxuICBsZXR0ZXJzcGFjaW5nOiAnbGV0dGVyU3BhY2luZycsXG4gICdsZXR0ZXItc3BhY2luZyc6ICdsZXR0ZXJTcGFjaW5nJyxcbiAgbGlnaHRpbmdjb2xvcjogJ2xpZ2h0aW5nQ29sb3InLFxuICAnbGlnaHRpbmctY29sb3InOiAnbGlnaHRpbmdDb2xvcicsXG4gIGxpbWl0aW5nY29uZWFuZ2xlOiAnbGltaXRpbmdDb25lQW5nbGUnLFxuICBsb2NhbDogJ2xvY2FsJyxcbiAgbWFya2VyZW5kOiAnbWFya2VyRW5kJyxcbiAgJ21hcmtlci1lbmQnOiAnbWFya2VyRW5kJyxcbiAgbWFya2VyaGVpZ2h0OiAnbWFya2VySGVpZ2h0JyxcbiAgbWFya2VybWlkOiAnbWFya2VyTWlkJyxcbiAgJ21hcmtlci1taWQnOiAnbWFya2VyTWlkJyxcbiAgbWFya2Vyc3RhcnQ6ICdtYXJrZXJTdGFydCcsXG4gICdtYXJrZXItc3RhcnQnOiAnbWFya2VyU3RhcnQnLFxuICBtYXJrZXJ1bml0czogJ21hcmtlclVuaXRzJyxcbiAgbWFya2Vyd2lkdGg6ICdtYXJrZXJXaWR0aCcsXG4gIG1hc2s6ICdtYXNrJyxcbiAgbWFza2NvbnRlbnR1bml0czogJ21hc2tDb250ZW50VW5pdHMnLFxuICBtYXNrdW5pdHM6ICdtYXNrVW5pdHMnLFxuICBtYXRoZW1hdGljYWw6ICdtYXRoZW1hdGljYWwnLFxuICBtb2RlOiAnbW9kZScsXG4gIG51bW9jdGF2ZXM6ICdudW1PY3RhdmVzJyxcbiAgb2Zmc2V0OiAnb2Zmc2V0JyxcbiAgb3BhY2l0eTogJ29wYWNpdHknLFxuICBvcGVyYXRvcjogJ29wZXJhdG9yJyxcbiAgb3JkZXI6ICdvcmRlcicsXG4gIG9yaWVudDogJ29yaWVudCcsXG4gIG9yaWVudGF0aW9uOiAnb3JpZW50YXRpb24nLFxuICBvcmlnaW46ICdvcmlnaW4nLFxuICBvdmVyZmxvdzogJ292ZXJmbG93JyxcbiAgb3ZlcmxpbmVwb3NpdGlvbjogJ292ZXJsaW5lUG9zaXRpb24nLFxuICAnb3ZlcmxpbmUtcG9zaXRpb24nOiAnb3ZlcmxpbmVQb3NpdGlvbicsXG4gIG92ZXJsaW5ldGhpY2tuZXNzOiAnb3ZlcmxpbmVUaGlja25lc3MnLFxuICAnb3ZlcmxpbmUtdGhpY2tuZXNzJzogJ292ZXJsaW5lVGhpY2tuZXNzJyxcbiAgcGFpbnRvcmRlcjogJ3BhaW50T3JkZXInLFxuICAncGFpbnQtb3JkZXInOiAncGFpbnRPcmRlcicsXG4gIHBhbm9zZTE6ICdwYW5vc2UxJyxcbiAgJ3Bhbm9zZS0xJzogJ3Bhbm9zZTEnLFxuICBwYXRobGVuZ3RoOiAncGF0aExlbmd0aCcsXG4gIHBhdHRlcm5jb250ZW50dW5pdHM6ICdwYXR0ZXJuQ29udGVudFVuaXRzJyxcbiAgcGF0dGVybnRyYW5zZm9ybTogJ3BhdHRlcm5UcmFuc2Zvcm0nLFxuICBwYXR0ZXJudW5pdHM6ICdwYXR0ZXJuVW5pdHMnLFxuICBwb2ludGVyZXZlbnRzOiAncG9pbnRlckV2ZW50cycsXG4gICdwb2ludGVyLWV2ZW50cyc6ICdwb2ludGVyRXZlbnRzJyxcbiAgcG9pbnRzOiAncG9pbnRzJyxcbiAgcG9pbnRzYXR4OiAncG9pbnRzQXRYJyxcbiAgcG9pbnRzYXR5OiAncG9pbnRzQXRZJyxcbiAgcG9pbnRzYXR6OiAncG9pbnRzQXRaJyxcbiAgcHJlZml4OiAncHJlZml4JyxcbiAgcHJlc2VydmVhbHBoYTogJ3ByZXNlcnZlQWxwaGEnLFxuICBwcmVzZXJ2ZWFzcGVjdHJhdGlvOiAncHJlc2VydmVBc3BlY3RSYXRpbycsXG4gIHByaW1pdGl2ZXVuaXRzOiAncHJpbWl0aXZlVW5pdHMnLFxuICBwcm9wZXJ0eTogJ3Byb3BlcnR5JyxcbiAgcjogJ3InLFxuICByYWRpdXM6ICdyYWRpdXMnLFxuICByZWZ4OiAncmVmWCcsXG4gIHJlZnk6ICdyZWZZJyxcbiAgcmVuZGVyaW5naW50ZW50OiAncmVuZGVyaW5nSW50ZW50JyxcbiAgJ3JlbmRlcmluZy1pbnRlbnQnOiAncmVuZGVyaW5nSW50ZW50JyxcbiAgcmVwZWF0Y291bnQ6ICdyZXBlYXRDb3VudCcsXG4gIHJlcGVhdGR1cjogJ3JlcGVhdER1cicsXG4gIHJlcXVpcmVkZXh0ZW5zaW9uczogJ3JlcXVpcmVkRXh0ZW5zaW9ucycsXG4gIHJlcXVpcmVkZmVhdHVyZXM6ICdyZXF1aXJlZEZlYXR1cmVzJyxcbiAgcmVzb3VyY2U6ICdyZXNvdXJjZScsXG4gIHJlc3RhcnQ6ICdyZXN0YXJ0JyxcbiAgcmVzdWx0OiAncmVzdWx0JyxcbiAgcmVzdWx0czogJ3Jlc3VsdHMnLFxuICByb3RhdGU6ICdyb3RhdGUnLFxuICByeDogJ3J4JyxcbiAgcnk6ICdyeScsXG4gIHNjYWxlOiAnc2NhbGUnLFxuICBzZWN1cml0eTogJ3NlY3VyaXR5JyxcbiAgc2VlZDogJ3NlZWQnLFxuICBzaGFwZXJlbmRlcmluZzogJ3NoYXBlUmVuZGVyaW5nJyxcbiAgJ3NoYXBlLXJlbmRlcmluZyc6ICdzaGFwZVJlbmRlcmluZycsXG4gIHNsb3BlOiAnc2xvcGUnLFxuICBzcGFjaW5nOiAnc3BhY2luZycsXG4gIHNwZWN1bGFyY29uc3RhbnQ6ICdzcGVjdWxhckNvbnN0YW50JyxcbiAgc3BlY3VsYXJleHBvbmVudDogJ3NwZWN1bGFyRXhwb25lbnQnLFxuICBzcGVlZDogJ3NwZWVkJyxcbiAgc3ByZWFkbWV0aG9kOiAnc3ByZWFkTWV0aG9kJyxcbiAgc3RhcnRvZmZzZXQ6ICdzdGFydE9mZnNldCcsXG4gIHN0ZGRldmlhdGlvbjogJ3N0ZERldmlhdGlvbicsXG4gIHN0ZW1oOiAnc3RlbWgnLFxuICBzdGVtdjogJ3N0ZW12JyxcbiAgc3RpdGNodGlsZXM6ICdzdGl0Y2hUaWxlcycsXG4gIHN0b3Bjb2xvcjogJ3N0b3BDb2xvcicsXG4gICdzdG9wLWNvbG9yJzogJ3N0b3BDb2xvcicsXG4gIHN0b3BvcGFjaXR5OiAnc3RvcE9wYWNpdHknLFxuICAnc3RvcC1vcGFjaXR5JzogJ3N0b3BPcGFjaXR5JyxcbiAgc3RyaWtldGhyb3VnaHBvc2l0aW9uOiAnc3RyaWtldGhyb3VnaFBvc2l0aW9uJyxcbiAgJ3N0cmlrZXRocm91Z2gtcG9zaXRpb24nOiAnc3RyaWtldGhyb3VnaFBvc2l0aW9uJyxcbiAgc3RyaWtldGhyb3VnaHRoaWNrbmVzczogJ3N0cmlrZXRocm91Z2hUaGlja25lc3MnLFxuICAnc3RyaWtldGhyb3VnaC10aGlja25lc3MnOiAnc3RyaWtldGhyb3VnaFRoaWNrbmVzcycsXG4gIHN0cmluZzogJ3N0cmluZycsXG4gIHN0cm9rZTogJ3N0cm9rZScsXG4gIHN0cm9rZWRhc2hhcnJheTogJ3N0cm9rZURhc2hhcnJheScsXG4gICdzdHJva2UtZGFzaGFycmF5JzogJ3N0cm9rZURhc2hhcnJheScsXG4gIHN0cm9rZWRhc2hvZmZzZXQ6ICdzdHJva2VEYXNob2Zmc2V0JyxcbiAgJ3N0cm9rZS1kYXNob2Zmc2V0JzogJ3N0cm9rZURhc2hvZmZzZXQnLFxuICBzdHJva2VsaW5lY2FwOiAnc3Ryb2tlTGluZWNhcCcsXG4gICdzdHJva2UtbGluZWNhcCc6ICdzdHJva2VMaW5lY2FwJyxcbiAgc3Ryb2tlbGluZWpvaW46ICdzdHJva2VMaW5lam9pbicsXG4gICdzdHJva2UtbGluZWpvaW4nOiAnc3Ryb2tlTGluZWpvaW4nLFxuICBzdHJva2VtaXRlcmxpbWl0OiAnc3Ryb2tlTWl0ZXJsaW1pdCcsXG4gICdzdHJva2UtbWl0ZXJsaW1pdCc6ICdzdHJva2VNaXRlcmxpbWl0JyxcbiAgc3Ryb2tld2lkdGg6ICdzdHJva2VXaWR0aCcsXG4gICdzdHJva2Utd2lkdGgnOiAnc3Ryb2tlV2lkdGgnLFxuICBzdHJva2VvcGFjaXR5OiAnc3Ryb2tlT3BhY2l0eScsXG4gICdzdHJva2Utb3BhY2l0eSc6ICdzdHJva2VPcGFjaXR5JyxcbiAgc3VwcHJlc3Njb250ZW50ZWRpdGFibGV3YXJuaW5nOiAnc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nJyxcbiAgc3VwcHJlc3NoeWRyYXRpb253YXJuaW5nOiAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJyxcbiAgc3VyZmFjZXNjYWxlOiAnc3VyZmFjZVNjYWxlJyxcbiAgc3lzdGVtbGFuZ3VhZ2U6ICdzeXN0ZW1MYW5ndWFnZScsXG4gIHRhYmxldmFsdWVzOiAndGFibGVWYWx1ZXMnLFxuICB0YXJnZXR4OiAndGFyZ2V0WCcsXG4gIHRhcmdldHk6ICd0YXJnZXRZJyxcbiAgdGV4dGFuY2hvcjogJ3RleHRBbmNob3InLFxuICAndGV4dC1hbmNob3InOiAndGV4dEFuY2hvcicsXG4gIHRleHRkZWNvcmF0aW9uOiAndGV4dERlY29yYXRpb24nLFxuICAndGV4dC1kZWNvcmF0aW9uJzogJ3RleHREZWNvcmF0aW9uJyxcbiAgdGV4dGxlbmd0aDogJ3RleHRMZW5ndGgnLFxuICB0ZXh0cmVuZGVyaW5nOiAndGV4dFJlbmRlcmluZycsXG4gICd0ZXh0LXJlbmRlcmluZyc6ICd0ZXh0UmVuZGVyaW5nJyxcbiAgdG86ICd0bycsXG4gIHRyYW5zZm9ybTogJ3RyYW5zZm9ybScsXG4gIHR5cGVvZjogJ3R5cGVvZicsXG4gIHUxOiAndTEnLFxuICB1MjogJ3UyJyxcbiAgdW5kZXJsaW5lcG9zaXRpb246ICd1bmRlcmxpbmVQb3NpdGlvbicsXG4gICd1bmRlcmxpbmUtcG9zaXRpb24nOiAndW5kZXJsaW5lUG9zaXRpb24nLFxuICB1bmRlcmxpbmV0aGlja25lc3M6ICd1bmRlcmxpbmVUaGlja25lc3MnLFxuICAndW5kZXJsaW5lLXRoaWNrbmVzcyc6ICd1bmRlcmxpbmVUaGlja25lc3MnLFxuICB1bmljb2RlOiAndW5pY29kZScsXG4gIHVuaWNvZGViaWRpOiAndW5pY29kZUJpZGknLFxuICAndW5pY29kZS1iaWRpJzogJ3VuaWNvZGVCaWRpJyxcbiAgdW5pY29kZXJhbmdlOiAndW5pY29kZVJhbmdlJyxcbiAgJ3VuaWNvZGUtcmFuZ2UnOiAndW5pY29kZVJhbmdlJyxcbiAgdW5pdHNwZXJlbTogJ3VuaXRzUGVyRW0nLFxuICAndW5pdHMtcGVyLWVtJzogJ3VuaXRzUGVyRW0nLFxuICB1bnNlbGVjdGFibGU6ICd1bnNlbGVjdGFibGUnLFxuICB2YWxwaGFiZXRpYzogJ3ZBbHBoYWJldGljJyxcbiAgJ3YtYWxwaGFiZXRpYyc6ICd2QWxwaGFiZXRpYycsXG4gIHZhbHVlczogJ3ZhbHVlcycsXG4gIHZlY3RvcmVmZmVjdDogJ3ZlY3RvckVmZmVjdCcsXG4gICd2ZWN0b3ItZWZmZWN0JzogJ3ZlY3RvckVmZmVjdCcsXG4gIHZlcnNpb246ICd2ZXJzaW9uJyxcbiAgdmVydGFkdnk6ICd2ZXJ0QWR2WScsXG4gICd2ZXJ0LWFkdi15JzogJ3ZlcnRBZHZZJyxcbiAgdmVydG9yaWdpbng6ICd2ZXJ0T3JpZ2luWCcsXG4gICd2ZXJ0LW9yaWdpbi14JzogJ3ZlcnRPcmlnaW5YJyxcbiAgdmVydG9yaWdpbnk6ICd2ZXJ0T3JpZ2luWScsXG4gICd2ZXJ0LW9yaWdpbi15JzogJ3ZlcnRPcmlnaW5ZJyxcbiAgdmhhbmdpbmc6ICd2SGFuZ2luZycsXG4gICd2LWhhbmdpbmcnOiAndkhhbmdpbmcnLFxuICB2aWRlb2dyYXBoaWM6ICd2SWRlb2dyYXBoaWMnLFxuICAndi1pZGVvZ3JhcGhpYyc6ICd2SWRlb2dyYXBoaWMnLFxuICB2aWV3Ym94OiAndmlld0JveCcsXG4gIHZpZXd0YXJnZXQ6ICd2aWV3VGFyZ2V0JyxcbiAgdmlzaWJpbGl0eTogJ3Zpc2liaWxpdHknLFxuICB2bWF0aGVtYXRpY2FsOiAndk1hdGhlbWF0aWNhbCcsXG4gICd2LW1hdGhlbWF0aWNhbCc6ICd2TWF0aGVtYXRpY2FsJyxcbiAgdm9jYWI6ICd2b2NhYicsXG4gIHdpZHRoczogJ3dpZHRocycsXG4gIHdvcmRzcGFjaW5nOiAnd29yZFNwYWNpbmcnLFxuICAnd29yZC1zcGFjaW5nJzogJ3dvcmRTcGFjaW5nJyxcbiAgd3JpdGluZ21vZGU6ICd3cml0aW5nTW9kZScsXG4gICd3cml0aW5nLW1vZGUnOiAnd3JpdGluZ01vZGUnLFxuICB4MTogJ3gxJyxcbiAgeDI6ICd4MicsXG4gIHg6ICd4JyxcbiAgeGNoYW5uZWxzZWxlY3RvcjogJ3hDaGFubmVsU2VsZWN0b3InLFxuICB4aGVpZ2h0OiAneEhlaWdodCcsXG4gICd4LWhlaWdodCc6ICd4SGVpZ2h0JyxcbiAgeGxpbmthY3R1YXRlOiAneGxpbmtBY3R1YXRlJyxcbiAgJ3hsaW5rOmFjdHVhdGUnOiAneGxpbmtBY3R1YXRlJyxcbiAgeGxpbmthcmNyb2xlOiAneGxpbmtBcmNyb2xlJyxcbiAgJ3hsaW5rOmFyY3JvbGUnOiAneGxpbmtBcmNyb2xlJyxcbiAgeGxpbmtocmVmOiAneGxpbmtIcmVmJyxcbiAgJ3hsaW5rOmhyZWYnOiAneGxpbmtIcmVmJyxcbiAgeGxpbmtyb2xlOiAneGxpbmtSb2xlJyxcbiAgJ3hsaW5rOnJvbGUnOiAneGxpbmtSb2xlJyxcbiAgeGxpbmtzaG93OiAneGxpbmtTaG93JyxcbiAgJ3hsaW5rOnNob3cnOiAneGxpbmtTaG93JyxcbiAgeGxpbmt0aXRsZTogJ3hsaW5rVGl0bGUnLFxuICAneGxpbms6dGl0bGUnOiAneGxpbmtUaXRsZScsXG4gIHhsaW5rdHlwZTogJ3hsaW5rVHlwZScsXG4gICd4bGluazp0eXBlJzogJ3hsaW5rVHlwZScsXG4gIHhtbGJhc2U6ICd4bWxCYXNlJyxcbiAgJ3htbDpiYXNlJzogJ3htbEJhc2UnLFxuICB4bWxsYW5nOiAneG1sTGFuZycsXG4gICd4bWw6bGFuZyc6ICd4bWxMYW5nJyxcbiAgeG1sbnM6ICd4bWxucycsXG4gICd4bWw6c3BhY2UnOiAneG1sU3BhY2UnLFxuICB4bWxuc3hsaW5rOiAneG1sbnNYbGluaycsXG4gICd4bWxuczp4bGluayc6ICd4bWxuc1hsaW5rJyxcbiAgeG1sc3BhY2U6ICd4bWxTcGFjZScsXG4gIHkxOiAneTEnLFxuICB5MjogJ3kyJyxcbiAgeTogJ3knLFxuICB5Y2hhbm5lbHNlbGVjdG9yOiAneUNoYW5uZWxTZWxlY3RvcicsXG4gIHo6ICd6JyxcbiAgem9vbWFuZHBhbjogJ3pvb21BbmRQYW4nXG59O1xuXG52YXIgYXJpYVByb3BlcnRpZXMgPSB7XG4gICdhcmlhLWN1cnJlbnQnOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1kZXNjcmlwdGlvbic6IDAsXG4gICdhcmlhLWRldGFpbHMnOiAwLFxuICAnYXJpYS1kaXNhYmxlZCc6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWhpZGRlbic6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWludmFsaWQnOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1rZXlzaG9ydGN1dHMnOiAwLFxuICAnYXJpYS1sYWJlbCc6IDAsXG4gICdhcmlhLXJvbGVkZXNjcmlwdGlvbic6IDAsXG4gIC8vIFdpZGdldCBBdHRyaWJ1dGVzXG4gICdhcmlhLWF1dG9jb21wbGV0ZSc6IDAsXG4gICdhcmlhLWNoZWNrZWQnOiAwLFxuICAnYXJpYS1leHBhbmRlZCc6IDAsXG4gICdhcmlhLWhhc3BvcHVwJzogMCxcbiAgJ2FyaWEtbGV2ZWwnOiAwLFxuICAnYXJpYS1tb2RhbCc6IDAsXG4gICdhcmlhLW11bHRpbGluZSc6IDAsXG4gICdhcmlhLW11bHRpc2VsZWN0YWJsZSc6IDAsXG4gICdhcmlhLW9yaWVudGF0aW9uJzogMCxcbiAgJ2FyaWEtcGxhY2Vob2xkZXInOiAwLFxuICAnYXJpYS1wcmVzc2VkJzogMCxcbiAgJ2FyaWEtcmVhZG9ubHknOiAwLFxuICAnYXJpYS1yZXF1aXJlZCc6IDAsXG4gICdhcmlhLXNlbGVjdGVkJzogMCxcbiAgJ2FyaWEtc29ydCc6IDAsXG4gICdhcmlhLXZhbHVlbWF4JzogMCxcbiAgJ2FyaWEtdmFsdWVtaW4nOiAwLFxuICAnYXJpYS12YWx1ZW5vdyc6IDAsXG4gICdhcmlhLXZhbHVldGV4dCc6IDAsXG4gIC8vIExpdmUgUmVnaW9uIEF0dHJpYnV0ZXNcbiAgJ2FyaWEtYXRvbWljJzogMCxcbiAgJ2FyaWEtYnVzeSc6IDAsXG4gICdhcmlhLWxpdmUnOiAwLFxuICAnYXJpYS1yZWxldmFudCc6IDAsXG4gIC8vIERyYWctYW5kLURyb3AgQXR0cmlidXRlc1xuICAnYXJpYS1kcm9wZWZmZWN0JzogMCxcbiAgJ2FyaWEtZ3JhYmJlZCc6IDAsXG4gIC8vIFJlbGF0aW9uc2hpcCBBdHRyaWJ1dGVzXG4gICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnOiAwLFxuICAnYXJpYS1jb2xjb3VudCc6IDAsXG4gICdhcmlhLWNvbGluZGV4JzogMCxcbiAgJ2FyaWEtY29sc3Bhbic6IDAsXG4gICdhcmlhLWNvbnRyb2xzJzogMCxcbiAgJ2FyaWEtZGVzY3JpYmVkYnknOiAwLFxuICAnYXJpYS1lcnJvcm1lc3NhZ2UnOiAwLFxuICAnYXJpYS1mbG93dG8nOiAwLFxuICAnYXJpYS1sYWJlbGxlZGJ5JzogMCxcbiAgJ2FyaWEtb3ducyc6IDAsXG4gICdhcmlhLXBvc2luc2V0JzogMCxcbiAgJ2FyaWEtcm93Y291bnQnOiAwLFxuICAnYXJpYS1yb3dpbmRleCc6IDAsXG4gICdhcmlhLXJvd3NwYW4nOiAwLFxuICAnYXJpYS1zZXRzaXplJzogMFxufTtcblxudmFyIHdhcm5lZFByb3BlcnRpZXMgPSB7fTtcbnZhciByQVJJQSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xudmFyIHJBUklBQ2FtZWwgPSBuZXcgUmVnRXhwKCdeKGFyaWEpW0EtWl1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHkodGFnTmFtZSwgbmFtZSkge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwod2FybmVkUHJvcGVydGllcywgbmFtZSkgJiYgd2FybmVkUHJvcGVydGllc1tuYW1lXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHJBUklBQ2FtZWwudGVzdChuYW1lKSkge1xuICAgICAgdmFyIGFyaWFOYW1lID0gJ2FyaWEtJyArIG5hbWUuc2xpY2UoNCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBjb3JyZWN0TmFtZSA9IGFyaWFQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGFyaWFOYW1lKSA/IGFyaWFOYW1lIDogbnVsbDsgLy8gSWYgdGhpcyBpcyBhbiBhcmlhLSogYXR0cmlidXRlLCBidXQgaXMgbm90IGxpc3RlZCBpbiB0aGUga25vd24gRE9NXG4gICAgICAvLyBET00gcHJvcGVydGllcywgdGhlbiBpdCBpcyBhbiBpbnZhbGlkIGFyaWEtKiBhdHRyaWJ1dGUuXG5cbiAgICAgIGlmIChjb3JyZWN0TmFtZSA9PSBudWxsKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIEFSSUEgYXR0cmlidXRlIGAlc2AuIEFSSUEgYXR0cmlidXRlcyBmb2xsb3cgdGhlIHBhdHRlcm4gYXJpYS0qIGFuZCBtdXN0IGJlIGxvd2VyY2FzZS4nLCBuYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IC8vIGFyaWEtKiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBsb3dlcmNhc2U7IHN1Z2dlc3QgdGhlIGxvd2VyY2FzZSB2ZXJzaW9uLlxuXG5cbiAgICAgIGlmIChuYW1lICE9PSBjb3JyZWN0TmFtZSkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBBUklBIGF0dHJpYnV0ZSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBjb3JyZWN0TmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyQVJJQS50ZXN0KG5hbWUpKSB7XG4gICAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgc3RhbmRhcmROYW1lID0gYXJpYVByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpID8gbG93ZXJDYXNlZE5hbWUgOiBudWxsOyAvLyBJZiB0aGlzIGlzIGFuIGFyaWEtKiBhdHRyaWJ1dGUsIGJ1dCBpcyBub3QgbGlzdGVkIGluIHRoZSBrbm93biBET01cbiAgICAgIC8vIERPTSBwcm9wZXJ0aWVzLCB0aGVuIGl0IGlzIGFuIGludmFsaWQgYXJpYS0qIGF0dHJpYnV0ZS5cblxuICAgICAgaWYgKHN0YW5kYXJkTmFtZSA9PSBudWxsKSB7XG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IC8vIGFyaWEtKiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBsb3dlcmNhc2U7IHN1Z2dlc3QgdGhlIGxvd2VyY2FzZSB2ZXJzaW9uLlxuXG5cbiAgICAgIGlmIChuYW1lICE9PSBzdGFuZGFyZE5hbWUpIHtcbiAgICAgICAgZXJyb3IoJ1Vua25vd24gQVJJQSBhdHRyaWJ1dGUgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgc3RhbmRhcmROYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHdhcm5JbnZhbGlkQVJJQVByb3BzKHR5cGUsIHByb3BzKSB7XG4gIHtcbiAgICB2YXIgaW52YWxpZFByb3BzID0gW107XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHtcbiAgICAgIHZhciBpc1ZhbGlkID0gdmFsaWRhdGVQcm9wZXJ0eSh0eXBlLCBrZXkpO1xuXG4gICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgaW52YWxpZFByb3BzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdW5rbm93blByb3BTdHJpbmcgPSBpbnZhbGlkUHJvcHMubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICByZXR1cm4gJ2AnICsgcHJvcCArICdgJztcbiAgICB9KS5qb2luKCcsICcpO1xuXG4gICAgaWYgKGludmFsaWRQcm9wcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIGFyaWEgcHJvcCAlcyBvbiA8JXM+IHRhZy4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWFyaWEtcHJvcHMnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gICAgfSBlbHNlIGlmIChpbnZhbGlkUHJvcHMubGVuZ3RoID4gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgYXJpYSBwcm9wcyAlcyBvbiA8JXM+IHRhZy4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWFyaWEtcHJvcHMnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyh0eXBlLCBwcm9wcykge1xuICBpZiAoaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgd2FybkludmFsaWRBUklBUHJvcHModHlwZSwgcHJvcHMpO1xufVxuXG52YXIgZGlkV2FyblZhbHVlTnVsbCA9IGZhbHNlO1xuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzJDEodHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIGlmICh0eXBlICE9PSAnaW5wdXQnICYmIHR5cGUgIT09ICd0ZXh0YXJlYScgJiYgdHlwZSAhPT0gJ3NlbGVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMgIT0gbnVsbCAmJiBwcm9wcy52YWx1ZSA9PT0gbnVsbCAmJiAhZGlkV2FyblZhbHVlTnVsbCkge1xuICAgICAgZGlkV2FyblZhbHVlTnVsbCA9IHRydWU7XG5cbiAgICAgIGlmICh0eXBlID09PSAnc2VsZWN0JyAmJiBwcm9wcy5tdWx0aXBsZSkge1xuICAgICAgICBlcnJvcignYHZhbHVlYCBwcm9wIG9uIGAlc2Agc2hvdWxkIG5vdCBiZSBudWxsLiAnICsgJ0NvbnNpZGVyIHVzaW5nIGFuIGVtcHR5IGFycmF5IHdoZW4gYG11bHRpcGxlYCBpcyBzZXQgdG8gYHRydWVgICcgKyAndG8gY2xlYXIgdGhlIGNvbXBvbmVudCBvciBgdW5kZWZpbmVkYCBmb3IgdW5jb250cm9sbGVkIGNvbXBvbmVudHMuJywgdHlwZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcignYHZhbHVlYCBwcm9wIG9uIGAlc2Agc2hvdWxkIG5vdCBiZSBudWxsLiAnICsgJ0NvbnNpZGVyIHVzaW5nIGFuIGVtcHR5IHN0cmluZyB0byBjbGVhciB0aGUgY29tcG9uZW50IG9yIGB1bmRlZmluZWRgICcgKyAnZm9yIHVuY29udHJvbGxlZCBjb21wb25lbnRzLicsIHR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgdmFsaWRhdGVQcm9wZXJ0eSQxID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgdmFyIHdhcm5lZFByb3BlcnRpZXMkMSA9IHt9O1xuICB2YXIgRVZFTlRfTkFNRV9SRUdFWCA9IC9eb24uLztcbiAgdmFyIElOVkFMSURfRVZFTlRfTkFNRV9SRUdFWCA9IC9eb25bXkEtWl0vO1xuICB2YXIgckFSSUEkMSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuICB2YXIgckFSSUFDYW1lbCQxID0gbmV3IFJlZ0V4cCgnXihhcmlhKVtBLVpdWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuXG4gIHZhbGlkYXRlUHJvcGVydHkkMSA9IGZ1bmN0aW9uICh0YWdOYW1lLCBuYW1lLCB2YWx1ZSwgZXZlbnRSZWdpc3RyeSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHdhcm5lZFByb3BlcnRpZXMkMSwgbmFtZSkgJiYgd2FybmVkUHJvcGVydGllcyQxW25hbWVdKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdvbmZvY3VzaW4nIHx8IGxvd2VyQ2FzZWROYW1lID09PSAnb25mb2N1c291dCcpIHtcbiAgICAgIGVycm9yKCdSZWFjdCB1c2VzIG9uRm9jdXMgYW5kIG9uQmx1ciBpbnN0ZWFkIG9mIG9uRm9jdXNJbiBhbmQgb25Gb2N1c091dC4gJyArICdBbGwgUmVhY3QgZXZlbnRzIGFyZSBub3JtYWxpemVkIHRvIGJ1YmJsZSwgc28gb25Gb2N1c0luIGFuZCBvbkZvY3VzT3V0ICcgKyAnYXJlIG5vdCBuZWVkZWQvc3VwcG9ydGVkIGJ5IFJlYWN0LicpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBXZSBjYW4ndCByZWx5IG9uIHRoZSBldmVudCBzeXN0ZW0gYmVpbmcgaW5qZWN0ZWQgb24gdGhlIHNlcnZlci5cblxuXG4gICAgaWYgKGV2ZW50UmVnaXN0cnkgIT0gbnVsbCkge1xuICAgICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMgPSBldmVudFJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMsXG4gICAgICAgICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyA9IGV2ZW50UmVnaXN0cnkucG9zc2libGVSZWdpc3RyYXRpb25OYW1lcztcblxuICAgICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWdpc3RyYXRpb25OYW1lID0gcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkgPyBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzW2xvd2VyQ2FzZWROYW1lXSA6IG51bGw7XG5cbiAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCByZWdpc3RyYXRpb25OYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKEVWRU5UX05BTUVfUkVHRVgudGVzdChuYW1lKSkge1xuICAgICAgICBlcnJvcignVW5rbm93biBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuIEl0IHdpbGwgYmUgaWdub3JlZC4nLCBuYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEVWRU5UX05BTUVfUkVHRVgudGVzdChuYW1lKSkge1xuICAgICAgLy8gSWYgbm8gZXZlbnQgcGx1Z2lucyBoYXZlIGJlZW4gaW5qZWN0ZWQsIHdlIGFyZSBpbiBhIHNlcnZlciBlbnZpcm9ubWVudC5cbiAgICAgIC8vIFNvIHdlIGNhbid0IHRlbGwgaWYgdGhlIGV2ZW50IG5hbWUgaXMgY29ycmVjdCBmb3Igc3VyZSwgYnV0IHdlIGNhbiBmaWx0ZXJcbiAgICAgIC8vIG91dCBrbm93biBiYWQgb25lcyBsaWtlIGBvbmNsaWNrYC4gV2UgY2FuJ3Qgc3VnZ2VzdCBhIHNwZWNpZmljIHJlcGxhY2VtZW50IHRob3VnaC5cbiAgICAgIGlmIChJTlZBTElEX0VWRU5UX05BTUVfUkVHRVgudGVzdChuYW1lKSkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuICcgKyAnUmVhY3QgZXZlbnRzIHVzZSB0aGUgY2FtZWxDYXNlIG5hbWluZyBjb252ZW50aW9uLCBmb3IgZXhhbXBsZSBgb25DbGlja2AuJywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIExldCB0aGUgQVJJQSBhdHRyaWJ1dGUgaG9vayB2YWxpZGF0ZSBBUklBIGF0dHJpYnV0ZXNcblxuXG4gICAgaWYgKHJBUklBJDEudGVzdChuYW1lKSB8fCByQVJJQUNhbWVsJDEudGVzdChuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnaW5uZXJodG1sJykge1xuICAgICAgZXJyb3IoJ0RpcmVjdGx5IHNldHRpbmcgcHJvcGVydHkgYGlubmVySFRNTGAgaXMgbm90IHBlcm1pdHRlZC4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgbG9va3VwIGRvY3VtZW50YXRpb24gb24gYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2FyaWEnKSB7XG4gICAgICBlcnJvcignVGhlIGBhcmlhYCBhdHRyaWJ1dGUgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgaW4gUmVhY3QuICcgKyAnUGFzcyBpbmRpdmlkdWFsIGBhcmlhLWAgYXR0cmlidXRlcyBpbnN0ZWFkLicpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnaXMnICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIGEgYCVzYCBmb3IgYSBzdHJpbmcgYXR0cmlidXRlIGBpc2AuIElmIHRoaXMgaXMgZXhwZWN0ZWQsIGNhc3QgJyArICd0aGUgdmFsdWUgdG8gYSBzdHJpbmcuJywgdHlwZW9mIHZhbHVlKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlzTmFOKHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIE5hTiBmb3IgdGhlIGAlc2AgYXR0cmlidXRlLiBJZiB0aGlzIGlzIGV4cGVjdGVkLCBjYXN0ICcgKyAndGhlIHZhbHVlIHRvIGEgc3RyaW5nLicsIG5hbWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIHByb3BlcnR5SW5mbyA9IGdldFByb3BlcnR5SW5mbyhuYW1lKTtcbiAgICB2YXIgaXNSZXNlcnZlZCA9IHByb3BlcnR5SW5mbyAhPT0gbnVsbCAmJiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gUkVTRVJWRUQ7IC8vIEtub3duIGF0dHJpYnV0ZXMgc2hvdWxkIG1hdGNoIHRoZSBjYXNpbmcgc3BlY2lmaWVkIGluIHRoZSBwcm9wZXJ0eSBjb25maWcuXG5cbiAgICBpZiAocG9zc2libGVTdGFuZGFyZE5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSkge1xuICAgICAgdmFyIHN0YW5kYXJkTmFtZSA9IHBvc3NpYmxlU3RhbmRhcmROYW1lc1tsb3dlckNhc2VkTmFtZV07XG5cbiAgICAgIGlmIChzdGFuZGFyZE5hbWUgIT09IG5hbWUpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgRE9NIHByb3BlcnR5IGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIHN0YW5kYXJkTmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghaXNSZXNlcnZlZCAmJiBuYW1lICE9PSBsb3dlckNhc2VkTmFtZSkge1xuICAgICAgLy8gVW5rbm93biBhdHRyaWJ1dGVzIHNob3VsZCBoYXZlIGxvd2VyY2FzZSBjYXNpbmcgc2luY2UgdGhhdCdzIGhvdyB0aGV5XG4gICAgICAvLyB3aWxsIGJlIGNhc2VkIGFueXdheSB3aXRoIHNlcnZlciByZW5kZXJpbmcuXG4gICAgICBlcnJvcignUmVhY3QgZG9lcyBub3QgcmVjb2duaXplIHRoZSBgJXNgIHByb3Agb24gYSBET00gZWxlbWVudC4gSWYgeW91ICcgKyAnaW50ZW50aW9uYWxseSB3YW50IGl0IHRvIGFwcGVhciBpbiB0aGUgRE9NIGFzIGEgY3VzdG9tICcgKyAnYXR0cmlidXRlLCBzcGVsbCBpdCBhcyBsb3dlcmNhc2UgYCVzYCBpbnN0ZWFkLiAnICsgJ0lmIHlvdSBhY2NpZGVudGFsbHkgcGFzc2VkIGl0IGZyb20gYSBwYXJlbnQgY29tcG9uZW50LCByZW1vdmUgJyArICdpdCBmcm9tIHRoZSBET00gZWxlbWVudC4nLCBuYW1lLCBsb3dlckNhc2VkTmFtZSk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgJiYgc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZXJyb3IoJ1JlY2VpdmVkIGAlc2AgZm9yIGEgbm9uLWJvb2xlYW4gYXR0cmlidXRlIGAlc2AuXFxuXFxuJyArICdJZiB5b3Ugd2FudCB0byB3cml0ZSBpdCB0byB0aGUgRE9NLCBwYXNzIGEgc3RyaW5nIGluc3RlYWQ6ICcgKyAnJXM9XCIlc1wiIG9yICVzPXt2YWx1ZS50b1N0cmluZygpfS4nLCB2YWx1ZSwgbmFtZSwgbmFtZSwgdmFsdWUsIG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJ1JlY2VpdmVkIGAlc2AgZm9yIGEgbm9uLWJvb2xlYW4gYXR0cmlidXRlIGAlc2AuXFxuXFxuJyArICdJZiB5b3Ugd2FudCB0byB3cml0ZSBpdCB0byB0aGUgRE9NLCBwYXNzIGEgc3RyaW5nIGluc3RlYWQ6ICcgKyAnJXM9XCIlc1wiIG9yICVzPXt2YWx1ZS50b1N0cmluZygpfS5cXG5cXG4nICsgJ0lmIHlvdSB1c2VkIHRvIGNvbmRpdGlvbmFsbHkgb21pdCBpdCB3aXRoICVzPXtjb25kaXRpb24gJiYgdmFsdWV9LCAnICsgJ3Bhc3MgJXM9e2NvbmRpdGlvbiA/IHZhbHVlIDogdW5kZWZpbmVkfSBpbnN0ZWFkLicsIHZhbHVlLCBuYW1lLCBuYW1lLCB2YWx1ZSwgbmFtZSwgbmFtZSwgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIE5vdyB0aGF0IHdlJ3ZlIHZhbGlkYXRlZCBjYXNpbmcsIGRvIG5vdCB2YWxpZGF0ZVxuICAgIC8vIGRhdGEgdHlwZXMgZm9yIHJlc2VydmVkIHByb3BzXG5cblxuICAgIGlmIChpc1Jlc2VydmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIFdhcm4gd2hlbiBhIGtub3duIGF0dHJpYnV0ZSBpcyBhIGJhZCB0eXBlXG5cblxuICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBXYXJuIHdoZW4gcGFzc2luZyB0aGUgc3RyaW5ncyAnZmFsc2UnIG9yICd0cnVlJyBpbnRvIGEgYm9vbGVhbiBwcm9wXG5cblxuICAgIGlmICgodmFsdWUgPT09ICdmYWxzZScgfHwgdmFsdWUgPT09ICd0cnVlJykgJiYgcHJvcGVydHlJbmZvICE9PSBudWxsICYmIHByb3BlcnR5SW5mby50eXBlID09PSBCT09MRUFOKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgdGhlIHN0cmluZyBgJXNgIGZvciB0aGUgYm9vbGVhbiBhdHRyaWJ1dGUgYCVzYC4gJyArICclcyAnICsgJ0RpZCB5b3UgbWVhbiAlcz17JXN9PycsIHZhbHVlLCBuYW1lLCB2YWx1ZSA9PT0gJ2ZhbHNlJyA/ICdUaGUgYnJvd3NlciB3aWxsIGludGVycHJldCBpdCBhcyBhIHRydXRoeSB2YWx1ZS4nIDogJ0FsdGhvdWdoIHRoaXMgd29ya3MsIGl0IHdpbGwgbm90IHdvcmsgYXMgZXhwZWN0ZWQgaWYgeW91IHBhc3MgdGhlIHN0cmluZyBcImZhbHNlXCIuJywgbmFtZSwgdmFsdWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59XG5cbnZhciB3YXJuVW5rbm93blByb3BlcnRpZXMgPSBmdW5jdGlvbiAodHlwZSwgcHJvcHMsIGV2ZW50UmVnaXN0cnkpIHtcbiAge1xuICAgIHZhciB1bmtub3duUHJvcHMgPSBbXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgICAgdmFyIGlzVmFsaWQgPSB2YWxpZGF0ZVByb3BlcnR5JDEodHlwZSwga2V5LCBwcm9wc1trZXldLCBldmVudFJlZ2lzdHJ5KTtcblxuICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgIHVua25vd25Qcm9wcy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHVua25vd25Qcm9wU3RyaW5nID0gdW5rbm93blByb3BzLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgcmV0dXJuICdgJyArIHByb3AgKyAnYCc7XG4gICAgfSkuam9pbignLCAnKTtcblxuICAgIGlmICh1bmtub3duUHJvcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCB2YWx1ZSBmb3IgcHJvcCAlcyBvbiA8JXM+IHRhZy4gRWl0aGVyIHJlbW92ZSBpdCBmcm9tIHRoZSBlbGVtZW50LCAnICsgJ29yIHBhc3MgYSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlIHRvIGtlZXAgaXQgaW4gdGhlIERPTS4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9hdHRyaWJ1dGUtYmVoYXZpb3IgJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH0gZWxzZSBpZiAodW5rbm93blByb3BzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIHZhbHVlcyBmb3IgcHJvcHMgJXMgb24gPCVzPiB0YWcuIEVpdGhlciByZW1vdmUgdGhlbSBmcm9tIHRoZSBlbGVtZW50LCAnICsgJ29yIHBhc3MgYSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlIHRvIGtlZXAgdGhlbSBpbiB0aGUgRE9NLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2F0dHJpYnV0ZS1iZWhhdmlvciAnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXMkMih0eXBlLCBwcm9wcywgZXZlbnRSZWdpc3RyeSkge1xuICBpZiAoaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgd2FyblVua25vd25Qcm9wZXJ0aWVzKHR5cGUsIHByb3BzLCBldmVudFJlZ2lzdHJ5KTtcbn1cblxudmFyIElTX0VWRU5UX0hBTkRMRV9OT05fTUFOQUdFRF9OT0RFID0gMTtcbnZhciBJU19OT05fREVMRUdBVEVEID0gMSA8PCAxO1xudmFyIElTX0NBUFRVUkVfUEhBU0UgPSAxIDw8IDI7XG4vLyBzZXQgdG8gTEVHQUNZX0ZCX1NVUFBPUlQuIExFR0FDWV9GQl9TVVBQT1JUIG9ubHkgZ2V0cyBzZXQgd2hlblxuLy8gd2UgY2FsbCB3aWxsRGVmZXJMYXRlckZvckxlZ2FjeUZCU3VwcG9ydCwgdGh1cyBub3QgYmFpbGluZyBvdXRcbi8vIHdpbGwgcmVzdWx0IGluIGVuZGxlc3MgY3ljbGVzIGxpa2UgYW4gaW5maW5pdGUgbG9vcC5cbi8vIFdlIGFsc28gZG9uJ3Qgd2FudCB0byBkZWZlciBkdXJpbmcgZXZlbnQgcmVwbGF5aW5nLlxuXG52YXIgU0hPVUxEX05PVF9QUk9DRVNTX1BPTFlGSUxMX0VWRU5UX1BMVUdJTlMgPSBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSB8IElTX05PTl9ERUxFR0FURUQgfCBJU19DQVBUVVJFX1BIQVNFO1xuXG4vLyBUaGlzIGV4aXN0cyB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5IGJldHdlZW4gUmVhY3RET01FdmVudFJlcGxheWluZ1xuLy8gYW5kIERPTVBsdWdpbkV2ZW50U3lzdGVtLlxudmFyIGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9IG51bGw7XG5mdW5jdGlvbiBzZXRSZXBsYXlpbmdFdmVudChldmVudCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnRSZXBsYXlpbmdFdmVudCAhPT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGN1cnJlbnRseSByZXBsYXlpbmcgZXZlbnQgdG8gYmUgbnVsbC4gVGhpcyBlcnJvciAnICsgJ2lzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9IGV2ZW50O1xufVxuZnVuY3Rpb24gcmVzZXRSZXBsYXlpbmdFdmVudCgpIHtcbiAge1xuICAgIGlmIChjdXJyZW50UmVwbGF5aW5nRXZlbnQgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCBjdXJyZW50bHkgcmVwbGF5aW5nIGV2ZW50IHRvIG5vdCBiZSBudWxsLiBUaGlzIGVycm9yICcgKyAnaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgY3VycmVudFJlcGxheWluZ0V2ZW50ID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGlzUmVwbGF5aW5nRXZlbnQoZXZlbnQpIHtcbiAgcmV0dXJuIGV2ZW50ID09PSBjdXJyZW50UmVwbGF5aW5nRXZlbnQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgdGFyZ2V0IG5vZGUgZnJvbSBhIG5hdGl2ZSBicm93c2VyIGV2ZW50IGJ5IGFjY291bnRpbmcgZm9yXG4gKiBpbmNvbnNpc3RlbmNpZXMgaW4gYnJvd3NlciBET00gQVBJcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtET01FdmVudFRhcmdldH0gVGFyZ2V0IG5vZGUuXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpIHtcbiAgLy8gRmFsbGJhY2sgdG8gbmF0aXZlRXZlbnQuc3JjRWxlbWVudCBmb3IgSUU5XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTI1MDZcbiAgdmFyIHRhcmdldCA9IG5hdGl2ZUV2ZW50LnRhcmdldCB8fCBuYXRpdmVFdmVudC5zcmNFbGVtZW50IHx8IHdpbmRvdzsgLy8gTm9ybWFsaXplIFNWRyA8dXNlPiBlbGVtZW50IGV2ZW50cyAjNDk2M1xuXG4gIGlmICh0YXJnZXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpIHtcbiAgICB0YXJnZXQgPSB0YXJnZXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQ7XG4gIH0gLy8gU2FmYXJpIG1heSBmaXJlIGV2ZW50cyBvbiB0ZXh0IG5vZGVzIChOb2RlLlRFWFRfTk9ERSBpcyAzKS5cbiAgLy8gQHNlZSBodHRwOi8vd3d3LnF1aXJrc21vZGUub3JnL2pzL2V2ZW50c19wcm9wZXJ0aWVzLmh0bWxcblxuXG4gIHJldHVybiB0YXJnZXQubm9kZVR5cGUgPT09IFRFWFRfTk9ERSA/IHRhcmdldC5wYXJlbnROb2RlIDogdGFyZ2V0O1xufVxuXG52YXIgcmVzdG9yZUltcGwgPSBudWxsO1xudmFyIHJlc3RvcmVUYXJnZXQgPSBudWxsO1xudmFyIHJlc3RvcmVRdWV1ZSA9IG51bGw7XG5cbmZ1bmN0aW9uIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHRhcmdldCkge1xuICAvLyBXZSBwZXJmb3JtIHRoaXMgdHJhbnNsYXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgZXZlbnQgbG9vcCBzbyB0aGF0IHdlXG4gIC8vIGFsd2F5cyByZWNlaXZlIHRoZSBjb3JyZWN0IGZpYmVyIGhlcmVcbiAgdmFyIGludGVybmFsSW5zdGFuY2UgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKHRhcmdldCk7XG5cbiAgaWYgKCFpbnRlcm5hbEluc3RhbmNlKSB7XG4gICAgLy8gVW5tb3VudGVkXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZXN0b3JlSW1wbCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0UmVzdG9yZUltcGxlbWVudGF0aW9uKCkgbmVlZHMgdG8gYmUgY2FsbGVkIHRvIGhhbmRsZSBhIHRhcmdldCBmb3IgY29udHJvbGxlZCAnICsgJ2V2ZW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHZhciBzdGF0ZU5vZGUgPSBpbnRlcm5hbEluc3RhbmNlLnN0YXRlTm9kZTsgLy8gR3VhcmQgYWdhaW5zdCBGaWJlciBiZWluZyB1bm1vdW50ZWQuXG5cbiAgaWYgKHN0YXRlTm9kZSkge1xuICAgIHZhciBfcHJvcHMgPSBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlKHN0YXRlTm9kZSk7XG5cbiAgICByZXN0b3JlSW1wbChpbnRlcm5hbEluc3RhbmNlLnN0YXRlTm9kZSwgaW50ZXJuYWxJbnN0YW5jZS50eXBlLCBfcHJvcHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldFJlc3RvcmVJbXBsZW1lbnRhdGlvbihpbXBsKSB7XG4gIHJlc3RvcmVJbXBsID0gaW1wbDtcbn1cbmZ1bmN0aW9uIGVucXVldWVTdGF0ZVJlc3RvcmUodGFyZ2V0KSB7XG4gIGlmIChyZXN0b3JlVGFyZ2V0KSB7XG4gICAgaWYgKHJlc3RvcmVRdWV1ZSkge1xuICAgICAgcmVzdG9yZVF1ZXVlLnB1c2godGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdG9yZVF1ZXVlID0gW3RhcmdldF07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlc3RvcmVUYXJnZXQgPSB0YXJnZXQ7XG4gIH1cbn1cbmZ1bmN0aW9uIG5lZWRzU3RhdGVSZXN0b3JlKCkge1xuICByZXR1cm4gcmVzdG9yZVRhcmdldCAhPT0gbnVsbCB8fCByZXN0b3JlUXVldWUgIT09IG51bGw7XG59XG5mdW5jdGlvbiByZXN0b3JlU3RhdGVJZk5lZWRlZCgpIHtcbiAgaWYgKCFyZXN0b3JlVGFyZ2V0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHRhcmdldCA9IHJlc3RvcmVUYXJnZXQ7XG4gIHZhciBxdWV1ZWRUYXJnZXRzID0gcmVzdG9yZVF1ZXVlO1xuICByZXN0b3JlVGFyZ2V0ID0gbnVsbDtcbiAgcmVzdG9yZVF1ZXVlID0gbnVsbDtcbiAgcmVzdG9yZVN0YXRlT2ZUYXJnZXQodGFyZ2V0KTtcblxuICBpZiAocXVldWVkVGFyZ2V0cykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWVkVGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdG9yZVN0YXRlT2ZUYXJnZXQocXVldWVkVGFyZ2V0c1tpXSk7XG4gICAgfVxuICB9XG59XG5cbi8vIHRoZSByZW5kZXJlci4gU3VjaCBhcyB3aGVuIHdlJ3JlIGRpc3BhdGNoaW5nIGV2ZW50cyBvciBpZiB0aGlyZCBwYXJ0eVxuLy8gbGlicmFyaWVzIG5lZWQgdG8gY2FsbCBiYXRjaGVkVXBkYXRlcy4gRXZlbnR1YWxseSwgdGhpcyBBUEkgd2lsbCBnbyBhd2F5IHdoZW5cbi8vIGV2ZXJ5dGhpbmcgaXMgYmF0Y2hlZCBieSBkZWZhdWx0LiBXZSdsbCB0aGVuIGhhdmUgYSBzaW1pbGFyIEFQSSB0byBvcHQtb3V0IG9mXG4vLyBzY2hlZHVsZWQgd29yayBhbmQgaW5zdGVhZCBkbyBzeW5jaHJvbm91cyB3b3JrLlxuLy8gRGVmYXVsdHNcblxudmFyIGJhdGNoZWRVcGRhdGVzSW1wbCA9IGZ1bmN0aW9uIChmbiwgYm9va2tlZXBpbmcpIHtcbiAgcmV0dXJuIGZuKGJvb2trZWVwaW5nKTtcbn07XG5cbnZhciBmbHVzaFN5bmNJbXBsID0gZnVuY3Rpb24gKCkge307XG5cbnZhciBpc0luc2lkZUV2ZW50SGFuZGxlciA9IGZhbHNlO1xuXG5mdW5jdGlvbiBmaW5pc2hFdmVudEhhbmRsZXIoKSB7XG4gIC8vIEhlcmUgd2Ugd2FpdCB1bnRpbCBhbGwgdXBkYXRlcyBoYXZlIHByb3BhZ2F0ZWQsIHdoaWNoIGlzIGltcG9ydGFudFxuICAvLyB3aGVuIHVzaW5nIGNvbnRyb2xsZWQgY29tcG9uZW50cyB3aXRoaW4gbGF5ZXJzOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE2OThcbiAgLy8gVGhlbiB3ZSByZXN0b3JlIHN0YXRlIG9mIGFueSBjb250cm9sbGVkIGNvbXBvbmVudC5cbiAgdmFyIGNvbnRyb2xsZWRDb21wb25lbnRzSGF2ZVBlbmRpbmdVcGRhdGVzID0gbmVlZHNTdGF0ZVJlc3RvcmUoKTtcblxuICBpZiAoY29udHJvbGxlZENvbXBvbmVudHNIYXZlUGVuZGluZ1VwZGF0ZXMpIHtcbiAgICAvLyBJZiBhIGNvbnRyb2xsZWQgZXZlbnQgd2FzIGZpcmVkLCB3ZSBtYXkgbmVlZCB0byByZXN0b3JlIHRoZSBzdGF0ZSBvZlxuICAgIC8vIHRoZSBET00gbm9kZSBiYWNrIHRvIHRoZSBjb250cm9sbGVkIHZhbHVlLiBUaGlzIGlzIG5lY2Vzc2FyeSB3aGVuIFJlYWN0XG4gICAgLy8gYmFpbHMgb3V0IG9mIHRoZSB1cGRhdGUgd2l0aG91dCB0b3VjaGluZyB0aGUgRE9NLlxuICAgIC8vIFRPRE86IFJlc3RvcmUgc3RhdGUgaW4gdGhlIG1pY3JvdGFzaywgYWZ0ZXIgdGhlIGRpc2NyZXRlIHVwZGF0ZXMgZmx1c2gsXG4gICAgLy8gaW5zdGVhZCBvZiBlYXJseSBmbHVzaGluZyB0aGVtIGhlcmUuXG4gICAgZmx1c2hTeW5jSW1wbCgpO1xuICAgIHJlc3RvcmVTdGF0ZUlmTmVlZGVkKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYmF0Y2hlZFVwZGF0ZXMoZm4sIGEsIGIpIHtcbiAgaWYgKGlzSW5zaWRlRXZlbnRIYW5kbGVyKSB7XG4gICAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBpbnNpZGUgYW5vdGhlciBiYXRjaCwgd2UgbmVlZCB0byB3YWl0IHVudGlsIGl0XG4gICAgLy8gZnVsbHkgY29tcGxldGVzIGJlZm9yZSByZXN0b3Jpbmcgc3RhdGUuXG4gICAgcmV0dXJuIGZuKGEsIGIpO1xuICB9XG5cbiAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGJhdGNoZWRVcGRhdGVzSW1wbChmbiwgYSwgYik7XG4gIH0gZmluYWxseSB7XG4gICAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSBmYWxzZTtcbiAgICBmaW5pc2hFdmVudEhhbmRsZXIoKTtcbiAgfVxufSAvLyBUT0RPOiBSZXBsYWNlIHdpdGggZmx1c2hTeW5jXG5mdW5jdGlvbiBzZXRCYXRjaGluZ0ltcGxlbWVudGF0aW9uKF9iYXRjaGVkVXBkYXRlc0ltcGwsIF9kaXNjcmV0ZVVwZGF0ZXNJbXBsLCBfZmx1c2hTeW5jSW1wbCkge1xuICBiYXRjaGVkVXBkYXRlc0ltcGwgPSBfYmF0Y2hlZFVwZGF0ZXNJbXBsO1xuICBmbHVzaFN5bmNJbXBsID0gX2ZsdXNoU3luY0ltcGw7XG59XG5cbmZ1bmN0aW9uIGlzSW50ZXJhY3RpdmUodGFnKSB7XG4gIHJldHVybiB0YWcgPT09ICdidXR0b24nIHx8IHRhZyA9PT0gJ2lucHV0JyB8fCB0YWcgPT09ICdzZWxlY3QnIHx8IHRhZyA9PT0gJ3RleHRhcmVhJztcbn1cblxuZnVuY3Rpb24gc2hvdWxkUHJldmVudE1vdXNlRXZlbnQobmFtZSwgdHlwZSwgcHJvcHMpIHtcbiAgc3dpdGNoIChuYW1lKSB7XG4gICAgY2FzZSAnb25DbGljayc6XG4gICAgY2FzZSAnb25DbGlja0NhcHR1cmUnOlxuICAgIGNhc2UgJ29uRG91YmxlQ2xpY2snOlxuICAgIGNhc2UgJ29uRG91YmxlQ2xpY2tDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlRG93bic6XG4gICAgY2FzZSAnb25Nb3VzZURvd25DYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlTW92ZSc6XG4gICAgY2FzZSAnb25Nb3VzZU1vdmVDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlVXAnOlxuICAgIGNhc2UgJ29uTW91c2VVcENhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VFbnRlcic6XG4gICAgICByZXR1cm4gISEocHJvcHMuZGlzYWJsZWQgJiYgaXNJbnRlcmFjdGl2ZSh0eXBlKSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBpbnN0IFRoZSBpbnN0YW5jZSwgd2hpY2ggaXMgdGhlIHNvdXJjZSBvZiBldmVudHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBOYW1lIG9mIGxpc3RlbmVyIChlLmcuIGBvbkNsaWNrYCkuXG4gKiBAcmV0dXJuIHs/ZnVuY3Rpb259IFRoZSBzdG9yZWQgY2FsbGJhY2suXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRMaXN0ZW5lcihpbnN0LCByZWdpc3RyYXRpb25OYW1lKSB7XG4gIHZhciBzdGF0ZU5vZGUgPSBpbnN0LnN0YXRlTm9kZTtcblxuICBpZiAoc3RhdGVOb2RlID09PSBudWxsKSB7XG4gICAgLy8gV29yayBpbiBwcm9ncmVzcyAoZXg6IG9ubG9hZCBldmVudHMgaW4gaW5jcmVtZW50YWwgbW9kZSkuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgcHJvcHMgPSBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlKHN0YXRlTm9kZSk7XG5cbiAgaWYgKHByb3BzID09PSBudWxsKSB7XG4gICAgLy8gV29yayBpbiBwcm9ncmVzcy5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lciA9IHByb3BzW3JlZ2lzdHJhdGlvbk5hbWVdO1xuXG4gIGlmIChzaG91bGRQcmV2ZW50TW91c2VFdmVudChyZWdpc3RyYXRpb25OYW1lLCBpbnN0LnR5cGUsIHByb3BzKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGxpc3RlbmVyICYmIHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGBcIiArIHJlZ2lzdHJhdGlvbk5hbWUgKyBcImAgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYSB2YWx1ZSBvZiBgXCIgKyB0eXBlb2YgbGlzdGVuZXIgKyBcImAgdHlwZS5cIik7XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXI7XG59XG5cbnZhciBwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCA9IGZhbHNlOyAvLyBDaGVjayBpZiBicm93c2VyIHN1cHBvcnQgZXZlbnRzIHdpdGggcGFzc2l2ZSBsaXN0ZW5lcnNcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FdmVudFRhcmdldC9hZGRFdmVudExpc3RlbmVyI1NhZmVseV9kZXRlY3Rpbmdfb3B0aW9uX3N1cHBvcnRcblxuaWYgKGNhblVzZURPTSkge1xuICB0cnkge1xuICAgIHZhciBvcHRpb25zID0ge307IC8vICRGbG93Rml4TWU6IElnbm9yZSBGbG93IGNvbXBsYWluaW5nIGFib3V0IG5lZWRpbmcgYSB2YWx1ZVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9wdGlvbnMsICdwYXNzaXZlJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0Jywgb3B0aW9ucywgb3B0aW9ucyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFja1Byb2QobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICB2YXIgZnVuY0FyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpO1xuXG4gIHRyeSB7XG4gICAgZnVuYy5hcHBseShjb250ZXh0LCBmdW5jQXJncyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgfVxufVxuXG52YXIgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCA9IGludm9rZUd1YXJkZWRDYWxsYmFja1Byb2Q7XG5cbntcbiAgLy8gSW4gREVWIG1vZGUsIHdlIHN3YXAgb3V0IGludm9rZUd1YXJkZWRDYWxsYmFjayBmb3IgYSBzcGVjaWFsIHZlcnNpb25cbiAgLy8gdGhhdCBwbGF5cyBtb3JlIG5pY2VseSB3aXRoIHRoZSBicm93c2VyJ3MgRGV2VG9vbHMuIFRoZSBpZGVhIGlzIHRvIHByZXNlcnZlXG4gIC8vIFwiUGF1c2Ugb24gZXhjZXB0aW9uc1wiIGJlaGF2aW9yLiBCZWNhdXNlIFJlYWN0IHdyYXBzIGFsbCB1c2VyLXByb3ZpZGVkXG4gIC8vIGZ1bmN0aW9ucyBpbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2ssIGFuZCB0aGUgcHJvZHVjdGlvbiB2ZXJzaW9uIG9mXG4gIC8vIGludm9rZUd1YXJkZWRDYWxsYmFjayB1c2VzIGEgdHJ5LWNhdGNoLCBhbGwgdXNlciBleGNlcHRpb25zIGFyZSB0cmVhdGVkXG4gIC8vIGxpa2UgY2F1Z2h0IGV4Y2VwdGlvbnMsIGFuZCB0aGUgRGV2VG9vbHMgd29uJ3QgcGF1c2UgdW5sZXNzIHRoZSBkZXZlbG9wZXJcbiAgLy8gdGFrZXMgdGhlIGV4dHJhIHN0ZXAgb2YgZW5hYmxpbmcgcGF1c2Ugb24gY2F1Z2h0IGV4Y2VwdGlvbnMuIFRoaXMgaXNcbiAgLy8gdW5pbnR1aXRpdmUsIHRob3VnaCwgYmVjYXVzZSBldmVuIHRob3VnaCBSZWFjdCBoYXMgY2F1Z2h0IHRoZSBlcnJvciwgZnJvbVxuICAvLyB0aGUgZGV2ZWxvcGVyJ3MgcGVyc3BlY3RpdmUsIHRoZSBlcnJvciBpcyB1bmNhdWdodC5cbiAgLy9cbiAgLy8gVG8gcHJlc2VydmUgdGhlIGV4cGVjdGVkIFwiUGF1c2Ugb24gZXhjZXB0aW9uc1wiIGJlaGF2aW9yLCB3ZSBkb24ndCB1c2UgYVxuICAvLyB0cnktY2F0Y2ggaW4gREVWLiBJbnN0ZWFkLCB3ZSBzeW5jaHJvbm91c2x5IGRpc3BhdGNoIGEgZmFrZSBldmVudCB0byBhIGZha2VcbiAgLy8gRE9NIG5vZGUsIGFuZCBjYWxsIHRoZSB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrIGZyb20gaW5zaWRlIGFuIGV2ZW50IGhhbmRsZXJcbiAgLy8gZm9yIHRoYXQgZmFrZSBldmVudC4gSWYgdGhlIGNhbGxiYWNrIHRocm93cywgdGhlIGVycm9yIGlzIFwiY2FwdHVyZWRcIiB1c2luZ1xuICAvLyBhIGdsb2JhbCBldmVudCBoYW5kbGVyLiBCdXQgYmVjYXVzZSB0aGUgZXJyb3IgaGFwcGVucyBpbiBhIGRpZmZlcmVudFxuICAvLyBldmVudCBsb29wIGNvbnRleHQsIGl0IGRvZXMgbm90IGludGVycnVwdCB0aGUgbm9ybWFsIHByb2dyYW0gZmxvdy5cbiAgLy8gRWZmZWN0aXZlbHksIHRoaXMgZ2l2ZXMgdXMgdHJ5LWNhdGNoIGJlaGF2aW9yIHdpdGhvdXQgYWN0dWFsbHkgdXNpbmdcbiAgLy8gdHJ5LWNhdGNoLiBOZWF0IVxuICAvLyBDaGVjayB0aGF0IHRoZSBicm93c2VyIHN1cHBvcnRzIHRoZSBBUElzIHdlIG5lZWQgdG8gaW1wbGVtZW50IG91ciBzcGVjaWFsXG4gIC8vIERFViB2ZXJzaW9uIG9mIGludm9rZUd1YXJkZWRDYWxsYmFja1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kaXNwYXRjaEV2ZW50ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGZha2VOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncmVhY3QnKTtcblxuICAgIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwgPSBmdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tEZXYobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICAgICAgLy8gSWYgZG9jdW1lbnQgZG9lc24ndCBleGlzdCB3ZSBrbm93IGZvciBzdXJlIHdlIHdpbGwgY3Jhc2ggaW4gdGhpcyBtZXRob2RcbiAgICAgIC8vIHdoZW4gd2UgY2FsbCBkb2N1bWVudC5jcmVhdGVFdmVudCgpLiBIb3dldmVyIHRoaXMgY2FuIGNhdXNlIGNvbmZ1c2luZ1xuICAgICAgLy8gZXJyb3JzOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svY3JlYXRlLXJlYWN0LWFwcC9pc3N1ZXMvMzQ4MlxuICAgICAgLy8gU28gd2UgcHJlZW1wdGl2ZWx5IHRocm93IHdpdGggYSBiZXR0ZXIgbWVzc2FnZSBpbnN0ZWFkLlxuICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgZG9jdW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYGRvY3VtZW50YCBnbG9iYWwgd2FzIGRlZmluZWQgd2hlbiBSZWFjdCB3YXMgaW5pdGlhbGl6ZWQsIGJ1dCBpcyBub3QgJyArICdkZWZpbmVkIGFueW1vcmUuIFRoaXMgY2FuIGhhcHBlbiBpbiBhIHRlc3QgZW52aXJvbm1lbnQgaWYgYSBjb21wb25lbnQgJyArICdzY2hlZHVsZXMgYW4gdXBkYXRlIGZyb20gYW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrLCBidXQgdGhlIHRlc3QgaGFzIGFscmVhZHkgJyArICdmaW5pc2hlZCBydW5uaW5nLiBUbyBzb2x2ZSB0aGlzLCB5b3UgY2FuIGVpdGhlciB1bm1vdW50IHRoZSBjb21wb25lbnQgYXQgJyArICd0aGUgZW5kIG9mIHlvdXIgdGVzdCAoYW5kIGVuc3VyZSB0aGF0IGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBnZXQgJyArICdjYW5jZWxlZCBpbiBgY29tcG9uZW50V2lsbFVubW91bnRgKSwgb3IgeW91IGNhbiBjaGFuZ2UgdGhlIHRlc3QgaXRzZWxmICcgKyAndG8gYmUgYXN5bmNocm9ub3VzLicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgICB2YXIgZGlkQ2FsbCA9IGZhbHNlOyAvLyBLZWVwcyB0cmFjayBvZiB3aGV0aGVyIHRoZSB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrIHRocmV3IGFuIGVycm9yLiBXZVxuICAgICAgLy8gc2V0IHRoaXMgdG8gdHJ1ZSBhdCB0aGUgYmVnaW5uaW5nLCB0aGVuIHNldCBpdCB0byBmYWxzZSByaWdodCBhZnRlclxuICAgICAgLy8gY2FsbGluZyB0aGUgZnVuY3Rpb24uIElmIHRoZSBmdW5jdGlvbiBlcnJvcnMsIGBkaWRFcnJvcmAgd2lsbCBuZXZlciBiZVxuICAgICAgLy8gc2V0IHRvIGZhbHNlLiBUaGlzIHN0cmF0ZWd5IHdvcmtzIGV2ZW4gaWYgdGhlIGJyb3dzZXIgaXMgZmxha3kgYW5kXG4gICAgICAvLyBmYWlscyB0byBjYWxsIG91ciBnbG9iYWwgZXJyb3IgaGFuZGxlciwgYmVjYXVzZSBpdCBkb2Vzbid0IHJlbHkgb25cbiAgICAgIC8vIHRoZSBlcnJvciBldmVudCBhdCBhbGwuXG5cbiAgICAgIHZhciBkaWRFcnJvciA9IHRydWU7IC8vIEtlZXBzIHRyYWNrIG9mIHRoZSB2YWx1ZSBvZiB3aW5kb3cuZXZlbnQgc28gdGhhdCB3ZSBjYW4gcmVzZXQgaXRcbiAgICAgIC8vIGR1cmluZyB0aGUgY2FsbGJhY2sgdG8gbGV0IHVzZXIgY29kZSBhY2Nlc3Mgd2luZG93LmV2ZW50IGluIHRoZVxuICAgICAgLy8gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IGl0LlxuXG4gICAgICB2YXIgd2luZG93RXZlbnQgPSB3aW5kb3cuZXZlbnQ7IC8vIEtlZXBzIHRyYWNrIG9mIHRoZSBkZXNjcmlwdG9yIG9mIHdpbmRvdy5ldmVudCB0byByZXN0b3JlIGl0IGFmdGVyIGV2ZW50XG4gICAgICAvLyBkaXNwYXRjaGluZzogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzY4OFxuXG4gICAgICB2YXIgd2luZG93RXZlbnREZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdldmVudCcpO1xuXG4gICAgICBmdW5jdGlvbiByZXN0b3JlQWZ0ZXJEaXNwYXRjaCgpIHtcbiAgICAgICAgLy8gV2UgaW1tZWRpYXRlbHkgcmVtb3ZlIHRoZSBjYWxsYmFjayBmcm9tIGV2ZW50IGxpc3RlbmVycyBzbyB0aGF0XG4gICAgICAgIC8vIG5lc3RlZCBgaW52b2tlR3VhcmRlZENhbGxiYWNrYCBjYWxscyBkbyBub3QgY2xhc2guIE90aGVyd2lzZSwgYVxuICAgICAgICAvLyBuZXN0ZWQgY2FsbCB3b3VsZCB0cmlnZ2VyIHRoZSBmYWtlIGV2ZW50IGhhbmRsZXJzIG9mIGFueSBjYWxsIGhpZ2hlclxuICAgICAgICAvLyBpbiB0aGUgc3RhY2suXG4gICAgICAgIGZha2VOb2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZ0VHlwZSwgY2FsbENhbGxiYWNrLCBmYWxzZSk7IC8vIFdlIGNoZWNrIGZvciB3aW5kb3cuaGFzT3duUHJvcGVydHkoJ2V2ZW50JykgdG8gcHJldmVudCB0aGVcbiAgICAgICAgLy8gd2luZG93LmV2ZW50IGFzc2lnbm1lbnQgaW4gYm90aCBJRSA8PSAxMCBhcyB0aGV5IHRocm93IGFuIGVycm9yXG4gICAgICAgIC8vIFwiTWVtYmVyIG5vdCBmb3VuZFwiIGluIHN0cmljdCBtb2RlLCBhbmQgaW4gRmlyZWZveCB3aGljaCBkb2VzIG5vdFxuICAgICAgICAvLyBzdXBwb3J0IHdpbmRvdy5ldmVudC5cblxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5ldmVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lmhhc093blByb3BlcnR5KCdldmVudCcpKSB7XG4gICAgICAgICAgd2luZG93LmV2ZW50ID0gd2luZG93RXZlbnQ7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gQ3JlYXRlIGFuIGV2ZW50IGhhbmRsZXIgZm9yIG91ciBmYWtlIGV2ZW50LiBXZSB3aWxsIHN5bmNocm9ub3VzbHlcbiAgICAgIC8vIGRpc3BhdGNoIG91ciBmYWtlIGV2ZW50IHVzaW5nIGBkaXNwYXRjaEV2ZW50YC4gSW5zaWRlIHRoZSBoYW5kbGVyLCB3ZVxuICAgICAgLy8gY2FsbCB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjay5cblxuXG4gICAgICB2YXIgZnVuY0FyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpO1xuXG4gICAgICBmdW5jdGlvbiBjYWxsQ2FsbGJhY2soKSB7XG4gICAgICAgIGRpZENhbGwgPSB0cnVlO1xuICAgICAgICByZXN0b3JlQWZ0ZXJEaXNwYXRjaCgpO1xuICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGZ1bmNBcmdzKTtcbiAgICAgICAgZGlkRXJyb3IgPSBmYWxzZTtcbiAgICAgIH0gLy8gQ3JlYXRlIGEgZ2xvYmFsIGVycm9yIGV2ZW50IGhhbmRsZXIuIFdlIHVzZSB0aGlzIHRvIGNhcHR1cmUgdGhlIHZhbHVlXG4gICAgICAvLyB0aGF0IHdhcyB0aHJvd24uIEl0J3MgcG9zc2libGUgdGhhdCB0aGlzIGVycm9yIGhhbmRsZXIgd2lsbCBmaXJlIG1vcmVcbiAgICAgIC8vIHRoYW4gb25jZTsgZm9yIGV4YW1wbGUsIGlmIG5vbi1SZWFjdCBjb2RlIGFsc28gY2FsbHMgYGRpc3BhdGNoRXZlbnRgXG4gICAgICAvLyBhbmQgYSBoYW5kbGVyIGZvciB0aGF0IGV2ZW50IHRocm93cy4gV2Ugc2hvdWxkIGJlIHJlc2lsaWVudCB0byBtb3N0IG9mXG4gICAgICAvLyB0aG9zZSBjYXNlcy4gRXZlbiBpZiBvdXIgZXJyb3IgZXZlbnQgaGFuZGxlciBmaXJlcyBtb3JlIHRoYW4gb25jZSwgdGhlXG4gICAgICAvLyBsYXN0IGVycm9yIGV2ZW50IGlzIGFsd2F5cyB1c2VkLiBJZiB0aGUgY2FsbGJhY2sgYWN0dWFsbHkgZG9lcyBlcnJvcixcbiAgICAgIC8vIHdlIGtub3cgdGhhdCB0aGUgbGFzdCBlcnJvciBldmVudCBpcyB0aGUgY29ycmVjdCBvbmUsIGJlY2F1c2UgaXQncyBub3RcbiAgICAgIC8vIHBvc3NpYmxlIGZvciBhbnl0aGluZyBlbHNlIHRvIGhhdmUgaGFwcGVuZWQgaW4gYmV0d2VlbiBvdXIgY2FsbGJhY2tcbiAgICAgIC8vIGVycm9yaW5nIGFuZCB0aGUgY29kZSB0aGF0IGZvbGxvd3MgdGhlIGBkaXNwYXRjaEV2ZW50YCBjYWxsIGJlbG93LiBJZlxuICAgICAgLy8gdGhlIGNhbGxiYWNrIGRvZXNuJ3QgZXJyb3IsIGJ1dCB0aGUgZXJyb3IgZXZlbnQgd2FzIGZpcmVkLCB3ZSBrbm93IHRvXG4gICAgICAvLyBpZ25vcmUgaXQgYmVjYXVzZSBgZGlkRXJyb3JgIHdpbGwgYmUgZmFsc2UsIGFzIGRlc2NyaWJlZCBhYm92ZS5cblxuXG4gICAgICB2YXIgZXJyb3I7IC8vIFVzZSB0aGlzIHRvIHRyYWNrIHdoZXRoZXIgdGhlIGVycm9yIGV2ZW50IGlzIGV2ZXIgY2FsbGVkLlxuXG4gICAgICB2YXIgZGlkU2V0RXJyb3IgPSBmYWxzZTtcbiAgICAgIHZhciBpc0Nyb3NzT3JpZ2luRXJyb3IgPSBmYWxzZTtcblxuICAgICAgZnVuY3Rpb24gaGFuZGxlV2luZG93RXJyb3IoZXZlbnQpIHtcbiAgICAgICAgZXJyb3IgPSBldmVudC5lcnJvcjtcbiAgICAgICAgZGlkU2V0RXJyb3IgPSB0cnVlO1xuXG4gICAgICAgIGlmIChlcnJvciA9PT0gbnVsbCAmJiBldmVudC5jb2xubyA9PT0gMCAmJiBldmVudC5saW5lbm8gPT09IDApIHtcbiAgICAgICAgICBpc0Nyb3NzT3JpZ2luRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAvLyBTb21lIG90aGVyIGVycm9yIGhhbmRsZXIgaGFzIHByZXZlbnRlZCBkZWZhdWx0LlxuICAgICAgICAgIC8vIEJyb3dzZXJzIHNpbGVuY2UgdGhlIGVycm9yIHJlcG9ydCBpZiB0aGlzIGhhcHBlbnMuXG4gICAgICAgICAgLy8gV2UnbGwgcmVtZW1iZXIgdGhpcyB0byBsYXRlciBkZWNpZGUgd2hldGhlciB0byBsb2cgaXQgb3Igbm90LlxuICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGVycm9yLl9zdXBwcmVzc0xvZ2dpbmcgPSB0cnVlO1xuICAgICAgICAgICAgfSBjYXRjaCAoaW5uZXIpIHsvLyBJZ25vcmUuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vIENyZWF0ZSBhIGZha2UgZXZlbnQgdHlwZS5cblxuXG4gICAgICB2YXIgZXZ0VHlwZSA9IFwicmVhY3QtXCIgKyAobmFtZSA/IG5hbWUgOiAnaW52b2tlZ3VhcmRlZGNhbGxiYWNrJyk7IC8vIEF0dGFjaCBvdXIgZXZlbnQgaGFuZGxlcnNcblxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgaGFuZGxlV2luZG93RXJyb3IpO1xuICAgICAgZmFrZU5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldnRUeXBlLCBjYWxsQ2FsbGJhY2ssIGZhbHNlKTsgLy8gU3luY2hyb25vdXNseSBkaXNwYXRjaCBvdXIgZmFrZSBldmVudC4gSWYgdGhlIHVzZXItcHJvdmlkZWQgZnVuY3Rpb25cbiAgICAgIC8vIGVycm9ycywgaXQgd2lsbCB0cmlnZ2VyIG91ciBnbG9iYWwgZXJyb3IgaGFuZGxlci5cblxuICAgICAgZXZ0LmluaXRFdmVudChldnRUeXBlLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgZmFrZU5vZGUuZGlzcGF0Y2hFdmVudChldnQpO1xuXG4gICAgICBpZiAod2luZG93RXZlbnREZXNjcmlwdG9yKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdldmVudCcsIHdpbmRvd0V2ZW50RGVzY3JpcHRvcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaWRDYWxsICYmIGRpZEVycm9yKSB7XG4gICAgICAgIGlmICghZGlkU2V0RXJyb3IpIHtcbiAgICAgICAgICAvLyBUaGUgY2FsbGJhY2sgZXJyb3JlZCwgYnV0IHRoZSBlcnJvciBldmVudCBuZXZlciBmaXJlZC5cbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKCdBbiBlcnJvciB3YXMgdGhyb3duIGluc2lkZSBvbmUgb2YgeW91ciBjb21wb25lbnRzLCBidXQgUmVhY3QgJyArIFwiZG9lc24ndCBrbm93IHdoYXQgaXQgd2FzLiBUaGlzIGlzIGxpa2VseSBkdWUgdG8gYnJvd3NlciBcIiArICdmbGFraW5lc3MuIFJlYWN0IGRvZXMgaXRzIGJlc3QgdG8gcHJlc2VydmUgdGhlIFwiUGF1c2Ugb24gJyArICdleGNlcHRpb25zXCIgYmVoYXZpb3Igb2YgdGhlIERldlRvb2xzLCB3aGljaCByZXF1aXJlcyBzb21lICcgKyBcIkRFVi1tb2RlIG9ubHkgdHJpY2tzLiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlc2UgZG9uJ3Qgd29yayBpbiBcIiArICd5b3VyIGJyb3dzZXIuIFRyeSB0cmlnZ2VyaW5nIHRoZSBlcnJvciBpbiBwcm9kdWN0aW9uIG1vZGUsICcgKyAnb3Igc3dpdGNoaW5nIHRvIGEgbW9kZXJuIGJyb3dzZXIuIElmIHlvdSBzdXNwZWN0IHRoYXQgdGhpcyBpcyAnICsgJ2FjdHVhbGx5IGFuIGlzc3VlIHdpdGggUmVhY3QsIHBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQ3Jvc3NPcmlnaW5FcnJvcikge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXCJBIGNyb3NzLW9yaWdpbiBlcnJvciB3YXMgdGhyb3duLiBSZWFjdCBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIFwiICsgJ3RoZSBhY3R1YWwgZXJyb3Igb2JqZWN0IGluIGRldmVsb3BtZW50LiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY3Jvc3NvcmlnaW4tZXJyb3IgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgfSAvLyBSZW1vdmUgb3VyIGV2ZW50IGxpc3RlbmVyc1xuXG5cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGhhbmRsZVdpbmRvd0Vycm9yKTtcblxuICAgICAgaWYgKCFkaWRDYWxsKSB7XG4gICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHJlYWxseSB3cm9uZywgYW5kIG91ciBldmVudCB3YXMgbm90IGRpc3BhdGNoZWQuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY3MzRcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjU4NVxuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIHByb2R1Y3Rpb24gaW1wbGVtZW50YXRpb24uXG4gICAgICAgIHJlc3RvcmVBZnRlckRpc3BhdGNoKCk7XG4gICAgICAgIHJldHVybiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG52YXIgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxID0gaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbDtcblxudmFyIGhhc0Vycm9yID0gZmFsc2U7XG52YXIgY2F1Z2h0RXJyb3IgPSBudWxsOyAvLyBVc2VkIGJ5IGV2ZW50IHN5c3RlbSB0byBjYXB0dXJlL3JldGhyb3cgdGhlIGZpcnN0IGVycm9yLlxuXG52YXIgaGFzUmV0aHJvd0Vycm9yID0gZmFsc2U7XG52YXIgcmV0aHJvd0Vycm9yID0gbnVsbDtcbnZhciByZXBvcnRlciA9IHtcbiAgb25FcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gIH1cbn07XG4vKipcbiAqIENhbGwgYSBmdW5jdGlvbiB3aGlsZSBndWFyZGluZyBhZ2FpbnN0IGVycm9ycyB0aGF0IGhhcHBlbnMgd2l0aGluIGl0LlxuICogUmV0dXJucyBhbiBlcnJvciBpZiBpdCB0aHJvd3MsIG90aGVyd2lzZSBudWxsLlxuICpcbiAqIEluIHByb2R1Y3Rpb24sIHRoaXMgaXMgaW1wbGVtZW50ZWQgdXNpbmcgYSB0cnktY2F0Y2guIFRoZSByZWFzb24gd2UgZG9uJ3RcbiAqIHVzZSBhIHRyeS1jYXRjaCBkaXJlY3RseSBpcyBzbyB0aGF0IHdlIGNhbiBzd2FwIG91dCBhIGRpZmZlcmVudFxuICogaW1wbGVtZW50YXRpb24gaW4gREVWIG1vZGUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgdGhlIGd1YXJkIHRvIHVzZSBmb3IgbG9nZ2luZyBvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZVxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIHVzZSB3aGVuIGNhbGxpbmcgdGhlIGZ1bmN0aW9uXG4gKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJndW1lbnRzIGZvciBmdW5jdGlvblxuICovXG5cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFjayhuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGhhc0Vycm9yID0gZmFsc2U7XG4gIGNhdWdodEVycm9yID0gbnVsbDtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxLmFwcGx5KHJlcG9ydGVyLCBhcmd1bWVudHMpO1xufVxuLyoqXG4gKiBTYW1lIGFzIGludm9rZUd1YXJkZWRDYWxsYmFjaywgYnV0IGluc3RlYWQgb2YgcmV0dXJuaW5nIGFuIGVycm9yLCBpdCBzdG9yZXNcbiAqIGl0IGluIGEgZ2xvYmFsIHNvIGl0IGNhbiBiZSByZXRocm93biBieSBgcmV0aHJvd0NhdWdodEVycm9yYCBsYXRlci5cbiAqIFRPRE86IFNlZSBpZiBjYXVnaHRFcnJvciBhbmQgcmV0aHJvd0Vycm9yIGNhbiBiZSB1bmlmaWVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9mIHRoZSBndWFyZCB0byB1c2UgZm9yIGxvZ2dpbmcgb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2VcbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byB1c2Ugd2hlbiBjYWxsaW5nIHRoZSBmdW5jdGlvblxuICogQHBhcmFtIHsuLi4qfSBhcmdzIEFyZ3VtZW50cyBmb3IgZnVuY3Rpb25cbiAqL1xuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tBbmRDYXRjaEZpcnN0RXJyb3IobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICBpZiAoaGFzRXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG5cbiAgICBpZiAoIWhhc1JldGhyb3dFcnJvcikge1xuICAgICAgaGFzUmV0aHJvd0Vycm9yID0gdHJ1ZTtcbiAgICAgIHJldGhyb3dFcnJvciA9IGVycm9yO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBEdXJpbmcgZXhlY3V0aW9uIG9mIGd1YXJkZWQgZnVuY3Rpb25zIHdlIHdpbGwgY2FwdHVyZSB0aGUgZmlyc3QgZXJyb3Igd2hpY2hcbiAqIHdlIHdpbGwgcmV0aHJvdyB0byBiZSBoYW5kbGVkIGJ5IHRoZSB0b3AgbGV2ZWwgZXJyb3IgaGFuZGxlci5cbiAqL1xuXG5mdW5jdGlvbiByZXRocm93Q2F1Z2h0RXJyb3IoKSB7XG4gIGlmIChoYXNSZXRocm93RXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSByZXRocm93RXJyb3I7XG4gICAgaGFzUmV0aHJvd0Vycm9yID0gZmFsc2U7XG4gICAgcmV0aHJvd0Vycm9yID0gbnVsbDtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuZnVuY3Rpb24gaGFzQ2F1Z2h0RXJyb3IoKSB7XG4gIHJldHVybiBoYXNFcnJvcjtcbn1cbmZ1bmN0aW9uIGNsZWFyQ2F1Z2h0RXJyb3IoKSB7XG4gIGlmIChoYXNFcnJvcikge1xuICAgIHZhciBlcnJvciA9IGNhdWdodEVycm9yO1xuICAgIGhhc0Vycm9yID0gZmFsc2U7XG4gICAgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICAgIHJldHVybiBlcnJvcjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyQ2F1Z2h0RXJyb3Igd2FzIGNhbGxlZCBidXQgbm8gZXJyb3Igd2FzIGNhcHR1cmVkLiBUaGlzIGVycm9yICcgKyAnaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBgUmVhY3RJbnN0YW5jZU1hcGAgbWFpbnRhaW5zIGEgbWFwcGluZyBmcm9tIGEgcHVibGljIGZhY2luZyBzdGF0ZWZ1bFxuICogaW5zdGFuY2UgKGtleSkgYW5kIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAodmFsdWUpLiBUaGlzIGFsbG93cyBwdWJsaWNcbiAqIG1ldGhvZHMgdG8gYWNjZXB0IHRoZSB1c2VyIGZhY2luZyBpbnN0YW5jZSBhcyBhbiBhcmd1bWVudCBhbmQgbWFwIHRoZW0gYmFja1xuICogdG8gaW50ZXJuYWwgbWV0aG9kcy5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBtb2R1bGUgaXMgY3VycmVudGx5IHNoYXJlZCBhbmQgYXNzdW1lZCB0byBiZSBzdGF0ZWxlc3MuXG4gKiBJZiB0aGlzIGJlY29tZXMgYW4gYWN0dWFsIE1hcCwgdGhhdCB3aWxsIGJyZWFrLlxuICovXG5mdW5jdGlvbiBnZXQoa2V5KSB7XG4gIHJldHVybiBrZXkuX3JlYWN0SW50ZXJuYWxzO1xufVxuZnVuY3Rpb24gaGFzKGtleSkge1xuICByZXR1cm4ga2V5Ll9yZWFjdEludGVybmFscyAhPT0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAga2V5Ll9yZWFjdEludGVybmFscyA9IHZhbHVlO1xufVxuXG4vLyBEb24ndCBjaGFuZ2UgdGhlc2UgdHdvIHZhbHVlcy4gVGhleSdyZSB1c2VkIGJ5IFJlYWN0IERldiBUb29scy5cbnZhciBOb0ZsYWdzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG4wO1xudmFyIFBlcmZvcm1lZFdvcmsgPVxuLyogICAgICAgICAgICAgICAgKi9cbjE7IC8vIFlvdSBjYW4gY2hhbmdlIHRoZSByZXN0IChhbmQgYWRkIG1vcmUpLlxuXG52YXIgUGxhY2VtZW50ID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuMjtcbnZhciBVcGRhdGUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG40O1xudmFyIENoaWxkRGVsZXRpb24gPVxuLyogICAgICAgICAgICAgICAgKi9cbjE2O1xudmFyIENvbnRlbnRSZXNldCA9XG4vKiAgICAgICAgICAgICAgICAgKi9cbjMyO1xudmFyIENhbGxiYWNrID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjY0O1xudmFyIERpZENhcHR1cmUgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjEyODtcbnZhciBGb3JjZUNsaWVudFJlbmRlciA9XG4vKiAgICAgICAgICAgICovXG4yNTY7XG52YXIgUmVmID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuNTEyO1xudmFyIFNuYXBzaG90ID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjEwMjQ7XG52YXIgUGFzc2l2ZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuMjA0ODtcbnZhciBIeWRyYXRpbmcgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG40MDk2O1xudmFyIFZpc2liaWxpdHkgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjgxOTI7XG52YXIgU3RvcmVDb25zaXN0ZW5jeSA9XG4vKiAgICAgICAgICAgICAqL1xuMTYzODQ7XG52YXIgTGlmZWN5Y2xlRWZmZWN0TWFzayA9IFBhc3NpdmUgfCBVcGRhdGUgfCBDYWxsYmFjayB8IFJlZiB8IFNuYXBzaG90IHwgU3RvcmVDb25zaXN0ZW5jeTsgLy8gVW5pb24gb2YgYWxsIGNvbW1pdCBmbGFncyAoZmxhZ3Mgd2l0aCB0aGUgbGlmZXRpbWUgb2YgYSBwYXJ0aWN1bGFyIGNvbW1pdClcblxudmFyIEhvc3RFZmZlY3RNYXNrID1cbi8qICAgICAgICAgICAgICAgKi9cbjMyNzY3OyAvLyBUaGVzZSBhcmUgbm90IHJlYWxseSBzaWRlIGVmZmVjdHMsIGJ1dCB3ZSBzdGlsbCByZXVzZSB0aGlzIGZpZWxkLlxuXG52YXIgSW5jb21wbGV0ZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuMzI3Njg7XG52YXIgU2hvdWxkQ2FwdHVyZSA9XG4vKiAgICAgICAgICAgICAgICAqL1xuNjU1MzY7XG52YXIgRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZSA9XG4vKiAqL1xuMTMxMDcyO1xudmFyIEZvcmtlZCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEwNDg1NzY7IC8vIFN0YXRpYyB0YWdzIGRlc2NyaWJlIGFzcGVjdHMgb2YgYSBmaWJlciB0aGF0IGFyZSBub3Qgc3BlY2lmaWMgdG8gYSByZW5kZXIsXG4vLyBlLmcuIGEgZmliZXIgdXNlcyBhIHBhc3NpdmUgZWZmZWN0IChldmVuIGlmIHRoZXJlIGFyZSBubyB1cGRhdGVzIG9uIHRoaXMgcGFydGljdWxhciByZW5kZXIpLlxuLy8gVGhpcyBlbmFibGVzIHVzIHRvIGRlZmVyIG1vcmUgd29yayBpbiB0aGUgdW5tb3VudCBjYXNlLFxuLy8gc2luY2Ugd2UgY2FuIGRlZmVyIHRyYXZlcnNpbmcgdGhlIHRyZWUgZHVyaW5nIGxheW91dCB0byBsb29rIGZvciBQYXNzaXZlIGVmZmVjdHMsXG4vLyBhbmQgaW5zdGVhZCByZWx5IG9uIHRoZSBzdGF0aWMgZmxhZyBhcyBhIHNpZ25hbCB0aGF0IHRoZXJlIG1heSBiZSBjbGVhbnVwIHdvcmsuXG5cbnZhciBSZWZTdGF0aWMgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG4yMDk3MTUyO1xudmFyIExheW91dFN0YXRpYyA9XG4vKiAgICAgICAgICAgICAgICAgKi9cbjQxOTQzMDQ7XG52YXIgUGFzc2l2ZVN0YXRpYyA9XG4vKiAgICAgICAgICAgICAgICAqL1xuODM4ODYwODsgLy8gVGhlc2UgZmxhZ3MgYWxsb3cgdXMgdG8gdHJhdmVyc2UgdG8gZmliZXJzIHRoYXQgaGF2ZSBlZmZlY3RzIG9uIG1vdW50XG4vLyB3aXRob3V0IHRyYXZlcnNpbmcgdGhlIGVudGlyZSB0cmVlIGFmdGVyIGV2ZXJ5IGNvbW1pdCBmb3Jcbi8vIGRvdWJsZSBpbnZva2luZ1xuXG52YXIgTW91bnRMYXlvdXREZXYgPVxuLyogICAgICAgICAgICAgICAqL1xuMTY3NzcyMTY7XG52YXIgTW91bnRQYXNzaXZlRGV2ID1cbi8qICAgICAgICAgICAgICAqL1xuMzM1NTQ0MzI7IC8vIEdyb3VwcyBvZiBmbGFncyB0aGF0IGFyZSB1c2VkIGluIHRoZSBjb21taXQgcGhhc2UgdG8gc2tpcCBvdmVyIHRyZWVzIHRoYXRcbi8vIGRvbid0IGNvbnRhaW4gZWZmZWN0cywgYnkgY2hlY2tpbmcgc3VidHJlZUZsYWdzLlxuXG52YXIgQmVmb3JlTXV0YXRpb25NYXNrID0gLy8gVE9ETzogUmVtb3ZlIFVwZGF0ZSBmbGFnIGZyb20gYmVmb3JlIG11dGF0aW9uIHBoYXNlIGJ5IHJlLWxhbmRpbmcgVmlzaWJpbGl0eVxuLy8gZmxhZyBsb2dpYyAoc2VlICMyMDA0MylcblVwZGF0ZSB8IFNuYXBzaG90IHwgKCAwKTtcbnZhciBNdXRhdGlvbk1hc2sgPSBQbGFjZW1lbnQgfCBVcGRhdGUgfCBDaGlsZERlbGV0aW9uIHwgQ29udGVudFJlc2V0IHwgUmVmIHwgSHlkcmF0aW5nIHwgVmlzaWJpbGl0eTtcbnZhciBMYXlvdXRNYXNrID0gVXBkYXRlIHwgQ2FsbGJhY2sgfCBSZWYgfCBWaXNpYmlsaXR5OyAvLyBUT0RPOiBTcGxpdCBpbnRvIFBhc3NpdmVNb3VudE1hc2sgYW5kIFBhc3NpdmVVbm1vdW50TWFza1xuXG52YXIgUGFzc2l2ZU1hc2sgPSBQYXNzaXZlIHwgQ2hpbGREZWxldGlvbjsgLy8gVW5pb24gb2YgdGFncyB0aGF0IGRvbid0IGdldCByZXNldCBvbiBjbG9uZXMuXG4vLyBUaGlzIGFsbG93cyBjZXJ0YWluIGNvbmNlcHRzIHRvIHBlcnNpc3Qgd2l0aG91dCByZWNhbGN1bGF0aW5nIHRoZW0sXG4vLyBlLmcuIHdoZXRoZXIgYSBzdWJ0cmVlIGNvbnRhaW5zIHBhc3NpdmUgZWZmZWN0cyBvciBwb3J0YWxzLlxuXG52YXIgU3RhdGljTWFzayA9IExheW91dFN0YXRpYyB8IFBhc3NpdmVTdGF0aWMgfCBSZWZTdGF0aWM7XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xuZnVuY3Rpb24gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikge1xuICB2YXIgbm9kZSA9IGZpYmVyO1xuICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBmaWJlcjtcblxuICBpZiAoIWZpYmVyLmFsdGVybmF0ZSkge1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIGFsdGVybmF0ZSwgdGhpcyBtaWdodCBiZSBhIG5ldyB0cmVlIHRoYXQgaXNuJ3QgaW5zZXJ0ZWRcbiAgICAvLyB5ZXQuIElmIGl0IGlzLCB0aGVuIGl0IHdpbGwgaGF2ZSBhIHBlbmRpbmcgaW5zZXJ0aW9uIGVmZmVjdCBvbiBpdC5cbiAgICB2YXIgbmV4dE5vZGUgPSBub2RlO1xuXG4gICAgZG8ge1xuICAgICAgbm9kZSA9IG5leHROb2RlO1xuXG4gICAgICBpZiAoKG5vZGUuZmxhZ3MgJiAoUGxhY2VtZW50IHwgSHlkcmF0aW5nKSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhbiBpbnNlcnRpb24gb3IgaW4tcHJvZ3Jlc3MgaHlkcmF0aW9uLiBUaGUgbmVhcmVzdCBwb3NzaWJsZVxuICAgICAgICAvLyBtb3VudGVkIGZpYmVyIGlzIHRoZSBwYXJlbnQgYnV0IHdlIG5lZWQgdG8gY29udGludWUgdG8gZmlndXJlIG91dFxuICAgICAgICAvLyBpZiB0aGF0IG9uZSBpcyBzdGlsbCBtb3VudGVkLlxuICAgICAgICBuZWFyZXN0TW91bnRlZCA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBuZXh0Tm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH0gd2hpbGUgKG5leHROb2RlKTtcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAobm9kZS5yZXR1cm4pIHtcbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAobm9kZS50YWcgPT09IEhvc3RSb290KSB7XG4gICAgLy8gVE9ETzogQ2hlY2sgaWYgdGhpcyB3YXMgYSBuZXN0ZWQgSG9zdFJvb3Qgd2hlbiB1c2VkIHdpdGhcbiAgICAvLyByZW5kZXJDb250YWluZXJJbnRvU3VidHJlZS5cbiAgICByZXR1cm4gbmVhcmVzdE1vdW50ZWQ7XG4gIH0gLy8gSWYgd2UgZGlkbid0IGhpdCB0aGUgcm9vdCwgdGhhdCBtZWFucyB0aGF0IHdlJ3JlIGluIGFuIGRpc2Nvbm5lY3RlZCB0cmVlXG4gIC8vIHRoYXQgaGFzIGJlZW4gdW5tb3VudGVkLlxuXG5cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKGZpYmVyKSB7XG4gIGlmIChmaWJlci50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHN1c3BlbnNlU3RhdGUgPT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICBzdXNwZW5zZVN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ2V0Q29udGFpbmVyRnJvbUZpYmVyKGZpYmVyKSB7XG4gIHJldHVybiBmaWJlci50YWcgPT09IEhvc3RSb290ID8gZmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8gOiBudWxsO1xufVxuZnVuY3Rpb24gaXNGaWJlck1vdW50ZWQoZmliZXIpIHtcbiAgcmV0dXJuIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpID09PSBmaWJlcjtcbn1cbmZ1bmN0aW9uIGlzTW91bnRlZChjb21wb25lbnQpIHtcbiAge1xuICAgIHZhciBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ7XG5cbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgb3duZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgdmFyIG93bmVyRmliZXIgPSBvd25lcjtcbiAgICAgIHZhciBpbnN0YW5jZSA9IG93bmVyRmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICBpZiAoIWluc3RhbmNlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlcikge1xuICAgICAgICBlcnJvcignJXMgaXMgYWNjZXNzaW5nIGlzTW91bnRlZCBpbnNpZGUgaXRzIHJlbmRlcigpIGZ1bmN0aW9uLiAnICsgJ3JlbmRlcigpIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLiBJdCBzaG91bGQgJyArICduZXZlciBhY2Nlc3Mgc29tZXRoaW5nIHRoYXQgcmVxdWlyZXMgc3RhbGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyAnICsgJ3JlbmRlciwgc3VjaCBhcyByZWZzLiBNb3ZlIHRoaXMgbG9naWMgdG8gY29tcG9uZW50RGlkTW91bnQgYW5kICcgKyAnY29tcG9uZW50RGlkVXBkYXRlIGluc3RlYWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihvd25lckZpYmVyKSB8fCAnQSBjb21wb25lbnQnKTtcbiAgICAgIH1cblxuICAgICAgaW5zdGFuY2UuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQoY29tcG9uZW50KTtcblxuICBpZiAoIWZpYmVyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpID09PSBmaWJlcjtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0SXNNb3VudGVkKGZpYmVyKSB7XG4gIGlmIChnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSAhPT0gZmliZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChmaWJlcikge1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmICghYWx0ZXJuYXRlKSB7XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gYWx0ZXJuYXRlLCB0aGVuIHdlIG9ubHkgbmVlZCB0byBjaGVjayBpZiBpdCBpcyBtb3VudGVkLlxuICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgICB9XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgIT09IGZpYmVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmliZXI7XG4gIH0gLy8gSWYgd2UgaGF2ZSB0d28gcG9zc2libGUgYnJhbmNoZXMsIHdlJ2xsIHdhbGsgYmFja3dhcmRzIHVwIHRvIHRoZSByb290XG4gIC8vIHRvIHNlZSB3aGF0IHBhdGggdGhlIHJvb3QgcG9pbnRzIHRvLiBPbiB0aGUgd2F5IHdlIG1heSBoaXQgb25lIG9mIHRoZVxuICAvLyBzcGVjaWFsIGNhc2VzIGFuZCB3ZSdsbCBkZWFsIHdpdGggdGhlbS5cblxuXG4gIHZhciBhID0gZmliZXI7XG4gIHZhciBiID0gYWx0ZXJuYXRlO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIHBhcmVudEEgPSBhLnJldHVybjtcblxuICAgIGlmIChwYXJlbnRBID09PSBudWxsKSB7XG4gICAgICAvLyBXZSdyZSBhdCB0aGUgcm9vdC5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBwYXJlbnRCID0gcGFyZW50QS5hbHRlcm5hdGU7XG5cbiAgICBpZiAocGFyZW50QiA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhlcmUgaXMgbm8gYWx0ZXJuYXRlLiBUaGlzIGlzIGFuIHVudXN1YWwgY2FzZS4gQ3VycmVudGx5LCBpdCBvbmx5XG4gICAgICAvLyBoYXBwZW5zIHdoZW4gYSBTdXNwZW5zZSBjb21wb25lbnQgaXMgaGlkZGVuLiBBbiBleHRyYSBmcmFnbWVudCBmaWJlclxuICAgICAgLy8gaXMgaW5zZXJ0ZWQgaW4gYmV0d2VlbiB0aGUgU3VzcGVuc2UgZmliZXIgYW5kIGl0cyBjaGlsZHJlbi4gU2tpcFxuICAgICAgLy8gb3ZlciB0aGlzIGV4dHJhIGZyYWdtZW50IGZpYmVyIGFuZCBwcm9jZWVkIHRvIHRoZSBuZXh0IHBhcmVudC5cbiAgICAgIHZhciBuZXh0UGFyZW50ID0gcGFyZW50QS5yZXR1cm47XG5cbiAgICAgIGlmIChuZXh0UGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIGEgPSBiID0gbmV4dFBhcmVudDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIElmIHRoZXJlJ3Mgbm8gcGFyZW50LCB3ZSdyZSBhdCB0aGUgcm9vdC5cblxuXG4gICAgICBicmVhaztcbiAgICB9IC8vIElmIGJvdGggY29waWVzIG9mIHRoZSBwYXJlbnQgZmliZXIgcG9pbnQgdG8gdGhlIHNhbWUgY2hpbGQsIHdlIGNhblxuICAgIC8vIGFzc3VtZSB0aGF0IHRoZSBjaGlsZCBpcyBjdXJyZW50LiBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBiYWlsb3V0IG9uIGxvd1xuICAgIC8vIHByaW9yaXR5OiB0aGUgYmFpbGVkIG91dCBmaWJlcidzIGNoaWxkIHJldXNlcyB0aGUgY3VycmVudCBjaGlsZC5cblxuXG4gICAgaWYgKHBhcmVudEEuY2hpbGQgPT09IHBhcmVudEIuY2hpbGQpIHtcbiAgICAgIHZhciBjaGlsZCA9IHBhcmVudEEuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgICBpZiAoY2hpbGQgPT09IGEpIHtcbiAgICAgICAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQSBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgICAgICAgYXNzZXJ0SXNNb3VudGVkKHBhcmVudEEpO1xuICAgICAgICAgIHJldHVybiBmaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGlsZCA9PT0gYikge1xuICAgICAgICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBCIGlzIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgICAgICAgICBhc3NlcnRJc01vdW50ZWQocGFyZW50QSk7XG4gICAgICAgICAgcmV0dXJuIGFsdGVybmF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgIH0gLy8gV2Ugc2hvdWxkIG5ldmVyIGhhdmUgYW4gYWx0ZXJuYXRlIGZvciBhbnkgbW91bnRpbmcgbm9kZS4gU28gdGhlIG9ubHlcbiAgICAgIC8vIHdheSB0aGlzIGNvdWxkIHBvc3NpYmx5IGhhcHBlbiBpcyBpZiB0aGlzIHdhcyB1bm1vdW50ZWQsIGlmIGF0IGFsbC5cblxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgICB9XG5cbiAgICBpZiAoYS5yZXR1cm4gIT09IGIucmV0dXJuKSB7XG4gICAgICAvLyBUaGUgcmV0dXJuIHBvaW50ZXIgb2YgQSBhbmQgdGhlIHJldHVybiBwb2ludGVyIG9mIEIgcG9pbnQgdG8gZGlmZmVyZW50XG4gICAgICAvLyBmaWJlcnMuIFdlIGFzc3VtZSB0aGF0IHJldHVybiBwb2ludGVycyBuZXZlciBjcmlzcy1jcm9zcywgc28gQSBtdXN0XG4gICAgICAvLyBiZWxvbmcgdG8gdGhlIGNoaWxkIHNldCBvZiBBLnJldHVybiwgYW5kIEIgbXVzdCBiZWxvbmcgdG8gdGhlIGNoaWxkXG4gICAgICAvLyBzZXQgb2YgQi5yZXR1cm4uXG4gICAgICBhID0gcGFyZW50QTtcbiAgICAgIGIgPSBwYXJlbnRCO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgcmV0dXJuIHBvaW50ZXJzIHBvaW50IHRvIHRoZSBzYW1lIGZpYmVyLiBXZSdsbCBoYXZlIHRvIHVzZSB0aGVcbiAgICAgIC8vIGRlZmF1bHQsIHNsb3cgcGF0aDogc2NhbiB0aGUgY2hpbGQgc2V0cyBvZiBlYWNoIHBhcmVudCBhbHRlcm5hdGUgdG8gc2VlXG4gICAgICAvLyB3aGljaCBjaGlsZCBiZWxvbmdzIHRvIHdoaWNoIHNldC5cbiAgICAgIC8vXG4gICAgICAvLyBTZWFyY2ggcGFyZW50IEEncyBjaGlsZCBzZXRcbiAgICAgIHZhciBkaWRGaW5kQ2hpbGQgPSBmYWxzZTtcbiAgICAgIHZhciBfY2hpbGQgPSBwYXJlbnRBLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoX2NoaWxkKSB7XG4gICAgICAgIGlmIChfY2hpbGQgPT09IGEpIHtcbiAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgIGEgPSBwYXJlbnRBO1xuICAgICAgICAgIGIgPSBwYXJlbnRCO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF9jaGlsZCA9PT0gYikge1xuICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgYiA9IHBhcmVudEE7XG4gICAgICAgICAgYSA9IHBhcmVudEI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBfY2hpbGQgPSBfY2hpbGQuc2libGluZztcbiAgICAgIH1cblxuICAgICAgaWYgKCFkaWRGaW5kQ2hpbGQpIHtcbiAgICAgICAgLy8gU2VhcmNoIHBhcmVudCBCJ3MgY2hpbGQgc2V0XG4gICAgICAgIF9jaGlsZCA9IHBhcmVudEIuY2hpbGQ7XG5cbiAgICAgICAgd2hpbGUgKF9jaGlsZCkge1xuICAgICAgICAgIGlmIChfY2hpbGQgPT09IGEpIHtcbiAgICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgICBhID0gcGFyZW50QjtcbiAgICAgICAgICAgIGIgPSBwYXJlbnRBO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF9jaGlsZCA9PT0gYikge1xuICAgICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICAgIGIgPSBwYXJlbnRCO1xuICAgICAgICAgICAgYSA9IHBhcmVudEE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfY2hpbGQgPSBfY2hpbGQuc2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGlkRmluZENoaWxkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaGlsZCB3YXMgbm90IGZvdW5kIGluIGVpdGhlciBwYXJlbnQgc2V0LiBUaGlzIGluZGljYXRlcyBhIGJ1ZyAnICsgJ2luIFJlYWN0IHJlbGF0ZWQgdG8gdGhlIHJldHVybiBwb2ludGVyLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhLmFsdGVybmF0ZSAhPT0gYikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmV0dXJuIGZpYmVycyBzaG91bGQgYWx3YXlzIGJlIGVhY2ggb3RoZXJzJyBhbHRlcm5hdGVzLiBcIiArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfSAvLyBJZiB0aGUgcm9vdCBpcyBub3QgYSBob3N0IGNvbnRhaW5lciwgd2UncmUgaW4gYSBkaXNjb25uZWN0ZWQgdHJlZS4gSS5lLlxuICAvLyB1bm1vdW50ZWQuXG5cblxuICBpZiAoYS50YWcgIT09IEhvc3RSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gIH1cblxuICBpZiAoYS5zdGF0ZU5vZGUuY3VycmVudCA9PT0gYSkge1xuICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBBIGlzIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgICByZXR1cm4gZmliZXI7XG4gIH0gLy8gT3RoZXJ3aXNlIEIgaGFzIHRvIGJlIGN1cnJlbnQgYnJhbmNoLlxuXG5cbiAgcmV0dXJuIGFsdGVybmF0ZTtcbn1cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyKHBhcmVudCkge1xuICB2YXIgY3VycmVudFBhcmVudCA9IGZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoKHBhcmVudCk7XG4gIHJldHVybiBjdXJyZW50UGFyZW50ICE9PSBudWxsID8gZmluZEN1cnJlbnRIb3N0RmliZXJJbXBsKGN1cnJlbnRQYXJlbnQpIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRIb3N0RmliZXJJbXBsKG5vZGUpIHtcbiAgLy8gTmV4dCB3ZSdsbCBkcmlsbCBkb3duIHRoaXMgY29tcG9uZW50IHRvIGZpbmQgdGhlIGZpcnN0IEhvc3RDb21wb25lbnQvVGV4dC5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICB2YXIgbWF0Y2ggPSBmaW5kQ3VycmVudEhvc3RGaWJlckltcGwoY2hpbGQpO1xuXG4gICAgaWYgKG1hdGNoICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfVxuXG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFscyhwYXJlbnQpIHtcbiAgdmFyIGN1cnJlbnRQYXJlbnQgPSBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChwYXJlbnQpO1xuICByZXR1cm4gY3VycmVudFBhcmVudCAhPT0gbnVsbCA/IGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFsc0ltcGwoY3VycmVudFBhcmVudCkgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHNJbXBsKG5vZGUpIHtcbiAgLy8gTmV4dCB3ZSdsbCBkcmlsbCBkb3duIHRoaXMgY29tcG9uZW50IHRvIGZpbmQgdGhlIGZpcnN0IEhvc3RDb21wb25lbnQvVGV4dC5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICBpZiAoY2hpbGQudGFnICE9PSBIb3N0UG9ydGFsKSB7XG4gICAgICB2YXIgbWF0Y2ggPSBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHNJbXBsKGNoaWxkKTtcblxuICAgICAgaWYgKG1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gVGhpcyBtb2R1bGUgb25seSBleGlzdHMgYXMgYW4gRVNNIHdyYXBwZXIgYXJvdW5kIHRoZSBleHRlcm5hbCBDb21tb25KU1xudmFyIHNjaGVkdWxlQ2FsbGJhY2sgPSBTY2hlZHVsZXIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaztcbnZhciBjYW5jZWxDYWxsYmFjayA9IFNjaGVkdWxlci51bnN0YWJsZV9jYW5jZWxDYWxsYmFjaztcbnZhciBzaG91bGRZaWVsZCA9IFNjaGVkdWxlci51bnN0YWJsZV9zaG91bGRZaWVsZDtcbnZhciByZXF1ZXN0UGFpbnQgPSBTY2hlZHVsZXIudW5zdGFibGVfcmVxdWVzdFBhaW50O1xudmFyIG5vdyA9IFNjaGVkdWxlci51bnN0YWJsZV9ub3c7XG52YXIgZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSBTY2hlZHVsZXIudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWw7XG52YXIgSW1tZWRpYXRlUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHk7XG52YXIgVXNlckJsb2NraW5nUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHk7XG52YXIgTm9ybWFsUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHk7XG52YXIgTG93UHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfTG93UHJpb3JpdHk7XG52YXIgSWRsZVByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0lkbGVQcmlvcml0eTtcbi8vIHRoaXMgZG9lc24ndCBhY3R1YWxseSBleGlzdCBvbiB0aGUgc2NoZWR1bGVyLCBidXQgaXQgKmRvZXMqXG4vLyBvbiBzY2hlZHVsZXIvdW5zdGFibGVfbW9jaywgd2hpY2ggd2UnbGwgbmVlZCBmb3IgaW50ZXJuYWwgdGVzdGluZ1xudmFyIHVuc3RhYmxlX3lpZWxkVmFsdWUgPSBTY2hlZHVsZXIudW5zdGFibGVfeWllbGRWYWx1ZTtcbnZhciB1bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZSA9IFNjaGVkdWxlci51bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZTtcblxudmFyIHJlbmRlcmVySUQgPSBudWxsO1xudmFyIGluamVjdGVkSG9vayA9IG51bGw7XG52YXIgaW5qZWN0ZWRQcm9maWxpbmdIb29rcyA9IG51bGw7XG52YXIgaGFzTG9nZ2VkRXJyb3IgPSBmYWxzZTtcbnZhciBpc0RldlRvb2xzUHJlc2VudCA9IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnO1xuZnVuY3Rpb24gaW5qZWN0SW50ZXJuYWxzKGludGVybmFscykge1xuICBpZiAodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBObyBEZXZUb29sc1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBob29rID0gX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fO1xuXG4gIGlmIChob29rLmlzRGlzYWJsZWQpIHtcbiAgICAvLyBUaGlzIGlzbid0IGEgcmVhbCBwcm9wZXJ0eSBvbiB0aGUgaG9vaywgYnV0IGl0IGNhbiBiZSBzZXQgdG8gb3B0IG91dFxuICAgIC8vIG9mIERldlRvb2xzIGludGVncmF0aW9uIGFuZCBhc3NvY2lhdGVkIHdhcm5pbmdzIGFuZCBsb2dzLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMzg3N1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCFob29rLnN1cHBvcnRzRmliZXIpIHtcbiAgICB7XG4gICAgICBlcnJvcignVGhlIGluc3RhbGxlZCB2ZXJzaW9uIG9mIFJlYWN0IERldlRvb2xzIGlzIHRvbyBvbGQgYW5kIHdpbGwgbm90IHdvcmsgJyArICd3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgUmVhY3QuIFBsZWFzZSB1cGRhdGUgUmVhY3QgRGV2VG9vbHMuICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LWRldnRvb2xzJyk7XG4gICAgfSAvLyBEZXZUb29scyBleGlzdHMsIGV2ZW4gdGhvdWdoIGl0IGRvZXNuJ3Qgc3VwcG9ydCBGaWJlci5cblxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB0cnkge1xuICAgIGlmIChlbmFibGVTY2hlZHVsaW5nUHJvZmlsZXIpIHtcbiAgICAgIC8vIENvbmRpdGlvbmFsbHkgaW5qZWN0IHRoZXNlIGhvb2tzIG9ubHkgaWYgVGltZWxpbmUgcHJvZmlsZXIgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgYnVpbGQuXG4gICAgICAvLyBUaGlzIGdpdmVzIERldlRvb2xzIGEgd2F5IHRvIGZlYXR1cmUgZGV0ZWN0IHRoYXQgaXNuJ3QgdGllZCB0byB2ZXJzaW9uIG51bWJlclxuICAgICAgLy8gKHNpbmNlIHByb2ZpbGluZyBhbmQgdGltZWxpbmUgYXJlIGNvbnRyb2xsZWQgYnkgZGlmZmVyZW50IGZlYXR1cmUgZmxhZ3MpLlxuICAgICAgaW50ZXJuYWxzID0gYXNzaWduKHt9LCBpbnRlcm5hbHMsIHtcbiAgICAgICAgZ2V0TGFuZUxhYmVsTWFwOiBnZXRMYW5lTGFiZWxNYXAsXG4gICAgICAgIGluamVjdFByb2ZpbGluZ0hvb2tzOiBpbmplY3RQcm9maWxpbmdIb29rc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVuZGVyZXJJRCA9IGhvb2suaW5qZWN0KGludGVybmFscyk7IC8vIFdlIGhhdmUgc3VjY2Vzc2Z1bGx5IGluamVjdGVkLCBzbyBub3cgaXQgaXMgc2FmZSB0byBzZXQgdXAgaG9va3MuXG5cbiAgICBpbmplY3RlZEhvb2sgPSBob29rO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBDYXRjaCBhbGwgZXJyb3JzIGJlY2F1c2UgaXQgaXMgdW5zYWZlIHRvIHRocm93IGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiAgICB7XG4gICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcy4nLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChob29rLmNoZWNrRENFKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgcmVhbCBEZXZUb29scy5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGxpa2VseSBhIGhvb2sgaW5zdGFsbGVkIGJ5IEZhc3QgUmVmcmVzaCBydW50aW1lLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gb25TY2hlZHVsZVJvb3Qocm9vdCwgY2hpbGRyZW4pIHtcbiAge1xuICAgIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vblNjaGVkdWxlRmliZXJSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbmplY3RlZEhvb2sub25TY2hlZHVsZUZpYmVyUm9vdChyZW5kZXJlcklELCByb290LCBjaGlsZHJlbik7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCAhaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG9uQ29tbWl0Um9vdChyb290LCBldmVudFByaW9yaXR5KSB7XG4gIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyUm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICB2YXIgZGlkRXJyb3IgPSAocm9vdC5jdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IERpZENhcHR1cmU7XG5cbiAgICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyKSB7XG4gICAgICAgIHZhciBzY2hlZHVsZXJQcmlvcml0eTtcblxuICAgICAgICBzd2l0Y2ggKGV2ZW50UHJpb3JpdHkpIHtcbiAgICAgICAgICBjYXNlIERpc2NyZXRlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gSW1tZWRpYXRlUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgQ29udGludW91c0V2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IFVzZXJCbG9ja2luZ1ByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIERlZmF1bHRFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBJZGxlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gSWRsZVByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIHNjaGVkdWxlclByaW9yaXR5LCBkaWRFcnJvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCwgdW5kZWZpbmVkLCBkaWRFcnJvcik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB7XG4gICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG9uUG9zdENvbW1pdFJvb3Qocm9vdCkge1xuICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2sub25Qb3N0Q29tbWl0RmliZXJSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGluamVjdGVkSG9vay5vblBvc3RDb21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB7XG4gICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG9uQ29tbWl0VW5tb3VudChmaWJlcikge1xuICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJVbm1vdW50KHJlbmRlcmVySUQsIGZpYmVyKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMobmV3SXNTdHJpY3RNb2RlKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIHVuc3RhYmxlX3lpZWxkVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFdlJ3JlIGluIGEgdGVzdCBiZWNhdXNlIFNjaGVkdWxlci51bnN0YWJsZV95aWVsZFZhbHVlIG9ubHkgZXhpc3RzXG4gICAgICAvLyBpbiBTY2hlZHVsZXJNb2NrLiBUbyByZWR1Y2UgdGhlIG5vaXNlIGluIHN0cmljdCBtb2RlIHRlc3RzLFxuICAgICAgLy8gc3VwcHJlc3Mgd2FybmluZ3MgYW5kIGRpc2FibGUgc2NoZWR1bGVyIHlpZWxkaW5nIGR1cmluZyB0aGUgZG91YmxlIHJlbmRlclxuICAgICAgdW5zdGFibGVfc2V0RGlzYWJsZVlpZWxkVmFsdWUobmV3SXNTdHJpY3RNb2RlKTtcbiAgICAgIHNldFN1cHByZXNzV2FybmluZyhuZXdJc1N0cmljdE1vZGUpO1xuICAgIH1cblxuICAgIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5zZXRTdHJpY3RNb2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbmplY3RlZEhvb2suc2V0U3RyaWN0TW9kZShyZW5kZXJlcklELCBuZXdJc1N0cmljdE1vZGUpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0gLy8gUHJvZmlsZXIgQVBJIGhvb2tzXG5cbmZ1bmN0aW9uIGluamVjdFByb2ZpbGluZ0hvb2tzKHByb2ZpbGluZ0hvb2tzKSB7XG4gIGluamVjdGVkUHJvZmlsaW5nSG9va3MgPSBwcm9maWxpbmdIb29rcztcbn1cblxuZnVuY3Rpb24gZ2V0TGFuZUxhYmVsTWFwKCkge1xuICB7XG4gICAgdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAgICB2YXIgbGFuZSA9IDE7XG5cbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgVG90YWxMYW5lczsgaW5kZXgrKykge1xuICAgICAgdmFyIGxhYmVsID0gZ2V0TGFiZWxGb3JMYW5lKGxhbmUpO1xuICAgICAgbWFwLnNldChsYW5lLCBsYWJlbCk7XG4gICAgICBsYW5lICo9IDI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrQ29tbWl0U3RhcnRlZChsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0YXJ0ZWQobGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbW1pdFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tbWl0U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tbWl0U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50RXJyb3JlZChmaWJlciwgdGhyb3duVmFsdWUsIGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50RXJyb3JlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50RXJyb3JlZChmaWJlciwgdGhyb3duVmFsdWUsIGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRTdXNwZW5kZWQoZmliZXIsIHdha2VhYmxlLCBsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFN1c3BlbmRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50U3VzcGVuZGVkKGZpYmVyLCB3YWtlYWJsZSwgbGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0xheW91dEVmZmVjdHNTdGFydGVkKGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrTGF5b3V0RWZmZWN0c1N0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0xheW91dEVmZmVjdHNTdGFydGVkKGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtQYXNzaXZlRWZmZWN0c1N0YXJ0ZWQobGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtQYXNzaXZlRWZmZWN0c1N0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1Bhc3NpdmVFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1Bhc3NpdmVFZmZlY3RzU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUmVuZGVyU3RhcnRlZChsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0YXJ0ZWQobGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlcllpZWxkZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyWWllbGRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyWWllbGRlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlclN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlclNjaGVkdWxlZChsYW5lKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU2NoZWR1bGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTY2hlZHVsZWQobGFuZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrRm9yY2VVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrRm9yY2VVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIE5vTW9kZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMDsgLy8gVE9ETzogUmVtb3ZlIENvbmN1cnJlbnRNb2RlIGJ5IHJlYWRpbmcgZnJvbSB0aGUgcm9vdCB0YWcgaW5zdGVhZFxuXG52YXIgQ29uY3VycmVudE1vZGUgPVxuLyogICAgICAgICAgICAgICAgICovXG4xO1xudmFyIFByb2ZpbGVNb2RlID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuMjtcbnZhciBTdHJpY3RMZWdhY3lNb2RlID1cbi8qICAgICAgICAgICAgICAgKi9cbjg7XG52YXIgU3RyaWN0RWZmZWN0c01vZGUgPVxuLyogICAgICAgICAgICAgICovXG4xNjtcblxuLy8gVE9ETzogVGhpcyBpcyBwcmV0dHkgd2VsbCBzdXBwb3J0ZWQgYnkgYnJvd3NlcnMuIE1heWJlIHdlIGNhbiBkcm9wIGl0LlxudmFyIGNsejMyID0gTWF0aC5jbHozMiA/IE1hdGguY2x6MzIgOiBjbHozMkZhbGxiYWNrOyAvLyBDb3VudCBsZWFkaW5nIHplcm9zLlxuLy8gQmFzZWQgb246XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9NYXRoL2NsejMyXG5cbnZhciBsb2cgPSBNYXRoLmxvZztcbnZhciBMTjIgPSBNYXRoLkxOMjtcblxuZnVuY3Rpb24gY2x6MzJGYWxsYmFjayh4KSB7XG4gIHZhciBhc1VpbnQgPSB4ID4+PiAwO1xuXG4gIGlmIChhc1VpbnQgPT09IDApIHtcbiAgICByZXR1cm4gMzI7XG4gIH1cblxuICByZXR1cm4gMzEgLSAobG9nKGFzVWludCkgLyBMTjIgfCAwKSB8IDA7XG59XG5cbi8vIElmIHRob3NlIHZhbHVlcyBhcmUgY2hhbmdlZCB0aGF0IHBhY2thZ2Ugc2hvdWxkIGJlIHJlYnVpbHQgYW5kIHJlZGVwbG95ZWQuXG5cbnZhciBUb3RhbExhbmVzID0gMzE7XG52YXIgTm9MYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4wO1xudmFyIE5vTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjA7XG52YXIgU3luY0xhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTtcbnZhciBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lID1cbi8qICAgICovXG4yO1xudmFyIElucHV0Q29udGludW91c0xhbmUgPVxuLyogICAgICAgICAgICAgKi9cbjQ7XG52YXIgRGVmYXVsdEh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAqL1xuODtcbnZhciBEZWZhdWx0TGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICovXG4xNjtcbnZhciBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMzI7XG52YXIgVHJhbnNpdGlvbkxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDE5NDI0MDtcbnZhciBUcmFuc2l0aW9uTGFuZTEgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuNjQ7XG52YXIgVHJhbnNpdGlvbkxhbmUyID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEyODtcbnZhciBUcmFuc2l0aW9uTGFuZTMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjU2O1xudmFyIFRyYW5zaXRpb25MYW5lNCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG41MTI7XG52YXIgVHJhbnNpdGlvbkxhbmU1ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEwMjQ7XG52YXIgVHJhbnNpdGlvbkxhbmU2ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjIwNDg7XG52YXIgVHJhbnNpdGlvbkxhbmU3ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjQwOTY7XG52YXIgVHJhbnNpdGlvbkxhbmU4ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjgxOTI7XG52YXIgVHJhbnNpdGlvbkxhbmU5ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjE2Mzg0O1xudmFyIFRyYW5zaXRpb25MYW5lMTAgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4zMjc2ODtcbnZhciBUcmFuc2l0aW9uTGFuZTExID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNjU1MzY7XG52YXIgVHJhbnNpdGlvbkxhbmUxMiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEzMTA3MjtcbnZhciBUcmFuc2l0aW9uTGFuZTEzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjYyMTQ0O1xudmFyIFRyYW5zaXRpb25MYW5lMTQgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG41MjQyODg7XG52YXIgVHJhbnNpdGlvbkxhbmUxNSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEwNDg1NzY7XG52YXIgVHJhbnNpdGlvbkxhbmUxNiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjIwOTcxNTI7XG52YXIgUmV0cnlMYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTMwMDIzNDI0O1xudmFyIFJldHJ5TGFuZTEgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG40MTk0MzA0O1xudmFyIFJldHJ5TGFuZTIgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG44Mzg4NjA4O1xudmFyIFJldHJ5TGFuZTMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4xNjc3NzIxNjtcbnZhciBSZXRyeUxhbmU0ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMzM1NTQ0MzI7XG52YXIgUmV0cnlMYW5lNSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjY3MTA4ODY0O1xudmFyIFNvbWVSZXRyeUxhbmUgPSBSZXRyeUxhbmUxO1xudmFyIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgKi9cbjEzNDIxNzcyODtcbnZhciBOb25JZGxlTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4yNjg0MzU0NTU7XG52YXIgSWRsZUh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAgICAqL1xuMjY4NDM1NDU2O1xudmFyIElkbGVMYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjUzNjg3MDkxMjtcbnZhciBPZmZzY3JlZW5MYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICovXG4xMDczNzQxODI0OyAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHRoZSBleHBlcmltZW50YWwgdGltZWxpbmUgKHJlYWN0LWRldnRvb2xzLXRpbWVsaW5lKVxuLy8gSXQgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBMYW5lcyB2YWx1ZXMgYWJvdmUuXG5cbmZ1bmN0aW9uIGdldExhYmVsRm9yTGFuZShsYW5lKSB7XG4gIHtcbiAgICBpZiAobGFuZSAmIFN5bmNMYW5lKSB7XG4gICAgICByZXR1cm4gJ1N5bmMnO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdJbnB1dENvbnRpbnVvdXNIeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgSW5wdXRDb250aW51b3VzTGFuZSkge1xuICAgICAgcmV0dXJuICdJbnB1dENvbnRpbnVvdXMnO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgRGVmYXVsdEh5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnRGVmYXVsdEh5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBEZWZhdWx0TGFuZSkge1xuICAgICAgcmV0dXJuICdEZWZhdWx0JztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ1RyYW5zaXRpb25IeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgVHJhbnNpdGlvbkxhbmVzKSB7XG4gICAgICByZXR1cm4gJ1RyYW5zaXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgUmV0cnlMYW5lcykge1xuICAgICAgcmV0dXJuICdSZXRyeSc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBTZWxlY3RpdmVIeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ1NlbGVjdGl2ZUh5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBJZGxlSHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdJZGxlSHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIElkbGVMYW5lKSB7XG4gICAgICByZXR1cm4gJ0lkbGUnO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgT2Zmc2NyZWVuTGFuZSkge1xuICAgICAgcmV0dXJuICdPZmZzY3JlZW4nO1xuICAgIH1cbiAgfVxufVxudmFyIE5vVGltZXN0YW1wID0gLTE7XG52YXIgbmV4dFRyYW5zaXRpb25MYW5lID0gVHJhbnNpdGlvbkxhbmUxO1xudmFyIG5leHRSZXRyeUxhbmUgPSBSZXRyeUxhbmUxO1xuXG5mdW5jdGlvbiBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhsYW5lcykge1xuICBzd2l0Y2ggKGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpKSB7XG4gICAgY2FzZSBTeW5jTGFuZTpcbiAgICAgIHJldHVybiBTeW5jTGFuZTtcblxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNMYW5lOlxuICAgICAgcmV0dXJuIElucHV0Q29udGludW91c0xhbmU7XG5cbiAgICBjYXNlIERlZmF1bHRIeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIERlZmF1bHRIeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBEZWZhdWx0TGFuZTpcbiAgICAgIHJldHVybiBEZWZhdWx0TGFuZTtcblxuICAgIGNhc2UgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lODpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lOTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTA6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTExOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTY6XG4gICAgICByZXR1cm4gbGFuZXMgJiBUcmFuc2l0aW9uTGFuZXM7XG5cbiAgICBjYXNlIFJldHJ5TGFuZTE6XG4gICAgY2FzZSBSZXRyeUxhbmUyOlxuICAgIGNhc2UgUmV0cnlMYW5lMzpcbiAgICBjYXNlIFJldHJ5TGFuZTQ6XG4gICAgY2FzZSBSZXRyeUxhbmU1OlxuICAgICAgcmV0dXJuIGxhbmVzICYgUmV0cnlMYW5lcztcblxuICAgIGNhc2UgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBTZWxlY3RpdmVIeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBJZGxlSHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBJZGxlSHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgSWRsZUxhbmU6XG4gICAgICByZXR1cm4gSWRsZUxhbmU7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkxhbmU6XG4gICAgICByZXR1cm4gT2Zmc2NyZWVuTGFuZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIGVycm9yKCdTaG91bGQgaGF2ZSBmb3VuZCBtYXRjaGluZyBsYW5lcy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH0gLy8gVGhpcyBzaG91bGRuJ3QgYmUgcmVhY2hhYmxlLCBidXQgYXMgYSBmYWxsYmFjaywgcmV0dXJuIHRoZSBlbnRpcmUgYml0bWFzay5cblxuXG4gICAgICByZXR1cm4gbGFuZXM7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TmV4dExhbmVzKHJvb3QsIHdpcExhbmVzKSB7XG4gIC8vIEVhcmx5IGJhaWxvdXQgaWYgdGhlcmUncyBubyBwZW5kaW5nIHdvcmsgbGVmdC5cbiAgdmFyIHBlbmRpbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzO1xuXG4gIGlmIChwZW5kaW5nTGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm4gTm9MYW5lcztcbiAgfVxuXG4gIHZhciBuZXh0TGFuZXMgPSBOb0xhbmVzO1xuICB2YXIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzO1xuICB2YXIgcGluZ2VkTGFuZXMgPSByb290LnBpbmdlZExhbmVzOyAvLyBEbyBub3Qgd29yayBvbiBhbnkgaWRsZSB3b3JrIHVudGlsIGFsbCB0aGUgbm9uLWlkbGUgd29yayBoYXMgZmluaXNoZWQsXG4gIC8vIGV2ZW4gaWYgdGhlIHdvcmsgaXMgc3VzcGVuZGVkLlxuXG4gIHZhciBub25JZGxlUGVuZGluZ0xhbmVzID0gcGVuZGluZ0xhbmVzICYgTm9uSWRsZUxhbmVzO1xuXG4gIGlmIChub25JZGxlUGVuZGluZ0xhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgdmFyIG5vbklkbGVVbmJsb2NrZWRMYW5lcyA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiB+c3VzcGVuZGVkTGFuZXM7XG5cbiAgICBpZiAobm9uSWRsZVVuYmxvY2tlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICBuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhub25JZGxlVW5ibG9ja2VkTGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbm9uSWRsZVBpbmdlZExhbmVzID0gbm9uSWRsZVBlbmRpbmdMYW5lcyAmIHBpbmdlZExhbmVzO1xuXG4gICAgICBpZiAobm9uSWRsZVBpbmdlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKG5vbklkbGVQaW5nZWRMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoZSBvbmx5IHJlbWFpbmluZyB3b3JrIGlzIElkbGUuXG4gICAgdmFyIHVuYmxvY2tlZExhbmVzID0gcGVuZGluZ0xhbmVzICYgfnN1c3BlbmRlZExhbmVzO1xuXG4gICAgaWYgKHVuYmxvY2tlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICBuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyh1bmJsb2NrZWRMYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwaW5nZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICBuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhwaW5nZWRMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKG5leHRMYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgcmVhY2hhYmxlIGlmIHdlJ3JlIHN1c3BlbmRlZFxuICAgIC8vIFRPRE86IENvbnNpZGVyIHdhcm5pbmcgaW4gdGhpcyBwYXRoIGlmIGEgZmFsbGJhY2sgdGltZXIgaXMgbm90IHNjaGVkdWxlZC5cbiAgICByZXR1cm4gTm9MYW5lcztcbiAgfSAvLyBJZiB3ZSdyZSBhbHJlYWR5IGluIHRoZSBtaWRkbGUgb2YgYSByZW5kZXIsIHN3aXRjaGluZyBsYW5lcyB3aWxsIGludGVycnVwdFxuICAvLyBpdCBhbmQgd2UnbGwgbG9zZSBvdXIgcHJvZ3Jlc3MuIFdlIHNob3VsZCBvbmx5IGRvIHRoaXMgaWYgdGhlIG5ldyBsYW5lcyBhcmVcbiAgLy8gaGlnaGVyIHByaW9yaXR5LlxuXG5cbiAgaWYgKHdpcExhbmVzICE9PSBOb0xhbmVzICYmIHdpcExhbmVzICE9PSBuZXh0TGFuZXMgJiYgLy8gSWYgd2UgYWxyZWFkeSBzdXNwZW5kZWQgd2l0aCBhIGRlbGF5LCB0aGVuIGludGVycnVwdGluZyBpcyBmaW5lLiBEb24ndFxuICAvLyBib3RoZXIgd2FpdGluZyB1bnRpbCB0aGUgcm9vdCBpcyBjb21wbGV0ZS5cbiAgKHdpcExhbmVzICYgc3VzcGVuZGVkTGFuZXMpID09PSBOb0xhbmVzKSB7XG4gICAgdmFyIG5leHRMYW5lID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShuZXh0TGFuZXMpO1xuICAgIHZhciB3aXBMYW5lID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZSh3aXBMYW5lcyk7XG5cbiAgICBpZiAoIC8vIFRlc3RzIHdoZXRoZXIgdGhlIG5leHQgbGFuZSBpcyBlcXVhbCBvciBsb3dlciBwcmlvcml0eSB0aGFuIHRoZSB3aXBcbiAgICAvLyBvbmUuIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgYml0cyBkZWNyZWFzZSBpbiBwcmlvcml0eSBhcyB5b3UgZ28gbGVmdC5cbiAgICBuZXh0TGFuZSA+PSB3aXBMYW5lIHx8IC8vIERlZmF1bHQgcHJpb3JpdHkgdXBkYXRlcyBzaG91bGQgbm90IGludGVycnVwdCB0cmFuc2l0aW9uIHVwZGF0ZXMuIFRoZVxuICAgIC8vIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIGRlZmF1bHQgdXBkYXRlcyBhbmQgdHJhbnNpdGlvbiB1cGRhdGVzIGlzIHRoYXRcbiAgICAvLyBkZWZhdWx0IHVwZGF0ZXMgZG8gbm90IHN1cHBvcnQgcmVmcmVzaCB0cmFuc2l0aW9ucy5cbiAgICBuZXh0TGFuZSA9PT0gRGVmYXVsdExhbmUgJiYgKHdpcExhbmUgJiBUcmFuc2l0aW9uTGFuZXMpICE9PSBOb0xhbmVzKSB7XG4gICAgICAvLyBLZWVwIHdvcmtpbmcgb24gdGhlIGV4aXN0aW5nIGluLXByb2dyZXNzIHRyZWUuIERvIG5vdCBpbnRlcnJ1cHQuXG4gICAgICByZXR1cm4gd2lwTGFuZXM7XG4gICAgfVxuICB9XG5cbiAgaWYgKChuZXh0TGFuZXMgJiBJbnB1dENvbnRpbnVvdXNMYW5lKSAhPT0gTm9MYW5lcykge1xuICAgIC8vIFdoZW4gdXBkYXRlcyBhcmUgc3luYyBieSBkZWZhdWx0LCB3ZSBlbnRhbmdsZSBjb250aW51b3VzIHByaW9yaXR5IHVwZGF0ZXNcbiAgICAvLyBhbmQgZGVmYXVsdCB1cGRhdGVzLCBzbyB0aGV5IHJlbmRlciBpbiB0aGUgc2FtZSBiYXRjaC4gVGhlIG9ubHkgcmVhc29uXG4gICAgLy8gdGhleSB1c2Ugc2VwYXJhdGUgbGFuZXMgaXMgYmVjYXVzZSBjb250aW51b3VzIHVwZGF0ZXMgc2hvdWxkIGludGVycnVwdFxuICAgIC8vIHRyYW5zaXRpb25zLCBidXQgZGVmYXVsdCB1cGRhdGVzIHNob3VsZCBub3QuXG4gICAgbmV4dExhbmVzIHw9IHBlbmRpbmdMYW5lcyAmIERlZmF1bHRMYW5lO1xuICB9IC8vIENoZWNrIGZvciBlbnRhbmdsZWQgbGFuZXMgYW5kIGFkZCB0aGVtIHRvIHRoZSBiYXRjaC5cbiAgLy9cbiAgLy8gQSBsYW5lIGlzIHNhaWQgdG8gYmUgZW50YW5nbGVkIHdpdGggYW5vdGhlciB3aGVuIGl0J3Mgbm90IGFsbG93ZWQgdG8gcmVuZGVyXG4gIC8vIGluIGEgYmF0Y2ggdGhhdCBkb2VzIG5vdCBhbHNvIGluY2x1ZGUgdGhlIG90aGVyIGxhbmUuIFR5cGljYWxseSB3ZSBkbyB0aGlzXG4gIC8vIHdoZW4gbXVsdGlwbGUgdXBkYXRlcyBoYXZlIHRoZSBzYW1lIHNvdXJjZSwgYW5kIHdlIG9ubHkgd2FudCB0byByZXNwb25kIHRvXG4gIC8vIHRoZSBtb3N0IHJlY2VudCBldmVudCBmcm9tIHRoYXQgc291cmNlLlxuICAvL1xuICAvLyBOb3RlIHRoYXQgd2UgYXBwbHkgZW50YW5nbGVtZW50cyAqYWZ0ZXIqIGNoZWNraW5nIGZvciBwYXJ0aWFsIHdvcmsgYWJvdmUuXG4gIC8vIFRoaXMgbWVhbnMgdGhhdCBpZiBhIGxhbmUgaXMgZW50YW5nbGVkIGR1cmluZyBhbiBpbnRlcmxlYXZlZCBldmVudCB3aGlsZVxuICAvLyBpdCdzIGFscmVhZHkgcmVuZGVyaW5nLCB3ZSB3b24ndCBpbnRlcnJ1cHQgaXQuIFRoaXMgaXMgaW50ZW50aW9uYWwsIHNpbmNlXG4gIC8vIGVudGFuZ2xlbWVudCBpcyB1c3VhbGx5IFwiYmVzdCBlZmZvcnRcIjogd2UnbGwgdHJ5IG91ciBiZXN0IHRvIHJlbmRlciB0aGVcbiAgLy8gbGFuZXMgaW4gdGhlIHNhbWUgYmF0Y2gsIGJ1dCBpdCdzIG5vdCB3b3J0aCB0aHJvd2luZyBvdXQgcGFydGlhbGx5XG4gIC8vIGNvbXBsZXRlZCB3b3JrIGluIG9yZGVyIHRvIGRvIGl0LlxuICAvLyBUT0RPOiBSZWNvbnNpZGVyIHRoaXMuIFRoZSBjb3VudGVyLWFyZ3VtZW50IGlzIHRoYXQgdGhlIHBhcnRpYWwgd29ya1xuICAvLyByZXByZXNlbnRzIGFuIGludGVybWVkaWF0ZSBzdGF0ZSwgd2hpY2ggd2UgZG9uJ3Qgd2FudCB0byBzaG93IHRvIHRoZSB1c2VyLlxuICAvLyBBbmQgYnkgc3BlbmRpbmcgZXh0cmEgdGltZSBmaW5pc2hpbmcgaXQsIHdlJ3JlIGluY3JlYXNpbmcgdGhlIGFtb3VudCBvZlxuICAvLyB0aW1lIGl0IHRha2VzIHRvIHNob3cgdGhlIGZpbmFsIHN0YXRlLCB3aGljaCBpcyB3aGF0IHRoZXkgYXJlIGFjdHVhbGx5XG4gIC8vIHdhaXRpbmcgZm9yLlxuICAvL1xuICAvLyBGb3IgdGhvc2UgZXhjZXB0aW9ucyB3aGVyZSBlbnRhbmdsZW1lbnQgaXMgc2VtYW50aWNhbGx5IGltcG9ydGFudCwgbGlrZVxuICAvLyB1c2VNdXRhYmxlU291cmNlLCB3ZSBzaG91bGQgZW5zdXJlIHRoYXQgdGhlcmUgaXMgbm8gcGFydGlhbCB3b3JrIGF0IHRoZVxuICAvLyB0aW1lIHdlIGFwcGx5IHRoZSBlbnRhbmdsZW1lbnQuXG5cblxuICB2YXIgZW50YW5nbGVkTGFuZXMgPSByb290LmVudGFuZ2xlZExhbmVzO1xuXG4gIGlmIChlbnRhbmdsZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIHZhciBlbnRhbmdsZW1lbnRzID0gcm9vdC5lbnRhbmdsZW1lbnRzO1xuICAgIHZhciBsYW5lcyA9IG5leHRMYW5lcyAmIGVudGFuZ2xlZExhbmVzO1xuXG4gICAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgICBuZXh0TGFuZXMgfD0gZW50YW5nbGVtZW50c1tpbmRleF07XG4gICAgICBsYW5lcyAmPSB+bGFuZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dExhbmVzO1xufVxuZnVuY3Rpb24gZ2V0TW9zdFJlY2VudEV2ZW50VGltZShyb290LCBsYW5lcykge1xuICB2YXIgZXZlbnRUaW1lcyA9IHJvb3QuZXZlbnRUaW1lcztcbiAgdmFyIG1vc3RSZWNlbnRFdmVudFRpbWUgPSBOb1RpbWVzdGFtcDtcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIHZhciBldmVudFRpbWUgPSBldmVudFRpbWVzW2luZGV4XTtcblxuICAgIGlmIChldmVudFRpbWUgPiBtb3N0UmVjZW50RXZlbnRUaW1lKSB7XG4gICAgICBtb3N0UmVjZW50RXZlbnRUaW1lID0gZXZlbnRUaW1lO1xuICAgIH1cblxuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG5cbiAgcmV0dXJuIG1vc3RSZWNlbnRFdmVudFRpbWU7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVFeHBpcmF0aW9uVGltZShsYW5lLCBjdXJyZW50VGltZSkge1xuICBzd2l0Y2ggKGxhbmUpIHtcbiAgICBjYXNlIFN5bmNMYW5lOlxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIElucHV0Q29udGludW91c0xhbmU6XG4gICAgICAvLyBVc2VyIGludGVyYWN0aW9ucyBzaG91bGQgZXhwaXJlIHNsaWdodGx5IG1vcmUgcXVpY2tseS5cbiAgICAgIC8vXG4gICAgICAvLyBOT1RFOiBUaGlzIGlzIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyBjb25zdGFudCBhcyBpbiBTY2hlZHVsZXIuanMuXG4gICAgICAvLyBXaGVuIHdlIG1hZGUgaXQgbGFyZ2VyLCBhIHByb2R1Y3QgbWV0cmljIGluIHd3dyByZWdyZXNzZWQsIHN1Z2dlc3RpbmdcbiAgICAgIC8vIHRoZXJlJ3MgYSB1c2VyIGludGVyYWN0aW9uIHRoYXQncyBiZWluZyBzdGFydmVkIGJ5IGEgc2VyaWVzIG9mXG4gICAgICAvLyBzeW5jaHJvbm91cyB1cGRhdGVzLiBJZiB0aGF0IHRoZW9yeSBpcyBjb3JyZWN0LCB0aGUgcHJvcGVyIHNvbHV0aW9uIGlzXG4gICAgICAvLyB0byBmaXggdGhlIHN0YXJ2YXRpb24uIEhvd2V2ZXIsIHRoaXMgc2NlbmFyaW8gc3VwcG9ydHMgdGhlIGlkZWEgdGhhdFxuICAgICAgLy8gZXhwaXJhdGlvbiB0aW1lcyBhcmUgYW4gaW1wb3J0YW50IHNhZmVndWFyZCB3aGVuIHN0YXJ2YXRpb25cbiAgICAgIC8vIGRvZXMgaGFwcGVuLlxuICAgICAgcmV0dXJuIGN1cnJlbnRUaW1lICsgMjUwO1xuXG4gICAgY2FzZSBEZWZhdWx0SHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIERlZmF1bHRMYW5lOlxuICAgIGNhc2UgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTY6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTc6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTg6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTk6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEwOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE2OlxuICAgICAgcmV0dXJuIGN1cnJlbnRUaW1lICsgNTAwMDtcblxuICAgIGNhc2UgUmV0cnlMYW5lMTpcbiAgICBjYXNlIFJldHJ5TGFuZTI6XG4gICAgY2FzZSBSZXRyeUxhbmUzOlxuICAgIGNhc2UgUmV0cnlMYW5lNDpcbiAgICBjYXNlIFJldHJ5TGFuZTU6XG4gICAgICAvLyBUT0RPOiBSZXRyaWVzIHNob3VsZCBiZSBhbGxvd2VkIHRvIGV4cGlyZSBpZiB0aGV5IGFyZSBDUFUgYm91bmQgZm9yXG4gICAgICAvLyB0b28gbG9uZywgYnV0IHdoZW4gSSBtYWRlIHRoaXMgY2hhbmdlIGl0IGNhdXNlZCBhIHNwaWtlIGluIGJyb3dzZXJcbiAgICAgIC8vIGNyYXNoZXMuIFRoZXJlIG11c3QgYmUgc29tZSBvdGhlciB1bmRlcmx5aW5nIGJ1Zzsgbm90IHN1cGVyIHVyZ2VudCBidXRcbiAgICAgIC8vIGlkZWFsbHkgc2hvdWxkIGZpZ3VyZSBvdXQgd2h5IGFuZCBmaXggaXQuIFVuZm9ydHVuYXRlbHkgd2UgZG9uJ3QgaGF2ZVxuICAgICAgLy8gYSByZXBybyBmb3IgdGhlIGNyYXNoZXMsIG9ubHkgZGV0ZWN0ZWQgdmlhIHByb2R1Y3Rpb24gbWV0cmljcy5cbiAgICAgIHJldHVybiBOb1RpbWVzdGFtcDtcblxuICAgIGNhc2UgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIElkbGVIeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgSWRsZUxhbmU6XG4gICAgY2FzZSBPZmZzY3JlZW5MYW5lOlxuICAgICAgLy8gQW55dGhpbmcgaWRsZSBwcmlvcml0eSBvciBsb3dlciBzaG91bGQgbmV2ZXIgZXhwaXJlLlxuICAgICAgcmV0dXJuIE5vVGltZXN0YW1wO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgZXJyb3IoJ1Nob3VsZCBoYXZlIGZvdW5kIG1hdGNoaW5nIGxhbmVzLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gTm9UaW1lc3RhbXA7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya1N0YXJ2ZWRMYW5lc0FzRXhwaXJlZChyb290LCBjdXJyZW50VGltZSkge1xuICAvLyBUT0RPOiBUaGlzIGdldHMgY2FsbGVkIGV2ZXJ5IHRpbWUgd2UgeWllbGQuIFdlIGNhbiBvcHRpbWl6ZSBieSBzdG9yaW5nXG4gIC8vIHRoZSBlYXJsaWVzdCBleHBpcmF0aW9uIHRpbWUgb24gdGhlIHJvb3QuIFRoZW4gdXNlIHRoYXQgdG8gcXVpY2tseSBiYWlsIG91dFxuICAvLyBvZiB0aGlzIGZ1bmN0aW9uLlxuICB2YXIgcGVuZGluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7XG4gIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXM7XG4gIHZhciBwaW5nZWRMYW5lcyA9IHJvb3QucGluZ2VkTGFuZXM7XG4gIHZhciBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lczsgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBwZW5kaW5nIGxhbmVzIGFuZCBjaGVjayBpZiB3ZSd2ZSByZWFjaGVkIHRoZWlyXG4gIC8vIGV4cGlyYXRpb24gdGltZS4gSWYgc28sIHdlJ2xsIGFzc3VtZSB0aGUgdXBkYXRlIGlzIGJlaW5nIHN0YXJ2ZWQgYW5kIG1hcmtcbiAgLy8gaXQgYXMgZXhwaXJlZCB0byBmb3JjZSBpdCB0byBmaW5pc2guXG5cbiAgdmFyIGxhbmVzID0gcGVuZGluZ0xhbmVzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIGV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWVzW2luZGV4XTtcblxuICAgIGlmIChleHBpcmF0aW9uVGltZSA9PT0gTm9UaW1lc3RhbXApIHtcbiAgICAgIC8vIEZvdW5kIGEgcGVuZGluZyBsYW5lIHdpdGggbm8gZXhwaXJhdGlvbiB0aW1lLiBJZiBpdCdzIG5vdCBzdXNwZW5kZWQsIG9yXG4gICAgICAvLyBpZiBpdCdzIHBpbmdlZCwgYXNzdW1lIGl0J3MgQ1BVLWJvdW5kLiBDb21wdXRlIGEgbmV3IGV4cGlyYXRpb24gdGltZVxuICAgICAgLy8gdXNpbmcgdGhlIGN1cnJlbnQgdGltZS5cbiAgICAgIGlmICgobGFuZSAmIHN1c3BlbmRlZExhbmVzKSA9PT0gTm9MYW5lcyB8fCAobGFuZSAmIHBpbmdlZExhbmVzKSAhPT0gTm9MYW5lcykge1xuICAgICAgICAvLyBBc3N1bWVzIHRpbWVzdGFtcHMgYXJlIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy5cbiAgICAgICAgZXhwaXJhdGlvblRpbWVzW2luZGV4XSA9IGNvbXB1dGVFeHBpcmF0aW9uVGltZShsYW5lLCBjdXJyZW50VGltZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChleHBpcmF0aW9uVGltZSA8PSBjdXJyZW50VGltZSkge1xuICAgICAgLy8gVGhpcyBsYW5lIGV4cGlyZWRcbiAgICAgIHJvb3QuZXhwaXJlZExhbmVzIHw9IGxhbmU7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn0gLy8gVGhpcyByZXR1cm5zIHRoZSBoaWdoZXN0IHByaW9yaXR5IHBlbmRpbmcgbGFuZXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXlcbi8vIGFyZSBzdXNwZW5kZWQuXG5cbmZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eVBlbmRpbmdMYW5lcyhyb290KSB7XG4gIHJldHVybiBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhyb290LnBlbmRpbmdMYW5lcyk7XG59XG5mdW5jdGlvbiBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KSB7XG4gIHZhciBldmVyeXRoaW5nQnV0T2Zmc2NyZWVuID0gcm9vdC5wZW5kaW5nTGFuZXMgJiB+T2Zmc2NyZWVuTGFuZTtcblxuICBpZiAoZXZlcnl0aGluZ0J1dE9mZnNjcmVlbiAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybiBldmVyeXRoaW5nQnV0T2Zmc2NyZWVuO1xuICB9XG5cbiAgaWYgKGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW4gJiBPZmZzY3JlZW5MYW5lKSB7XG4gICAgcmV0dXJuIE9mZnNjcmVlbkxhbmU7XG4gIH1cblxuICByZXR1cm4gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzU3luY0xhbmUobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIFN5bmNMYW5lKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzTm9uSWRsZVdvcmsobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIE5vbklkbGVMYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc09ubHlSZXRyaWVzKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBSZXRyeUxhbmVzKSA9PT0gbGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc09ubHlOb25VcmdlbnRMYW5lcyhsYW5lcykge1xuICB2YXIgVXJnZW50TGFuZXMgPSBTeW5jTGFuZSB8IElucHV0Q29udGludW91c0xhbmUgfCBEZWZhdWx0TGFuZTtcbiAgcmV0dXJuIChsYW5lcyAmIFVyZ2VudExhbmVzKSA9PT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seVRyYW5zaXRpb25zKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBUcmFuc2l0aW9uTGFuZXMpID09PSBsYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIGxhbmVzKSB7XG5cbiAgdmFyIFN5bmNEZWZhdWx0TGFuZXMgPSBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lIHwgSW5wdXRDb250aW51b3VzTGFuZSB8IERlZmF1bHRIeWRyYXRpb25MYW5lIHwgRGVmYXVsdExhbmU7XG4gIHJldHVybiAobGFuZXMgJiBTeW5jRGVmYXVsdExhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzRXhwaXJlZExhbmUocm9vdCwgbGFuZXMpIHtcbiAgLy8gVGhpcyBpcyBhIHNlcGFyYXRlIGNoZWNrIGZyb20gaW5jbHVkZXNCbG9ja2luZ0xhbmUgYmVjYXVzZSBhIGxhbmUgY2FuXG4gIC8vIGV4cGlyZSBhZnRlciBhIHJlbmRlciBoYXMgYWxyZWFkeSBzdGFydGVkLlxuICByZXR1cm4gKGxhbmVzICYgcm9vdC5leHBpcmVkTGFuZXMpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaXNUcmFuc2l0aW9uTGFuZShsYW5lKSB7XG4gIHJldHVybiAobGFuZSAmIFRyYW5zaXRpb25MYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBjbGFpbU5leHRUcmFuc2l0aW9uTGFuZSgpIHtcbiAgLy8gQ3ljbGUgdGhyb3VnaCB0aGUgbGFuZXMsIGFzc2lnbmluZyBlYWNoIG5ldyB0cmFuc2l0aW9uIHRvIHRoZSBuZXh0IGxhbmUuXG4gIC8vIEluIG1vc3QgY2FzZXMsIHRoaXMgbWVhbnMgZXZlcnkgdHJhbnNpdGlvbiBnZXRzIGl0cyBvd24gbGFuZSwgdW50aWwgd2VcbiAgLy8gcnVuIG91dCBvZiBsYW5lcyBhbmQgY3ljbGUgYmFjayB0byB0aGUgYmVnaW5uaW5nLlxuICB2YXIgbGFuZSA9IG5leHRUcmFuc2l0aW9uTGFuZTtcbiAgbmV4dFRyYW5zaXRpb25MYW5lIDw8PSAxO1xuXG4gIGlmICgobmV4dFRyYW5zaXRpb25MYW5lICYgVHJhbnNpdGlvbkxhbmVzKSA9PT0gTm9MYW5lcykge1xuICAgIG5leHRUcmFuc2l0aW9uTGFuZSA9IFRyYW5zaXRpb25MYW5lMTtcbiAgfVxuXG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gY2xhaW1OZXh0UmV0cnlMYW5lKCkge1xuICB2YXIgbGFuZSA9IG5leHRSZXRyeUxhbmU7XG4gIG5leHRSZXRyeUxhbmUgPDw9IDE7XG5cbiAgaWYgKChuZXh0UmV0cnlMYW5lICYgUmV0cnlMYW5lcykgPT09IE5vTGFuZXMpIHtcbiAgICBuZXh0UmV0cnlMYW5lID0gUmV0cnlMYW5lMTtcbiAgfVxuXG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShsYW5lcykge1xuICByZXR1cm4gbGFuZXMgJiAtbGFuZXM7XG59XG5mdW5jdGlvbiBwaWNrQXJiaXRyYXJ5TGFuZShsYW5lcykge1xuICAvLyBUaGlzIHdyYXBwZXIgZnVuY3Rpb24gZ2V0cyBpbmxpbmVkLiBPbmx5IGV4aXN0cyBzbyB0byBjb21tdW5pY2F0ZSB0aGF0IGl0XG4gIC8vIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGJpdCBpcyBzZWxlY3RlZDsgeW91IGNhbiBwaWNrIGFueSBiaXQgd2l0aG91dFxuICAvLyBhZmZlY3RpbmcgdGhlIGFsZ29yaXRobXMgd2hlcmUgaXRzIHVzZWQuIEhlcmUgSSdtIHVzaW5nXG4gIC8vIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUgYmVjYXVzZSBpdCByZXF1aXJlcyB0aGUgZmV3ZXN0IG9wZXJhdGlvbnMuXG4gIHJldHVybiBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKTtcbn1cblxuZnVuY3Rpb24gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcykge1xuICByZXR1cm4gMzEgLSBjbHozMihsYW5lcyk7XG59XG5cbmZ1bmN0aW9uIGxhbmVUb0luZGV4KGxhbmUpIHtcbiAgcmV0dXJuIHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZSk7XG59XG5cbmZ1bmN0aW9uIGluY2x1ZGVzU29tZUxhbmUoYSwgYikge1xuICByZXR1cm4gKGEgJiBiKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGlzU3Vic2V0T2ZMYW5lcyhzZXQsIHN1YnNldCkge1xuICByZXR1cm4gKHNldCAmIHN1YnNldCkgPT09IHN1YnNldDtcbn1cbmZ1bmN0aW9uIG1lcmdlTGFuZXMoYSwgYikge1xuICByZXR1cm4gYSB8IGI7XG59XG5mdW5jdGlvbiByZW1vdmVMYW5lcyhzZXQsIHN1YnNldCkge1xuICByZXR1cm4gc2V0ICYgfnN1YnNldDtcbn1cbmZ1bmN0aW9uIGludGVyc2VjdExhbmVzKGEsIGIpIHtcbiAgcmV0dXJuIGEgJiBiO1xufSAvLyBTZWVtcyByZWR1bmRhbnQsIGJ1dCBpdCBjaGFuZ2VzIHRoZSB0eXBlIGZyb20gYSBzaW5nbGUgbGFuZSAodXNlZCBmb3Jcbi8vIHVwZGF0ZXMpIHRvIGEgZ3JvdXAgb2YgbGFuZXMgKHVzZWQgZm9yIGZsdXNoaW5nIHdvcmspLlxuXG5mdW5jdGlvbiBsYW5lVG9MYW5lcyhsYW5lKSB7XG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gaGlnaGVyUHJpb3JpdHlMYW5lKGEsIGIpIHtcbiAgLy8gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBiaXQgcmFuZ2VzIGRlY3JlYXNlIGluIHByaW9yaXR5IGFzIHlvdSBnbyBsZWZ0LlxuICByZXR1cm4gYSAhPT0gTm9MYW5lICYmIGEgPCBiID8gYSA6IGI7XG59XG5mdW5jdGlvbiBjcmVhdGVMYW5lTWFwKGluaXRpYWwpIHtcbiAgLy8gSW50ZW50aW9uYWxseSBwdXNoaW5nIG9uZSBieSBvbmUuXG4gIC8vIGh0dHBzOi8vdjguZGV2L2Jsb2cvZWxlbWVudHMta2luZHMjYXZvaWQtY3JlYXRpbmctaG9sZXNcbiAgdmFyIGxhbmVNYXAgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IFRvdGFsTGFuZXM7IGkrKykge1xuICAgIGxhbmVNYXAucHVzaChpbml0aWFsKTtcbiAgfVxuXG4gIHJldHVybiBsYW5lTWFwO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RVcGRhdGVkKHJvb3QsIHVwZGF0ZUxhbmUsIGV2ZW50VGltZSkge1xuICByb290LnBlbmRpbmdMYW5lcyB8PSB1cGRhdGVMYW5lOyAvLyBJZiB0aGVyZSBhcmUgYW55IHN1c3BlbmRlZCB0cmFuc2l0aW9ucywgaXQncyBwb3NzaWJsZSB0aGlzIG5ldyB1cGRhdGVcbiAgLy8gY291bGQgdW5ibG9jayB0aGVtLiBDbGVhciB0aGUgc3VzcGVuZGVkIGxhbmVzIHNvIHRoYXQgd2UgY2FuIHRyeSByZW5kZXJpbmdcbiAgLy8gdGhlbSBhZ2Fpbi5cbiAgLy9cbiAgLy8gVE9ETzogV2UgcmVhbGx5IG9ubHkgbmVlZCB0byB1bnN1c3BlbmQgb25seSBsYW5lcyB0aGF0IGFyZSBpbiB0aGVcbiAgLy8gYHN1YnRyZWVMYW5lc2Agb2YgdGhlIHVwZGF0ZWQgZmliZXIsIG9yIHRoZSB1cGRhdGUgbGFuZXMgb2YgdGhlIHJldHVyblxuICAvLyBwYXRoLiBUaGlzIHdvdWxkIGV4Y2x1ZGUgc3VzcGVuZGVkIHVwZGF0ZXMgaW4gYW4gdW5yZWxhdGVkIHNpYmxpbmcgdHJlZSxcbiAgLy8gc2luY2UgdGhlcmUncyBubyB3YXkgZm9yIHRoaXMgdXBkYXRlIHRvIHVuYmxvY2sgaXQuXG4gIC8vXG4gIC8vIFdlIGRvbid0IGRvIHRoaXMgaWYgdGhlIGluY29taW5nIHVwZGF0ZSBpcyBpZGxlLCBiZWNhdXNlIHdlIG5ldmVyIHByb2Nlc3NcbiAgLy8gaWRsZSB1cGRhdGVzIHVudGlsIGFmdGVyIGFsbCB0aGUgcmVndWxhciB1cGRhdGVzIGhhdmUgZmluaXNoZWQ7IHRoZXJlJ3Mgbm9cbiAgLy8gd2F5IGl0IGNvdWxkIHVuYmxvY2sgYSB0cmFuc2l0aW9uLlxuXG4gIGlmICh1cGRhdGVMYW5lICE9PSBJZGxlTGFuZSkge1xuICAgIHJvb3Quc3VzcGVuZGVkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHJvb3QucGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xuICB9XG5cbiAgdmFyIGV2ZW50VGltZXMgPSByb290LmV2ZW50VGltZXM7XG4gIHZhciBpbmRleCA9IGxhbmVUb0luZGV4KHVwZGF0ZUxhbmUpOyAvLyBXZSBjYW4gYWx3YXlzIG92ZXJ3cml0ZSBhbiBleGlzdGluZyB0aW1lc3RhbXAgYmVjYXVzZSB3ZSBwcmVmZXIgdGhlIG1vc3RcbiAgLy8gcmVjZW50IGV2ZW50LCBhbmQgd2UgYXNzdW1lIHRpbWUgaXMgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLlxuXG4gIGV2ZW50VGltZXNbaW5kZXhdID0gZXZlbnRUaW1lO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RTdXNwZW5kZWQocm9vdCwgc3VzcGVuZGVkTGFuZXMpIHtcbiAgcm9vdC5zdXNwZW5kZWRMYW5lcyB8PSBzdXNwZW5kZWRMYW5lcztcbiAgcm9vdC5waW5nZWRMYW5lcyAmPSB+c3VzcGVuZGVkTGFuZXM7IC8vIFRoZSBzdXNwZW5kZWQgbGFuZXMgYXJlIG5vIGxvbmdlciBDUFUtYm91bmQuIENsZWFyIHRoZWlyIGV4cGlyYXRpb24gdGltZXMuXG5cbiAgdmFyIGV4cGlyYXRpb25UaW1lcyA9IHJvb3QuZXhwaXJhdGlvblRpbWVzO1xuICB2YXIgbGFuZXMgPSBzdXNwZW5kZWRMYW5lcztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIGV4cGlyYXRpb25UaW1lc1tpbmRleF0gPSBOb1RpbWVzdGFtcDtcbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gbWFya1Jvb3RQaW5nZWQocm9vdCwgcGluZ2VkTGFuZXMsIGV2ZW50VGltZSkge1xuICByb290LnBpbmdlZExhbmVzIHw9IHJvb3Quc3VzcGVuZGVkTGFuZXMgJiBwaW5nZWRMYW5lcztcbn1cbmZ1bmN0aW9uIG1hcmtSb290RmluaXNoZWQocm9vdCwgcmVtYWluaW5nTGFuZXMpIHtcbiAgdmFyIG5vTG9uZ2VyUGVuZGluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXMgJiB+cmVtYWluaW5nTGFuZXM7XG4gIHJvb3QucGVuZGluZ0xhbmVzID0gcmVtYWluaW5nTGFuZXM7IC8vIExldCdzIHRyeSBldmVyeXRoaW5nIGFnYWluXG5cbiAgcm9vdC5zdXNwZW5kZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHJvb3QucGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xuICByb290LmV4cGlyZWRMYW5lcyAmPSByZW1haW5pbmdMYW5lcztcbiAgcm9vdC5tdXRhYmxlUmVhZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICByb290LmVudGFuZ2xlZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICB2YXIgZW50YW5nbGVtZW50cyA9IHJvb3QuZW50YW5nbGVtZW50cztcbiAgdmFyIGV2ZW50VGltZXMgPSByb290LmV2ZW50VGltZXM7XG4gIHZhciBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lczsgLy8gQ2xlYXIgdGhlIGxhbmVzIHRoYXQgbm8gbG9uZ2VyIGhhdmUgcGVuZGluZyB3b3JrXG5cbiAgdmFyIGxhbmVzID0gbm9Mb25nZXJQZW5kaW5nTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSA9IE5vTGFuZXM7XG4gICAgZXZlbnRUaW1lc1tpbmRleF0gPSBOb1RpbWVzdGFtcDtcbiAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gTm9UaW1lc3RhbXA7XG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIGVudGFuZ2xlZExhbmVzKSB7XG4gIC8vIEluIGFkZGl0aW9uIHRvIGVudGFuZ2xpbmcgZWFjaCBvZiB0aGUgZ2l2ZW4gbGFuZXMgd2l0aCBlYWNoIG90aGVyLCB3ZSBhbHNvXG4gIC8vIGhhdmUgdG8gY29uc2lkZXIgX3RyYW5zaXRpdmVfIGVudGFuZ2xlbWVudHMuIEZvciBlYWNoIGxhbmUgdGhhdCBpcyBhbHJlYWR5XG4gIC8vIGVudGFuZ2xlZCB3aXRoICphbnkqIG9mIHRoZSBnaXZlbiBsYW5lcywgdGhhdCBsYW5lIGlzIG5vdyB0cmFuc2l0aXZlbHlcbiAgLy8gZW50YW5nbGVkIHdpdGggKmFsbCogdGhlIGdpdmVuIGxhbmVzLlxuICAvL1xuICAvLyBUcmFuc2xhdGVkOiBJZiBDIGlzIGVudGFuZ2xlZCB3aXRoIEEsIHRoZW4gZW50YW5nbGluZyBBIHdpdGggQiBhbHNvXG4gIC8vIGVudGFuZ2xlcyBDIHdpdGggQi5cbiAgLy9cbiAgLy8gSWYgdGhpcyBpcyBoYXJkIHRvIGdyYXNwLCBpdCBtaWdodCBoZWxwIHRvIGludGVudGlvbmFsbHkgYnJlYWsgdGhpc1xuICAvLyBmdW5jdGlvbiBhbmQgbG9vayBhdCB0aGUgdGVzdHMgdGhhdCBmYWlsIGluIFJlYWN0VHJhbnNpdGlvbi10ZXN0LmpzLiBUcnlcbiAgLy8gY29tbWVudGluZyBvdXQgb25lIG9mIHRoZSBjb25kaXRpb25zIGJlbG93LlxuICB2YXIgcm9vdEVudGFuZ2xlZExhbmVzID0gcm9vdC5lbnRhbmdsZWRMYW5lcyB8PSBlbnRhbmdsZWRMYW5lcztcbiAgdmFyIGVudGFuZ2xlbWVudHMgPSByb290LmVudGFuZ2xlbWVudHM7XG4gIHZhciBsYW5lcyA9IHJvb3RFbnRhbmdsZWRMYW5lcztcblxuICB3aGlsZSAobGFuZXMpIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG5cbiAgICBpZiAoIC8vIElzIHRoaXMgb25lIG9mIHRoZSBuZXdseSBlbnRhbmdsZWQgbGFuZXM/XG4gICAgbGFuZSAmIGVudGFuZ2xlZExhbmVzIHwgLy8gSXMgdGhpcyBsYW5lIHRyYW5zaXRpdmVseSBlbnRhbmdsZWQgd2l0aCB0aGUgbmV3bHkgZW50YW5nbGVkIGxhbmVzP1xuICAgIGVudGFuZ2xlbWVudHNbaW5kZXhdICYgZW50YW5nbGVkTGFuZXMpIHtcbiAgICAgIGVudGFuZ2xlbWVudHNbaW5kZXhdIHw9IGVudGFuZ2xlZExhbmVzO1xuICAgIH1cblxuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBnZXRCdW1wZWRMYW5lRm9ySHlkcmF0aW9uKHJvb3QsIHJlbmRlckxhbmVzKSB7XG4gIHZhciByZW5kZXJMYW5lID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShyZW5kZXJMYW5lcyk7XG4gIHZhciBsYW5lO1xuXG4gIHN3aXRjaCAocmVuZGVyTGFuZSkge1xuICAgIGNhc2UgSW5wdXRDb250aW51b3VzTGFuZTpcbiAgICAgIGxhbmUgPSBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIERlZmF1bHRMYW5lOlxuICAgICAgbGFuZSA9IERlZmF1bHRIeWRyYXRpb25MYW5lO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lODpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lOTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTA6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTExOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTY6XG4gICAgY2FzZSBSZXRyeUxhbmUxOlxuICAgIGNhc2UgUmV0cnlMYW5lMjpcbiAgICBjYXNlIFJldHJ5TGFuZTM6XG4gICAgY2FzZSBSZXRyeUxhbmU0OlxuICAgIGNhc2UgUmV0cnlMYW5lNTpcbiAgICAgIGxhbmUgPSBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBJZGxlTGFuZTpcbiAgICAgIGxhbmUgPSBJZGxlSHlkcmF0aW9uTGFuZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpcyBhbHJlYWR5IGVpdGhlciBhIGh5ZHJhdGlvbiBsYW5lLCBvciBzaG91bGRuJ3RcbiAgICAgIC8vIGJlIHJldHJpZWQgYXQgYSBoeWRyYXRpb24gbGFuZS5cbiAgICAgIGxhbmUgPSBOb0xhbmU7XG4gICAgICBicmVhaztcbiAgfSAvLyBDaGVjayBpZiB0aGUgbGFuZSB3ZSBjaG9zZSBpcyBzdXNwZW5kZWQuIElmIHNvLCB0aGF0IGluZGljYXRlcyB0aGF0IHdlXG4gIC8vIGFscmVhZHkgYXR0ZW1wdGVkIGFuZCBmYWlsZWQgdG8gaHlkcmF0ZSBhdCB0aGF0IGxldmVsLiBBbHNvIGNoZWNrIGlmIHdlJ3JlXG4gIC8vIGFscmVhZHkgcmVuZGVyaW5nIHRoYXQgbGFuZSwgd2hpY2ggaXMgcmFyZSBidXQgY291bGQgaGFwcGVuLlxuXG5cbiAgaWYgKChsYW5lICYgKHJvb3Quc3VzcGVuZGVkTGFuZXMgfCByZW5kZXJMYW5lcykpICE9PSBOb0xhbmUpIHtcbiAgICAvLyBHaXZlIHVwIHRyeWluZyB0byBoeWRyYXRlIGFuZCBmYWxsIGJhY2sgdG8gY2xpZW50IHJlbmRlci5cbiAgICByZXR1cm4gTm9MYW5lO1xuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBhZGRGaWJlclRvTGFuZXNNYXAocm9vdCwgZmliZXIsIGxhbmVzKSB7XG5cbiAgaWYgKCFpc0RldlRvb2xzUHJlc2VudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwID0gcm9vdC5wZW5kaW5nVXBkYXRlcnNMYW5lTWFwO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBsYW5lVG9JbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIHZhciB1cGRhdGVycyA9IHBlbmRpbmdVcGRhdGVyc0xhbmVNYXBbaW5kZXhdO1xuICAgIHVwZGF0ZXJzLmFkZChmaWJlcik7XG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIG1vdmVQZW5kaW5nRmliZXJzVG9NZW1vaXplZChyb290LCBsYW5lcykge1xuXG4gIGlmICghaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IHJvb3QucGVuZGluZ1VwZGF0ZXJzTGFuZU1hcDtcbiAgdmFyIG1lbW9pemVkVXBkYXRlcnMgPSByb290Lm1lbW9pemVkVXBkYXRlcnM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IGxhbmVUb0luZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIHVwZGF0ZXJzID0gcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcFtpbmRleF07XG5cbiAgICBpZiAodXBkYXRlcnMuc2l6ZSA+IDApIHtcbiAgICAgIHVwZGF0ZXJzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgaWYgKGFsdGVybmF0ZSA9PT0gbnVsbCB8fCAhbWVtb2l6ZWRVcGRhdGVycy5oYXMoYWx0ZXJuYXRlKSkge1xuICAgICAgICAgIG1lbW9pemVkVXBkYXRlcnMuYWRkKGZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB1cGRhdGVycy5jbGVhcigpO1xuICAgIH1cblxuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBnZXRUcmFuc2l0aW9uc0ZvckxhbmVzKHJvb3QsIGxhbmVzKSB7XG4gIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG52YXIgRGlzY3JldGVFdmVudFByaW9yaXR5ID0gU3luY0xhbmU7XG52YXIgQ29udGludW91c0V2ZW50UHJpb3JpdHkgPSBJbnB1dENvbnRpbnVvdXNMYW5lO1xudmFyIERlZmF1bHRFdmVudFByaW9yaXR5ID0gRGVmYXVsdExhbmU7XG52YXIgSWRsZUV2ZW50UHJpb3JpdHkgPSBJZGxlTGFuZTtcbnZhciBjdXJyZW50VXBkYXRlUHJpb3JpdHkgPSBOb0xhbmU7XG5mdW5jdGlvbiBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKSB7XG4gIHJldHVybiBjdXJyZW50VXBkYXRlUHJpb3JpdHk7XG59XG5mdW5jdGlvbiBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkobmV3UHJpb3JpdHkpIHtcbiAgY3VycmVudFVwZGF0ZVByaW9yaXR5ID0gbmV3UHJpb3JpdHk7XG59XG5mdW5jdGlvbiBydW5XaXRoUHJpb3JpdHkocHJpb3JpdHksIGZuKSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gY3VycmVudFVwZGF0ZVByaW9yaXR5O1xuXG4gIHRyeSB7XG4gICAgY3VycmVudFVwZGF0ZVByaW9yaXR5ID0gcHJpb3JpdHk7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFVwZGF0ZVByaW9yaXR5ID0gcHJldmlvdXNQcmlvcml0eTtcbiAgfVxufVxuZnVuY3Rpb24gaGlnaGVyRXZlbnRQcmlvcml0eShhLCBiKSB7XG4gIHJldHVybiBhICE9PSAwICYmIGEgPCBiID8gYSA6IGI7XG59XG5mdW5jdGlvbiBsb3dlckV2ZW50UHJpb3JpdHkoYSwgYikge1xuICByZXR1cm4gYSA9PT0gMCB8fCBhID4gYiA/IGEgOiBiO1xufVxuZnVuY3Rpb24gaXNIaWdoZXJFdmVudFByaW9yaXR5KGEsIGIpIHtcbiAgcmV0dXJuIGEgIT09IDAgJiYgYSA8IGI7XG59XG5mdW5jdGlvbiBsYW5lc1RvRXZlbnRQcmlvcml0eShsYW5lcykge1xuICB2YXIgbGFuZSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpO1xuXG4gIGlmICghaXNIaWdoZXJFdmVudFByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSwgbGFuZSkpIHtcbiAgICByZXR1cm4gRGlzY3JldGVFdmVudFByaW9yaXR5O1xuICB9XG5cbiAgaWYgKCFpc0hpZ2hlckV2ZW50UHJpb3JpdHkoQ29udGludW91c0V2ZW50UHJpb3JpdHksIGxhbmUpKSB7XG4gICAgcmV0dXJuIENvbnRpbnVvdXNFdmVudFByaW9yaXR5O1xuICB9XG5cbiAgaWYgKGluY2x1ZGVzTm9uSWRsZVdvcmsobGFuZSkpIHtcbiAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gIH1cblxuICByZXR1cm4gSWRsZUV2ZW50UHJpb3JpdHk7XG59XG5cbi8vIFRoaXMgaXMgaW1wb3J0ZWQgYnkgdGhlIGV2ZW50IHJlcGxheWluZyBpbXBsZW1lbnRhdGlvbiBpbiBSZWFjdCBET00uIEl0J3Ncbi8vIGluIGEgc2VwYXJhdGUgZmlsZSB0byBicmVhayBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgcmVuZGVyZXIgYW5kXG4vLyB0aGUgcmVjb25jaWxlci5cbmZ1bmN0aW9uIGlzUm9vdERlaHlkcmF0ZWQocm9vdCkge1xuICB2YXIgY3VycmVudFN0YXRlID0gcm9vdC5jdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBjdXJyZW50U3RhdGUuaXNEZWh5ZHJhdGVkO1xufVxuXG52YXIgX2F0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbjtcblxuZnVuY3Rpb24gc2V0QXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGZuKSB7XG4gIF9hdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24gPSBmbjtcbn1cbmZ1bmN0aW9uIGF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihmaWJlcikge1xuICBfYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGZpYmVyKTtcbn1cbnZhciBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbjtcbmZ1bmN0aW9uIHNldEF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKGZuKSB7XG4gIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uID0gZm47XG59XG52YXIgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5O1xuZnVuY3Rpb24gc2V0QXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5KGZuKSB7XG4gIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eSA9IGZuO1xufVxudmFyIGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSQxO1xuZnVuY3Rpb24gc2V0R2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KGZuKSB7XG4gIGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSQxID0gZm47XG59XG52YXIgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHk7XG5mdW5jdGlvbiBzZXRBdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShmbikge1xuICBhdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eSA9IGZuO1xufSAvLyBUT0RPOiBVcGdyYWRlIHRoaXMgZGVmaW5pdGlvbiBvbmNlIHdlJ3JlIG9uIGEgbmV3ZXIgdmVyc2lvbiBvZiBGbG93IHRoYXRcbi8vIGhhcyB0aGlzIGRlZmluaXRpb24gYnVpbHQtaW4uXG5cbnZhciBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0ID0gZmFsc2U7IC8vIFRoZSBxdWV1ZSBvZiBkaXNjcmV0ZSBldmVudHMgdG8gYmUgcmVwbGF5ZWQuXG5cbnZhciBxdWV1ZWREaXNjcmV0ZUV2ZW50cyA9IFtdOyAvLyBJbmRpY2F0ZXMgaWYgYW55IGNvbnRpbnVvdXMgZXZlbnQgdGFyZ2V0cyBhcmUgbm9uLW51bGwgZm9yIGVhcmx5IGJhaWxvdXQuXG4vLyBpZiB0aGUgbGFzdCB0YXJnZXQgd2FzIGRlaHlkcmF0ZWQuXG5cbnZhciBxdWV1ZWRGb2N1cyA9IG51bGw7XG52YXIgcXVldWVkRHJhZyA9IG51bGw7XG52YXIgcXVldWVkTW91c2UgPSBudWxsOyAvLyBGb3IgcG9pbnRlciBldmVudHMgdGhlcmUgY2FuIGJlIG9uZSBsYXRlc3QgZXZlbnQgcGVyIHBvaW50ZXJJZC5cblxudmFyIHF1ZXVlZFBvaW50ZXJzID0gbmV3IE1hcCgpO1xudmFyIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcyA9IG5ldyBNYXAoKTsgLy8gV2UgY291bGQgY29uc2lkZXIgcmVwbGF5aW5nIHNlbGVjdGlvbmNoYW5nZSBhbmQgdG91Y2htb3ZlcyB0b28uXG5cbnZhciBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMgPSBbXTtcbnZhciBkaXNjcmV0ZVJlcGxheWFibGVFdmVudHMgPSBbJ21vdXNlZG93bicsICdtb3VzZXVwJywgJ3RvdWNoY2FuY2VsJywgJ3RvdWNoZW5kJywgJ3RvdWNoc3RhcnQnLCAnYXV4Y2xpY2snLCAnZGJsY2xpY2snLCAncG9pbnRlcmNhbmNlbCcsICdwb2ludGVyZG93bicsICdwb2ludGVydXAnLCAnZHJhZ2VuZCcsICdkcmFnc3RhcnQnLCAnZHJvcCcsICdjb21wb3NpdGlvbmVuZCcsICdjb21wb3NpdGlvbnN0YXJ0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnaW5wdXQnLCAndGV4dElucHV0JywgLy8gSW50ZW50aW9uYWxseSBjYW1lbENhc2Vcbidjb3B5JywgJ2N1dCcsICdwYXN0ZScsICdjbGljaycsICdjaGFuZ2UnLCAnY29udGV4dG1lbnUnLCAncmVzZXQnLCAnc3VibWl0J107XG5mdW5jdGlvbiBpc0Rpc2NyZXRlRXZlbnRUaGF0UmVxdWlyZXNIeWRyYXRpb24oZXZlbnRUeXBlKSB7XG4gIHJldHVybiBkaXNjcmV0ZVJlcGxheWFibGVFdmVudHMuaW5kZXhPZihldmVudFR5cGUpID4gLTE7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVF1ZXVlZFJlcGxheWFibGVFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICByZXR1cm4ge1xuICAgIGJsb2NrZWRPbjogYmxvY2tlZE9uLFxuICAgIGRvbUV2ZW50TmFtZTogZG9tRXZlbnROYW1lLFxuICAgIGV2ZW50U3lzdGVtRmxhZ3M6IGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgbmF0aXZlRXZlbnQ6IG5hdGl2ZUV2ZW50LFxuICAgIHRhcmdldENvbnRhaW5lcnM6IFt0YXJnZXRDb250YWluZXJdXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgIHF1ZXVlZEZvY3VzID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICBjYXNlICdkcmFnbGVhdmUnOlxuICAgICAgcXVldWVkRHJhZyA9IG51bGw7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgY2FzZSAnbW91c2VvdXQnOlxuICAgICAgcXVldWVkTW91c2UgPSBudWxsO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdwb2ludGVyb3Zlcic6XG4gICAgY2FzZSAncG9pbnRlcm91dCc6XG4gICAgICB7XG4gICAgICAgIHZhciBwb2ludGVySWQgPSBuYXRpdmVFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJzLmRlbGV0ZShwb2ludGVySWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgJ2dvdHBvaW50ZXJjYXB0dXJlJzpcbiAgICBjYXNlICdsb3N0cG9pbnRlcmNhcHR1cmUnOlxuICAgICAge1xuICAgICAgICB2YXIgX3BvaW50ZXJJZCA9IG5hdGl2ZUV2ZW50LnBvaW50ZXJJZDtcbiAgICAgICAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmRlbGV0ZShfcG9pbnRlcklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChleGlzdGluZ1F1ZXVlZEV2ZW50LCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICBpZiAoZXhpc3RpbmdRdWV1ZWRFdmVudCA9PT0gbnVsbCB8fCBleGlzdGluZ1F1ZXVlZEV2ZW50Lm5hdGl2ZUV2ZW50ICE9PSBuYXRpdmVFdmVudCkge1xuICAgIHZhciBxdWV1ZWRFdmVudCA9IGNyZWF0ZVF1ZXVlZFJlcGxheWFibGVFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG5cbiAgICBpZiAoYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgICB2YXIgX2ZpYmVyMiA9IGdldEluc3RhbmNlRnJvbU5vZGUoYmxvY2tlZE9uKTtcblxuICAgICAgaWYgKF9maWJlcjIgIT09IG51bGwpIHtcbiAgICAgICAgLy8gQXR0ZW1wdCB0byBpbmNyZWFzZSB0aGUgcHJpb3JpdHkgb2YgdGhpcyB0YXJnZXQuXG4gICAgICAgIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKF9maWJlcjIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWV1ZWRFdmVudDtcbiAgfSAvLyBJZiB3ZSBoYXZlIGFscmVhZHkgcXVldWVkIHRoaXMgZXhhY3QgZXZlbnQsIHRoZW4gaXQncyBiZWNhdXNlXG4gIC8vIHRoZSBkaWZmZXJlbnQgZXZlbnQgc3lzdGVtcyBoYXZlIGRpZmZlcmVudCBET00gZXZlbnQgbGlzdGVuZXJzLlxuICAvLyBXZSBjYW4gYWNjdW11bGF0ZSB0aGUgZmxhZ3MsIGFuZCB0aGUgdGFyZ2V0Q29udGFpbmVycywgYW5kXG4gIC8vIHN0b3JlIGEgc2luZ2xlIGV2ZW50IHRvIGJlIHJlcGxheWVkLlxuXG5cbiAgZXhpc3RpbmdRdWV1ZWRFdmVudC5ldmVudFN5c3RlbUZsYWdzIHw9IGV2ZW50U3lzdGVtRmxhZ3M7XG4gIHZhciB0YXJnZXRDb250YWluZXJzID0gZXhpc3RpbmdRdWV1ZWRFdmVudC50YXJnZXRDb250YWluZXJzO1xuXG4gIGlmICh0YXJnZXRDb250YWluZXIgIT09IG51bGwgJiYgdGFyZ2V0Q29udGFpbmVycy5pbmRleE9mKHRhcmdldENvbnRhaW5lcikgPT09IC0xKSB7XG4gICAgdGFyZ2V0Q29udGFpbmVycy5wdXNoKHRhcmdldENvbnRhaW5lcik7XG4gIH1cblxuICByZXR1cm4gZXhpc3RpbmdRdWV1ZWRFdmVudDtcbn1cblxuZnVuY3Rpb24gcXVldWVJZkNvbnRpbnVvdXNFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICAvLyBUaGVzZSBzZXQgcmVsYXRlZFRhcmdldCB0byBudWxsIGJlY2F1c2UgdGhlIHJlcGxheWVkIGV2ZW50IHdpbGwgYmUgdHJlYXRlZCBhcyBpZiB3ZVxuICAvLyBtb3ZlZCBmcm9tIG91dHNpZGUgdGhlIHdpbmRvdyAobm8gdGFyZ2V0KSBvbnRvIHRoZSB0YXJnZXQgb25jZSBpdCBoeWRyYXRlcy5cbiAgLy8gSW5zdGVhZCBvZiBtdXRhdGluZyB3ZSBjb3VsZCBjbG9uZSB0aGUgZXZlbnQuXG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgICB7XG4gICAgICAgIHZhciBmb2N1c0V2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHF1ZXVlZEZvY3VzID0gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRGb2N1cywgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgZm9jdXNFdmVudCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIGRyYWdFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWREcmFnID0gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWREcmFnLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBkcmFnRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgICB7XG4gICAgICAgIHZhciBtb3VzZUV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHF1ZXVlZE1vdXNlID0gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRNb3VzZSwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbW91c2VFdmVudCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgICAge1xuICAgICAgICB2YXIgcG9pbnRlckV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHZhciBwb2ludGVySWQgPSBwb2ludGVyRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVycy5zZXQocG9pbnRlcklkLCBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZFBvaW50ZXJzLmdldChwb2ludGVySWQpIHx8IG51bGwsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIHBvaW50ZXJFdmVudCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ2dvdHBvaW50ZXJjYXB0dXJlJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wb2ludGVyRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgdmFyIF9wb2ludGVySWQyID0gX3BvaW50ZXJFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5zZXQoX3BvaW50ZXJJZDIsIGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkUG9pbnRlckNhcHR1cmVzLmdldChfcG9pbnRlcklkMikgfHwgbnVsbCwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgX3BvaW50ZXJFdmVudCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn0gLy8gQ2hlY2sgaWYgdGhpcyB0YXJnZXQgaXMgdW5ibG9ja2VkLiBSZXR1cm5zIHRydWUgaWYgaXQncyB1bmJsb2NrZWQuXG5cbmZ1bmN0aW9uIGF0dGVtcHRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldChxdWV1ZWRUYXJnZXQpIHtcbiAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBzaGFyZXMgYSBsb3Qgb2YgbG9naWMgd2l0aCBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50LlxuICAvLyBUcnkgdG8gdW5pZnkgdGhlbS4gSXQncyBhIGJpdCB0cmlja3kgc2luY2UgaXQgd291bGQgcmVxdWlyZSB0d28gcmV0dXJuXG4gIC8vIHZhbHVlcy5cbiAgdmFyIHRhcmdldEluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShxdWV1ZWRUYXJnZXQudGFyZ2V0KTtcblxuICBpZiAodGFyZ2V0SW5zdCAhPT0gbnVsbCkge1xuICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIodGFyZ2V0SW5zdCk7XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgIT09IG51bGwpIHtcbiAgICAgIHZhciB0YWcgPSBuZWFyZXN0TW91bnRlZC50YWc7XG5cbiAgICAgIGlmICh0YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFN1c3BlbnNlSW5zdGFuY2VGcm9tRmliZXIobmVhcmVzdE1vdW50ZWQpO1xuXG4gICAgICAgIGlmIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlJ3JlIGJsb2NrZWQgb24gaHlkcmF0aW5nIHRoaXMgYm91bmRhcnkuXG4gICAgICAgICAgLy8gSW5jcmVhc2UgaXRzIHByaW9yaXR5LlxuICAgICAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBpbnN0YW5jZTtcbiAgICAgICAgICBhdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShxdWV1ZWRUYXJnZXQucHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eShuZWFyZXN0TW91bnRlZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgICAgdmFyIHJvb3QgPSBuZWFyZXN0TW91bnRlZC5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHtcbiAgICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gZ2V0Q29udGFpbmVyRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTsgLy8gV2UgZG9uJ3QgY3VycmVudGx5IGhhdmUgYSB3YXkgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mXG4gICAgICAgICAgLy8gYSByb290IG90aGVyIHRoYW4gc3luYy5cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsO1xufVxuXG5mdW5jdGlvbiBxdWV1ZUV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHRhcmdldCkge1xuICAvLyBUT0RPOiBUaGlzIHdpbGwgcmVhZCB0aGUgcHJpb3JpdHkgaWYgaXQncyBkaXNwYXRjaGVkIGJ5IHRoZSBSZWFjdFxuICAvLyBldmVudCBzeXN0ZW0gYnV0IG5vdCBuYXRpdmUgZXZlbnRzLiBTaG91bGQgcmVhZCB3aW5kb3cuZXZlbnQudHlwZSwgbGlrZVxuICAvLyB3ZSBkbyBmb3IgdXBkYXRlcyAoZ2V0Q3VycmVudEV2ZW50UHJpb3JpdHkpLlxuICB2YXIgdXBkYXRlUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkkMSgpO1xuICB2YXIgcXVldWVkVGFyZ2V0ID0ge1xuICAgIGJsb2NrZWRPbjogbnVsbCxcbiAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICBwcmlvcml0eTogdXBkYXRlUHJpb3JpdHlcbiAgfTtcbiAgdmFyIGkgPSAwO1xuXG4gIGZvciAoOyBpIDwgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gU3RvcCBvbmNlIHdlIGhpdCB0aGUgZmlyc3QgdGFyZ2V0IHdpdGggbG93ZXIgcHJpb3JpdHkgdGhhblxuICAgIGlmICghaXNIaWdoZXJFdmVudFByaW9yaXR5KHVwZGF0ZVByaW9yaXR5LCBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHNbaV0ucHJpb3JpdHkpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMuc3BsaWNlKGksIDAsIHF1ZXVlZFRhcmdldCk7XG5cbiAgaWYgKGkgPT09IDApIHtcbiAgICBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQocXVldWVkVGFyZ2V0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEV2ZW50KSB7XG4gIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdGFyZ2V0Q29udGFpbmVycyA9IHF1ZXVlZEV2ZW50LnRhcmdldENvbnRhaW5lcnM7XG5cbiAgd2hpbGUgKHRhcmdldENvbnRhaW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciB0YXJnZXRDb250YWluZXIgPSB0YXJnZXRDb250YWluZXJzWzBdO1xuICAgIHZhciBuZXh0QmxvY2tlZE9uID0gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChxdWV1ZWRFdmVudC5kb21FdmVudE5hbWUsIHF1ZXVlZEV2ZW50LmV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgcXVldWVkRXZlbnQubmF0aXZlRXZlbnQpO1xuXG4gICAgaWYgKG5leHRCbG9ja2VkT24gPT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgdmFyIG5hdGl2ZUV2ZW50ID0gcXVldWVkRXZlbnQubmF0aXZlRXZlbnQ7XG4gICAgICAgIHZhciBuYXRpdmVFdmVudENsb25lID0gbmV3IG5hdGl2ZUV2ZW50LmNvbnN0cnVjdG9yKG5hdGl2ZUV2ZW50LnR5cGUsIG5hdGl2ZUV2ZW50KTtcbiAgICAgICAgc2V0UmVwbGF5aW5nRXZlbnQobmF0aXZlRXZlbnRDbG9uZSk7XG4gICAgICAgIG5hdGl2ZUV2ZW50LnRhcmdldC5kaXNwYXRjaEV2ZW50KG5hdGl2ZUV2ZW50Q2xvbmUpO1xuICAgICAgICByZXNldFJlcGxheWluZ0V2ZW50KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlJ3JlIHN0aWxsIGJsb2NrZWQuIFRyeSBhZ2FpbiBsYXRlci5cbiAgICAgIHZhciBfZmliZXIzID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShuZXh0QmxvY2tlZE9uKTtcblxuICAgICAgaWYgKF9maWJlcjMgIT09IG51bGwpIHtcbiAgICAgICAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oX2ZpYmVyMyk7XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9IG5leHRCbG9ja2VkT247XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBUaGlzIHRhcmdldCBjb250YWluZXIgd2FzIHN1Y2Nlc3NmdWxseSBkaXNwYXRjaGVkLiBUcnkgdGhlIG5leHQuXG5cblxuICAgIHRhcmdldENvbnRhaW5lcnMuc2hpZnQoKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50SW5NYXAocXVldWVkRXZlbnQsIGtleSwgbWFwKSB7XG4gIGlmIChhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEV2ZW50KSkge1xuICAgIG1hcC5kZWxldGUoa2V5KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYXlVbmJsb2NrZWRFdmVudHMoKSB7XG4gIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSBmYWxzZTtcblxuXG4gIGlmIChxdWV1ZWRGb2N1cyAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEZvY3VzKSkge1xuICAgIHF1ZXVlZEZvY3VzID0gbnVsbDtcbiAgfVxuXG4gIGlmIChxdWV1ZWREcmFnICE9PSBudWxsICYmIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRHJhZykpIHtcbiAgICBxdWV1ZWREcmFnID0gbnVsbDtcbiAgfVxuXG4gIGlmIChxdWV1ZWRNb3VzZSAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZE1vdXNlKSkge1xuICAgIHF1ZXVlZE1vdXNlID0gbnVsbDtcbiAgfVxuXG4gIHF1ZXVlZFBvaW50ZXJzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTtcbiAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZEV2ZW50LCB1bmJsb2NrZWQpIHtcbiAgaWYgKHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9PT0gdW5ibG9ja2VkKSB7XG4gICAgcXVldWVkRXZlbnQuYmxvY2tlZE9uID0gbnVsbDtcblxuICAgIGlmICghaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCkge1xuICAgICAgaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCA9IHRydWU7IC8vIFNjaGVkdWxlIGEgY2FsbGJhY2sgdG8gYXR0ZW1wdCByZXBsYXlpbmcgYXMgbWFueSBldmVudHMgYXMgYXJlXG4gICAgICAvLyBub3cgdW5ibG9ja2VkLiBUaGlzIGZpcnN0IG1pZ2h0IG5vdCBhY3R1YWxseSBiZSB1bmJsb2NrZWQgeWV0LlxuICAgICAgLy8gV2UgY291bGQgY2hlY2sgaXQgZWFybHkgdG8gYXZvaWQgc2NoZWR1bGluZyBhbiB1bm5lY2Vzc2FyeSBjYWxsYmFjay5cblxuICAgICAgU2NoZWR1bGVyLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soU2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LCByZXBsYXlVbmJsb2NrZWRFdmVudHMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXRyeUlmQmxvY2tlZE9uKHVuYmxvY2tlZCkge1xuICAvLyBNYXJrIGFueXRoaW5nIHRoYXQgd2FzIGJsb2NrZWQgb24gdGhpcyBhcyBubyBsb25nZXIgYmxvY2tlZFxuICAvLyBhbmQgZWxpZ2libGUgZm9yIGEgcmVwbGF5LlxuICBpZiAocXVldWVkRGlzY3JldGVFdmVudHMubGVuZ3RoID4gMCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWREaXNjcmV0ZUV2ZW50c1swXSwgdW5ibG9ja2VkKTsgLy8gVGhpcyBpcyBhIGV4cG9uZW50aWFsIHNlYXJjaCBmb3IgZWFjaCBib3VuZGFyeSB0aGF0IGNvbW1pdHMuIEkgdGhpbmsgaXQnc1xuICAgIC8vIHdvcnRoIGl0IGJlY2F1c2Ugd2UgZXhwZWN0IHZlcnkgZmV3IGRpc2NyZXRlIGV2ZW50cyB0byBxdWV1ZSB1cCBhbmQgb25jZVxuICAgIC8vIHdlIGFyZSBhY3R1YWxseSBmdWxseSB1bmJsb2NrZWQgaXQgd2lsbCBiZSBmYXN0IHRvIHJlcGxheSB0aGVtLlxuXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBxdWV1ZWREaXNjcmV0ZUV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXVlZEV2ZW50ID0gcXVldWVkRGlzY3JldGVFdmVudHNbaV07XG5cbiAgICAgIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gPT09IHVuYmxvY2tlZCkge1xuICAgICAgICBxdWV1ZWRFdmVudC5ibG9ja2VkT24gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChxdWV1ZWRGb2N1cyAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRGb2N1cywgdW5ibG9ja2VkKTtcbiAgfVxuXG4gIGlmIChxdWV1ZWREcmFnICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZERyYWcsIHVuYmxvY2tlZCk7XG4gIH1cblxuICBpZiAocXVldWVkTW91c2UgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkTW91c2UsIHVuYmxvY2tlZCk7XG4gIH1cblxuICB2YXIgdW5ibG9jayA9IGZ1bmN0aW9uIChxdWV1ZWRFdmVudCkge1xuICAgIHJldHVybiBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRXZlbnQsIHVuYmxvY2tlZCk7XG4gIH07XG5cbiAgcXVldWVkUG9pbnRlcnMuZm9yRWFjaCh1bmJsb2NrKTtcbiAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2godW5ibG9jayk7XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgcXVldWVkVGFyZ2V0ID0gcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzW19pXTtcblxuICAgIGlmIChxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID09PSB1bmJsb2NrZWQpIHtcbiAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHdoaWxlIChxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgIHZhciBuZXh0RXhwbGljaXRUYXJnZXQgPSBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHNbMF07XG5cbiAgICBpZiAobmV4dEV4cGxpY2l0VGFyZ2V0LmJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgc3RpbGwgYmxvY2tlZC5cbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQobmV4dEV4cGxpY2l0VGFyZ2V0KTtcblxuICAgICAgaWYgKG5leHRFeHBsaWNpdFRhcmdldC5ibG9ja2VkT24gPT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UncmUgdW5ibG9ja2VkLlxuICAgICAgICBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMuc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7IC8vIFRPRE86IGNhbiB3ZSBzdG9wIGV4cG9ydGluZyB0aGVzZT9cblxudmFyIF9lbmFibGVkID0gdHJ1ZTsgLy8gVGhpcyBpcyBleHBvcnRlZCBpbiBGQiBidWlsZHMgZm9yIHVzZSBieSBsZWdhY3kgRkIgbGF5ZXIgaW5mcmEuXG4vLyBXZSdkIGxpa2UgdG8gcmVtb3ZlIHRoaXMgYnV0IGl0J3Mgbm90IGNsZWFyIGlmIHRoaXMgaXMgc2FmZS5cblxuZnVuY3Rpb24gc2V0RW5hYmxlZChlbmFibGVkKSB7XG4gIF9lbmFibGVkID0gISFlbmFibGVkO1xufVxuZnVuY3Rpb24gaXNFbmFibGVkKCkge1xuICByZXR1cm4gX2VuYWJsZWQ7XG59XG5mdW5jdGlvbiBjcmVhdGVFdmVudExpc3RlbmVyV3JhcHBlcldpdGhQcmlvcml0eSh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncykge1xuICB2YXIgZXZlbnRQcmlvcml0eSA9IGdldEV2ZW50UHJpb3JpdHkoZG9tRXZlbnROYW1lKTtcbiAgdmFyIGxpc3RlbmVyV3JhcHBlcjtcblxuICBzd2l0Y2ggKGV2ZW50UHJpb3JpdHkpIHtcbiAgICBjYXNlIERpc2NyZXRlRXZlbnRQcmlvcml0eTpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoRGlzY3JldGVFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBDb250aW51b3VzRXZlbnRQcmlvcml0eTpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoQ29udGludW91c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIERlZmF1bHRFdmVudFByaW9yaXR5OlxuICAgIGRlZmF1bHQ6XG4gICAgICBsaXN0ZW5lcldyYXBwZXIgPSBkaXNwYXRjaEV2ZW50O1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJXcmFwcGVyLmJpbmQobnVsbCwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaERpc2NyZXRlRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBudWxsO1xuXG4gIHRyeSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgZGlzcGF0Y2hFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBudWxsO1xuXG4gIHRyeSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KENvbnRpbnVvdXNFdmVudFByaW9yaXR5KTtcbiAgICBkaXNwYXRjaEV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICBpZiAoIV9lbmFibGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIGRpc3BhdGNoRXZlbnRXaXRoRW5hYmxlQ2FwdHVyZVBoYXNlU2VsZWN0aXZlSHlkcmF0aW9uV2l0aG91dERpc2NyZXRlRXZlbnRSZXBsYXkoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50V2l0aEVuYWJsZUNhcHR1cmVQaGFzZVNlbGVjdGl2ZUh5ZHJhdGlvbldpdGhvdXREaXNjcmV0ZUV2ZW50UmVwbGF5KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB2YXIgYmxvY2tlZE9uID0gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuXG4gIGlmIChibG9ja2VkT24gPT09IG51bGwpIHtcbiAgICBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgcmV0dXJuX3RhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcik7XG4gICAgY2xlYXJJZkNvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocXVldWVJZkNvbnRpbnVvdXNFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkpIHtcbiAgICBuYXRpdmVFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICByZXR1cm47XG4gIH0gLy8gV2UgbmVlZCB0byBjbGVhciBvbmx5IGlmIHdlIGRpZG4ndCBxdWV1ZSBiZWNhdXNlXG4gIC8vIHF1ZXVlaW5nIGlzIGFjY3VtdWxhdGl2ZS5cblxuXG4gIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG5cbiAgaWYgKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19DQVBUVVJFX1BIQVNFICYmIGlzRGlzY3JldGVFdmVudFRoYXRSZXF1aXJlc0h5ZHJhdGlvbihkb21FdmVudE5hbWUpKSB7XG4gICAgd2hpbGUgKGJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgdmFyIGZpYmVyID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShibG9ja2VkT24pO1xuXG4gICAgICBpZiAoZmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGZpYmVyKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5leHRCbG9ja2VkT24gPSBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG5cbiAgICAgIGlmIChuZXh0QmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgICAgIGRpc3BhdGNoRXZlbnRGb3JQbHVnaW5FdmVudFN5c3RlbShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCByZXR1cm5fdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5leHRCbG9ja2VkT24gPT09IGJsb2NrZWRPbikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgYmxvY2tlZE9uID0gbmV4dEJsb2NrZWRPbjtcbiAgICB9XG5cbiAgICBpZiAoYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgICBuYXRpdmVFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0gLy8gVGhpcyBpcyBub3QgcmVwbGF5YWJsZSBzbyB3ZSdsbCBpbnZva2UgaXQgYnV0IHdpdGhvdXQgYSB0YXJnZXQsXG4gIC8vIGluIGNhc2UgdGhlIGV2ZW50IHN5c3RlbSBuZWVkcyB0byB0cmFjZSBpdC5cblxuXG4gIGRpc3BhdGNoRXZlbnRGb3JQbHVnaW5FdmVudFN5c3RlbShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCBudWxsLCB0YXJnZXRDb250YWluZXIpO1xufVxuXG52YXIgcmV0dXJuX3RhcmdldEluc3QgPSBudWxsOyAvLyBSZXR1cm5zIGEgU3VzcGVuc2VJbnN0YW5jZSBvciBDb250YWluZXIgaWYgaXQncyBibG9ja2VkLlxuLy8gVGhlIHJldHVybl90YXJnZXRJbnN0IGZpZWxkIGFib3ZlIGlzIGNvbmNlcHR1YWxseSBwYXJ0IG9mIHRoZSByZXR1cm4gdmFsdWUuXG5cbmZ1bmN0aW9uIGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIC8vIFRPRE86IFdhcm4gaWYgX2VuYWJsZWQgaXMgZmFsc2UuXG4gIHJldHVybl90YXJnZXRJbnN0ID0gbnVsbDtcbiAgdmFyIG5hdGl2ZUV2ZW50VGFyZ2V0ID0gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpO1xuICB2YXIgdGFyZ2V0SW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBpZiAodGFyZ2V0SW5zdCAhPT0gbnVsbCkge1xuICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIodGFyZ2V0SW5zdCk7XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgdHJlZSBoYXMgYmVlbiB1bm1vdW50ZWQgYWxyZWFkeS4gRGlzcGF0Y2ggd2l0aG91dCBhIHRhcmdldC5cbiAgICAgIHRhcmdldEluc3QgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdGFnID0gbmVhcmVzdE1vdW50ZWQudGFnO1xuXG4gICAgICBpZiAodGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBRdWV1ZSB0aGUgZXZlbnQgdG8gYmUgcmVwbGF5ZWQgbGF0ZXIuIEFib3J0IGRpc3BhdGNoaW5nIHNpbmNlIHdlXG4gICAgICAgICAgLy8gZG9uJ3Qgd2FudCB0aGlzIGV2ZW50IGRpc3BhdGNoZWQgdHdpY2UgdGhyb3VnaCB0aGUgZXZlbnQgc3lzdGVtLlxuICAgICAgICAgIC8vIFRPRE86IElmIHRoaXMgaXMgdGhlIGZpcnN0IGRpc2NyZXRlIGV2ZW50IGluIHRoZSBxdWV1ZS4gU2NoZWR1bGUgYW4gaW5jcmVhc2VkXG4gICAgICAgICAgLy8gcHJpb3JpdHkgZm9yIHRoaXMgYm91bmRhcnkuXG4gICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICB9IC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlbiwgc29tZXRoaW5nIHdlbnQgd3JvbmcgYnV0IHRvIGF2b2lkIGJsb2NraW5nXG4gICAgICAgIC8vIHRoZSB3aG9sZSBzeXN0ZW0sIGRpc3BhdGNoIHRoZSBldmVudCB3aXRob3V0IGEgdGFyZ2V0LlxuICAgICAgICAvLyBUT0RPOiBXYXJuLlxuXG5cbiAgICAgICAgdGFyZ2V0SW5zdCA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgICAgdmFyIHJvb3QgPSBuZWFyZXN0TW91bnRlZC5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIGhhcHBlbnMgZHVyaW5nIGEgcmVwbGF5IHNvbWV0aGluZyB3ZW50IHdyb25nIGFuZCBpdCBtaWdodCBibG9ja1xuICAgICAgICAgIC8vIHRoZSB3aG9sZSBzeXN0ZW0uXG4gICAgICAgICAgcmV0dXJuIGdldENvbnRhaW5lckZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAobmVhcmVzdE1vdW50ZWQgIT09IHRhcmdldEluc3QpIHtcbiAgICAgICAgLy8gSWYgd2UgZ2V0IGFuIGV2ZW50IChleDogaW1nIG9ubG9hZCkgYmVmb3JlIGNvbW1pdHRpbmcgdGhhdFxuICAgICAgICAvLyBjb21wb25lbnQncyBtb3VudCwgaWdub3JlIGl0IGZvciBub3cgKHRoYXQgaXMsIHRyZWF0IGl0IGFzIGlmIGl0IHdhcyBhblxuICAgICAgICAvLyBldmVudCBvbiBhIG5vbi1SZWFjdCB0cmVlKS4gV2UgbWlnaHQgYWxzbyBjb25zaWRlciBxdWV1ZWluZyBldmVudHMgYW5kXG4gICAgICAgIC8vIGRpc3BhdGNoaW5nIHRoZW0gYWZ0ZXIgdGhlIG1vdW50LlxuICAgICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm5fdGFyZ2V0SW5zdCA9IHRhcmdldEluc3Q7IC8vIFdlJ3JlIG5vdCBibG9ja2VkIG9uIGFueXRoaW5nLlxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ2V0RXZlbnRQcmlvcml0eShkb21FdmVudE5hbWUpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAvLyBVc2VkIGJ5IFNpbXBsZUV2ZW50UGx1Z2luOlxuICAgIGNhc2UgJ2NhbmNlbCc6XG4gICAgY2FzZSAnY2xpY2snOlxuICAgIGNhc2UgJ2Nsb3NlJzpcbiAgICBjYXNlICdjb250ZXh0bWVudSc6XG4gICAgY2FzZSAnY29weSc6XG4gICAgY2FzZSAnY3V0JzpcbiAgICBjYXNlICdhdXhjbGljayc6XG4gICAgY2FzZSAnZGJsY2xpY2snOlxuICAgIGNhc2UgJ2RyYWdlbmQnOlxuICAgIGNhc2UgJ2RyYWdzdGFydCc6XG4gICAgY2FzZSAnZHJvcCc6XG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICBjYXNlICdpbnZhbGlkJzpcbiAgICBjYXNlICdrZXlkb3duJzpcbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgY2FzZSAnbW91c2V1cCc6XG4gICAgY2FzZSAncGFzdGUnOlxuICAgIGNhc2UgJ3BhdXNlJzpcbiAgICBjYXNlICdwbGF5JzpcbiAgICBjYXNlICdwb2ludGVyY2FuY2VsJzpcbiAgICBjYXNlICdwb2ludGVyZG93bic6XG4gICAgY2FzZSAncG9pbnRlcnVwJzpcbiAgICBjYXNlICdyYXRlY2hhbmdlJzpcbiAgICBjYXNlICdyZXNldCc6XG4gICAgY2FzZSAncmVzaXplJzpcbiAgICBjYXNlICdzZWVrZWQnOlxuICAgIGNhc2UgJ3N1Ym1pdCc6XG4gICAgY2FzZSAndG91Y2hjYW5jZWwnOlxuICAgIGNhc2UgJ3RvdWNoZW5kJzpcbiAgICBjYXNlICd0b3VjaHN0YXJ0JzpcbiAgICBjYXNlICd2b2x1bWVjaGFuZ2UnOiAvLyBVc2VkIGJ5IHBvbHlmaWxsczpcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgJ2NoYW5nZSc6XG4gICAgY2FzZSAnc2VsZWN0aW9uY2hhbmdlJzpcbiAgICBjYXNlICd0ZXh0SW5wdXQnOlxuICAgIGNhc2UgJ2NvbXBvc2l0aW9uc3RhcnQnOlxuICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzpcbiAgICBjYXNlICdjb21wb3NpdGlvbnVwZGF0ZSc6IC8vIE9ubHkgZW5hYmxlQ3JlYXRlRXZlbnRIYW5kbGVBUEk6XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlICdiZWZvcmVibHVyJzpcbiAgICBjYXNlICdhZnRlcmJsdXInOiAvLyBOb3QgdXNlZCBieSBSZWFjdCBidXQgY291bGQgYmUgYnkgdXNlciBjb2RlOlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSAnYmVmb3JlaW5wdXQnOlxuICAgIGNhc2UgJ2JsdXInOlxuICAgIGNhc2UgJ2Z1bGxzY3JlZW5jaGFuZ2UnOlxuICAgIGNhc2UgJ2ZvY3VzJzpcbiAgICBjYXNlICdoYXNoY2hhbmdlJzpcbiAgICBjYXNlICdwb3BzdGF0ZSc6XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICBjYXNlICdzZWxlY3RzdGFydCc6XG4gICAgICByZXR1cm4gRGlzY3JldGVFdmVudFByaW9yaXR5O1xuXG4gICAgY2FzZSAnZHJhZyc6XG4gICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICBjYXNlICdkcmFnZXhpdCc6XG4gICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICBjYXNlICdkcmFnb3Zlcic6XG4gICAgY2FzZSAnbW91c2Vtb3ZlJzpcbiAgICBjYXNlICdtb3VzZW91dCc6XG4gICAgY2FzZSAnbW91c2VvdmVyJzpcbiAgICBjYXNlICdwb2ludGVybW92ZSc6XG4gICAgY2FzZSAncG9pbnRlcm91dCc6XG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3Njcm9sbCc6XG4gICAgY2FzZSAndG9nZ2xlJzpcbiAgICBjYXNlICd0b3VjaG1vdmUnOlxuICAgIGNhc2UgJ3doZWVsJzogLy8gTm90IHVzZWQgYnkgUmVhY3QgYnV0IGNvdWxkIGJlIGJ5IHVzZXIgY29kZTpcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgJ21vdXNlZW50ZXInOlxuICAgIGNhc2UgJ21vdXNlbGVhdmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJlbnRlcic6XG4gICAgY2FzZSAncG9pbnRlcmxlYXZlJzpcbiAgICAgIHJldHVybiBDb250aW51b3VzRXZlbnRQcmlvcml0eTtcblxuICAgIGNhc2UgJ21lc3NhZ2UnOlxuICAgICAge1xuICAgICAgICAvLyBXZSBtaWdodCBiZSBpbiB0aGUgU2NoZWR1bGVyIGNhbGxiYWNrLlxuICAgICAgICAvLyBFdmVudHVhbGx5IHRoaXMgbWVjaGFuaXNtIHdpbGwgYmUgcmVwbGFjZWQgYnkgYSBjaGVja1xuICAgICAgICAvLyBvZiB0aGUgY3VycmVudCBwcmlvcml0eSBvbiB0aGUgbmF0aXZlIHNjaGVkdWxlci5cbiAgICAgICAgdmFyIHNjaGVkdWxlclByaW9yaXR5ID0gZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKTtcblxuICAgICAgICBzd2l0Y2ggKHNjaGVkdWxlclByaW9yaXR5KSB7XG4gICAgICAgICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICAgICAgICAgIHJldHVybiBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk7XG5cbiAgICAgICAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVvdXNFdmVudFByaW9yaXR5O1xuXG4gICAgICAgICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICAgICAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgICAgICAgICAgLy8gVE9ETzogSGFuZGxlIExvd1NjaGVkdWxlclByaW9yaXR5LCBzb21laG93LiBNYXliZSB0aGUgc2FtZSBsYW5lIGFzIGh5ZHJhdGlvbi5cbiAgICAgICAgICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcblxuICAgICAgICAgIGNhc2UgSWRsZVByaW9yaXR5OlxuICAgICAgICAgICAgcmV0dXJuIElkbGVFdmVudFByaW9yaXR5O1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRFdmVudEJ1YmJsZUxpc3RlbmVyKHRhcmdldCwgZXZlbnRUeXBlLCBsaXN0ZW5lcikge1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cbmZ1bmN0aW9uIGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyKHRhcmdldCwgZXZlbnRUeXBlLCBsaXN0ZW5lcikge1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuZnVuY3Rpb24gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyLCBwYXNzaXZlKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHtcbiAgICBjYXB0dXJlOiB0cnVlLFxuICAgIHBhc3NpdmU6IHBhc3NpdmVcbiAgfSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cbmZ1bmN0aW9uIGFkZEV2ZW50QnViYmxlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyLCBwYXNzaXZlKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHtcbiAgICBwYXNzaXZlOiBwYXNzaXZlXG4gIH0pO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5cbi8qKlxuICogVGhlc2UgdmFyaWFibGVzIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHRleHQgY29udGVudCBvZiBhIHRhcmdldCBub2RlLFxuICogYWxsb3dpbmcgY29tcGFyaXNvbiBvZiBjb250ZW50IGJlZm9yZSBhbmQgYWZ0ZXIgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBJZGVudGlmeSB0aGUgbm9kZSB3aGVyZSBzZWxlY3Rpb24gY3VycmVudGx5IGJlZ2lucywgdGhlbiBvYnNlcnZlXG4gKiBib3RoIGl0cyB0ZXh0IGNvbnRlbnQgYW5kIGl0cyBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBET00uIFNpbmNlIHRoZVxuICogYnJvd3NlciBtYXkgbmF0aXZlbHkgcmVwbGFjZSB0aGUgdGFyZ2V0IG5vZGUgZHVyaW5nIGNvbXBvc2l0aW9uLCB3ZSBjYW5cbiAqIHVzZSBpdHMgcG9zaXRpb24gdG8gZmluZCBpdHMgcmVwbGFjZW1lbnQuXG4gKlxuICpcbiAqL1xudmFyIHJvb3QgPSBudWxsO1xudmFyIHN0YXJ0VGV4dCA9IG51bGw7XG52YXIgZmFsbGJhY2tUZXh0ID0gbnVsbDtcbmZ1bmN0aW9uIGluaXRpYWxpemUobmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcm9vdCA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICBzdGFydFRleHQgPSBnZXRUZXh0KCk7XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gcmVzZXQoKSB7XG4gIHJvb3QgPSBudWxsO1xuICBzdGFydFRleHQgPSBudWxsO1xuICBmYWxsYmFja1RleHQgPSBudWxsO1xufVxuZnVuY3Rpb24gZ2V0RGF0YSgpIHtcbiAgaWYgKGZhbGxiYWNrVGV4dCkge1xuICAgIHJldHVybiBmYWxsYmFja1RleHQ7XG4gIH1cblxuICB2YXIgc3RhcnQ7XG4gIHZhciBzdGFydFZhbHVlID0gc3RhcnRUZXh0O1xuICB2YXIgc3RhcnRMZW5ndGggPSBzdGFydFZhbHVlLmxlbmd0aDtcbiAgdmFyIGVuZDtcbiAgdmFyIGVuZFZhbHVlID0gZ2V0VGV4dCgpO1xuICB2YXIgZW5kTGVuZ3RoID0gZW5kVmFsdWUubGVuZ3RoO1xuXG4gIGZvciAoc3RhcnQgPSAwOyBzdGFydCA8IHN0YXJ0TGVuZ3RoOyBzdGFydCsrKSB7XG4gICAgaWYgKHN0YXJ0VmFsdWVbc3RhcnRdICE9PSBlbmRWYWx1ZVtzdGFydF0pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBtaW5FbmQgPSBzdGFydExlbmd0aCAtIHN0YXJ0O1xuXG4gIGZvciAoZW5kID0gMTsgZW5kIDw9IG1pbkVuZDsgZW5kKyspIHtcbiAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydExlbmd0aCAtIGVuZF0gIT09IGVuZFZhbHVlW2VuZExlbmd0aCAtIGVuZF0pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzbGljZVRhaWwgPSBlbmQgPiAxID8gMSAtIGVuZCA6IHVuZGVmaW5lZDtcbiAgZmFsbGJhY2tUZXh0ID0gZW5kVmFsdWUuc2xpY2Uoc3RhcnQsIHNsaWNlVGFpbCk7XG4gIHJldHVybiBmYWxsYmFja1RleHQ7XG59XG5mdW5jdGlvbiBnZXRUZXh0KCkge1xuICBpZiAoJ3ZhbHVlJyBpbiByb290KSB7XG4gICAgcmV0dXJuIHJvb3QudmFsdWU7XG4gIH1cblxuICByZXR1cm4gcm9vdC50ZXh0Q29udGVudDtcbn1cblxuLyoqXG4gKiBgY2hhckNvZGVgIHJlcHJlc2VudHMgdGhlIGFjdHVhbCBcImNoYXJhY3RlciBjb2RlXCIgYW5kIGlzIHNhZmUgdG8gdXNlIHdpdGhcbiAqIGBTdHJpbmcuZnJvbUNoYXJDb2RlYC4gQXMgc3VjaCwgb25seSBrZXlzIHRoYXQgY29ycmVzcG9uZCB0byBwcmludGFibGVcbiAqIGNoYXJhY3RlcnMgcHJvZHVjZSBhIHZhbGlkIGBjaGFyQ29kZWAsIHRoZSBvbmx5IGV4Y2VwdGlvbiB0byB0aGlzIGlzIEVudGVyLlxuICogVGhlIFRhYi1rZXkgaXMgY29uc2lkZXJlZCBub24tcHJpbnRhYmxlIGFuZCBkb2VzIG5vdCBoYXZlIGEgYGNoYXJDb2RlYCxcbiAqIHByZXN1bWFibHkgYmVjYXVzZSBpdCBkb2VzIG5vdCBwcm9kdWNlIGEgdGFiLWNoYXJhY3RlciBpbiBicm93c2Vycy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IE5vcm1hbGl6ZWQgYGNoYXJDb2RlYCBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkge1xuICB2YXIgY2hhckNvZGU7XG4gIHZhciBrZXlDb2RlID0gbmF0aXZlRXZlbnQua2V5Q29kZTtcblxuICBpZiAoJ2NoYXJDb2RlJyBpbiBuYXRpdmVFdmVudCkge1xuICAgIGNoYXJDb2RlID0gbmF0aXZlRXZlbnQuY2hhckNvZGU7IC8vIEZGIGRvZXMgbm90IHNldCBgY2hhckNvZGVgIGZvciB0aGUgRW50ZXIta2V5LCBjaGVjayBhZ2FpbnN0IGBrZXlDb2RlYC5cblxuICAgIGlmIChjaGFyQ29kZSA9PT0gMCAmJiBrZXlDb2RlID09PSAxMykge1xuICAgICAgY2hhckNvZGUgPSAxMztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSUU4IGRvZXMgbm90IGltcGxlbWVudCBgY2hhckNvZGVgLCBidXQgYGtleUNvZGVgIGhhcyB0aGUgY29ycmVjdCB2YWx1ZS5cbiAgICBjaGFyQ29kZSA9IGtleUNvZGU7XG4gIH0gLy8gSUUgYW5kIEVkZ2UgKG9uIFdpbmRvd3MpIGFuZCBDaHJvbWUgLyBTYWZhcmkgKG9uIFdpbmRvd3MgYW5kIExpbnV4KVxuICAvLyByZXBvcnQgRW50ZXIgYXMgY2hhckNvZGUgMTAgd2hlbiBjdHJsIGlzIHByZXNzZWQuXG5cblxuICBpZiAoY2hhckNvZGUgPT09IDEwKSB7XG4gICAgY2hhckNvZGUgPSAxMztcbiAgfSAvLyBTb21lIG5vbi1wcmludGFibGUga2V5cyBhcmUgcmVwb3J0ZWQgaW4gYGNoYXJDb2RlYC9ga2V5Q29kZWAsIGRpc2NhcmQgdGhlbS5cbiAgLy8gTXVzdCBub3QgZGlzY2FyZCB0aGUgKG5vbi0pcHJpbnRhYmxlIEVudGVyLWtleS5cblxuXG4gIGlmIChjaGFyQ29kZSA+PSAzMiB8fCBjaGFyQ29kZSA9PT0gMTMpIHtcbiAgICByZXR1cm4gY2hhckNvZGU7XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWUoKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2UoKSB7XG4gIHJldHVybiBmYWxzZTtcbn0gLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGEgZmFjdG9yeSBzbyB0aGF0IHdlIGhhdmUgZGlmZmVyZW50IHJldHVybmVkIGNvbnN0cnVjdG9ycy5cbi8vIElmIHdlIGhhZCBhIHNpbmdsZSBjb25zdHJ1Y3RvciwgaXQgd291bGQgYmUgbWVnYW1vcnBoaWMgYW5kIGVuZ2luZXMgd291bGQgZGVvcHQuXG5cblxuZnVuY3Rpb24gY3JlYXRlU3ludGhldGljRXZlbnQoSW50ZXJmYWNlKSB7XG4gIC8qKlxuICAgKiBTeW50aGV0aWMgZXZlbnRzIGFyZSBkaXNwYXRjaGVkIGJ5IGV2ZW50IHBsdWdpbnMsIHR5cGljYWxseSBpbiByZXNwb25zZSB0byBhXG4gICAqIHRvcC1sZXZlbCBldmVudCBkZWxlZ2F0aW9uIGhhbmRsZXIuXG4gICAqXG4gICAqIFRoZXNlIHN5c3RlbXMgc2hvdWxkIGdlbmVyYWxseSB1c2UgcG9vbGluZyB0byByZWR1Y2UgdGhlIGZyZXF1ZW5jeSBvZiBnYXJiYWdlXG4gICAqIGNvbGxlY3Rpb24uIFRoZSBzeXN0ZW0gc2hvdWxkIGNoZWNrIGBpc1BlcnNpc3RlbnRgIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZVxuICAgKiBldmVudCBzaG91bGQgYmUgcmVsZWFzZWQgaW50byB0aGUgcG9vbCBhZnRlciBiZWluZyBkaXNwYXRjaGVkLiBVc2VycyB0aGF0XG4gICAqIG5lZWQgYSBwZXJzaXN0ZWQgZXZlbnQgc2hvdWxkIGludm9rZSBgcGVyc2lzdGAuXG4gICAqXG4gICAqIFN5bnRoZXRpYyBldmVudHMgKGFuZCBzdWJjbGFzc2VzKSBpbXBsZW1lbnQgdGhlIERPTSBMZXZlbCAzIEV2ZW50cyBBUEkgYnlcbiAgICogbm9ybWFsaXppbmcgYnJvd3NlciBxdWlya3MuIFN1YmNsYXNzZXMgZG8gbm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8gaW1wbGVtZW50IGFcbiAgICogRE9NIGludGVyZmFjZTsgY3VzdG9tIGFwcGxpY2F0aW9uLXNwZWNpZmljIGV2ZW50cyBjYW4gYWxzbyBzdWJjbGFzcyB0aGlzLlxuICAgKi9cbiAgZnVuY3Rpb24gU3ludGhldGljQmFzZUV2ZW50KHJlYWN0TmFtZSwgcmVhY3RFdmVudFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIHRoaXMuX3JlYWN0TmFtZSA9IHJlYWN0TmFtZTtcbiAgICB0aGlzLl90YXJnZXRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgICB0aGlzLnR5cGUgPSByZWFjdEV2ZW50VHlwZTtcbiAgICB0aGlzLm5hdGl2ZUV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgdGhpcy50YXJnZXQgPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgICB0aGlzLmN1cnJlbnRUYXJnZXQgPSBudWxsO1xuXG4gICAgZm9yICh2YXIgX3Byb3BOYW1lIGluIEludGVyZmFjZSkge1xuICAgICAgaWYgKCFJbnRlcmZhY2UuaGFzT3duUHJvcGVydHkoX3Byb3BOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5vcm1hbGl6ZSA9IEludGVyZmFjZVtfcHJvcE5hbWVdO1xuXG4gICAgICBpZiAobm9ybWFsaXplKSB7XG4gICAgICAgIHRoaXNbX3Byb3BOYW1lXSA9IG5vcm1hbGl6ZShuYXRpdmVFdmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzW19wcm9wTmFtZV0gPSBuYXRpdmVFdmVudFtfcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkZWZhdWx0UHJldmVudGVkID0gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCAhPSBudWxsID8gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCA6IG5hdGl2ZUV2ZW50LnJldHVyblZhbHVlID09PSBmYWxzZTtcblxuICAgIGlmIChkZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYXNzaWduKFN5bnRoZXRpY0Jhc2VFdmVudC5wcm90b3R5cGUsIHtcbiAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgIHZhciBldmVudCA9IHRoaXMubmF0aXZlRXZlbnQ7XG5cbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gJEZsb3dGaXhNZSAtIGZsb3cgaXMgbm90IGF3YXJlIG9mIGB1bmtub3duYCBpbiBJRVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQucmV0dXJuVmFsdWUgIT09ICd1bmtub3duJykge1xuICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlO1xuICAgIH0sXG4gICAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuXG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8gJEZsb3dGaXhNZSAtIGZsb3cgaXMgbm90IGF3YXJlIG9mIGB1bmtub3duYCBpbiBJRVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQuY2FuY2VsQnViYmxlICE9PSAndW5rbm93bicpIHtcbiAgICAgICAgLy8gVGhlIENoYW5nZUV2ZW50UGx1Z2luIHJlZ2lzdGVycyBhIFwicHJvcGVydHljaGFuZ2VcIiBldmVudCBmb3JcbiAgICAgICAgLy8gSUUuIFRoaXMgZXZlbnQgZG9lcyBub3Qgc3VwcG9ydCBidWJibGluZyBvciBjYW5jZWxsaW5nLCBhbmRcbiAgICAgICAgLy8gYW55IHJlZmVyZW5jZXMgdG8gY2FuY2VsQnViYmxlIHRocm93IFwiTWVtYmVyIG5vdCBmb3VuZFwiLiAgQVxuICAgICAgICAvLyB0eXBlb2YgY2hlY2sgb2YgXCJ1bmtub3duXCIgY2lyY3VtdmVudHMgdGhpcyBpc3N1ZSAoYW5kIGlzIGFsc29cbiAgICAgICAgLy8gSUUgc3BlY2lmaWMpLlxuICAgICAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFdlIHJlbGVhc2UgYWxsIGRpc3BhdGNoZWQgYFN5bnRoZXRpY0V2ZW50YHMgYWZ0ZXIgZWFjaCBldmVudCBsb29wLCBhZGRpbmdcbiAgICAgKiB0aGVtIGJhY2sgaW50byB0aGUgcG9vbC4gVGhpcyBhbGxvd3MgYSB3YXkgdG8gaG9sZCBvbnRvIGEgcmVmZXJlbmNlIHRoYXRcbiAgICAgKiB3b24ndCBiZSBhZGRlZCBiYWNrIGludG8gdGhlIHBvb2wuXG4gICAgICovXG4gICAgcGVyc2lzdDogZnVuY3Rpb24gKCkgey8vIE1vZGVybiBldmVudCBzeXN0ZW0gZG9lc24ndCB1c2UgcG9vbGluZy5cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoaXMgZXZlbnQgc2hvdWxkIGJlIHJlbGVhc2VkIGJhY2sgaW50byB0aGUgcG9vbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhpcyBzaG91bGQgbm90IGJlIHJlbGVhc2VkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaXNQZXJzaXN0ZW50OiBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZVxuICB9KTtcbiAgcmV0dXJuIFN5bnRoZXRpY0Jhc2VFdmVudDtcbn1cbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxuXG52YXIgRXZlbnRJbnRlcmZhY2UgPSB7XG4gIGV2ZW50UGhhc2U6IDAsXG4gIGJ1YmJsZXM6IDAsXG4gIGNhbmNlbGFibGU6IDAsXG4gIHRpbWVTdGFtcDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIGV2ZW50LnRpbWVTdGFtcCB8fCBEYXRlLm5vdygpO1xuICB9LFxuICBkZWZhdWx0UHJldmVudGVkOiAwLFxuICBpc1RydXN0ZWQ6IDBcbn07XG52YXIgU3ludGhldGljRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChFdmVudEludGVyZmFjZSk7XG5cbnZhciBVSUV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICB2aWV3OiAwLFxuICBkZXRhaWw6IDBcbn0pO1xuXG52YXIgU3ludGhldGljVUlFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFVJRXZlbnRJbnRlcmZhY2UpO1xudmFyIGxhc3RNb3ZlbWVudFg7XG52YXIgbGFzdE1vdmVtZW50WTtcbnZhciBsYXN0TW91c2VFdmVudDtcblxuZnVuY3Rpb24gdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoZXZlbnQpIHtcbiAgaWYgKGV2ZW50ICE9PSBsYXN0TW91c2VFdmVudCkge1xuICAgIGlmIChsYXN0TW91c2VFdmVudCAmJiBldmVudC50eXBlID09PSAnbW91c2Vtb3ZlJykge1xuICAgICAgbGFzdE1vdmVtZW50WCA9IGV2ZW50LnNjcmVlblggLSBsYXN0TW91c2VFdmVudC5zY3JlZW5YO1xuICAgICAgbGFzdE1vdmVtZW50WSA9IGV2ZW50LnNjcmVlblkgLSBsYXN0TW91c2VFdmVudC5zY3JlZW5ZO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0TW92ZW1lbnRYID0gMDtcbiAgICAgIGxhc3RNb3ZlbWVudFkgPSAwO1xuICAgIH1cblxuICAgIGxhc3RNb3VzZUV2ZW50ID0gZXZlbnQ7XG4gIH1cbn1cbi8qKlxuICogQGludGVyZmFjZSBNb3VzZUV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBNb3VzZUV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIHNjcmVlblg6IDAsXG4gIHNjcmVlblk6IDAsXG4gIGNsaWVudFg6IDAsXG4gIGNsaWVudFk6IDAsXG4gIHBhZ2VYOiAwLFxuICBwYWdlWTogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlLFxuICBidXR0b246IDAsXG4gIGJ1dHRvbnM6IDAsXG4gIHJlbGF0ZWRUYXJnZXQ6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudC5yZWxhdGVkVGFyZ2V0ID09PSB1bmRlZmluZWQpIHJldHVybiBldmVudC5mcm9tRWxlbWVudCA9PT0gZXZlbnQuc3JjRWxlbWVudCA/IGV2ZW50LnRvRWxlbWVudCA6IGV2ZW50LmZyb21FbGVtZW50O1xuICAgIHJldHVybiBldmVudC5yZWxhdGVkVGFyZ2V0O1xuICB9LFxuICBtb3ZlbWVudFg6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmICgnbW92ZW1lbnRYJyBpbiBldmVudCkge1xuICAgICAgcmV0dXJuIGV2ZW50Lm1vdmVtZW50WDtcbiAgICB9XG5cbiAgICB1cGRhdGVNb3VzZU1vdmVtZW50UG9seWZpbGxTdGF0ZShldmVudCk7XG4gICAgcmV0dXJuIGxhc3RNb3ZlbWVudFg7XG4gIH0sXG4gIG1vdmVtZW50WTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKCdtb3ZlbWVudFknIGluIGV2ZW50KSB7XG4gICAgICByZXR1cm4gZXZlbnQubW92ZW1lbnRZO1xuICAgIH0gLy8gRG9uJ3QgbmVlZCB0byBjYWxsIHVwZGF0ZU1vdXNlTW92ZW1lbnRQb2x5ZmlsbFN0YXRlKCkgaGVyZVxuICAgIC8vIGJlY2F1c2UgaXQncyBndWFyYW50ZWVkIHRvIGhhdmUgYWxyZWFkeSBydW4gd2hlbiBtb3ZlbWVudFhcbiAgICAvLyB3YXMgY29waWVkLlxuXG5cbiAgICByZXR1cm4gbGFzdE1vdmVtZW50WTtcbiAgfVxufSk7XG5cbnZhciBTeW50aGV0aWNNb3VzZUV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoTW91c2VFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRHJhZ0V2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG52YXIgRHJhZ0V2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBNb3VzZUV2ZW50SW50ZXJmYWNlLCB7XG4gIGRhdGFUcmFuc2ZlcjogMFxufSk7XG5cbnZhciBTeW50aGV0aWNEcmFnRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChEcmFnRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEZvY3VzRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cbnZhciBGb2N1c0V2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIHJlbGF0ZWRUYXJnZXQ6IDBcbn0pO1xuXG52YXIgU3ludGhldGljRm9jdXNFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEZvY3VzRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtYW5pbWF0aW9ucy8jQW5pbWF0aW9uRXZlbnQtaW50ZXJmYWNlXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BbmltYXRpb25FdmVudFxuICovXG5cbnZhciBBbmltYXRpb25FdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgYW5pbWF0aW9uTmFtZTogMCxcbiAgZWxhcHNlZFRpbWU6IDAsXG4gIHBzZXVkb0VsZW1lbnQ6IDBcbn0pO1xuXG52YXIgU3ludGhldGljQW5pbWF0aW9uRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChBbmltYXRpb25FdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvY2xpcGJvYXJkLWFwaXMvXG4gKi9cblxudmFyIENsaXBib2FyZEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBjbGlwYm9hcmREYXRhOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2NsaXBib2FyZERhdGEnIGluIGV2ZW50ID8gZXZlbnQuY2xpcGJvYXJkRGF0YSA6IHdpbmRvdy5jbGlwYm9hcmREYXRhO1xuICB9XG59KTtcblxudmFyIFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQ2xpcGJvYXJkRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRzLWNvbXBvc2l0aW9uZXZlbnRzXG4gKi9cblxudmFyIENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGRhdGE6IDBcbn0pO1xuXG52YXIgU3ludGhldGljQ29tcG9zaXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1XG4gKiAgICAgIC8jZXZlbnRzLWlucHV0ZXZlbnRzXG4gKi9cbi8vIEhhcHBlbnMgdG8gc2hhcmUgdGhlIHNhbWUgbGlzdCBmb3Igbm93LlxuXG52YXIgU3ludGhldGljSW5wdXRFdmVudCA9IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQ7XG4vKipcbiAqIE5vcm1hbGl6YXRpb24gb2YgZGVwcmVjYXRlZCBIVE1MNSBga2V5YCB2YWx1ZXNcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQjS2V5X25hbWVzXG4gKi9cblxudmFyIG5vcm1hbGl6ZUtleSA9IHtcbiAgRXNjOiAnRXNjYXBlJyxcbiAgU3BhY2ViYXI6ICcgJyxcbiAgTGVmdDogJ0Fycm93TGVmdCcsXG4gIFVwOiAnQXJyb3dVcCcsXG4gIFJpZ2h0OiAnQXJyb3dSaWdodCcsXG4gIERvd246ICdBcnJvd0Rvd24nLFxuICBEZWw6ICdEZWxldGUnLFxuICBXaW46ICdPUycsXG4gIE1lbnU6ICdDb250ZXh0TWVudScsXG4gIEFwcHM6ICdDb250ZXh0TWVudScsXG4gIFNjcm9sbDogJ1Njcm9sbExvY2snLFxuICBNb3pQcmludGFibGVLZXk6ICdVbmlkZW50aWZpZWQnXG59O1xuLyoqXG4gKiBUcmFuc2xhdGlvbiBmcm9tIGxlZ2FjeSBga2V5Q29kZWAgdG8gSFRNTDUgYGtleWBcbiAqIE9ubHkgc3BlY2lhbCBrZXlzIHN1cHBvcnRlZCwgYWxsIG90aGVycyBkZXBlbmQgb24ga2V5Ym9hcmQgbGF5b3V0IG9yIGJyb3dzZXJcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQjS2V5X25hbWVzXG4gKi9cblxudmFyIHRyYW5zbGF0ZVRvS2V5ID0ge1xuICAnOCc6ICdCYWNrc3BhY2UnLFxuICAnOSc6ICdUYWInLFxuICAnMTInOiAnQ2xlYXInLFxuICAnMTMnOiAnRW50ZXInLFxuICAnMTYnOiAnU2hpZnQnLFxuICAnMTcnOiAnQ29udHJvbCcsXG4gICcxOCc6ICdBbHQnLFxuICAnMTknOiAnUGF1c2UnLFxuICAnMjAnOiAnQ2Fwc0xvY2snLFxuICAnMjcnOiAnRXNjYXBlJyxcbiAgJzMyJzogJyAnLFxuICAnMzMnOiAnUGFnZVVwJyxcbiAgJzM0JzogJ1BhZ2VEb3duJyxcbiAgJzM1JzogJ0VuZCcsXG4gICczNic6ICdIb21lJyxcbiAgJzM3JzogJ0Fycm93TGVmdCcsXG4gICczOCc6ICdBcnJvd1VwJyxcbiAgJzM5JzogJ0Fycm93UmlnaHQnLFxuICAnNDAnOiAnQXJyb3dEb3duJyxcbiAgJzQ1JzogJ0luc2VydCcsXG4gICc0Nic6ICdEZWxldGUnLFxuICAnMTEyJzogJ0YxJyxcbiAgJzExMyc6ICdGMicsXG4gICcxMTQnOiAnRjMnLFxuICAnMTE1JzogJ0Y0JyxcbiAgJzExNic6ICdGNScsXG4gICcxMTcnOiAnRjYnLFxuICAnMTE4JzogJ0Y3JyxcbiAgJzExOSc6ICdGOCcsXG4gICcxMjAnOiAnRjknLFxuICAnMTIxJzogJ0YxMCcsXG4gICcxMjInOiAnRjExJyxcbiAgJzEyMyc6ICdGMTInLFxuICAnMTQ0JzogJ051bUxvY2snLFxuICAnMTQ1JzogJ1Njcm9sbExvY2snLFxuICAnMjI0JzogJ01ldGEnXG59O1xuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IE5vcm1hbGl6ZWQgYGtleWAgcHJvcGVydHkuXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXZlbnRLZXkobmF0aXZlRXZlbnQpIHtcbiAgaWYgKG5hdGl2ZUV2ZW50LmtleSkge1xuICAgIC8vIE5vcm1hbGl6ZSBpbmNvbnNpc3RlbnQgdmFsdWVzIHJlcG9ydGVkIGJ5IGJyb3dzZXJzIGR1ZSB0b1xuICAgIC8vIGltcGxlbWVudGF0aW9ucyBvZiBhIHdvcmtpbmcgZHJhZnQgc3BlY2lmaWNhdGlvbi5cbiAgICAvLyBGaXJlRm94IGltcGxlbWVudHMgYGtleWAgYnV0IHJldHVybnMgYE1velByaW50YWJsZUtleWAgZm9yIGFsbFxuICAgIC8vIHByaW50YWJsZSBjaGFyYWN0ZXJzIChub3JtYWxpemVkIHRvIGBVbmlkZW50aWZpZWRgKSwgaWdub3JlIGl0LlxuICAgIHZhciBrZXkgPSBub3JtYWxpemVLZXlbbmF0aXZlRXZlbnQua2V5XSB8fCBuYXRpdmVFdmVudC5rZXk7XG5cbiAgICBpZiAoa2V5ICE9PSAnVW5pZGVudGlmaWVkJykge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH0gLy8gQnJvd3NlciBkb2VzIG5vdCBpbXBsZW1lbnQgYGtleWAsIHBvbHlmaWxsIGFzIG11Y2ggb2YgaXQgYXMgd2UgY2FuLlxuXG5cbiAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICB2YXIgY2hhckNvZGUgPSBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KTsgLy8gVGhlIGVudGVyLWtleSBpcyB0ZWNobmljYWxseSBib3RoIHByaW50YWJsZSBhbmQgbm9uLXByaW50YWJsZSBhbmQgY2FuXG4gICAgLy8gdGh1cyBiZSBjYXB0dXJlZCBieSBga2V5cHJlc3NgLCBubyBvdGhlciBub24tcHJpbnRhYmxlIGtleSBzaG91bGQuXG5cbiAgICByZXR1cm4gY2hhckNvZGUgPT09IDEzID8gJ0VudGVyJyA6IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICB9XG5cbiAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBuYXRpdmVFdmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgLy8gV2hpbGUgdXNlciBrZXlib2FyZCBsYXlvdXQgZGV0ZXJtaW5lcyB0aGUgYWN0dWFsIG1lYW5pbmcgb2YgZWFjaFxuICAgIC8vIGBrZXlDb2RlYCB2YWx1ZSwgYWxtb3N0IGFsbCBmdW5jdGlvbiBrZXlzIGhhdmUgYSB1bml2ZXJzYWwgdmFsdWUuXG4gICAgcmV0dXJuIHRyYW5zbGF0ZVRvS2V5W25hdGl2ZUV2ZW50LmtleUNvZGVdIHx8ICdVbmlkZW50aWZpZWQnO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuLyoqXG4gKiBUcmFuc2xhdGlvbiBmcm9tIG1vZGlmaWVyIGtleSB0byB0aGUgYXNzb2NpYXRlZCBwcm9wZXJ0eSBpbiB0aGUgZXZlbnQuXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8ja2V5cy1Nb2RpZmllcnNcbiAqL1xuXG5cbnZhciBtb2RpZmllcktleVRvUHJvcCA9IHtcbiAgQWx0OiAnYWx0S2V5JyxcbiAgQ29udHJvbDogJ2N0cmxLZXknLFxuICBNZXRhOiAnbWV0YUtleScsXG4gIFNoaWZ0OiAnc2hpZnRLZXknXG59OyAvLyBPbGRlciBicm93c2VycyAoU2FmYXJpIDw9IDEwLCBpT1MgU2FmYXJpIDw9IDEwLjIpIGRvIG5vdCBzdXBwb3J0XG4vLyBnZXRNb2RpZmllclN0YXRlLiBJZiBnZXRNb2RpZmllclN0YXRlIGlzIG5vdCBzdXBwb3J0ZWQsIHdlIG1hcCBpdCB0byBhIHNldCBvZlxuLy8gbW9kaWZpZXIga2V5cyBleHBvc2VkIGJ5IHRoZSBldmVudC4gSW4gdGhpcyBjYXNlLCBMb2NrLWtleXMgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cbmZ1bmN0aW9uIG1vZGlmaWVyU3RhdGVHZXR0ZXIoa2V5QXJnKSB7XG4gIHZhciBzeW50aGV0aWNFdmVudCA9IHRoaXM7XG4gIHZhciBuYXRpdmVFdmVudCA9IHN5bnRoZXRpY0V2ZW50Lm5hdGl2ZUV2ZW50O1xuXG4gIGlmIChuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0YXRlKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUoa2V5QXJnKTtcbiAgfVxuXG4gIHZhciBrZXlQcm9wID0gbW9kaWZpZXJLZXlUb1Byb3Bba2V5QXJnXTtcbiAgcmV0dXJuIGtleVByb3AgPyAhIW5hdGl2ZUV2ZW50W2tleVByb3BdIDogZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEV2ZW50TW9kaWZpZXJTdGF0ZShuYXRpdmVFdmVudCkge1xuICByZXR1cm4gbW9kaWZpZXJTdGF0ZUdldHRlcjtcbn1cbi8qKlxuICogQGludGVyZmFjZSBLZXlib2FyZEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBLZXlib2FyZEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIGtleTogZ2V0RXZlbnRLZXksXG4gIGNvZGU6IDAsXG4gIGxvY2F0aW9uOiAwLFxuICBjdHJsS2V5OiAwLFxuICBzaGlmdEtleTogMCxcbiAgYWx0S2V5OiAwLFxuICBtZXRhS2V5OiAwLFxuICByZXBlYXQ6IDAsXG4gIGxvY2FsZTogMCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlLFxuICAvLyBMZWdhY3kgSW50ZXJmYWNlXG4gIGNoYXJDb2RlOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBgY2hhckNvZGVgIGlzIHRoZSByZXN1bHQgb2YgYSBLZXlQcmVzcyBldmVudCBhbmQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2ZcbiAgICAvLyB0aGUgYWN0dWFsIHByaW50YWJsZSBjaGFyYWN0ZXIuXG4gICAgLy8gS2V5UHJlc3MgaXMgZGVwcmVjYXRlZCwgYnV0IGl0cyByZXBsYWNlbWVudCBpcyBub3QgeWV0IGZpbmFsIGFuZCBub3RcbiAgICAvLyBpbXBsZW1lbnRlZCBpbiBhbnkgbWFqb3IgYnJvd3Nlci4gT25seSBLZXlQcmVzcyBoYXMgY2hhckNvZGUuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgIHJldHVybiBnZXRFdmVudENoYXJDb2RlKGV2ZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAga2V5Q29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYGtleUNvZGVgIGlzIHRoZSByZXN1bHQgb2YgYSBLZXlEb3duL1VwIGV2ZW50IGFuZCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZlxuICAgIC8vIHBoeXNpY2FsIGtleWJvYXJkIGtleS5cbiAgICAvLyBUaGUgYWN0dWFsIG1lYW5pbmcgb2YgdGhlIHZhbHVlIGRlcGVuZHMgb24gdGhlIHVzZXJzJyBrZXlib2FyZCBsYXlvdXRcbiAgICAvLyB3aGljaCBjYW5ub3QgYmUgZGV0ZWN0ZWQuIEFzc3VtaW5nIHRoYXQgaXQgaXMgYSBVUyBrZXlib2FyZCBsYXlvdXRcbiAgICAvLyBwcm92aWRlcyBhIHN1cnByaXNpbmdseSBhY2N1cmF0ZSBtYXBwaW5nIGZvciBVUyBhbmQgRXVyb3BlYW4gdXNlcnMuXG4gICAgLy8gRHVlIHRvIHRoaXMsIGl0IGlzIGxlZnQgdG8gdGhlIHVzZXIgdG8gaW1wbGVtZW50IGF0IHRoaXMgdGltZS5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgIHJldHVybiBldmVudC5rZXlDb2RlO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9LFxuICB3aGljaDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYHdoaWNoYCBpcyBhbiBhbGlhcyBmb3IgZWl0aGVyIGBrZXlDb2RlYCBvciBgY2hhckNvZGVgIGRlcGVuZGluZyBvbiB0aGVcbiAgICAvLyB0eXBlIG9mIHRoZSBldmVudC5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgcmV0dXJuIGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpO1xuICAgIH1cblxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5ZG93bicgfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgICAgcmV0dXJuIGV2ZW50LmtleUNvZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cbn0pO1xuXG52YXIgU3ludGhldGljS2V5Ym9hcmRFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEtleWJvYXJkRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIFBvaW50ZXJFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9wb2ludGVyZXZlbnRzL1xuICovXG5cbnZhciBQb2ludGVyRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIE1vdXNlRXZlbnRJbnRlcmZhY2UsIHtcbiAgcG9pbnRlcklkOiAwLFxuICB3aWR0aDogMCxcbiAgaGVpZ2h0OiAwLFxuICBwcmVzc3VyZTogMCxcbiAgdGFuZ2VudGlhbFByZXNzdXJlOiAwLFxuICB0aWx0WDogMCxcbiAgdGlsdFk6IDAsXG4gIHR3aXN0OiAwLFxuICBwb2ludGVyVHlwZTogMCxcbiAgaXNQcmltYXJ5OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1BvaW50ZXJFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFBvaW50ZXJFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgVG91Y2hFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi90b3VjaC1ldmVudHMvXG4gKi9cblxudmFyIFRvdWNoRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgdG91Y2hlczogMCxcbiAgdGFyZ2V0VG91Y2hlczogMCxcbiAgY2hhbmdlZFRvdWNoZXM6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZVxufSk7XG5cbnZhciBTeW50aGV0aWNUb3VjaEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVG91Y2hFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwOS9XRC1jc3MzLXRyYW5zaXRpb25zLTIwMDkwMzIwLyN0cmFuc2l0aW9uLWV2ZW50cy1cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RyYW5zaXRpb25FdmVudFxuICovXG5cbnZhciBUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIHByb3BlcnR5TmFtZTogMCxcbiAgZWxhcHNlZFRpbWU6IDAsXG4gIHBzZXVkb0VsZW1lbnQ6IDBcbn0pO1xuXG52YXIgU3ludGhldGljVHJhbnNpdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVHJhbnNpdGlvbkV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBXaGVlbEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG52YXIgV2hlZWxFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgTW91c2VFdmVudEludGVyZmFjZSwge1xuICBkZWx0YVg6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnZGVsdGFYJyBpbiBldmVudCA/IGV2ZW50LmRlbHRhWCA6IC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhWGAgZm9yIFdlYmtpdCBhbmQgbm9ybWFsaXplIChyaWdodCBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGFYJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhWCA6IDA7XG4gIH0sXG4gIGRlbHRhWTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdkZWx0YVknIGluIGV2ZW50ID8gZXZlbnQuZGVsdGFZIDogLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFZYCBmb3IgV2Via2l0IGFuZCBub3JtYWxpemUgKGRvd24gaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhWScgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YVkgOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YWAgZm9yIElFPDkgYW5kIG5vcm1hbGl6ZSAoZG93biBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGEnIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGEgOiAwO1xuICB9LFxuICBkZWx0YVo6IDAsXG4gIC8vIEJyb3dzZXJzIHdpdGhvdXQgXCJkZWx0YU1vZGVcIiBpcyByZXBvcnRpbmcgaW4gcmF3IHdoZWVsIGRlbHRhIHdoZXJlIG9uZVxuICAvLyBub3RjaCBvbiB0aGUgc2Nyb2xsIGlzIGFsd2F5cyArLy0gMTIwLCByb3VnaGx5IGVxdWl2YWxlbnQgdG8gcGl4ZWxzLlxuICAvLyBBIGdvb2QgYXBwcm94aW1hdGlvbiBvZiBET01fREVMVEFfTElORSAoMSkgaXMgNSUgb2Ygdmlld3BvcnQgc2l6ZSBvclxuICAvLyB+NDAgcGl4ZWxzLCBmb3IgRE9NX0RFTFRBX1NDUkVFTiAoMikgaXQgaXMgODcuNSUgb2Ygdmlld3BvcnQgc2l6ZS5cbiAgZGVsdGFNb2RlOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1doZWVsRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChXaGVlbEV2ZW50SW50ZXJmYWNlKTtcblxudmFyIEVORF9LRVlDT0RFUyA9IFs5LCAxMywgMjcsIDMyXTsgLy8gVGFiLCBSZXR1cm4sIEVzYywgU3BhY2VcblxudmFyIFNUQVJUX0tFWUNPREUgPSAyMjk7XG52YXIgY2FuVXNlQ29tcG9zaXRpb25FdmVudCA9IGNhblVzZURPTSAmJiAnQ29tcG9zaXRpb25FdmVudCcgaW4gd2luZG93O1xudmFyIGRvY3VtZW50TW9kZSA9IG51bGw7XG5cbmlmIChjYW5Vc2VET00gJiYgJ2RvY3VtZW50TW9kZScgaW4gZG9jdW1lbnQpIHtcbiAgZG9jdW1lbnRNb2RlID0gZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xufSAvLyBXZWJraXQgb2ZmZXJzIGEgdmVyeSB1c2VmdWwgYHRleHRJbnB1dGAgZXZlbnQgdGhhdCBjYW4gYmUgdXNlZCB0b1xuLy8gZGlyZWN0bHkgcmVwcmVzZW50IGBiZWZvcmVJbnB1dGAuIFRoZSBJRSBgdGV4dGlucHV0YCBldmVudCBpcyBub3QgYXNcbi8vIHVzZWZ1bCwgc28gd2UgZG9uJ3QgdXNlIGl0LlxuXG5cbnZhciBjYW5Vc2VUZXh0SW5wdXRFdmVudCA9IGNhblVzZURPTSAmJiAnVGV4dEV2ZW50JyBpbiB3aW5kb3cgJiYgIWRvY3VtZW50TW9kZTsgLy8gSW4gSUU5Kywgd2UgaGF2ZSBhY2Nlc3MgdG8gY29tcG9zaXRpb24gZXZlbnRzLCBidXQgdGhlIGRhdGEgc3VwcGxpZWRcbi8vIGJ5IHRoZSBuYXRpdmUgY29tcG9zaXRpb25lbmQgZXZlbnQgbWF5IGJlIGluY29ycmVjdC4gSmFwYW5lc2UgaWRlb2dyYXBoaWNcbi8vIHNwYWNlcywgZm9yIGluc3RhbmNlIChcXHUzMDAwKSBhcmUgbm90IHJlY29yZGVkIGNvcnJlY3RseS5cblxudmFyIHVzZUZhbGxiYWNrQ29tcG9zaXRpb25EYXRhID0gY2FuVXNlRE9NICYmICghY2FuVXNlQ29tcG9zaXRpb25FdmVudCB8fCBkb2N1bWVudE1vZGUgJiYgZG9jdW1lbnRNb2RlID4gOCAmJiBkb2N1bWVudE1vZGUgPD0gMTEpO1xudmFyIFNQQUNFQkFSX0NPREUgPSAzMjtcbnZhciBTUEFDRUJBUl9DSEFSID0gU3RyaW5nLmZyb21DaGFyQ29kZShTUEFDRUJBUl9DT0RFKTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMoKSB7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25CZWZvcmVJbnB1dCcsIFsnY29tcG9zaXRpb25lbmQnLCAna2V5cHJlc3MnLCAndGV4dElucHV0JywgJ3Bhc3RlJ10pO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ29tcG9zaXRpb25FbmQnLCBbJ2NvbXBvc2l0aW9uZW5kJywgJ2ZvY3Vzb3V0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnbW91c2Vkb3duJ10pO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ29tcG9zaXRpb25TdGFydCcsIFsnY29tcG9zaXRpb25zdGFydCcsICdmb2N1c291dCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ21vdXNlZG93biddKTtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkNvbXBvc2l0aW9uVXBkYXRlJywgWydjb21wb3NpdGlvbnVwZGF0ZScsICdmb2N1c291dCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ21vdXNlZG93biddKTtcbn0gLy8gVHJhY2sgd2hldGhlciB3ZSd2ZSBldmVyIGhhbmRsZWQgYSBrZXlwcmVzcyBvbiB0aGUgc3BhY2Uga2V5LlxuXG5cbnZhciBoYXNTcGFjZUtleXByZXNzID0gZmFsc2U7XG4vKipcbiAqIFJldHVybiB3aGV0aGVyIGEgbmF0aXZlIGtleXByZXNzIGV2ZW50IGlzIGFzc3VtZWQgdG8gYmUgYSBjb21tYW5kLlxuICogVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIEZpcmVmb3ggZmlyZXMgYGtleXByZXNzYCBldmVudHMgZm9yIGtleSBjb21tYW5kc1xuICogKGN1dCwgY29weSwgc2VsZWN0LWFsbCwgZXRjLikgZXZlbiB0aG91Z2ggbm8gY2hhcmFjdGVyIGlzIGluc2VydGVkLlxuICovXG5cbmZ1bmN0aW9uIGlzS2V5cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiAobmF0aXZlRXZlbnQuY3RybEtleSB8fCBuYXRpdmVFdmVudC5hbHRLZXkgfHwgbmF0aXZlRXZlbnQubWV0YUtleSkgJiYgLy8gY3RybEtleSAmJiBhbHRLZXkgaXMgZXF1aXZhbGVudCB0byBBbHRHciwgYW5kIGlzIG5vdCBhIGNvbW1hbmQuXG4gICEobmF0aXZlRXZlbnQuY3RybEtleSAmJiBuYXRpdmVFdmVudC5hbHRLZXkpO1xufVxuLyoqXG4gKiBUcmFuc2xhdGUgbmF0aXZlIHRvcCBsZXZlbCBldmVudHMgaW50byBldmVudCB0eXBlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldENvbXBvc2l0aW9uRXZlbnRUeXBlKGRvbUV2ZW50TmFtZSkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2NvbXBvc2l0aW9uc3RhcnQnOlxuICAgICAgcmV0dXJuICdvbkNvbXBvc2l0aW9uU3RhcnQnO1xuXG4gICAgY2FzZSAnY29tcG9zaXRpb25lbmQnOlxuICAgICAgcmV0dXJuICdvbkNvbXBvc2l0aW9uRW5kJztcblxuICAgIGNhc2UgJ2NvbXBvc2l0aW9udXBkYXRlJzpcbiAgICAgIHJldHVybiAnb25Db21wb3NpdGlvblVwZGF0ZSc7XG4gIH1cbn1cbi8qKlxuICogRG9lcyBvdXIgZmFsbGJhY2sgYmVzdC1ndWVzcyBtb2RlbCB0aGluayB0aGlzIGV2ZW50IHNpZ25pZmllcyB0aGF0XG4gKiBjb21wb3NpdGlvbiBoYXMgYmVndW4/XG4gKi9cblxuXG5mdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25TdGFydChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBkb21FdmVudE5hbWUgPT09ICdrZXlkb3duJyAmJiBuYXRpdmVFdmVudC5rZXlDb2RlID09PSBTVEFSVF9LRVlDT0RFO1xufVxuLyoqXG4gKiBEb2VzIG91ciBmYWxsYmFjayBtb2RlIHRoaW5rIHRoYXQgdGhpcyBldmVudCBpcyB0aGUgZW5kIG9mIGNvbXBvc2l0aW9uP1xuICovXG5cblxuZnVuY3Rpb24gaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdrZXl1cCc6XG4gICAgICAvLyBDb21tYW5kIGtleXMgaW5zZXJ0IG9yIGNsZWFyIElNRSBpbnB1dC5cbiAgICAgIHJldHVybiBFTkRfS0VZQ09ERVMuaW5kZXhPZihuYXRpdmVFdmVudC5rZXlDb2RlKSAhPT0gLTE7XG5cbiAgICBjYXNlICdrZXlkb3duJzpcbiAgICAgIC8vIEV4cGVjdCBJTUUga2V5Q29kZSBvbiBlYWNoIGtleWRvd24uIElmIHdlIGdldCBhbnkgb3RoZXJcbiAgICAgIC8vIGNvZGUgd2UgbXVzdCBoYXZlIGV4aXRlZCBlYXJsaWVyLlxuICAgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmtleUNvZGUgIT09IFNUQVJUX0tFWUNPREU7XG5cbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICAvLyBFdmVudHMgYXJlIG5vdCBwb3NzaWJsZSB3aXRob3V0IGNhbmNlbGxpbmcgSU1FLlxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4vKipcbiAqIEdvb2dsZSBJbnB1dCBUb29scyBwcm92aWRlcyBjb21wb3NpdGlvbiBkYXRhIHZpYSBhIEN1c3RvbUV2ZW50LFxuICogd2l0aCB0aGUgYGRhdGFgIHByb3BlcnR5IHBvcHVsYXRlZCBpbiB0aGUgYGRldGFpbGAgb2JqZWN0LiBJZiB0aGlzXG4gKiBpcyBhdmFpbGFibGUgb24gdGhlIGV2ZW50IG9iamVjdCwgdXNlIGl0LiBJZiBub3QsIHRoaXMgaXMgYSBwbGFpblxuICogY29tcG9zaXRpb24gZXZlbnQgYW5kIHdlIGhhdmUgbm90aGluZyBzcGVjaWFsIHRvIGV4dHJhY3QuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHs/c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCkge1xuICB2YXIgZGV0YWlsID0gbmF0aXZlRXZlbnQuZGV0YWlsO1xuXG4gIGlmICh0eXBlb2YgZGV0YWlsID09PSAnb2JqZWN0JyAmJiAnZGF0YScgaW4gZGV0YWlsKSB7XG4gICAgcmV0dXJuIGRldGFpbC5kYXRhO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIENoZWNrIGlmIGEgY29tcG9zaXRpb24gZXZlbnQgd2FzIHRyaWdnZXJlZCBieSBLb3JlYW4gSU1FLlxuICogT3VyIGZhbGxiYWNrIG1vZGUgZG9lcyBub3Qgd29yayB3ZWxsIHdpdGggSUUncyBLb3JlYW4gSU1FLFxuICogc28ganVzdCB1c2UgbmF0aXZlIGNvbXBvc2l0aW9uIGV2ZW50cyB3aGVuIEtvcmVhbiBJTUUgaXMgdXNlZC5cbiAqIEFsdGhvdWdoIENvbXBvc2l0aW9uRXZlbnQubG9jYWxlIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQsXG4gKiBpdCBpcyBhdmFpbGFibGUgaW4gSUUsIHdoZXJlIG91ciBmYWxsYmFjayBtb2RlIGlzIGVuYWJsZWQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5cblxuZnVuY3Rpb24gaXNVc2luZ0tvcmVhbklNRShuYXRpdmVFdmVudCkge1xuICByZXR1cm4gbmF0aXZlRXZlbnQubG9jYWxlID09PSAna28nO1xufSAvLyBUcmFjayB0aGUgY3VycmVudCBJTUUgY29tcG9zaXRpb24gc3RhdHVzLCBpZiBhbnkuXG5cblxudmFyIGlzQ29tcG9zaW5nID0gZmFsc2U7XG4vKipcbiAqIEByZXR1cm4gez9vYmplY3R9IEEgU3ludGhldGljQ29tcG9zaXRpb25FdmVudC5cbiAqL1xuXG5mdW5jdGlvbiBleHRyYWN0Q29tcG9zaXRpb25FdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICB2YXIgZXZlbnRUeXBlO1xuICB2YXIgZmFsbGJhY2tEYXRhO1xuXG4gIGlmIChjYW5Vc2VDb21wb3NpdGlvbkV2ZW50KSB7XG4gICAgZXZlbnRUeXBlID0gZ2V0Q29tcG9zaXRpb25FdmVudFR5cGUoZG9tRXZlbnROYW1lKTtcbiAgfSBlbHNlIGlmICghaXNDb21wb3NpbmcpIHtcbiAgICBpZiAoaXNGYWxsYmFja0NvbXBvc2l0aW9uU3RhcnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkpIHtcbiAgICAgIGV2ZW50VHlwZSA9ICdvbkNvbXBvc2l0aW9uU3RhcnQnO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkpIHtcbiAgICBldmVudFR5cGUgPSAnb25Db21wb3NpdGlvbkVuZCc7XG4gIH1cblxuICBpZiAoIWV2ZW50VHlwZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKHVzZUZhbGxiYWNrQ29tcG9zaXRpb25EYXRhICYmICFpc1VzaW5nS29yZWFuSU1FKG5hdGl2ZUV2ZW50KSkge1xuICAgIC8vIFRoZSBjdXJyZW50IGNvbXBvc2l0aW9uIGlzIHN0b3JlZCBzdGF0aWNhbGx5IGFuZCBtdXN0IG5vdCBiZVxuICAgIC8vIG92ZXJ3cml0dGVuIHdoaWxlIGNvbXBvc2l0aW9uIGNvbnRpbnVlcy5cbiAgICBpZiAoIWlzQ29tcG9zaW5nICYmIGV2ZW50VHlwZSA9PT0gJ29uQ29tcG9zaXRpb25TdGFydCcpIHtcbiAgICAgIGlzQ29tcG9zaW5nID0gaW5pdGlhbGl6ZShuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdvbkNvbXBvc2l0aW9uRW5kJykge1xuICAgICAgaWYgKGlzQ29tcG9zaW5nKSB7XG4gICAgICAgIGZhbGxiYWNrRGF0YSA9IGdldERhdGEoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgbGlzdGVuZXJzID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKHRhcmdldEluc3QsIGV2ZW50VHlwZSk7XG5cbiAgaWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQoZXZlbnRUeXBlLCBkb21FdmVudE5hbWUsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG5cbiAgICBpZiAoZmFsbGJhY2tEYXRhKSB7XG4gICAgICAvLyBJbmplY3QgZGF0YSBnZW5lcmF0ZWQgZnJvbSBmYWxsYmFjayBwYXRoIGludG8gdGhlIHN5bnRoZXRpYyBldmVudC5cbiAgICAgIC8vIFRoaXMgbWF0Y2hlcyB0aGUgcHJvcGVydHkgb2YgbmF0aXZlIENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UuXG4gICAgICBldmVudC5kYXRhID0gZmFsbGJhY2tEYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgY3VzdG9tRGF0YSA9IGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpO1xuXG4gICAgICBpZiAoY3VzdG9tRGF0YSAhPT0gbnVsbCkge1xuICAgICAgICBldmVudC5kYXRhID0gY3VzdG9tRGF0YTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TmF0aXZlQmVmb3JlSW5wdXRDaGFycyhkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAnY29tcG9zaXRpb25lbmQnOlxuICAgICAgcmV0dXJuIGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpO1xuXG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgICAgLyoqXG4gICAgICAgKiBJZiBuYXRpdmUgYHRleHRJbnB1dGAgZXZlbnRzIGFyZSBhdmFpbGFibGUsIG91ciBnb2FsIGlzIHRvIG1ha2VcbiAgICAgICAqIHVzZSBvZiB0aGVtLiBIb3dldmVyLCB0aGVyZSBpcyBhIHNwZWNpYWwgY2FzZTogdGhlIHNwYWNlYmFyIGtleS5cbiAgICAgICAqIEluIFdlYmtpdCwgcHJldmVudGluZyBkZWZhdWx0IG9uIGEgc3BhY2ViYXIgYHRleHRJbnB1dGAgZXZlbnRcbiAgICAgICAqIGNhbmNlbHMgY2hhcmFjdGVyIGluc2VydGlvbiwgYnV0IGl0ICphbHNvKiBjYXVzZXMgdGhlIGJyb3dzZXJcbiAgICAgICAqIHRvIGZhbGwgYmFjayB0byBpdHMgZGVmYXVsdCBzcGFjZWJhciBiZWhhdmlvciBvZiBzY3JvbGxpbmcgdGhlXG4gICAgICAgKiBwYWdlLlxuICAgICAgICpcbiAgICAgICAqIFRyYWNraW5nIGF0OlxuICAgICAgICogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTM1NTEwM1xuICAgICAgICpcbiAgICAgICAqIFRvIGF2b2lkIHRoaXMgaXNzdWUsIHVzZSB0aGUga2V5cHJlc3MgZXZlbnQgYXMgaWYgbm8gYHRleHRJbnB1dGBcbiAgICAgICAqIGV2ZW50IGlzIGF2YWlsYWJsZS5cbiAgICAgICAqL1xuICAgICAgdmFyIHdoaWNoID0gbmF0aXZlRXZlbnQud2hpY2g7XG5cbiAgICAgIGlmICh3aGljaCAhPT0gU1BBQ0VCQVJfQ09ERSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaGFzU3BhY2VLZXlwcmVzcyA9IHRydWU7XG4gICAgICByZXR1cm4gU1BBQ0VCQVJfQ0hBUjtcblxuICAgIGNhc2UgJ3RleHRJbnB1dCc6XG4gICAgICAvLyBSZWNvcmQgdGhlIGNoYXJhY3RlcnMgdG8gYmUgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgIHZhciBjaGFycyA9IG5hdGl2ZUV2ZW50LmRhdGE7IC8vIElmIGl0J3MgYSBzcGFjZWJhciBjaGFyYWN0ZXIsIGFzc3VtZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkXG4gICAgICAvLyBpdCBhdCB0aGUga2V5cHJlc3MgbGV2ZWwgYW5kIGJhaWwgaW1tZWRpYXRlbHkuIEFuZHJvaWQgQ2hyb21lXG4gICAgICAvLyBkb2Vzbid0IGdpdmUgdXMga2V5Y29kZXMsIHNvIHdlIG5lZWQgdG8gaWdub3JlIGl0LlxuXG4gICAgICBpZiAoY2hhcnMgPT09IFNQQUNFQkFSX0NIQVIgJiYgaGFzU3BhY2VLZXlwcmVzcykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNoYXJzO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIEZvciBvdGhlciBuYXRpdmUgZXZlbnQgdHlwZXMsIGRvIG5vdGhpbmcuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuLyoqXG4gKiBGb3IgYnJvd3NlcnMgdGhhdCBkbyBub3QgcHJvdmlkZSB0aGUgYHRleHRJbnB1dGAgZXZlbnQsIGV4dHJhY3QgdGhlXG4gKiBhcHByb3ByaWF0ZSBzdHJpbmcgdG8gdXNlIGZvciBTeW50aGV0aWNJbnB1dEV2ZW50LlxuICovXG5cblxuZnVuY3Rpb24gZ2V0RmFsbGJhY2tCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBjb21wb3NpbmcgKElNRSkgYW5kIHVzaW5nIGEgZmFsbGJhY2sgdG8gZG8gc28sXG4gIC8vIHRyeSB0byBleHRyYWN0IHRoZSBjb21wb3NlZCBjaGFyYWN0ZXJzIGZyb20gdGhlIGZhbGxiYWNrIG9iamVjdC5cbiAgLy8gSWYgY29tcG9zaXRpb24gZXZlbnQgaXMgYXZhaWxhYmxlLCB3ZSBleHRyYWN0IGEgc3RyaW5nIG9ubHkgYXRcbiAgLy8gY29tcG9zaXRpb25ldmVudCwgb3RoZXJ3aXNlIGV4dHJhY3QgaXQgYXQgZmFsbGJhY2sgZXZlbnRzLlxuICBpZiAoaXNDb21wb3NpbmcpIHtcbiAgICBpZiAoZG9tRXZlbnROYW1lID09PSAnY29tcG9zaXRpb25lbmQnIHx8ICFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ICYmIGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSkge1xuICAgICAgdmFyIGNoYXJzID0gZ2V0RGF0YSgpO1xuICAgICAgcmVzZXQoKTtcbiAgICAgIGlzQ29tcG9zaW5nID0gZmFsc2U7XG4gICAgICByZXR1cm4gY2hhcnM7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ3Bhc3RlJzpcbiAgICAgIC8vIElmIGEgcGFzdGUgZXZlbnQgb2NjdXJzIGFmdGVyIGEga2V5cHJlc3MsIHRocm93IG91dCB0aGUgaW5wdXRcbiAgICAgIC8vIGNoYXJzLiBQYXN0ZSBldmVudHMgc2hvdWxkIG5vdCBsZWFkIHRvIEJlZm9yZUlucHV0IGV2ZW50cy5cbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgICAgLyoqXG4gICAgICAgKiBBcyBvZiB2MjcsIEZpcmVmb3ggbWF5IGZpcmUga2V5cHJlc3MgZXZlbnRzIGV2ZW4gd2hlbiBubyBjaGFyYWN0ZXJcbiAgICAgICAqIHdpbGwgYmUgaW5zZXJ0ZWQuIEEgZmV3IHBvc3NpYmlsaXRpZXM6XG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIGAwYC4gQXJyb3cga2V5cywgRXNjIGtleSwgZXRjLlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyB0aGUgcHJlc3NlZCBrZXkgY29kZSwgYnV0IG5vIGNoYXIgaXMgYXZhaWxhYmxlLlxuICAgICAgICogICBFeDogJ0FsdEdyICsgZGAgaW4gUG9saXNoLiBUaGVyZSBpcyBubyBtb2RpZmllZCBjaGFyYWN0ZXIgZm9yXG4gICAgICAgKiAgIHRoaXMga2V5IGNvbWJpbmF0aW9uIGFuZCBubyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQgaW50byB0aGVcbiAgICAgICAqICAgZG9jdW1lbnQsIGJ1dCBGRiBmaXJlcyB0aGUga2V5cHJlc3MgZm9yIGNoYXIgY29kZSBgMTAwYCBhbnl3YXkuXG4gICAgICAgKiAgIE5vIGBpbnB1dGAgZXZlbnQgd2lsbCBvY2N1ci5cbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgdGhlIHByZXNzZWQga2V5IGNvZGUsIGJ1dCBhIGNvbW1hbmQgY29tYmluYXRpb24gaXNcbiAgICAgICAqICAgYmVpbmcgdXNlZC4gRXg6IGBDbWQrQ2AuIE5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZCwgYW5kIG5vXG4gICAgICAgKiAgIGBpbnB1dGAgZXZlbnQgd2lsbCBvY2N1ci5cbiAgICAgICAqL1xuICAgICAgaWYgKCFpc0tleXByZXNzQ29tbWFuZChuYXRpdmVFdmVudCkpIHtcbiAgICAgICAgLy8gSUUgZmlyZXMgdGhlIGBrZXlwcmVzc2AgZXZlbnQgd2hlbiBhIHVzZXIgdHlwZXMgYW4gZW1vamkgdmlhXG4gICAgICAgIC8vIFRvdWNoIGtleWJvYXJkIG9mIFdpbmRvd3MuICBJbiBzdWNoIGEgY2FzZSwgdGhlIGBjaGFyYCBwcm9wZXJ0eVxuICAgICAgICAvLyBob2xkcyBhbiBlbW9qaSBjaGFyYWN0ZXIgbGlrZSBgXFx1RDgzRFxcdURFMEFgLiAgQmVjYXVzZSBpdHMgbGVuZ3RoXG4gICAgICAgIC8vIGlzIDIsIHRoZSBwcm9wZXJ0eSBgd2hpY2hgIGRvZXMgbm90IHJlcHJlc2VudCBhbiBlbW9qaSBjb3JyZWN0bHkuXG4gICAgICAgIC8vIEluIHN1Y2ggYSBjYXNlLCB3ZSBkaXJlY3RseSByZXR1cm4gdGhlIGBjaGFyYCBwcm9wZXJ0eSBpbnN0ZWFkIG9mXG4gICAgICAgIC8vIHVzaW5nIGB3aGljaGAuXG4gICAgICAgIGlmIChuYXRpdmVFdmVudC5jaGFyICYmIG5hdGl2ZUV2ZW50LmNoYXIubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHJldHVybiBuYXRpdmVFdmVudC5jaGFyO1xuICAgICAgICB9IGVsc2UgaWYgKG5hdGl2ZUV2ZW50LndoaWNoKSB7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUobmF0aXZlRXZlbnQud2hpY2gpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSAnY29tcG9zaXRpb25lbmQnOlxuICAgICAgcmV0dXJuIHVzZUZhbGxiYWNrQ29tcG9zaXRpb25EYXRhICYmICFpc1VzaW5nS29yZWFuSU1FKG5hdGl2ZUV2ZW50KSA/IG51bGwgOiBuYXRpdmVFdmVudC5kYXRhO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG4vKipcbiAqIEV4dHJhY3QgYSBTeW50aGV0aWNJbnB1dEV2ZW50IGZvciBgYmVmb3JlSW5wdXRgLCBiYXNlZCBvbiBlaXRoZXIgbmF0aXZlXG4gKiBgdGV4dElucHV0YCBvciBmYWxsYmFjayBiZWhhdmlvci5cbiAqXG4gKiBAcmV0dXJuIHs/b2JqZWN0fSBBIFN5bnRoZXRpY0lucHV0RXZlbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0QmVmb3JlSW5wdXRFdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICB2YXIgY2hhcnM7XG5cbiAgaWYgKGNhblVzZVRleHRJbnB1dEV2ZW50KSB7XG4gICAgY2hhcnMgPSBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpO1xuICB9IGVsc2Uge1xuICAgIGNoYXJzID0gZ2V0RmFsbGJhY2tCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpO1xuICB9IC8vIElmIG5vIGNoYXJhY3RlcnMgYXJlIGJlaW5nIGluc2VydGVkLCBubyBCZWZvcmVJbnB1dCBldmVudCBzaG91bGRcbiAgLy8gYmUgZmlyZWQuXG5cblxuICBpZiAoIWNoYXJzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbGlzdGVuZXJzID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKHRhcmdldEluc3QsICdvbkJlZm9yZUlucHV0Jyk7XG5cbiAgaWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0lucHV0RXZlbnQoJ29uQmVmb3JlSW5wdXQnLCAnYmVmb3JlaW5wdXQnLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuICAgIGV2ZW50LmRhdGEgPSBjaGFycztcbiAgfVxufVxuLyoqXG4gKiBDcmVhdGUgYW4gYG9uQmVmb3JlSW5wdXRgIGV2ZW50IHRvIG1hdGNoXG4gKiBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDEzMTEwNS8jZXZlbnRzLWlucHV0ZXZlbnRzLlxuICpcbiAqIFRoaXMgZXZlbnQgcGx1Z2luIGlzIGJhc2VkIG9uIHRoZSBuYXRpdmUgYHRleHRJbnB1dGAgZXZlbnRcbiAqIGF2YWlsYWJsZSBpbiBDaHJvbWUsIFNhZmFyaSwgT3BlcmEsIGFuZCBJRS4gVGhpcyBldmVudCBmaXJlcyBhZnRlclxuICogYG9uS2V5UHJlc3NgIGFuZCBgb25Db21wb3NpdGlvbkVuZGAsIGJ1dCBiZWZvcmUgYG9uSW5wdXRgLlxuICpcbiAqIGBiZWZvcmVJbnB1dGAgaXMgc3BlYydkIGJ1dCBub3QgaW1wbGVtZW50ZWQgaW4gYW55IGJyb3dzZXJzLCBhbmRcbiAqIHRoZSBgaW5wdXRgIGV2ZW50IGRvZXMgbm90IHByb3ZpZGUgYW55IHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGhhc1xuICogYWN0dWFsbHkgYmVlbiBhZGRlZCwgY29udHJhcnkgdG8gdGhlIHNwZWMuIFRodXMsIGB0ZXh0SW5wdXRgIGlzIHRoZSBiZXN0XG4gKiBhdmFpbGFibGUgZXZlbnQgdG8gaWRlbnRpZnkgdGhlIGNoYXJhY3RlcnMgdGhhdCBoYXZlIGFjdHVhbGx5IGJlZW4gaW5zZXJ0ZWRcbiAqIGludG8gdGhlIHRhcmdldCBub2RlLlxuICpcbiAqIFRoaXMgcGx1Z2luIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGVtaXR0aW5nIGBjb21wb3NpdGlvbmAgZXZlbnRzLCB0aHVzXG4gKiBhbGxvd2luZyB1cyB0byBzaGFyZSBjb21wb3NpdGlvbiBmYWxsYmFjayBjb2RlIGZvciBib3RoIGBiZWZvcmVJbnB1dGAgYW5kXG4gKiBgY29tcG9zaXRpb25gIGV2ZW50IHR5cGVzLlxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyhkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIGV4dHJhY3RDb21wb3NpdGlvbkV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgZXh0cmFjdEJlZm9yZUlucHV0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG4vKipcbiAqIEBzZWUgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvdGhlLWlucHV0LWVsZW1lbnQuaHRtbCNpbnB1dC10eXBlLWF0dHItc3VtbWFyeVxuICovXG52YXIgc3VwcG9ydGVkSW5wdXRUeXBlcyA9IHtcbiAgY29sb3I6IHRydWUsXG4gIGRhdGU6IHRydWUsXG4gIGRhdGV0aW1lOiB0cnVlLFxuICAnZGF0ZXRpbWUtbG9jYWwnOiB0cnVlLFxuICBlbWFpbDogdHJ1ZSxcbiAgbW9udGg6IHRydWUsXG4gIG51bWJlcjogdHJ1ZSxcbiAgcGFzc3dvcmQ6IHRydWUsXG4gIHJhbmdlOiB0cnVlLFxuICBzZWFyY2g6IHRydWUsXG4gIHRlbDogdHJ1ZSxcbiAgdGV4dDogdHJ1ZSxcbiAgdGltZTogdHJ1ZSxcbiAgdXJsOiB0cnVlLFxuICB3ZWVrOiB0cnVlXG59O1xuXG5mdW5jdGlvbiBpc1RleHRJbnB1dEVsZW1lbnQoZWxlbSkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtICYmIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmIChub2RlTmFtZSA9PT0gJ2lucHV0Jykge1xuICAgIHJldHVybiAhIXN1cHBvcnRlZElucHV0VHlwZXNbZWxlbS50eXBlXTtcbiAgfVxuXG4gIGlmIChub2RlTmFtZSA9PT0gJ3RleHRhcmVhJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBldmVudCBpcyBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuICpcbiAqIE5PVEU6IFRoaXMgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkgZm9yIG5vbi1nZW5lcmljIGV2ZW50cyBzdWNoIGFzIGBjaGFuZ2VgLFxuICogYHJlc2V0YCwgYGxvYWRgLCBgZXJyb3JgLCBhbmQgYHNlbGVjdGAuXG4gKlxuICogQm9ycm93cyBmcm9tIE1vZGVybml6ci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lU3VmZml4IEV2ZW50IG5hbWUsIGUuZy4gXCJjbGlja1wiLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZXZlbnQgaXMgc3VwcG9ydGVkLlxuICogQGludGVybmFsXG4gKiBAbGljZW5zZSBNb2Rlcm5penIgMy4wLjBwcmUgKEN1c3RvbSBCdWlsZCkgfCBNSVRcbiAqL1xuXG5mdW5jdGlvbiBpc0V2ZW50U3VwcG9ydGVkKGV2ZW50TmFtZVN1ZmZpeCkge1xuICBpZiAoIWNhblVzZURPTSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBldmVudE5hbWUgPSAnb24nICsgZXZlbnROYW1lU3VmZml4O1xuICB2YXIgaXNTdXBwb3J0ZWQgPSAoZXZlbnROYW1lIGluIGRvY3VtZW50KTtcblxuICBpZiAoIWlzU3VwcG9ydGVkKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShldmVudE5hbWUsICdyZXR1cm47Jyk7XG4gICAgaXNTdXBwb3J0ZWQgPSB0eXBlb2YgZWxlbWVudFtldmVudE5hbWVdID09PSAnZnVuY3Rpb24nO1xuICB9XG5cbiAgcmV0dXJuIGlzU3VwcG9ydGVkO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyQxKCkge1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ2hhbmdlJywgWydjaGFuZ2UnLCAnY2xpY2snLCAnZm9jdXNpbicsICdmb2N1c291dCcsICdpbnB1dCcsICdrZXlkb3duJywgJ2tleXVwJywgJ3NlbGVjdGlvbmNoYW5nZSddKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGRpc3BhdGNoUXVldWUsIGluc3QsIG5hdGl2ZUV2ZW50LCB0YXJnZXQpIHtcbiAgLy8gRmxhZyB0aGlzIGV2ZW50IGxvb3AgYXMgbmVlZGluZyBzdGF0ZSByZXN0b3JlLlxuICBlbnF1ZXVlU3RhdGVSZXN0b3JlKHRhcmdldCk7XG4gIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnMoaW5zdCwgJ29uQ2hhbmdlJyk7XG5cbiAgaWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50KCdvbkNoYW5nZScsICdjaGFuZ2UnLCBudWxsLCBuYXRpdmVFdmVudCwgdGFyZ2V0KTtcbiAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9KTtcbiAgfVxufVxuLyoqXG4gKiBGb3IgSUUgc2hpbXNcbiAqL1xuXG5cbnZhciBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgY2hhbmdlYCBldmVudFxuICovXG5cbmZ1bmN0aW9uIHNob3VsZFVzZUNoYW5nZUV2ZW50KGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBub2RlTmFtZSA9PT0gJ3NlbGVjdCcgfHwgbm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgZWxlbS50eXBlID09PSAnZmlsZSc7XG59XG5cbmZ1bmN0aW9uIG1hbnVhbERpc3BhdGNoQ2hhbmdlRXZlbnQobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGRpc3BhdGNoUXVldWUgPSBbXTtcbiAgY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGRpc3BhdGNoUXVldWUsIGFjdGl2ZUVsZW1lbnRJbnN0LCBuYXRpdmVFdmVudCwgZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpKTsgLy8gSWYgY2hhbmdlIGFuZCBwcm9wZXJ0eWNoYW5nZSBidWJibGVkLCB3ZSdkIGp1c3QgYmluZCB0byBpdCBsaWtlIGFsbCB0aGVcbiAgLy8gb3RoZXIgZXZlbnRzIGFuZCBoYXZlIGl0IGdvIHRocm91Z2ggUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLiBTaW5jZSBpdFxuICAvLyBkb2Vzbid0LCB3ZSBtYW51YWxseSBsaXN0ZW4gZm9yIHRoZSBldmVudHMgYW5kIHNvIHdlIGhhdmUgdG8gZW5xdWV1ZSBhbmRcbiAgLy8gcHJvY2VzcyB0aGUgYWJzdHJhY3QgZXZlbnQgbWFudWFsbHkuXG4gIC8vXG4gIC8vIEJhdGNoaW5nIGlzIG5lY2Vzc2FyeSBoZXJlIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IGFsbCBldmVudCBoYW5kbGVycyBydW5cbiAgLy8gYmVmb3JlIHRoZSBuZXh0IHJlcmVuZGVyIChpbmNsdWRpbmcgZXZlbnQgaGFuZGxlcnMgYXR0YWNoZWQgdG8gYW5jZXN0b3JcbiAgLy8gZWxlbWVudHMgaW5zdGVhZCBvZiBkaXJlY3RseSBvbiB0aGUgaW5wdXQpLiBXaXRob3V0IHRoaXMsIGNvbnRyb2xsZWRcbiAgLy8gY29tcG9uZW50cyBkb24ndCB3b3JrIHByb3Blcmx5IGluIGNvbmp1bmN0aW9uIHdpdGggZXZlbnQgYnViYmxpbmcgYmVjYXVzZVxuICAvLyB0aGUgY29tcG9uZW50IGlzIHJlcmVuZGVyZWQgYW5kIHRoZSB2YWx1ZSByZXZlcnRlZCBiZWZvcmUgYWxsIHRoZSBldmVudFxuICAvLyBoYW5kbGVycyBjYW4gcnVuLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy83MDguXG5cbiAgYmF0Y2hlZFVwZGF0ZXMocnVuRXZlbnRJbkJhdGNoLCBkaXNwYXRjaFF1ZXVlKTtcbn1cblxuZnVuY3Rpb24gcnVuRXZlbnRJbkJhdGNoKGRpc3BhdGNoUXVldWUpIHtcbiAgcHJvY2Vzc0Rpc3BhdGNoUXVldWUoZGlzcGF0Y2hRdWV1ZSwgMCk7XG59XG5cbmZ1bmN0aW9uIGdldEluc3RJZlZhbHVlQ2hhbmdlZCh0YXJnZXRJbnN0KSB7XG4gIHZhciB0YXJnZXROb2RlID0gZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KTtcblxuICBpZiAodXBkYXRlVmFsdWVJZkNoYW5nZWQodGFyZ2V0Tm9kZSkpIHtcbiAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9yQ2hhbmdlRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdjaGFuZ2UnKSB7XG4gICAgcmV0dXJuIHRhcmdldEluc3Q7XG4gIH1cbn1cbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBpbnB1dGAgZXZlbnRcbiAqL1xuXG5cbnZhciBpc0lucHV0RXZlbnRTdXBwb3J0ZWQgPSBmYWxzZTtcblxuaWYgKGNhblVzZURPTSkge1xuICAvLyBJRTkgY2xhaW1zIHRvIHN1cHBvcnQgdGhlIGlucHV0IGV2ZW50IGJ1dCBmYWlscyB0byB0cmlnZ2VyIGl0IHdoZW5cbiAgLy8gZGVsZXRpbmcgdGV4dCwgc28gd2UgaWdub3JlIGl0cyBpbnB1dCBldmVudHMuXG4gIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGlzRXZlbnRTdXBwb3J0ZWQoJ2lucHV0JykgJiYgKCFkb2N1bWVudC5kb2N1bWVudE1vZGUgfHwgZG9jdW1lbnQuZG9jdW1lbnRNb2RlID4gOSk7XG59XG4vKipcbiAqIChGb3IgSUUgPD05KSBTdGFydHMgdHJhY2tpbmcgcHJvcGVydHljaGFuZ2UgZXZlbnRzIG9uIHRoZSBwYXNzZWQtaW4gZWxlbWVudFxuICogYW5kIG92ZXJyaWRlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBzbyB0aGF0IHdlIGNhbiBkaXN0aW5ndWlzaCB1c2VyIGV2ZW50cyBmcm9tXG4gKiB2YWx1ZSBjaGFuZ2VzIGluIEpTLlxuICovXG5cblxuZnVuY3Rpb24gc3RhcnRXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKHRhcmdldCwgdGFyZ2V0SW5zdCkge1xuICBhY3RpdmVFbGVtZW50ID0gdGFyZ2V0O1xuICBhY3RpdmVFbGVtZW50SW5zdCA9IHRhcmdldEluc3Q7XG4gIGFjdGl2ZUVsZW1lbnQuYXR0YWNoRXZlbnQoJ29ucHJvcGVydHljaGFuZ2UnLCBoYW5kbGVQcm9wZXJ0eUNoYW5nZSk7XG59XG4vKipcbiAqIChGb3IgSUUgPD05KSBSZW1vdmVzIHRoZSBldmVudCBsaXN0ZW5lcnMgZnJvbSB0aGUgY3VycmVudGx5LXRyYWNrZWQgZWxlbWVudCxcbiAqIGlmIGFueSBleGlzdHMuXG4gKi9cblxuXG5mdW5jdGlvbiBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpIHtcbiAgaWYgKCFhY3RpdmVFbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYWN0aXZlRWxlbWVudC5kZXRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTtcbiAgYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbn1cbi8qKlxuICogKEZvciBJRSA8PTkpIEhhbmRsZXMgYSBwcm9wZXJ0eWNoYW5nZSBldmVudCwgc2VuZGluZyBhIGBjaGFuZ2VgIGV2ZW50IGlmXG4gKiB0aGUgdmFsdWUgb2YgdGhlIGFjdGl2ZSBlbGVtZW50IGhhcyBjaGFuZ2VkLlxuICovXG5cblxuZnVuY3Rpb24gaGFuZGxlUHJvcGVydHlDaGFuZ2UobmF0aXZlRXZlbnQpIHtcbiAgaWYgKG5hdGl2ZUV2ZW50LnByb3BlcnR5TmFtZSAhPT0gJ3ZhbHVlJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChnZXRJbnN0SWZWYWx1ZUNoYW5nZWQoYWN0aXZlRWxlbWVudEluc3QpKSB7XG4gICAgbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudChuYXRpdmVFdmVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlRXZlbnRzRm9ySW5wdXRFdmVudFBvbHlmaWxsKGRvbUV2ZW50TmFtZSwgdGFyZ2V0LCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdmb2N1c2luJykge1xuICAgIC8vIEluIElFOSwgcHJvcGVydHljaGFuZ2UgZmlyZXMgZm9yIG1vc3QgaW5wdXQgZXZlbnRzIGJ1dCBpcyBidWdneSBhbmRcbiAgICAvLyBkb2Vzbid0IGZpcmUgd2hlbiB0ZXh0IGlzIGRlbGV0ZWQsIGJ1dCBjb252ZW5pZW50bHksIHNlbGVjdGlvbmNoYW5nZVxuICAgIC8vIGFwcGVhcnMgdG8gZmlyZSBpbiBhbGwgb2YgdGhlIHJlbWFpbmluZyBjYXNlcyBzbyB3ZSBjYXRjaCB0aG9zZSBhbmRcbiAgICAvLyBmb3J3YXJkIHRoZSBldmVudCBpZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWRcbiAgICAvLyBJbiBlaXRoZXIgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byBjYWxsIHRoZSBldmVudCBoYW5kbGVyIGlmIHRoZSB2YWx1ZVxuICAgIC8vIGlzIGNoYW5nZWQgZnJvbSBKUyBzbyB3ZSByZWRlZmluZSBhIHNldHRlciBmb3IgYC52YWx1ZWAgdGhhdCB1cGRhdGVzXG4gICAgLy8gb3VyIGFjdGl2ZUVsZW1lbnRWYWx1ZSB2YXJpYWJsZSwgYWxsb3dpbmcgdXMgdG8gaWdub3JlIHRob3NlIGNoYW5nZXNcbiAgICAvL1xuICAgIC8vIHN0b3BXYXRjaGluZygpIHNob3VsZCBiZSBhIG5vb3AgaGVyZSBidXQgd2UgY2FsbCBpdCBqdXN0IGluIGNhc2Ugd2VcbiAgICAvLyBtaXNzZWQgYSBibHVyIGV2ZW50IHNvbWVob3cuXG4gICAgc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKTtcbiAgICBzdGFydFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KTtcbiAgfSBlbHNlIGlmIChkb21FdmVudE5hbWUgPT09ICdmb2N1c291dCcpIHtcbiAgICBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpO1xuICB9XG59IC8vIEZvciBJRTggYW5kIElFOS5cblxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudFBvbHlmaWxsKGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnc2VsZWN0aW9uY2hhbmdlJyB8fCBkb21FdmVudE5hbWUgPT09ICdrZXl1cCcgfHwgZG9tRXZlbnROYW1lID09PSAna2V5ZG93bicpIHtcbiAgICAvLyBPbiB0aGUgc2VsZWN0aW9uY2hhbmdlIGV2ZW50LCB0aGUgdGFyZ2V0IGlzIGp1c3QgZG9jdW1lbnQgd2hpY2ggaXNuJ3RcbiAgICAvLyBoZWxwZnVsIGZvciB1cyBzbyBqdXN0IGNoZWNrIGFjdGl2ZUVsZW1lbnQgaW5zdGVhZC5cbiAgICAvL1xuICAgIC8vIDk5JSBvZiB0aGUgdGltZSwga2V5ZG93biBhbmQga2V5dXAgYXJlbid0IG5lY2Vzc2FyeS4gSUU4IGZhaWxzIHRvIGZpcmVcbiAgICAvLyBwcm9wZXJ0eWNoYW5nZSBvbiB0aGUgZmlyc3QgaW5wdXQgZXZlbnQgYWZ0ZXIgc2V0dGluZyBgdmFsdWVgIGZyb20gYVxuICAgIC8vIHNjcmlwdCBhbmQgZmlyZXMgb25seSBrZXlkb3duLCBrZXlwcmVzcywga2V5dXAuIENhdGNoaW5nIGtleXVwIHVzdWFsbHlcbiAgICAvLyBnZXRzIGl0IGFuZCBjYXRjaGluZyBrZXlkb3duIGxldHMgdXMgZmlyZSBhbiBldmVudCBmb3IgdGhlIGZpcnN0XG4gICAgLy8ga2V5c3Ryb2tlIGlmIHVzZXIgZG9lcyBhIGtleSByZXBlYXQgKGl0J2xsIGJlIGEgbGl0dGxlIGRlbGF5ZWQ6IHJpZ2h0XG4gICAgLy8gYmVmb3JlIHRoZSBzZWNvbmQga2V5c3Ryb2tlKS4gT3RoZXIgaW5wdXQgbWV0aG9kcyAoZS5nLiwgcGFzdGUpIHNlZW0gdG9cbiAgICAvLyBmaXJlIHNlbGVjdGlvbmNoYW5nZSBub3JtYWxseS5cbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKGFjdGl2ZUVsZW1lbnRJbnN0KTtcbiAgfVxufVxuLyoqXG4gKiBTRUNUSU9OOiBoYW5kbGUgYGNsaWNrYCBldmVudFxuICovXG5cblxuZnVuY3Rpb24gc2hvdWxkVXNlQ2xpY2tFdmVudChlbGVtKSB7XG4gIC8vIFVzZSB0aGUgYGNsaWNrYCBldmVudCB0byBkZXRlY3QgY2hhbmdlcyB0byBjaGVja2JveCBhbmQgcmFkaW8gaW5wdXRzLlxuICAvLyBUaGlzIGFwcHJvYWNoIHdvcmtzIGFjcm9zcyBhbGwgYnJvd3NlcnMsIHdoZXJlYXMgYGNoYW5nZWAgZG9lcyBub3QgZmlyZVxuICAvLyB1bnRpbCBgYmx1cmAgaW4gSUU4LlxuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lO1xuICByZXR1cm4gbm9kZU5hbWUgJiYgbm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiAoZWxlbS50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW0udHlwZSA9PT0gJ3JhZGlvJyk7XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JDbGlja0V2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnY2xpY2snKSB7XG4gICAgcmV0dXJuIGdldEluc3RJZlZhbHVlQ2hhbmdlZCh0YXJnZXRJbnN0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRPckNoYW5nZUV2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnaW5wdXQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ2NoYW5nZScpIHtcbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUNvbnRyb2xsZWRJbnB1dEJsdXIobm9kZSkge1xuICB2YXIgc3RhdGUgPSBub2RlLl93cmFwcGVyU3RhdGU7XG5cbiAgaWYgKCFzdGF0ZSB8fCAhc3RhdGUuY29udHJvbGxlZCB8fCBub2RlLnR5cGUgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIC8vIElmIGNvbnRyb2xsZWQsIGFzc2lnbiB0aGUgdmFsdWUgYXR0cmlidXRlIHRvIHRoZSBjdXJyZW50IHZhbHVlIG9uIGJsdXJcbiAgICBzZXREZWZhdWx0VmFsdWUobm9kZSwgJ251bWJlcicsIG5vZGUudmFsdWUpO1xuICB9XG59XG4vKipcbiAqIFRoaXMgcGx1Z2luIGNyZWF0ZXMgYW4gYG9uQ2hhbmdlYCBldmVudCB0aGF0IG5vcm1hbGl6ZXMgY2hhbmdlIGV2ZW50c1xuICogYWNyb3NzIGZvcm0gZWxlbWVudHMuIFRoaXMgZXZlbnQgZmlyZXMgYXQgYSB0aW1lIHdoZW4gaXQncyBwb3NzaWJsZSB0b1xuICogY2hhbmdlIHRoZSBlbGVtZW50J3MgdmFsdWUgd2l0aG91dCBzZWVpbmcgYSBmbGlja2VyLlxuICpcbiAqIFN1cHBvcnRlZCBlbGVtZW50cyBhcmU6XG4gKiAtIGlucHV0IChzZWUgYGlzVGV4dElucHV0RWxlbWVudGApXG4gKiAtIHRleHRhcmVhXG4gKiAtIHNlbGVjdFxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQxKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIHRhcmdldE5vZGUgPSB0YXJnZXRJbnN0ID8gZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KSA6IHdpbmRvdztcbiAgdmFyIGdldFRhcmdldEluc3RGdW5jLCBoYW5kbGVFdmVudEZ1bmM7XG5cbiAgaWYgKHNob3VsZFVzZUNoYW5nZUV2ZW50KHRhcmdldE5vZGUpKSB7XG4gICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9yQ2hhbmdlRXZlbnQ7XG4gIH0gZWxzZSBpZiAoaXNUZXh0SW5wdXRFbGVtZW50KHRhcmdldE5vZGUpKSB7XG4gICAgaWYgKGlzSW5wdXRFdmVudFN1cHBvcnRlZCkge1xuICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRPckNoYW5nZUV2ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50UG9seWZpbGw7XG4gICAgICBoYW5kbGVFdmVudEZ1bmMgPSBoYW5kbGVFdmVudHNGb3JJbnB1dEV2ZW50UG9seWZpbGw7XG4gICAgfVxuICB9IGVsc2UgaWYgKHNob3VsZFVzZUNsaWNrRXZlbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDbGlja0V2ZW50O1xuICB9XG5cbiAgaWYgKGdldFRhcmdldEluc3RGdW5jKSB7XG4gICAgdmFyIGluc3QgPSBnZXRUYXJnZXRJbnN0RnVuYyhkb21FdmVudE5hbWUsIHRhcmdldEluc3QpO1xuXG4gICAgaWYgKGluc3QpIHtcbiAgICAgIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChkaXNwYXRjaFF1ZXVlLCBpbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChoYW5kbGVFdmVudEZ1bmMpIHtcbiAgICBoYW5kbGVFdmVudEZ1bmMoZG9tRXZlbnROYW1lLCB0YXJnZXROb2RlLCB0YXJnZXRJbnN0KTtcbiAgfSAvLyBXaGVuIGJsdXJyaW5nLCBzZXQgdGhlIHZhbHVlIGF0dHJpYnV0ZSBmb3IgbnVtYmVyIGlucHV0c1xuXG5cbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3Vzb3V0Jykge1xuICAgIGhhbmRsZUNvbnRyb2xsZWRJbnB1dEJsdXIodGFyZ2V0Tm9kZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMkMigpIHtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Nb3VzZUVudGVyJywgWydtb3VzZW91dCcsICdtb3VzZW92ZXInXSk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uTW91c2VMZWF2ZScsIFsnbW91c2VvdXQnLCAnbW91c2VvdmVyJ10pO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvblBvaW50ZXJFbnRlcicsIFsncG9pbnRlcm91dCcsICdwb2ludGVyb3ZlciddKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Qb2ludGVyTGVhdmUnLCBbJ3BvaW50ZXJvdXQnLCAncG9pbnRlcm92ZXInXSk7XG59XG4vKipcbiAqIEZvciBhbG1vc3QgZXZlcnkgaW50ZXJhY3Rpb24gd2UgY2FyZSBhYm91dCwgdGhlcmUgd2lsbCBiZSBib3RoIGEgdG9wLWxldmVsXG4gKiBgbW91c2VvdmVyYCBhbmQgYG1vdXNlb3V0YCBldmVudCB0aGF0IG9jY3Vycy4gT25seSB1c2UgYG1vdXNlb3V0YCBzbyB0aGF0XG4gKiB3ZSBkbyBub3QgZXh0cmFjdCBkdXBsaWNhdGUgZXZlbnRzLiBIb3dldmVyLCBtb3ZpbmcgdGhlIG1vdXNlIGludG8gdGhlXG4gKiBicm93c2VyIGZyb20gb3V0c2lkZSB3aWxsIG5vdCBmaXJlIGEgYG1vdXNlb3V0YCBldmVudC4gSW4gdGhpcyBjYXNlLCB3ZSB1c2VcbiAqIHRoZSBgbW91c2VvdmVyYCB0b3AtbGV2ZWwgZXZlbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDIoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgaXNPdmVyRXZlbnQgPSBkb21FdmVudE5hbWUgPT09ICdtb3VzZW92ZXInIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdmVyJztcbiAgdmFyIGlzT3V0RXZlbnQgPSBkb21FdmVudE5hbWUgPT09ICdtb3VzZW91dCcgfHwgZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm91dCc7XG5cbiAgaWYgKGlzT3ZlckV2ZW50ICYmICFpc1JlcGxheWluZ0V2ZW50KG5hdGl2ZUV2ZW50KSkge1xuICAgIC8vIElmIHRoaXMgaXMgYW4gb3ZlciBldmVudCB3aXRoIGEgdGFyZ2V0LCB3ZSBtaWdodCBoYXZlIGFscmVhZHkgZGlzcGF0Y2hlZFxuICAgIC8vIHRoZSBldmVudCBpbiB0aGUgb3V0IGV2ZW50IG9mIHRoZSBvdGhlciB0YXJnZXQuIElmIHRoaXMgaXMgcmVwbGF5ZWQsXG4gICAgLy8gdGhlbiBpdCdzIGJlY2F1c2Ugd2UgY291bGRuJ3QgZGlzcGF0Y2ggYWdhaW5zdCB0aGlzIHRhcmdldCBwcmV2aW91c2x5XG4gICAgLy8gc28gd2UgaGF2ZSB0byBkbyBpdCBub3cgaW5zdGVhZC5cbiAgICB2YXIgcmVsYXRlZCA9IG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQuZnJvbUVsZW1lbnQ7XG5cbiAgICBpZiAocmVsYXRlZCkge1xuICAgICAgLy8gSWYgdGhlIHJlbGF0ZWQgbm9kZSBpcyBtYW5hZ2VkIGJ5IFJlYWN0LCB3ZSBjYW4gYXNzdW1lIHRoYXQgd2UgaGF2ZVxuICAgICAgLy8gYWxyZWFkeSBkaXNwYXRjaGVkIHRoZSBjb3JyZXNwb25kaW5nIGV2ZW50cyBkdXJpbmcgaXRzIG1vdXNlb3V0LlxuICAgICAgaWYgKGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHJlbGF0ZWQpIHx8IGlzQ29udGFpbmVyTWFya2VkQXNSb290KHJlbGF0ZWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIWlzT3V0RXZlbnQgJiYgIWlzT3ZlckV2ZW50KSB7XG4gICAgLy8gTXVzdCBub3QgYmUgYSBtb3VzZSBvciBwb2ludGVyIGluIG9yIG91dCAtIGlnbm9yaW5nLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB3aW47IC8vIFRPRE86IHdoeSBpcyB0aGlzIG51bGxhYmxlIGluIHRoZSB0eXBlcyBidXQgd2UgcmVhZCBmcm9tIGl0P1xuXG4gIGlmIChuYXRpdmVFdmVudFRhcmdldC53aW5kb3cgPT09IG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgLy8gYG5hdGl2ZUV2ZW50VGFyZ2V0YCBpcyBwcm9iYWJseSBhIHdpbmRvdyBvYmplY3QuXG4gICAgd2luID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gVE9ETzogRmlndXJlIG91dCB3aHkgYG93bmVyRG9jdW1lbnRgIGlzIHNvbWV0aW1lcyB1bmRlZmluZWQgaW4gSUU4LlxuICAgIHZhciBkb2MgPSBuYXRpdmVFdmVudFRhcmdldC5vd25lckRvY3VtZW50O1xuXG4gICAgaWYgKGRvYykge1xuICAgICAgd2luID0gZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3c7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbiA9IHdpbmRvdztcbiAgICB9XG4gIH1cblxuICB2YXIgZnJvbTtcbiAgdmFyIHRvO1xuXG4gIGlmIChpc091dEV2ZW50KSB7XG4gICAgdmFyIF9yZWxhdGVkID0gbmF0aXZlRXZlbnQucmVsYXRlZFRhcmdldCB8fCBuYXRpdmVFdmVudC50b0VsZW1lbnQ7XG5cbiAgICBmcm9tID0gdGFyZ2V0SW5zdDtcbiAgICB0byA9IF9yZWxhdGVkID8gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoX3JlbGF0ZWQpIDogbnVsbDtcblxuICAgIGlmICh0byAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5lYXJlc3RNb3VudGVkID0gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcih0byk7XG5cbiAgICAgIGlmICh0byAhPT0gbmVhcmVzdE1vdW50ZWQgfHwgdG8udGFnICE9PSBIb3N0Q29tcG9uZW50ICYmIHRvLnRhZyAhPT0gSG9zdFRleHQpIHtcbiAgICAgICAgdG8gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBNb3ZpbmcgdG8gYSBub2RlIGZyb20gb3V0c2lkZSB0aGUgd2luZG93LlxuICAgIGZyb20gPSBudWxsO1xuICAgIHRvID0gdGFyZ2V0SW5zdDtcbiAgfVxuXG4gIGlmIChmcm9tID09PSB0bykge1xuICAgIC8vIE5vdGhpbmcgcGVydGFpbnMgdG8gb3VyIG1hbmFnZWQgY29tcG9uZW50cy5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljTW91c2VFdmVudDtcbiAgdmFyIGxlYXZlRXZlbnRUeXBlID0gJ29uTW91c2VMZWF2ZSc7XG4gIHZhciBlbnRlckV2ZW50VHlwZSA9ICdvbk1vdXNlRW50ZXInO1xuICB2YXIgZXZlbnRUeXBlUHJlZml4ID0gJ21vdXNlJztcblxuICBpZiAoZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm91dCcgfHwgZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm92ZXInKSB7XG4gICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljUG9pbnRlckV2ZW50O1xuICAgIGxlYXZlRXZlbnRUeXBlID0gJ29uUG9pbnRlckxlYXZlJztcbiAgICBlbnRlckV2ZW50VHlwZSA9ICdvblBvaW50ZXJFbnRlcic7XG4gICAgZXZlbnRUeXBlUHJlZml4ID0gJ3BvaW50ZXInO1xuICB9XG5cbiAgdmFyIGZyb21Ob2RlID0gZnJvbSA9PSBudWxsID8gd2luIDogZ2V0Tm9kZUZyb21JbnN0YW5jZShmcm9tKTtcbiAgdmFyIHRvTm9kZSA9IHRvID09IG51bGwgPyB3aW4gOiBnZXROb2RlRnJvbUluc3RhbmNlKHRvKTtcbiAgdmFyIGxlYXZlID0gbmV3IFN5bnRoZXRpY0V2ZW50Q3RvcihsZWF2ZUV2ZW50VHlwZSwgZXZlbnRUeXBlUHJlZml4ICsgJ2xlYXZlJywgZnJvbSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgbGVhdmUudGFyZ2V0ID0gZnJvbU5vZGU7XG4gIGxlYXZlLnJlbGF0ZWRUYXJnZXQgPSB0b05vZGU7XG4gIHZhciBlbnRlciA9IG51bGw7IC8vIFdlIHNob3VsZCBvbmx5IHByb2Nlc3MgdGhpcyBuYXRpdmVFdmVudCBpZiB3ZSBhcmUgcHJvY2Vzc2luZ1xuICAvLyB0aGUgZmlyc3QgYW5jZXN0b3IuIE5leHQgdGltZSwgd2Ugd2lsbCBpZ25vcmUgdGhlIGV2ZW50LlxuXG4gIHZhciBuYXRpdmVUYXJnZXRJbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGlmIChuYXRpdmVUYXJnZXRJbnN0ID09PSB0YXJnZXRJbnN0KSB7XG4gICAgdmFyIGVudGVyRXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnRDdG9yKGVudGVyRXZlbnRUeXBlLCBldmVudFR5cGVQcmVmaXggKyAnZW50ZXInLCB0bywgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBlbnRlckV2ZW50LnRhcmdldCA9IHRvTm9kZTtcbiAgICBlbnRlckV2ZW50LnJlbGF0ZWRUYXJnZXQgPSBmcm9tTm9kZTtcbiAgICBlbnRlciA9IGVudGVyRXZlbnQ7XG4gIH1cblxuICBhY2N1bXVsYXRlRW50ZXJMZWF2ZVR3b1BoYXNlTGlzdGVuZXJzKGRpc3BhdGNoUXVldWUsIGxlYXZlLCBlbnRlciwgZnJvbSwgdG8pO1xufVxuXG4vKipcbiAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBvd25cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuICovXG5mdW5jdGlvbiBpcyh4LCB5KSB7XG4gIHJldHVybiB4ID09PSB5ICYmICh4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geSkgfHwgeCAhPT0geCAmJiB5ICE9PSB5IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIDtcbn1cblxudmFyIG9iamVjdElzID0gdHlwZW9mIE9iamVjdC5pcyA9PT0gJ2Z1bmN0aW9uJyA/IE9iamVjdC5pcyA6IGlzO1xuXG4vKipcbiAqIFBlcmZvcm1zIGVxdWFsaXR5IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGtleXMgb24gYW4gb2JqZWN0IGFuZCByZXR1cm5pbmcgZmFsc2VcbiAqIHdoZW4gYW55IGtleSBoYXMgdmFsdWVzIHdoaWNoIGFyZSBub3Qgc3RyaWN0bHkgZXF1YWwgYmV0d2VlbiB0aGUgYXJndW1lbnRzLlxuICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHZhbHVlcyBvZiBhbGwga2V5cyBhcmUgc3RyaWN0bHkgZXF1YWwuXG4gKi9cblxuZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIpIHtcbiAgaWYgKG9iamVjdElzKG9iakEsIG9iakIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iakEgIT09ICdvYmplY3QnIHx8IG9iakEgPT09IG51bGwgfHwgdHlwZW9mIG9iakIgIT09ICdvYmplY3QnIHx8IG9iakIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIFRlc3QgZm9yIEEncyBrZXlzIGRpZmZlcmVudCBmcm9tIEIuXG5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXNBLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGN1cnJlbnRLZXkgPSBrZXlzQVtpXTtcblxuICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChvYmpCLCBjdXJyZW50S2V5KSB8fCAhb2JqZWN0SXMob2JqQVtjdXJyZW50S2V5XSwgb2JqQltjdXJyZW50S2V5XSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBHaXZlbiBhbnkgbm9kZSByZXR1cm4gdGhlIGZpcnN0IGxlYWYgbm9kZSB3aXRob3V0IGNoaWxkcmVuLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHJldHVybiB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX1cbiAqL1xuXG5mdW5jdGlvbiBnZXRMZWFmTm9kZShub2RlKSB7XG4gIHdoaWxlIChub2RlICYmIG5vZGUuZmlyc3RDaGlsZCkge1xuICAgIG5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn1cbi8qKlxuICogR2V0IHRoZSBuZXh0IHNpYmxpbmcgd2l0aGluIGEgY29udGFpbmVyLiBUaGlzIHdpbGwgd2FsayB1cCB0aGVcbiAqIERPTSBpZiBhIG5vZGUncyBzaWJsaW5ncyBoYXZlIGJlZW4gZXhoYXVzdGVkLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHJldHVybiB7P0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXRTaWJsaW5nTm9kZShub2RlKSB7XG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nO1xuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gIH1cbn1cbi8qKlxuICogR2V0IG9iamVjdCBkZXNjcmliaW5nIHRoZSBub2RlcyB3aGljaCBjb250YWluIGNoYXJhY3RlcnMgYXQgb2Zmc2V0LlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gcm9vdFxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICogQHJldHVybiB7P29iamVjdH1cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQocm9vdCwgb2Zmc2V0KSB7XG4gIHZhciBub2RlID0gZ2V0TGVhZk5vZGUocm9vdCk7XG4gIHZhciBub2RlU3RhcnQgPSAwO1xuICB2YXIgbm9kZUVuZCA9IDA7XG5cbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICBub2RlRW5kID0gbm9kZVN0YXJ0ICsgbm9kZS50ZXh0Q29udGVudC5sZW5ndGg7XG5cbiAgICAgIGlmIChub2RlU3RhcnQgPD0gb2Zmc2V0ICYmIG5vZGVFbmQgPj0gb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICBvZmZzZXQ6IG9mZnNldCAtIG5vZGVTdGFydFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBub2RlU3RhcnQgPSBub2RlRW5kO1xuICAgIH1cblxuICAgIG5vZGUgPSBnZXRMZWFmTm9kZShnZXRTaWJsaW5nTm9kZShub2RlKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG91dGVyTm9kZVxuICogQHJldHVybiB7P29iamVjdH1cbiAqL1xuXG5mdW5jdGlvbiBnZXRPZmZzZXRzKG91dGVyTm9kZSkge1xuICB2YXIgb3duZXJEb2N1bWVudCA9IG91dGVyTm9kZS5vd25lckRvY3VtZW50O1xuICB2YXIgd2luID0gb3duZXJEb2N1bWVudCAmJiBvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgdmFyIHNlbGVjdGlvbiA9IHdpbi5nZXRTZWxlY3Rpb24gJiYgd2luLmdldFNlbGVjdGlvbigpO1xuXG4gIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgYW5jaG9yTm9kZSA9IHNlbGVjdGlvbi5hbmNob3JOb2RlLFxuICAgICAgYW5jaG9yT2Zmc2V0ID0gc2VsZWN0aW9uLmFuY2hvck9mZnNldCxcbiAgICAgIGZvY3VzTm9kZSA9IHNlbGVjdGlvbi5mb2N1c05vZGUsXG4gICAgICBmb2N1c09mZnNldCA9IHNlbGVjdGlvbi5mb2N1c09mZnNldDsgLy8gSW4gRmlyZWZveCwgYW5jaG9yTm9kZSBhbmQgZm9jdXNOb2RlIGNhbiBiZSBcImFub255bW91cyBkaXZzXCIsIGUuZy4gdGhlXG4gIC8vIHVwL2Rvd24gYnV0dG9ucyBvbiBhbiA8aW5wdXQgdHlwZT1cIm51bWJlclwiPi4gQW5vbnltb3VzIGRpdnMgZG8gbm90IHNlZW0gdG9cbiAgLy8gZXhwb3NlIHByb3BlcnRpZXMsIHRyaWdnZXJpbmcgYSBcIlBlcm1pc3Npb24gZGVuaWVkIGVycm9yXCIgaWYgYW55IG9mIGl0c1xuICAvLyBwcm9wZXJ0aWVzIGFyZSBhY2Nlc3NlZC4gVGhlIG9ubHkgc2VlbWluZ2x5IHBvc3NpYmxlIHdheSB0byBhdm9pZCBlcnJvcmluZ1xuICAvLyBpcyB0byBhY2Nlc3MgYSBwcm9wZXJ0eSB0aGF0IHR5cGljYWxseSB3b3JrcyBmb3Igbm9uLWFub255bW91cyBkaXZzIGFuZFxuICAvLyBjYXRjaCBhbnkgZXJyb3IgdGhhdCBtYXkgb3RoZXJ3aXNlIGFyaXNlLiBTZWVcbiAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjA4NDI3XG5cbiAgdHJ5IHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtZXhwcmVzc2lvbnMgKi9cbiAgICBhbmNob3JOb2RlLm5vZGVUeXBlO1xuICAgIGZvY3VzTm9kZS5ub2RlVHlwZTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZ2V0TW9kZXJuT2Zmc2V0c0Zyb21Qb2ludHMob3V0ZXJOb2RlLCBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpO1xufVxuLyoqXG4gKiBSZXR1cm5zIHtzdGFydCwgZW5kfSB3aGVyZSBgc3RhcnRgIGlzIHRoZSBjaGFyYWN0ZXIvY29kZXBvaW50IGluZGV4IG9mXG4gKiAoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0KSB3aXRoaW4gdGhlIHRleHRDb250ZW50IG9mIGBvdXRlck5vZGVgLCBhbmRcbiAqIGBlbmRgIGlzIHRoZSBpbmRleCBvZiAoZm9jdXNOb2RlLCBmb2N1c09mZnNldCkuXG4gKlxuICogUmV0dXJucyBudWxsIGlmIHlvdSBwYXNzIGluIGdhcmJhZ2UgaW5wdXQgYnV0IHdlIHNob3VsZCBwcm9iYWJseSBqdXN0IGNyYXNoLlxuICpcbiAqIEV4cG9ydGVkIG9ubHkgZm9yIHRlc3RpbmcuXG4gKi9cblxuZnVuY3Rpb24gZ2V0TW9kZXJuT2Zmc2V0c0Zyb21Qb2ludHMob3V0ZXJOb2RlLCBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpIHtcbiAgdmFyIGxlbmd0aCA9IDA7XG4gIHZhciBzdGFydCA9IC0xO1xuICB2YXIgZW5kID0gLTE7XG4gIHZhciBpbmRleFdpdGhpbkFuY2hvciA9IDA7XG4gIHZhciBpbmRleFdpdGhpbkZvY3VzID0gMDtcbiAgdmFyIG5vZGUgPSBvdXRlck5vZGU7XG4gIHZhciBwYXJlbnROb2RlID0gbnVsbDtcblxuICBvdXRlcjogd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgbmV4dCA9IG51bGw7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUgPT09IGFuY2hvck5vZGUgJiYgKGFuY2hvck9mZnNldCA9PT0gMCB8fCBub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpKSB7XG4gICAgICAgIHN0YXJ0ID0gbGVuZ3RoICsgYW5jaG9yT2Zmc2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSA9PT0gZm9jdXNOb2RlICYmIChmb2N1c09mZnNldCA9PT0gMCB8fCBub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpKSB7XG4gICAgICAgIGVuZCA9IGxlbmd0aCArIGZvY3VzT2Zmc2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICAgIGxlbmd0aCArPSBub2RlLm5vZGVWYWx1ZS5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmICgobmV4dCA9IG5vZGUuZmlyc3RDaGlsZCkgPT09IG51bGwpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IC8vIE1vdmluZyBmcm9tIGBub2RlYCB0byBpdHMgZmlyc3QgY2hpbGQgYG5leHRgLlxuXG5cbiAgICAgIHBhcmVudE5vZGUgPSBub2RlO1xuICAgICAgbm9kZSA9IG5leHQ7XG4gICAgfVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlID09PSBvdXRlck5vZGUpIHtcbiAgICAgICAgLy8gSWYgYG91dGVyTm9kZWAgaGFzIGNoaWxkcmVuLCB0aGlzIGlzIGFsd2F5cyB0aGUgc2Vjb25kIHRpbWUgdmlzaXRpbmdcbiAgICAgICAgLy8gaXQuIElmIGl0IGhhcyBubyBjaGlsZHJlbiwgdGhpcyBpcyBzdGlsbCB0aGUgZmlyc3QgbG9vcCwgYW5kIHRoZSBvbmx5XG4gICAgICAgIC8vIHZhbGlkIHNlbGVjdGlvbiBpcyBhbmNob3JOb2RlIGFuZCBmb2N1c05vZGUgYm90aCBlcXVhbCB0byB0aGlzIG5vZGVcbiAgICAgICAgLy8gYW5kIGJvdGggb2Zmc2V0cyAwLCBpbiB3aGljaCBjYXNlIHdlIHdpbGwgaGF2ZSBoYW5kbGVkIGFib3ZlLlxuICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudE5vZGUgPT09IGFuY2hvck5vZGUgJiYgKytpbmRleFdpdGhpbkFuY2hvciA9PT0gYW5jaG9yT2Zmc2V0KSB7XG4gICAgICAgIHN0YXJ0ID0gbGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Tm9kZSA9PT0gZm9jdXNOb2RlICYmICsraW5kZXhXaXRoaW5Gb2N1cyA9PT0gZm9jdXNPZmZzZXQpIHtcbiAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAoKG5leHQgPSBub2RlLm5leHRTaWJsaW5nKSAhPT0gbnVsbCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IHBhcmVudE5vZGU7XG4gICAgICBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH0gLy8gTW92aW5nIGZyb20gYG5vZGVgIHRvIGl0cyBuZXh0IHNpYmxpbmcgYG5leHRgLlxuXG5cbiAgICBub2RlID0gbmV4dDtcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gLTEgfHwgZW5kID09PSAtMSkge1xuICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gKFdvdWxkIGhhcHBlbiBpZiB0aGUgYW5jaG9yL2ZvY3VzIG5vZGVzIGFyZW4ndFxuICAgIC8vIGFjdHVhbGx5IGluc2lkZSB0aGUgcGFzc2VkLWluIG5vZGUuKVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydDogc3RhcnQsXG4gICAgZW5kOiBlbmRcbiAgfTtcbn1cbi8qKlxuICogSW4gbW9kZXJuIG5vbi1JRSBicm93c2Vycywgd2UgY2FuIHN1cHBvcnQgYm90aCBmb3J3YXJkIGFuZCBiYWNrd2FyZFxuICogc2VsZWN0aW9ucy5cbiAqXG4gKiBOb3RlOiBJRTEwKyBzdXBwb3J0cyB0aGUgU2VsZWN0aW9uIG9iamVjdCwgYnV0IGl0IGRvZXMgbm90IHN1cHBvcnRcbiAqIHRoZSBgZXh0ZW5kYCBtZXRob2QsIHdoaWNoIG1lYW5zIHRoYXQgZXZlbiBpbiBtb2Rlcm4gSUUsIGl0J3Mgbm90IHBvc3NpYmxlXG4gKiB0byBwcm9ncmFtbWF0aWNhbGx5IGNyZWF0ZSBhIGJhY2t3YXJkIHNlbGVjdGlvbi4gVGh1cywgZm9yIGFsbCBJRVxuICogdmVyc2lvbnMsIHdlIHVzZSB0aGUgb2xkIElFIEFQSSB0byBjcmVhdGUgb3VyIHNlbGVjdGlvbnMuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcGFyYW0ge29iamVjdH0gb2Zmc2V0c1xuICovXG5cbmZ1bmN0aW9uIHNldE9mZnNldHMobm9kZSwgb2Zmc2V0cykge1xuICB2YXIgZG9jID0gbm9kZS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50O1xuICB2YXIgd2luID0gZG9jICYmIGRvYy5kZWZhdWx0VmlldyB8fCB3aW5kb3c7IC8vIEVkZ2UgZmFpbHMgd2l0aCBcIk9iamVjdCBleHBlY3RlZFwiIGluIHNvbWUgc2NlbmFyaW9zLlxuICAvLyAoRm9yIGluc3RhbmNlOiBUaW55TUNFIGVkaXRvciB1c2VkIGluIGEgbGlzdCBjb21wb25lbnQgdGhhdCBzdXBwb3J0cyBwYXN0aW5nIHRvIGFkZCBtb3JlLFxuICAvLyBmYWlscyB3aGVuIHBhc3RpbmcgMTAwKyBpdGVtcylcblxuICBpZiAoIXdpbi5nZXRTZWxlY3Rpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbigpO1xuICB2YXIgbGVuZ3RoID0gbm9kZS50ZXh0Q29udGVudC5sZW5ndGg7XG4gIHZhciBzdGFydCA9IE1hdGgubWluKG9mZnNldHMuc3RhcnQsIGxlbmd0aCk7XG4gIHZhciBlbmQgPSBvZmZzZXRzLmVuZCA9PT0gdW5kZWZpbmVkID8gc3RhcnQgOiBNYXRoLm1pbihvZmZzZXRzLmVuZCwgbGVuZ3RoKTsgLy8gSUUgMTEgdXNlcyBtb2Rlcm4gc2VsZWN0aW9uLCBidXQgZG9lc24ndCBzdXBwb3J0IHRoZSBleHRlbmQgbWV0aG9kLlxuICAvLyBGbGlwIGJhY2t3YXJkIHNlbGVjdGlvbnMsIHNvIHdlIGNhbiBzZXQgd2l0aCBhIHNpbmdsZSByYW5nZS5cblxuICBpZiAoIXNlbGVjdGlvbi5leHRlbmQgJiYgc3RhcnQgPiBlbmQpIHtcbiAgICB2YXIgdGVtcCA9IGVuZDtcbiAgICBlbmQgPSBzdGFydDtcbiAgICBzdGFydCA9IHRlbXA7XG4gIH1cblxuICB2YXIgc3RhcnRNYXJrZXIgPSBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KG5vZGUsIHN0YXJ0KTtcbiAgdmFyIGVuZE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQobm9kZSwgZW5kKTtcblxuICBpZiAoc3RhcnRNYXJrZXIgJiYgZW5kTWFya2VyKSB7XG4gICAgaWYgKHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAxICYmIHNlbGVjdGlvbi5hbmNob3JOb2RlID09PSBzdGFydE1hcmtlci5ub2RlICYmIHNlbGVjdGlvbi5hbmNob3JPZmZzZXQgPT09IHN0YXJ0TWFya2VyLm9mZnNldCAmJiBzZWxlY3Rpb24uZm9jdXNOb2RlID09PSBlbmRNYXJrZXIubm9kZSAmJiBzZWxlY3Rpb24uZm9jdXNPZmZzZXQgPT09IGVuZE1hcmtlci5vZmZzZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcmFuZ2UgPSBkb2MuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZS5zZXRTdGFydChzdGFydE1hcmtlci5ub2RlLCBzdGFydE1hcmtlci5vZmZzZXQpO1xuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcblxuICAgIGlmIChzdGFydCA+IGVuZCkge1xuICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgIHNlbGVjdGlvbi5leHRlbmQoZW5kTWFya2VyLm5vZGUsIGVuZE1hcmtlci5vZmZzZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByYW5nZS5zZXRFbmQoZW5kTWFya2VyLm5vZGUsIGVuZE1hcmtlci5vZmZzZXQpO1xuICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNUZXh0Tm9kZShub2RlKSB7XG4gIHJldHVybiBub2RlICYmIG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERTtcbn1cblxuZnVuY3Rpb24gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlKSB7XG4gIGlmICghb3V0ZXJOb2RlIHx8ICFpbm5lck5vZGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAob3V0ZXJOb2RlID09PSBpbm5lck5vZGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc1RleHROb2RlKG91dGVyTm9kZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAoaXNUZXh0Tm9kZShpbm5lck5vZGUpKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5zTm9kZShvdXRlck5vZGUsIGlubmVyTm9kZS5wYXJlbnROb2RlKTtcbiAgfSBlbHNlIGlmICgnY29udGFpbnMnIGluIG91dGVyTm9kZSkge1xuICAgIHJldHVybiBvdXRlck5vZGUuY29udGFpbnMoaW5uZXJOb2RlKTtcbiAgfSBlbHNlIGlmIChvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24pIHtcbiAgICByZXR1cm4gISEob3V0ZXJOb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGlubmVyTm9kZSkgJiAxNik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzSW5Eb2N1bWVudChub2RlKSB7XG4gIHJldHVybiBub2RlICYmIG5vZGUub3duZXJEb2N1bWVudCAmJiBjb250YWluc05vZGUobm9kZS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgbm9kZSk7XG59XG5cbmZ1bmN0aW9uIGlzU2FtZU9yaWdpbkZyYW1lKGlmcmFtZSkge1xuICB0cnkge1xuICAgIC8vIEFjY2Vzc2luZyB0aGUgY29udGVudERvY3VtZW50IG9mIGEgSFRNTElmcmFtZUVsZW1lbnQgY2FuIGNhdXNlIHRoZSBicm93c2VyXG4gICAgLy8gdG8gdGhyb3csIGUuZy4gaWYgaXQgaGFzIGEgY3Jvc3Mtb3JpZ2luIHNyYyBhdHRyaWJ1dGUuXG4gICAgLy8gU2FmYXJpIHdpbGwgc2hvdyBhbiBlcnJvciBpbiB0aGUgY29uc29sZSB3aGVuIHRoZSBhY2Nlc3MgcmVzdWx0cyBpbiBcIkJsb2NrZWQgYSBmcmFtZSB3aXRoIG9yaWdpblwiLiBlLmc6XG4gICAgLy8gaWZyYW1lLmNvbnRlbnREb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICAvLyBBIHNhZmV0eSB3YXkgaXMgdG8gYWNjZXNzIG9uZSBvZiB0aGUgY3Jvc3Mgb3JpZ2luIHByb3BlcnRpZXM6IFdpbmRvdyBvciBMb2NhdGlvblxuICAgIC8vIFdoaWNoIG1pZ2h0IHJlc3VsdCBpbiBcIlNlY3VyaXR5RXJyb3JcIiBET00gRXhjZXB0aW9uIGFuZCBpdCBpcyBjb21wYXRpYmxlIHRvIFNhZmFyaS5cbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9icm93c2Vycy5odG1sI2ludGVncmF0aW9uLXdpdGgtaWRsXG4gICAgcmV0dXJuIHR5cGVvZiBpZnJhbWUuY29udGVudFdpbmRvdy5sb2NhdGlvbi5ocmVmID09PSAnc3RyaW5nJztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEFjdGl2ZUVsZW1lbnREZWVwKCkge1xuICB2YXIgd2luID0gd2luZG93O1xuICB2YXIgZWxlbWVudCA9IGdldEFjdGl2ZUVsZW1lbnQoKTtcblxuICB3aGlsZSAoZWxlbWVudCBpbnN0YW5jZW9mIHdpbi5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgIGlmIChpc1NhbWVPcmlnaW5GcmFtZShlbGVtZW50KSkge1xuICAgICAgd2luID0gZWxlbWVudC5jb250ZW50V2luZG93O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICBlbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudCh3aW4uZG9jdW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG4vKipcbiAqIEBSZWFjdElucHV0U2VsZWN0aW9uOiBSZWFjdCBpbnB1dCBzZWxlY3Rpb24gbW9kdWxlLiBCYXNlZCBvbiBTZWxlY3Rpb24uanMsXG4gKiBidXQgbW9kaWZpZWQgdG8gYmUgc3VpdGFibGUgZm9yIHJlYWN0IGFuZCBoYXMgYSBjb3VwbGUgb2YgYnVnIGZpeGVzIChkb2Vzbid0XG4gKiBhc3N1bWUgYnV0dG9ucyBoYXZlIHJhbmdlIHNlbGVjdGlvbnMgYWxsb3dlZCkuXG4gKiBJbnB1dCBzZWxlY3Rpb24gbW9kdWxlIGZvciBSZWFjdC5cbiAqL1xuXG4vKipcbiAqIEBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXM6IHdlIGdldCB0aGUgZWxlbWVudCB0eXBlcyB0aGF0IHN1cHBvcnQgc2VsZWN0aW9uXG4gKiBmcm9tIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2RvLW5vdC1hcHBseSwgbG9va2luZyBhdCBgc2VsZWN0aW9uU3RhcnRgXG4gKiBhbmQgYHNlbGVjdGlvbkVuZGAgcm93cy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBub2RlTmFtZSAmJiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgKGVsZW0udHlwZSA9PT0gJ3RleHQnIHx8IGVsZW0udHlwZSA9PT0gJ3NlYXJjaCcgfHwgZWxlbS50eXBlID09PSAndGVsJyB8fCBlbGVtLnR5cGUgPT09ICd1cmwnIHx8IGVsZW0udHlwZSA9PT0gJ3Bhc3N3b3JkJykgfHwgbm9kZU5hbWUgPT09ICd0ZXh0YXJlYScgfHwgZWxlbS5jb250ZW50RWRpdGFibGUgPT09ICd0cnVlJyk7XG59XG5mdW5jdGlvbiBnZXRTZWxlY3Rpb25JbmZvcm1hdGlvbigpIHtcbiAgdmFyIGZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxlbWVudERlZXAoKTtcbiAgcmV0dXJuIHtcbiAgICBmb2N1c2VkRWxlbTogZm9jdXNlZEVsZW0sXG4gICAgc2VsZWN0aW9uUmFuZ2U6IGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhmb2N1c2VkRWxlbSkgPyBnZXRTZWxlY3Rpb24oZm9jdXNlZEVsZW0pIDogbnVsbFxuICB9O1xufVxuLyoqXG4gKiBAcmVzdG9yZVNlbGVjdGlvbjogSWYgYW55IHNlbGVjdGlvbiBpbmZvcm1hdGlvbiB3YXMgcG90ZW50aWFsbHkgbG9zdCxcbiAqIHJlc3RvcmUgaXQuIFRoaXMgaXMgdXNlZnVsIHdoZW4gcGVyZm9ybWluZyBvcGVyYXRpb25zIHRoYXQgY291bGQgcmVtb3ZlIGRvbVxuICogbm9kZXMgYW5kIHBsYWNlIHRoZW0gYmFjayBpbiwgcmVzdWx0aW5nIGluIGZvY3VzIGJlaW5nIGxvc3QuXG4gKi9cblxuZnVuY3Rpb24gcmVzdG9yZVNlbGVjdGlvbihwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uKSB7XG4gIHZhciBjdXJGb2N1c2VkRWxlbSA9IGdldEFjdGl2ZUVsZW1lbnREZWVwKCk7XG4gIHZhciBwcmlvckZvY3VzZWRFbGVtID0gcHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbi5mb2N1c2VkRWxlbTtcbiAgdmFyIHByaW9yU2VsZWN0aW9uUmFuZ2UgPSBwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uLnNlbGVjdGlvblJhbmdlO1xuXG4gIGlmIChjdXJGb2N1c2VkRWxlbSAhPT0gcHJpb3JGb2N1c2VkRWxlbSAmJiBpc0luRG9jdW1lbnQocHJpb3JGb2N1c2VkRWxlbSkpIHtcbiAgICBpZiAocHJpb3JTZWxlY3Rpb25SYW5nZSAhPT0gbnVsbCAmJiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMocHJpb3JGb2N1c2VkRWxlbSkpIHtcbiAgICAgIHNldFNlbGVjdGlvbihwcmlvckZvY3VzZWRFbGVtLCBwcmlvclNlbGVjdGlvblJhbmdlKTtcbiAgICB9IC8vIEZvY3VzaW5nIGEgbm9kZSBjYW4gY2hhbmdlIHRoZSBzY3JvbGwgcG9zaXRpb24sIHdoaWNoIGlzIHVuZGVzaXJhYmxlXG5cblxuICAgIHZhciBhbmNlc3RvcnMgPSBbXTtcbiAgICB2YXIgYW5jZXN0b3IgPSBwcmlvckZvY3VzZWRFbGVtO1xuXG4gICAgd2hpbGUgKGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50Tm9kZSkge1xuICAgICAgaWYgKGFuY2VzdG9yLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgYW5jZXN0b3JzLnB1c2goe1xuICAgICAgICAgIGVsZW1lbnQ6IGFuY2VzdG9yLFxuICAgICAgICAgIGxlZnQ6IGFuY2VzdG9yLnNjcm9sbExlZnQsXG4gICAgICAgICAgdG9wOiBhbmNlc3Rvci5zY3JvbGxUb3BcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwcmlvckZvY3VzZWRFbGVtLmZvY3VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwcmlvckZvY3VzZWRFbGVtLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbmNlc3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpbmZvID0gYW5jZXN0b3JzW2ldO1xuICAgICAgaW5mby5lbGVtZW50LnNjcm9sbExlZnQgPSBpbmZvLmxlZnQ7XG4gICAgICBpbmZvLmVsZW1lbnQuc2Nyb2xsVG9wID0gaW5mby50b3A7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEBnZXRTZWxlY3Rpb246IEdldHMgdGhlIHNlbGVjdGlvbiBib3VuZHMgb2YgYSBmb2N1c2VkIHRleHRhcmVhLCBpbnB1dCBvclxuICogY29udGVudEVkaXRhYmxlIG5vZGUuXG4gKiAtQGlucHV0OiBMb29rIHVwIHNlbGVjdGlvbiBib3VuZHMgb2YgdGhpcyBpbnB1dFxuICogLUByZXR1cm4ge3N0YXJ0OiBzZWxlY3Rpb25TdGFydCwgZW5kOiBzZWxlY3Rpb25FbmR9XG4gKi9cblxuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uKGlucHV0KSB7XG4gIHZhciBzZWxlY3Rpb247XG5cbiAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gaW5wdXQpIHtcbiAgICAvLyBNb2Rlcm4gYnJvd3NlciB3aXRoIGlucHV0IG9yIHRleHRhcmVhLlxuICAgIHNlbGVjdGlvbiA9IHtcbiAgICAgIHN0YXJ0OiBpbnB1dC5zZWxlY3Rpb25TdGFydCxcbiAgICAgIGVuZDogaW5wdXQuc2VsZWN0aW9uRW5kXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDb250ZW50IGVkaXRhYmxlIG9yIG9sZCBJRSB0ZXh0YXJlYS5cbiAgICBzZWxlY3Rpb24gPSBnZXRPZmZzZXRzKGlucHV0KTtcbiAgfVxuXG4gIHJldHVybiBzZWxlY3Rpb24gfHwge1xuICAgIHN0YXJ0OiAwLFxuICAgIGVuZDogMFxuICB9O1xufVxuLyoqXG4gKiBAc2V0U2VsZWN0aW9uOiBTZXRzIHRoZSBzZWxlY3Rpb24gYm91bmRzIG9mIGEgdGV4dGFyZWEgb3IgaW5wdXQgYW5kIGZvY3VzZXNcbiAqIHRoZSBpbnB1dC5cbiAqIC1AaW5wdXQgICAgIFNldCBzZWxlY3Rpb24gYm91bmRzIG9mIHRoaXMgaW5wdXQgb3IgdGV4dGFyZWFcbiAqIC1Ab2Zmc2V0cyAgIE9iamVjdCBvZiBzYW1lIGZvcm0gdGhhdCBpcyByZXR1cm5lZCBmcm9tIGdldCpcbiAqL1xuXG5mdW5jdGlvbiBzZXRTZWxlY3Rpb24oaW5wdXQsIG9mZnNldHMpIHtcbiAgdmFyIHN0YXJ0ID0gb2Zmc2V0cy5zdGFydDtcbiAgdmFyIGVuZCA9IG9mZnNldHMuZW5kO1xuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHN0YXJ0O1xuICB9XG5cbiAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gaW5wdXQpIHtcbiAgICBpbnB1dC5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0O1xuICAgIGlucHV0LnNlbGVjdGlvbkVuZCA9IE1hdGgubWluKGVuZCwgaW5wdXQudmFsdWUubGVuZ3RoKTtcbiAgfSBlbHNlIHtcbiAgICBzZXRPZmZzZXRzKGlucHV0LCBvZmZzZXRzKTtcbiAgfVxufVxuXG52YXIgc2tpcFNlbGVjdGlvbkNoYW5nZUV2ZW50ID0gY2FuVXNlRE9NICYmICdkb2N1bWVudE1vZGUnIGluIGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA8PSAxMTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMkMygpIHtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvblNlbGVjdCcsIFsnZm9jdXNvdXQnLCAnY29udGV4dG1lbnUnLCAnZHJhZ2VuZCcsICdmb2N1c2luJywgJ2tleWRvd24nLCAna2V5dXAnLCAnbW91c2Vkb3duJywgJ21vdXNldXAnLCAnc2VsZWN0aW9uY2hhbmdlJ10pO1xufVxuXG52YXIgYWN0aXZlRWxlbWVudCQxID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50SW5zdCQxID0gbnVsbDtcbnZhciBsYXN0U2VsZWN0aW9uID0gbnVsbDtcbnZhciBtb3VzZURvd24gPSBmYWxzZTtcbi8qKlxuICogR2V0IGFuIG9iamVjdCB3aGljaCBpcyBhIHVuaXF1ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24uXG4gKlxuICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIG5vdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBub2RlcyBvciBicm93c2VycywgYnV0XG4gKiB0d28gaWRlbnRpY2FsIHNlbGVjdGlvbnMgb24gdGhlIHNhbWUgbm9kZSB3aWxsIHJldHVybiBpZGVudGljYWwgb2JqZWN0cy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24kMShub2RlKSB7XG4gIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIG5vZGUgJiYgaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKG5vZGUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0OiBub2RlLnNlbGVjdGlvblN0YXJ0LFxuICAgICAgZW5kOiBub2RlLnNlbGVjdGlvbkVuZFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdmFyIHdpbiA9IG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICAgIHZhciBzZWxlY3Rpb24gPSB3aW4uZ2V0U2VsZWN0aW9uKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFuY2hvck5vZGU6IHNlbGVjdGlvbi5hbmNob3JOb2RlLFxuICAgICAgYW5jaG9yT2Zmc2V0OiBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LFxuICAgICAgZm9jdXNOb2RlOiBzZWxlY3Rpb24uZm9jdXNOb2RlLFxuICAgICAgZm9jdXNPZmZzZXQ6IHNlbGVjdGlvbi5mb2N1c09mZnNldFxuICAgIH07XG4gIH1cbn1cbi8qKlxuICogR2V0IGRvY3VtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQgdGFyZ2V0LlxuICovXG5cblxuZnVuY3Rpb24gZ2V0RXZlbnRUYXJnZXREb2N1bWVudChldmVudFRhcmdldCkge1xuICByZXR1cm4gZXZlbnRUYXJnZXQud2luZG93ID09PSBldmVudFRhcmdldCA/IGV2ZW50VGFyZ2V0LmRvY3VtZW50IDogZXZlbnRUYXJnZXQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyBldmVudFRhcmdldCA6IGV2ZW50VGFyZ2V0Lm93bmVyRG9jdW1lbnQ7XG59XG4vKipcbiAqIFBvbGwgc2VsZWN0aW9uIHRvIHNlZSB3aGV0aGVyIGl0J3MgY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFRhcmdldFxuICogQHJldHVybiB7P1N5bnRoZXRpY0V2ZW50fVxuICovXG5cblxuZnVuY3Rpb24gY29uc3RydWN0U2VsZWN0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIC8vIEVuc3VyZSB3ZSBoYXZlIHRoZSByaWdodCBlbGVtZW50LCBhbmQgdGhhdCB0aGUgdXNlciBpcyBub3QgZHJhZ2dpbmcgYVxuICAvLyBzZWxlY3Rpb24gKHRoaXMgbWF0Y2hlcyBuYXRpdmUgYHNlbGVjdGAgZXZlbnQgYmVoYXZpb3IpLiBJbiBIVE1MNSwgc2VsZWN0XG4gIC8vIGZpcmVzIG9ubHkgb24gaW5wdXQgYW5kIHRleHRhcmVhIHRodXMgaWYgdGhlcmUncyBubyBmb2N1c2VkIGVsZW1lbnQgd2VcbiAgLy8gd29uJ3QgZGlzcGF0Y2guXG4gIHZhciBkb2MgPSBnZXRFdmVudFRhcmdldERvY3VtZW50KG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBpZiAobW91c2VEb3duIHx8IGFjdGl2ZUVsZW1lbnQkMSA9PSBudWxsIHx8IGFjdGl2ZUVsZW1lbnQkMSAhPT0gZ2V0QWN0aXZlRWxlbWVudChkb2MpKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIE9ubHkgZmlyZSB3aGVuIHNlbGVjdGlvbiBoYXMgYWN0dWFsbHkgY2hhbmdlZC5cblxuXG4gIHZhciBjdXJyZW50U2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uJDEoYWN0aXZlRWxlbWVudCQxKTtcblxuICBpZiAoIWxhc3RTZWxlY3Rpb24gfHwgIXNoYWxsb3dFcXVhbChsYXN0U2VsZWN0aW9uLCBjdXJyZW50U2VsZWN0aW9uKSkge1xuICAgIGxhc3RTZWxlY3Rpb24gPSBjdXJyZW50U2VsZWN0aW9uO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnMoYWN0aXZlRWxlbWVudEluc3QkMSwgJ29uU2VsZWN0Jyk7XG5cbiAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBldmVudCA9IG5ldyBTeW50aGV0aWNFdmVudCgnb25TZWxlY3QnLCAnc2VsZWN0JywgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICAgIH0pO1xuICAgICAgZXZlbnQudGFyZ2V0ID0gYWN0aXZlRWxlbWVudCQxO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBUaGlzIHBsdWdpbiBjcmVhdGVzIGFuIGBvblNlbGVjdGAgZXZlbnQgdGhhdCBub3JtYWxpemVzIHNlbGVjdCBldmVudHNcbiAqIGFjcm9zcyBmb3JtIGVsZW1lbnRzLlxuICpcbiAqIFN1cHBvcnRlZCBlbGVtZW50cyBhcmU6XG4gKiAtIGlucHV0IChzZWUgYGlzVGV4dElucHV0RWxlbWVudGApXG4gKiAtIHRleHRhcmVhXG4gKiAtIGNvbnRlbnRFZGl0YWJsZVxuICpcbiAqIFRoaXMgZGlmZmVycyBmcm9tIG5hdGl2ZSBicm93c2VyIGltcGxlbWVudGF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHdheXM6XG4gKiAtIEZpcmVzIG9uIGNvbnRlbnRFZGl0YWJsZSBmaWVsZHMgYXMgd2VsbCBhcyBpbnB1dHMuXG4gKiAtIEZpcmVzIGZvciBjb2xsYXBzZWQgc2VsZWN0aW9uLlxuICogLSBGaXJlcyBhZnRlciB1c2VyIGlucHV0LlxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIHRhcmdldE5vZGUgPSB0YXJnZXRJbnN0ID8gZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KSA6IHdpbmRvdztcblxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIC8vIFRyYWNrIHRoZSBpbnB1dCBub2RlIHRoYXQgaGFzIGZvY3VzLlxuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAgaWYgKGlzVGV4dElucHV0RWxlbWVudCh0YXJnZXROb2RlKSB8fCB0YXJnZXROb2RlLmNvbnRlbnRFZGl0YWJsZSA9PT0gJ3RydWUnKSB7XG4gICAgICAgIGFjdGl2ZUVsZW1lbnQkMSA9IHRhcmdldE5vZGU7XG4gICAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSB0YXJnZXRJbnN0O1xuICAgICAgICBsYXN0U2VsZWN0aW9uID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICBhY3RpdmVFbGVtZW50JDEgPSBudWxsO1xuICAgICAgYWN0aXZlRWxlbWVudEluc3QkMSA9IG51bGw7XG4gICAgICBsYXN0U2VsZWN0aW9uID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuICAgIC8vIERvbid0IGZpcmUgdGhlIGV2ZW50IHdoaWxlIHRoZSB1c2VyIGlzIGRyYWdnaW5nLiBUaGlzIG1hdGNoZXMgdGhlXG4gICAgLy8gc2VtYW50aWNzIG9mIHRoZSBuYXRpdmUgc2VsZWN0IGV2ZW50LlxuXG4gICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICAgIG1vdXNlRG93biA9IHRydWU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2NvbnRleHRtZW51JzpcbiAgICBjYXNlICdtb3VzZXVwJzpcbiAgICBjYXNlICdkcmFnZW5kJzpcbiAgICAgIG1vdXNlRG93biA9IGZhbHNlO1xuICAgICAgY29uc3RydWN0U2VsZWN0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICAgIGJyZWFrO1xuICAgIC8vIENocm9tZSBhbmQgSUUgZmlyZSBub24tc3RhbmRhcmQgZXZlbnQgd2hlbiBzZWxlY3Rpb24gaXMgY2hhbmdlZCAoYW5kXG4gICAgLy8gc29tZXRpbWVzIHdoZW4gaXQgaGFzbid0KS4gSUUncyBldmVudCBmaXJlcyBvdXQgb2Ygb3JkZXIgd2l0aCByZXNwZWN0XG4gICAgLy8gdG8ga2V5IGFuZCBpbnB1dCBldmVudHMgb24gZGVsZXRpb24sIHNvIHdlIGRpc2NhcmQgaXQuXG4gICAgLy9cbiAgICAvLyBGaXJlZm94IGRvZXNuJ3Qgc3VwcG9ydCBzZWxlY3Rpb25jaGFuZ2UsIHNvIGNoZWNrIHNlbGVjdGlvbiBzdGF0dXNcbiAgICAvLyBhZnRlciBlYWNoIGtleSBlbnRyeS4gVGhlIHNlbGVjdGlvbiBjaGFuZ2VzIGFmdGVyIGtleWRvd24gYW5kIGJlZm9yZVxuICAgIC8vIGtleXVwLCBidXQgd2UgY2hlY2sgb24ga2V5ZG93biBhcyB3ZWxsIGluIHRoZSBjYXNlIG9mIGhvbGRpbmcgZG93biBhXG4gICAgLy8ga2V5LCB3aGVuIG11bHRpcGxlIGtleWRvd24gZXZlbnRzIGFyZSBmaXJlZCBidXQgb25seSBvbmUga2V5dXAgaXMuXG4gICAgLy8gVGhpcyBpcyBhbHNvIG91ciBhcHByb2FjaCBmb3IgSUUgaGFuZGxpbmcsIGZvciB0aGUgcmVhc29uIGFib3ZlLlxuXG4gICAgY2FzZSAnc2VsZWN0aW9uY2hhbmdlJzpcbiAgICAgIGlmIChza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAvLyBmYWxscyB0aHJvdWdoXG5cbiAgICBjYXNlICdrZXlkb3duJzpcbiAgICBjYXNlICdrZXl1cCc6XG4gICAgICBjb25zdHJ1Y3RTZWxlY3RFdmVudChkaXNwYXRjaFF1ZXVlLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBtYXBwaW5nIG9mIHN0YW5kYXJkIHZlbmRvciBwcmVmaXhlcyB1c2luZyB0aGUgZGVmaW5lZCBzdHlsZSBwcm9wZXJ0eSBhbmQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3R5bGVQcm9wXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIG1ha2VQcmVmaXhNYXAoc3R5bGVQcm9wLCBldmVudE5hbWUpIHtcbiAgdmFyIHByZWZpeGVzID0ge307XG4gIHByZWZpeGVzW3N0eWxlUHJvcC50b0xvd2VyQ2FzZSgpXSA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICBwcmVmaXhlc1snV2Via2l0JyArIHN0eWxlUHJvcF0gPSAnd2Via2l0JyArIGV2ZW50TmFtZTtcbiAgcHJlZml4ZXNbJ01veicgKyBzdHlsZVByb3BdID0gJ21veicgKyBldmVudE5hbWU7XG4gIHJldHVybiBwcmVmaXhlcztcbn1cbi8qKlxuICogQSBsaXN0IG9mIGV2ZW50IG5hbWVzIHRvIGEgY29uZmlndXJhYmxlIGxpc3Qgb2YgdmVuZG9yIHByZWZpeGVzLlxuICovXG5cblxudmFyIHZlbmRvclByZWZpeGVzID0ge1xuICBhbmltYXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ0FuaW1hdGlvbicsICdBbmltYXRpb25FbmQnKSxcbiAgYW5pbWF0aW9uaXRlcmF0aW9uOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uSXRlcmF0aW9uJyksXG4gIGFuaW1hdGlvbnN0YXJ0OiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uU3RhcnQnKSxcbiAgdHJhbnNpdGlvbmVuZDogbWFrZVByZWZpeE1hcCgnVHJhbnNpdGlvbicsICdUcmFuc2l0aW9uRW5kJylcbn07XG4vKipcbiAqIEV2ZW50IG5hbWVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gZGV0ZWN0ZWQgYW5kIHByZWZpeGVkIChpZiBhcHBsaWNhYmxlKS5cbiAqL1xuXG52YXIgcHJlZml4ZWRFdmVudE5hbWVzID0ge307XG4vKipcbiAqIEVsZW1lbnQgdG8gY2hlY2sgZm9yIHByZWZpeGVzIG9uLlxuICovXG5cbnZhciBzdHlsZSA9IHt9O1xuLyoqXG4gKiBCb290c3RyYXAgaWYgYSBET00gZXhpc3RzLlxuICovXG5cbmlmIChjYW5Vc2VET00pIHtcbiAgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZTsgLy8gT24gc29tZSBwbGF0Zm9ybXMsIGluIHBhcnRpY3VsYXIgc29tZSByZWxlYXNlcyBvZiBBbmRyb2lkIDQueCxcbiAgLy8gdGhlIHVuLXByZWZpeGVkIFwiYW5pbWF0aW9uXCIgYW5kIFwidHJhbnNpdGlvblwiIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgb24gdGhlXG4gIC8vIHN0eWxlIG9iamVjdCBidXQgdGhlIGV2ZW50cyB0aGF0IGZpcmUgd2lsbCBzdGlsbCBiZSBwcmVmaXhlZCwgc28gd2UgbmVlZFxuICAvLyB0byBjaGVjayBpZiB0aGUgdW4tcHJlZml4ZWQgZXZlbnRzIGFyZSB1c2FibGUsIGFuZCBpZiBub3QgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgbWFwLlxuXG4gIGlmICghKCdBbmltYXRpb25FdmVudCcgaW4gd2luZG93KSkge1xuICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy5hbmltYXRpb25lbmQuYW5pbWF0aW9uO1xuICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy5hbmltYXRpb25pdGVyYXRpb24uYW5pbWF0aW9uO1xuICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy5hbmltYXRpb25zdGFydC5hbmltYXRpb247XG4gIH0gLy8gU2FtZSBhcyBhYm92ZVxuXG5cbiAgaWYgKCEoJ1RyYW5zaXRpb25FdmVudCcgaW4gd2luZG93KSkge1xuICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy50cmFuc2l0aW9uZW5kLnRyYW5zaXRpb247XG4gIH1cbn1cbi8qKlxuICogQXR0ZW1wdHMgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHZlbmRvciBwcmVmaXhlZCBldmVudCBuYW1lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShldmVudE5hbWUpIHtcbiAgaWYgKHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdO1xuICB9IGVsc2UgaWYgKCF2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZTtcbiAgfVxuXG4gIHZhciBwcmVmaXhNYXAgPSB2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdO1xuXG4gIGZvciAodmFyIHN0eWxlUHJvcCBpbiBwcmVmaXhNYXApIHtcbiAgICBpZiAocHJlZml4TWFwLmhhc093blByb3BlcnR5KHN0eWxlUHJvcCkgJiYgc3R5bGVQcm9wIGluIHN0eWxlKSB7XG4gICAgICByZXR1cm4gcHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV0gPSBwcmVmaXhNYXBbc3R5bGVQcm9wXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXZlbnROYW1lO1xufVxuXG52YXIgQU5JTUFUSU9OX0VORCA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25lbmQnKTtcbnZhciBBTklNQVRJT05fSVRFUkFUSU9OID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ2FuaW1hdGlvbml0ZXJhdGlvbicpO1xudmFyIEFOSU1BVElPTl9TVEFSVCA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25zdGFydCcpO1xudmFyIFRSQU5TSVRJT05fRU5EID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ3RyYW5zaXRpb25lbmQnKTtcblxudmFyIHRvcExldmVsRXZlbnRzVG9SZWFjdE5hbWVzID0gbmV3IE1hcCgpOyAvLyBOT1RFOiBDYXBpdGFsaXphdGlvbiBpcyBpbXBvcnRhbnQgaW4gdGhpcyBsaXN0IVxuLy9cbi8vIEUuZy4gaXQgbmVlZHMgXCJwb2ludGVyRG93blwiLCBub3QgXCJwb2ludGVyZG93blwiLlxuLy8gVGhpcyBpcyBiZWNhdXNlIHdlIGRlcml2ZSBib3RoIFJlYWN0IG5hbWUgKFwib25Qb2ludGVyRG93blwiKVxuLy8gYW5kIERPTSBuYW1lIChcInBvaW50ZXJkb3duXCIpIGZyb20gdGhlIHNhbWUgbGlzdC5cbi8vXG4vLyBFeGNlcHRpb25zIHRoYXQgZG9uJ3QgbWF0Y2ggdGhpcyBjb252ZW50aW9uIGFyZSBsaXN0ZWQgc2VwYXJhdGVseS5cbi8vXG4vLyBwcmV0dGllci1pZ25vcmVcblxudmFyIHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzID0gWydhYm9ydCcsICdhdXhDbGljaycsICdjYW5jZWwnLCAnY2FuUGxheScsICdjYW5QbGF5VGhyb3VnaCcsICdjbGljaycsICdjbG9zZScsICdjb250ZXh0TWVudScsICdjb3B5JywgJ2N1dCcsICdkcmFnJywgJ2RyYWdFbmQnLCAnZHJhZ0VudGVyJywgJ2RyYWdFeGl0JywgJ2RyYWdMZWF2ZScsICdkcmFnT3ZlcicsICdkcmFnU3RhcnQnLCAnZHJvcCcsICdkdXJhdGlvbkNoYW5nZScsICdlbXB0aWVkJywgJ2VuY3J5cHRlZCcsICdlbmRlZCcsICdlcnJvcicsICdnb3RQb2ludGVyQ2FwdHVyZScsICdpbnB1dCcsICdpbnZhbGlkJywgJ2tleURvd24nLCAna2V5UHJlc3MnLCAna2V5VXAnLCAnbG9hZCcsICdsb2FkZWREYXRhJywgJ2xvYWRlZE1ldGFkYXRhJywgJ2xvYWRTdGFydCcsICdsb3N0UG9pbnRlckNhcHR1cmUnLCAnbW91c2VEb3duJywgJ21vdXNlTW92ZScsICdtb3VzZU91dCcsICdtb3VzZU92ZXInLCAnbW91c2VVcCcsICdwYXN0ZScsICdwYXVzZScsICdwbGF5JywgJ3BsYXlpbmcnLCAncG9pbnRlckNhbmNlbCcsICdwb2ludGVyRG93bicsICdwb2ludGVyTW92ZScsICdwb2ludGVyT3V0JywgJ3BvaW50ZXJPdmVyJywgJ3BvaW50ZXJVcCcsICdwcm9ncmVzcycsICdyYXRlQ2hhbmdlJywgJ3Jlc2V0JywgJ3Jlc2l6ZScsICdzZWVrZWQnLCAnc2Vla2luZycsICdzdGFsbGVkJywgJ3N1Ym1pdCcsICdzdXNwZW5kJywgJ3RpbWVVcGRhdGUnLCAndG91Y2hDYW5jZWwnLCAndG91Y2hFbmQnLCAndG91Y2hTdGFydCcsICd2b2x1bWVDaGFuZ2UnLCAnc2Nyb2xsJywgJ3RvZ2dsZScsICd0b3VjaE1vdmUnLCAnd2FpdGluZycsICd3aGVlbCddO1xuXG5mdW5jdGlvbiByZWdpc3RlclNpbXBsZUV2ZW50KGRvbUV2ZW50TmFtZSwgcmVhY3ROYW1lKSB7XG4gIHRvcExldmVsRXZlbnRzVG9SZWFjdE5hbWVzLnNldChkb21FdmVudE5hbWUsIHJlYWN0TmFtZSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudChyZWFjdE5hbWUsIFtkb21FdmVudE5hbWVdKTtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJTaW1wbGVFdmVudHMoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2ltcGxlRXZlbnRQbHVnaW5FdmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZXZlbnROYW1lID0gc2ltcGxlRXZlbnRQbHVnaW5FdmVudHNbaV07XG4gICAgdmFyIGRvbUV2ZW50TmFtZSA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBjYXBpdGFsaXplZEV2ZW50ID0gZXZlbnROYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBldmVudE5hbWUuc2xpY2UoMSk7XG4gICAgcmVnaXN0ZXJTaW1wbGVFdmVudChkb21FdmVudE5hbWUsICdvbicgKyBjYXBpdGFsaXplZEV2ZW50KTtcbiAgfSAvLyBTcGVjaWFsIGNhc2VzIHdoZXJlIGV2ZW50IG5hbWVzIGRvbid0IG1hdGNoLlxuXG5cbiAgcmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fRU5ELCAnb25BbmltYXRpb25FbmQnKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fSVRFUkFUSU9OLCAnb25BbmltYXRpb25JdGVyYXRpb24nKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fU1RBUlQsICdvbkFuaW1hdGlvblN0YXJ0Jyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoJ2RibGNsaWNrJywgJ29uRG91YmxlQ2xpY2snKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudCgnZm9jdXNpbicsICdvbkZvY3VzJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoJ2ZvY3Vzb3V0JywgJ29uQmx1cicpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KFRSQU5TSVRJT05fRU5ELCAnb25UcmFuc2l0aW9uRW5kJyk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkNChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciByZWFjdE5hbWUgPSB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcy5nZXQoZG9tRXZlbnROYW1lKTtcblxuICBpZiAocmVhY3ROYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRXZlbnQ7XG4gIHZhciByZWFjdEV2ZW50VHlwZSA9IGRvbUV2ZW50TmFtZTtcblxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICAgIC8vIEZpcmVmb3ggY3JlYXRlcyBhIGtleXByZXNzIGV2ZW50IGZvciBmdW5jdGlvbiBrZXlzIHRvby4gVGhpcyByZW1vdmVzXG4gICAgICAvLyB0aGUgdW53YW50ZWQga2V5cHJlc3MgZXZlbnRzLiBFbnRlciBpcyBob3dldmVyIGJvdGggcHJpbnRhYmxlIGFuZFxuICAgICAgLy8gbm9uLXByaW50YWJsZS4gT25lIHdvdWxkIGV4cGVjdCBUYWIgdG8gYmUgYXMgd2VsbCAoYnV0IGl0IGlzbid0KS5cbiAgICAgIGlmIChnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KSA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAvKiBmYWxscyB0aHJvdWdoICovXG5cbiAgICBjYXNlICdrZXlkb3duJzpcbiAgICBjYXNlICdrZXl1cCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNLZXlib2FyZEV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgIHJlYWN0RXZlbnRUeXBlID0gJ2ZvY3VzJztcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgIHJlYWN0RXZlbnRUeXBlID0gJ2JsdXInO1xuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRm9jdXNFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnYmVmb3JlYmx1cic6XG4gICAgY2FzZSAnYWZ0ZXJibHVyJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2NsaWNrJzpcbiAgICAgIC8vIEZpcmVmb3ggY3JlYXRlcyBhIGNsaWNrIGV2ZW50IG9uIHJpZ2h0IG1vdXNlIGNsaWNrcy4gVGhpcyByZW1vdmVzIHRoZVxuICAgICAgLy8gdW53YW50ZWQgY2xpY2sgZXZlbnRzLlxuICAgICAgaWYgKG5hdGl2ZUV2ZW50LmJ1dHRvbiA9PT0gMikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAvKiBmYWxscyB0aHJvdWdoICovXG5cbiAgICBjYXNlICdhdXhjbGljayc6XG4gICAgY2FzZSAnZGJsY2xpY2snOlxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgY2FzZSAnbW91c2Vtb3ZlJzpcbiAgICBjYXNlICdtb3VzZXVwJzogLy8gVE9ETzogRGlzYWJsZWQgZWxlbWVudHMgc2hvdWxkIG5vdCByZXNwb25kIHRvIG1vdXNlIGV2ZW50c1xuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAnbW91c2VvdXQnOlxuICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgY2FzZSAnY29udGV4dG1lbnUnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljTW91c2VFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZHJhZyc6XG4gICAgY2FzZSAnZHJhZ2VuZCc6XG4gICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICBjYXNlICdkcmFnZXhpdCc6XG4gICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICBjYXNlICdkcmFnb3Zlcic6XG4gICAgY2FzZSAnZHJhZ3N0YXJ0JzpcbiAgICBjYXNlICdkcm9wJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0RyYWdFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndG91Y2hjYW5jZWwnOlxuICAgIGNhc2UgJ3RvdWNoZW5kJzpcbiAgICBjYXNlICd0b3VjaG1vdmUnOlxuICAgIGNhc2UgJ3RvdWNoc3RhcnQnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljVG91Y2hFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBBTklNQVRJT05fRU5EOlxuICAgIGNhc2UgQU5JTUFUSU9OX0lURVJBVElPTjpcbiAgICBjYXNlIEFOSU1BVElPTl9TVEFSVDpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFRSQU5TSVRJT05fRU5EOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljVHJhbnNpdGlvbkV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzY3JvbGwnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljVUlFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnd2hlZWwnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljV2hlZWxFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnY29weSc6XG4gICAgY2FzZSAnY3V0JzpcbiAgICBjYXNlICdwYXN0ZSc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNDbGlwYm9hcmRFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZ290cG9pbnRlcmNhcHR1cmUnOlxuICAgIGNhc2UgJ2xvc3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgY2FzZSAncG9pbnRlcmNhbmNlbCc6XG4gICAgY2FzZSAncG9pbnRlcmRvd24nOlxuICAgIGNhc2UgJ3BvaW50ZXJtb3ZlJzpcbiAgICBjYXNlICdwb2ludGVyb3V0JzpcbiAgICBjYXNlICdwb2ludGVyb3Zlcic6XG4gICAgY2FzZSAncG9pbnRlcnVwJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1BvaW50ZXJFdmVudDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdmFyIGluQ2FwdHVyZVBoYXNlID0gKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19DQVBUVVJFX1BIQVNFKSAhPT0gMDtcblxuICB7XG4gICAgLy8gU29tZSBldmVudHMgZG9uJ3QgYnViYmxlIGluIHRoZSBicm93c2VyLlxuICAgIC8vIEluIHRoZSBwYXN0LCBSZWFjdCBoYXMgYWx3YXlzIGJ1YmJsZWQgdGhlbSwgYnV0IHRoaXMgY2FuIGJlIHN1cnByaXNpbmcuXG4gICAgLy8gV2UncmUgZ29pbmcgdG8gdHJ5IGFsaWduaW5nIGNsb3NlciB0byB0aGUgYnJvd3NlciBiZWhhdmlvciBieSBub3QgYnViYmxpbmdcbiAgICAvLyB0aGVtIGluIFJlYWN0IGVpdGhlci4gV2UnbGwgc3RhcnQgYnkgbm90IGJ1YmJsaW5nIG9uU2Nyb2xsLCBhbmQgdGhlbiBleHBhbmQuXG4gICAgdmFyIGFjY3VtdWxhdGVUYXJnZXRPbmx5ID0gIWluQ2FwdHVyZVBoYXNlICYmIC8vIFRPRE86IGlkZWFsbHksIHdlJ2QgZXZlbnR1YWxseSBhZGQgYWxsIGV2ZW50cyBmcm9tXG4gICAgLy8gbm9uRGVsZWdhdGVkRXZlbnRzIGxpc3QgaW4gRE9NUGx1Z2luRXZlbnRTeXN0ZW0uXG4gICAgLy8gVGhlbiB3ZSBjYW4gcmVtb3ZlIHRoaXMgc3BlY2lhbCBsaXN0LlxuICAgIC8vIFRoaXMgaXMgYSBicmVha2luZyBjaGFuZ2UgdGhhdCBjYW4gd2FpdCB1bnRpbCBSZWFjdCAxOC5cbiAgICBkb21FdmVudE5hbWUgPT09ICdzY3JvbGwnO1xuXG4gICAgdmFyIF9saXN0ZW5lcnMgPSBhY2N1bXVsYXRlU2luZ2xlUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgcmVhY3ROYW1lLCBuYXRpdmVFdmVudC50eXBlLCBpbkNhcHR1cmVQaGFzZSwgYWNjdW11bGF0ZVRhcmdldE9ubHkpO1xuXG4gICAgaWYgKF9saXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gSW50ZW50aW9uYWxseSBjcmVhdGUgZXZlbnQgbGF6aWx5LlxuICAgICAgdmFyIF9ldmVudCA9IG5ldyBTeW50aGV0aWNFdmVudEN0b3IocmVhY3ROYW1lLCByZWFjdEV2ZW50VHlwZSwgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICAgICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgICAgZXZlbnQ6IF9ldmVudCxcbiAgICAgICAgbGlzdGVuZXJzOiBfbGlzdGVuZXJzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRvcC1sZXZlbCBzaWRlIGVmZmVjdC5cbnJlZ2lzdGVyU2ltcGxlRXZlbnRzKCk7XG5yZWdpc3RlckV2ZW50cyQyKCk7XG5yZWdpc3RlckV2ZW50cyQxKCk7XG5yZWdpc3RlckV2ZW50cyQzKCk7XG5yZWdpc3RlckV2ZW50cygpO1xuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDUoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICAvLyBUT0RPOiB3ZSBzaG91bGQgcmVtb3ZlIHRoZSBjb25jZXB0IG9mIGEgXCJTaW1wbGVFdmVudFBsdWdpblwiLlxuICAvLyBUaGlzIGlzIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IG9mIHRoZSBldmVudCBzeXN0ZW0uIEFsbFxuICAvLyB0aGUgb3RoZXIgcGx1Z2lucyBhcmUgZXNzZW50aWFsbHkgcG9seWZpbGxzLiBTbyB0aGUgcGx1Z2luXG4gIC8vIHNob3VsZCBwcm9iYWJseSBiZSBpbmxpbmVkIHNvbWV3aGVyZSBhbmQgaGF2ZSBpdHMgbG9naWNcbiAgLy8gYmUgY29yZSB0aGUgdG8gZXZlbnQgc3lzdGVtLiBUaGlzIHdvdWxkIHBvdGVudGlhbGx5IGFsbG93XG4gIC8vIHVzIHRvIHNoaXAgYnVpbGRzIG9mIFJlYWN0IHdpdGhvdXQgdGhlIHBvbHlmaWxsZWQgcGx1Z2lucyBiZWxvdy5cbiAgZXh0cmFjdEV2ZW50cyQ0KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzKTtcbiAgdmFyIHNob3VsZFByb2Nlc3NQb2x5ZmlsbFBsdWdpbnMgPSAoZXZlbnRTeXN0ZW1GbGFncyAmIFNIT1VMRF9OT1RfUFJPQ0VTU19QT0xZRklMTF9FVkVOVF9QTFVHSU5TKSA9PT0gMDsgLy8gV2UgZG9uJ3QgcHJvY2VzcyB0aGVzZSBldmVudHMgdW5sZXNzIHdlIGFyZSBpbiB0aGVcbiAgLy8gZXZlbnQncyBuYXRpdmUgXCJidWJibGVcIiBwaGFzZSwgd2hpY2ggbWVhbnMgdGhhdCB3ZSdyZVxuICAvLyBub3QgaW4gdGhlIGNhcHR1cmUgcGhhc2UuIFRoYXQncyBiZWNhdXNlIHdlIGVtdWxhdGVcbiAgLy8gdGhlIGNhcHR1cmUgcGhhc2UgaGVyZSBzdGlsbC4gVGhpcyBpcyBhIHRyYWRlLW9mZixcbiAgLy8gYmVjYXVzZSBpbiBhbiBpZGVhbCB3b3JsZCB3ZSB3b3VsZCBub3QgZW11bGF0ZSBhbmQgdXNlXG4gIC8vIHRoZSBwaGFzZXMgcHJvcGVybHksIGxpa2Ugd2UgZG8gd2l0aCB0aGUgU2ltcGxlRXZlbnRcbiAgLy8gcGx1Z2luLiBIb3dldmVyLCB0aGUgcGx1Z2lucyBiZWxvdyBlaXRoZXIgZXhwZWN0XG4gIC8vIGVtdWxhdGlvbiAoRW50ZXJMZWF2ZSkgb3IgdXNlIHN0YXRlIGxvY2FsaXplZCB0byB0aGF0XG4gIC8vIHBsdWdpbiAoQmVmb3JlSW5wdXQsIENoYW5nZSwgU2VsZWN0KS4gVGhlIHN0YXRlIGluXG4gIC8vIHRoZXNlIG1vZHVsZXMgY29tcGxpY2F0ZXMgdGhpbmdzLCBhcyB5b3UnbGwgZXNzZW50aWFsbHlcbiAgLy8gZ2V0IHRoZSBjYXNlIHdoZXJlIHRoZSBjYXB0dXJlIHBoYXNlIGV2ZW50IG1pZ2h0IGNoYW5nZVxuICAvLyBzdGF0ZSwgb25seSBmb3IgdGhlIGZvbGxvd2luZyBidWJibGUgZXZlbnQgdG8gY29tZSBpblxuICAvLyBsYXRlciBhbmQgbm90IHRyaWdnZXIgYW55dGhpbmcgYXMgdGhlIHN0YXRlIG5vd1xuICAvLyBpbnZhbGlkYXRlcyB0aGUgaGV1cmlzdGljcyBvZiB0aGUgZXZlbnQgcGx1Z2luLiBXZVxuICAvLyBjb3VsZCBhbHRlciBhbGwgdGhlc2UgcGx1Z2lucyB0byB3b3JrIGluIHN1Y2ggd2F5cywgYnV0XG4gIC8vIHRoYXQgbWlnaHQgY2F1c2Ugb3RoZXIgdW5rbm93biBzaWRlLWVmZmVjdHMgdGhhdCB3ZVxuICAvLyBjYW4ndCBmb3Jlc2VlIHJpZ2h0IG5vdy5cblxuICBpZiAoc2hvdWxkUHJvY2Vzc1BvbHlmaWxsUGx1Z2lucykge1xuICAgIGV4dHJhY3RFdmVudHMkMihkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZXh0cmFjdEV2ZW50cyQxKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBleHRyYWN0RXZlbnRzJDMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGV4dHJhY3RFdmVudHMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICB9XG59IC8vIExpc3Qgb2YgZXZlbnRzIHRoYXQgbmVlZCB0byBiZSBpbmRpdmlkdWFsbHkgYXR0YWNoZWQgdG8gbWVkaWEgZWxlbWVudHMuXG5cblxudmFyIG1lZGlhRXZlbnRUeXBlcyA9IFsnYWJvcnQnLCAnY2FucGxheScsICdjYW5wbGF5dGhyb3VnaCcsICdkdXJhdGlvbmNoYW5nZScsICdlbXB0aWVkJywgJ2VuY3J5cHRlZCcsICdlbmRlZCcsICdlcnJvcicsICdsb2FkZWRkYXRhJywgJ2xvYWRlZG1ldGFkYXRhJywgJ2xvYWRzdGFydCcsICdwYXVzZScsICdwbGF5JywgJ3BsYXlpbmcnLCAncHJvZ3Jlc3MnLCAncmF0ZWNoYW5nZScsICdyZXNpemUnLCAnc2Vla2VkJywgJ3NlZWtpbmcnLCAnc3RhbGxlZCcsICdzdXNwZW5kJywgJ3RpbWV1cGRhdGUnLCAndm9sdW1lY2hhbmdlJywgJ3dhaXRpbmcnXTsgLy8gV2Ugc2hvdWxkIG5vdCBkZWxlZ2F0ZSB0aGVzZSBldmVudHMgdG8gdGhlIGNvbnRhaW5lciwgYnV0IHJhdGhlclxuLy8gc2V0IHRoZW0gb24gdGhlIGFjdHVhbCB0YXJnZXQgZWxlbWVudCBpdHNlbGYuIFRoaXMgaXMgcHJpbWFyaWx5XG4vLyBiZWNhdXNlIHRoZXNlIGV2ZW50cyBkbyBub3QgY29uc2lzdGVudGx5IGJ1YmJsZSBpbiB0aGUgRE9NLlxuXG52YXIgbm9uRGVsZWdhdGVkRXZlbnRzID0gbmV3IFNldChbJ2NhbmNlbCcsICdjbG9zZScsICdpbnZhbGlkJywgJ2xvYWQnLCAnc2Nyb2xsJywgJ3RvZ2dsZSddLmNvbmNhdChtZWRpYUV2ZW50VHlwZXMpKTtcblxuZnVuY3Rpb24gZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBsaXN0ZW5lciwgY3VycmVudFRhcmdldCkge1xuICB2YXIgdHlwZSA9IGV2ZW50LnR5cGUgfHwgJ3Vua25vd24tZXZlbnQnO1xuICBldmVudC5jdXJyZW50VGFyZ2V0ID0gY3VycmVudFRhcmdldDtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrQW5kQ2F0Y2hGaXJzdEVycm9yKHR5cGUsIGxpc3RlbmVyLCB1bmRlZmluZWQsIGV2ZW50KTtcbiAgZXZlbnQuY3VycmVudFRhcmdldCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NEaXNwYXRjaFF1ZXVlSXRlbXNJbk9yZGVyKGV2ZW50LCBkaXNwYXRjaExpc3RlbmVycywgaW5DYXB0dXJlUGhhc2UpIHtcbiAgdmFyIHByZXZpb3VzSW5zdGFuY2U7XG5cbiAgaWYgKGluQ2FwdHVyZVBoYXNlKSB7XG4gICAgZm9yICh2YXIgaSA9IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgX2Rpc3BhdGNoTGlzdGVuZXJzJGkgPSBkaXNwYXRjaExpc3RlbmVyc1tpXSxcbiAgICAgICAgICBpbnN0YW5jZSA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmluc3RhbmNlLFxuICAgICAgICAgIGN1cnJlbnRUYXJnZXQgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5jdXJyZW50VGFyZ2V0LFxuICAgICAgICAgIGxpc3RlbmVyID0gX2Rpc3BhdGNoTGlzdGVuZXJzJGkubGlzdGVuZXI7XG5cbiAgICAgIGlmIChpbnN0YW5jZSAhPT0gcHJldmlvdXNJbnN0YW5jZSAmJiBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBsaXN0ZW5lciwgY3VycmVudFRhcmdldCk7XG4gICAgICBwcmV2aW91c0luc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBkaXNwYXRjaExpc3RlbmVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kgPSBkaXNwYXRjaExpc3RlbmVyc1tfaV0sXG4gICAgICAgICAgX2luc3RhbmNlID0gX2Rpc3BhdGNoTGlzdGVuZXJzJF9pLmluc3RhbmNlLFxuICAgICAgICAgIF9jdXJyZW50VGFyZ2V0ID0gX2Rpc3BhdGNoTGlzdGVuZXJzJF9pLmN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgX2xpc3RlbmVyID0gX2Rpc3BhdGNoTGlzdGVuZXJzJF9pLmxpc3RlbmVyO1xuXG4gICAgICBpZiAoX2luc3RhbmNlICE9PSBwcmV2aW91c0luc3RhbmNlICYmIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIF9saXN0ZW5lciwgX2N1cnJlbnRUYXJnZXQpO1xuICAgICAgcHJldmlvdXNJbnN0YW5jZSA9IF9pbnN0YW5jZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0Rpc3BhdGNoUXVldWUoZGlzcGF0Y2hRdWV1ZSwgZXZlbnRTeXN0ZW1GbGFncykge1xuICB2YXIgaW5DYXB0dXJlUGhhc2UgPSAoZXZlbnRTeXN0ZW1GbGFncyAmIElTX0NBUFRVUkVfUEhBU0UpICE9PSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGlzcGF0Y2hRdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBfZGlzcGF0Y2hRdWV1ZSRpID0gZGlzcGF0Y2hRdWV1ZVtpXSxcbiAgICAgICAgZXZlbnQgPSBfZGlzcGF0Y2hRdWV1ZSRpLmV2ZW50LFxuICAgICAgICBsaXN0ZW5lcnMgPSBfZGlzcGF0Y2hRdWV1ZSRpLmxpc3RlbmVycztcbiAgICBwcm9jZXNzRGlzcGF0Y2hRdWV1ZUl0ZW1zSW5PcmRlcihldmVudCwgbGlzdGVuZXJzLCBpbkNhcHR1cmVQaGFzZSk7IC8vICBldmVudCBzeXN0ZW0gZG9lc24ndCB1c2UgcG9vbGluZy5cbiAgfSAvLyBUaGlzIHdvdWxkIGJlIGEgZ29vZCB0aW1lIHRvIHJldGhyb3cgaWYgYW55IG9mIHRoZSBldmVudCBoYW5kbGVycyB0aHJldy5cblxuXG4gIHJldGhyb3dDYXVnaHRFcnJvcigpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50c0ZvclBsdWdpbnMoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciBuYXRpdmVFdmVudFRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KTtcbiAgdmFyIGRpc3BhdGNoUXVldWUgPSBbXTtcbiAgZXh0cmFjdEV2ZW50cyQ1KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzKTtcbiAgcHJvY2Vzc0Rpc3BhdGNoUXVldWUoZGlzcGF0Y2hRdWV1ZSwgZXZlbnRTeXN0ZW1GbGFncyk7XG59XG5cbmZ1bmN0aW9uIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRFbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoIW5vbkRlbGVnYXRlZEV2ZW50cy5oYXMoZG9tRXZlbnROYW1lKSkge1xuICAgICAgZXJyb3IoJ0RpZCBub3QgZXhwZWN0IGEgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgpIGNhbGwgZm9yIFwiJXNcIi4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBkb21FdmVudE5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyID0gZmFsc2U7XG4gIHZhciBsaXN0ZW5lclNldCA9IGdldEV2ZW50TGlzdGVuZXJTZXQodGFyZ2V0RWxlbWVudCk7XG4gIHZhciBsaXN0ZW5lclNldEtleSA9IGdldExpc3RlbmVyU2V0S2V5KGRvbUV2ZW50TmFtZSwgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcik7XG5cbiAgaWYgKCFsaXN0ZW5lclNldC5oYXMobGlzdGVuZXJTZXRLZXkpKSB7XG4gICAgYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0RWxlbWVudCwgZG9tRXZlbnROYW1lLCBJU19OT05fREVMRUdBVEVELCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKTtcbiAgICBsaXN0ZW5lclNldC5hZGQobGlzdGVuZXJTZXRLZXkpO1xuICB9XG59XG5mdW5jdGlvbiBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lciwgdGFyZ2V0KSB7XG4gIHtcbiAgICBpZiAobm9uRGVsZWdhdGVkRXZlbnRzLmhhcyhkb21FdmVudE5hbWUpICYmICFpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgICBlcnJvcignRGlkIG5vdCBleHBlY3QgYSBsaXN0ZW5Ub05hdGl2ZUV2ZW50KCkgY2FsbCBmb3IgXCIlc1wiIGluIHRoZSBidWJibGUgcGhhc2UuICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZG9tRXZlbnROYW1lKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZXZlbnRTeXN0ZW1GbGFncyA9IDA7XG5cbiAgaWYgKGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpIHtcbiAgICBldmVudFN5c3RlbUZsYWdzIHw9IElTX0NBUFRVUkVfUEhBU0U7XG4gIH1cblxuICBhZGRUcmFwcGVkRXZlbnRMaXN0ZW5lcih0YXJnZXQsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcik7XG59IC8vIFRoaXMgaXMgb25seSB1c2VkIGJ5IGNyZWF0ZUV2ZW50SGFuZGxlIHdoZW4gdGhlXG52YXIgbGlzdGVuaW5nTWFya2VyID0gJ19yZWFjdExpc3RlbmluZycgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtcbmZ1bmN0aW9uIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIGlmICghcm9vdENvbnRhaW5lckVsZW1lbnRbbGlzdGVuaW5nTWFya2VyXSkge1xuICAgIHJvb3RDb250YWluZXJFbGVtZW50W2xpc3RlbmluZ01hcmtlcl0gPSB0cnVlO1xuICAgIGFsbE5hdGl2ZUV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChkb21FdmVudE5hbWUpIHtcbiAgICAgIC8vIFdlIGhhbmRsZSBzZWxlY3Rpb25jaGFuZ2Ugc2VwYXJhdGVseSBiZWNhdXNlIGl0XG4gICAgICAvLyBkb2Vzbid0IGJ1YmJsZSBhbmQgbmVlZHMgdG8gYmUgb24gdGhlIGRvY3VtZW50LlxuICAgICAgaWYgKGRvbUV2ZW50TmFtZSAhPT0gJ3NlbGVjdGlvbmNoYW5nZScpIHtcbiAgICAgICAgaWYgKCFub25EZWxlZ2F0ZWRFdmVudHMuaGFzKGRvbUV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgZmFsc2UsIHJvb3RDb250YWluZXJFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpc3RlblRvTmF0aXZlRXZlbnQoZG9tRXZlbnROYW1lLCB0cnVlLCByb290Q29udGFpbmVyRWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdmFyIG93bmVyRG9jdW1lbnQgPSByb290Q29udGFpbmVyRWxlbWVudC5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/IHJvb3RDb250YWluZXJFbGVtZW50IDogcm9vdENvbnRhaW5lckVsZW1lbnQub3duZXJEb2N1bWVudDtcblxuICAgIGlmIChvd25lckRvY3VtZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGUgc2VsZWN0aW9uY2hhbmdlIGV2ZW50IGFsc28gbmVlZHMgZGVkdXBsaWNhdGlvblxuICAgICAgLy8gYnV0IGl0IGlzIGF0dGFjaGVkIHRvIHRoZSBkb2N1bWVudC5cbiAgICAgIGlmICghb3duZXJEb2N1bWVudFtsaXN0ZW5pbmdNYXJrZXJdKSB7XG4gICAgICAgIG93bmVyRG9jdW1lbnRbbGlzdGVuaW5nTWFya2VyXSA9IHRydWU7XG4gICAgICAgIGxpc3RlblRvTmF0aXZlRXZlbnQoJ3NlbGVjdGlvbmNoYW5nZScsIGZhbHNlLCBvd25lckRvY3VtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIsIGlzRGVmZXJyZWRMaXN0ZW5lckZvckxlZ2FjeUZCU3VwcG9ydCkge1xuICB2YXIgbGlzdGVuZXIgPSBjcmVhdGVFdmVudExpc3RlbmVyV3JhcHBlcldpdGhQcmlvcml0eSh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncyk7IC8vIElmIHBhc3NpdmUgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIHRoZW4gdGhlIGV2ZW50IHdpbGwgYmVcbiAgLy8gYWN0aXZlIGFuZCBub3QgcGFzc2l2ZS5cblxuICB2YXIgaXNQYXNzaXZlTGlzdGVuZXIgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkKSB7XG4gICAgLy8gQnJvd3NlcnMgaW50cm9kdWNlZCBhbiBpbnRlcnZlbnRpb24sIG1ha2luZyB0aGVzZSBldmVudHNcbiAgICAvLyBwYXNzaXZlIGJ5IGRlZmF1bHQgb24gZG9jdW1lbnQuIFJlYWN0IGRvZXNuJ3QgYmluZCB0aGVtXG4gICAgLy8gdG8gZG9jdW1lbnQgYW55bW9yZSwgYnV0IGNoYW5naW5nIHRoaXMgbm93IHdvdWxkIHVuZG9cbiAgICAvLyB0aGUgcGVyZm9ybWFuY2Ugd2lucyBmcm9tIHRoZSBjaGFuZ2UuIFNvIHdlIGVtdWxhdGVcbiAgICAvLyB0aGUgZXhpc3RpbmcgYmVoYXZpb3IgbWFudWFsbHkgb24gdGhlIHJvb3RzIG5vdy5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5NjUxXG4gICAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3RvdWNoc3RhcnQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3RvdWNobW92ZScgfHwgZG9tRXZlbnROYW1lID09PSAnd2hlZWwnKSB7XG4gICAgICBpc1Bhc3NpdmVMaXN0ZW5lciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdGFyZ2V0Q29udGFpbmVyID0gIHRhcmdldENvbnRhaW5lcjtcbiAgdmFyIHVuc3Vic2NyaWJlTGlzdGVuZXI7IC8vIFdoZW4gbGVnYWN5RkJTdXBwb3J0IGlzIGVuYWJsZWQsIGl0J3MgZm9yIHdoZW4gd2VcblxuXG4gIGlmIChpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgaWYgKGlzUGFzc2l2ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIsIGlzUGFzc2l2ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChpc1Bhc3NpdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIsIGlzUGFzc2l2ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50QnViYmxlTGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNNYXRjaGluZ1Jvb3RDb250YWluZXIoZ3JhbmRDb250YWluZXIsIHRhcmdldENvbnRhaW5lcikge1xuICByZXR1cm4gZ3JhbmRDb250YWluZXIgPT09IHRhcmdldENvbnRhaW5lciB8fCBncmFuZENvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFICYmIGdyYW5kQ29udGFpbmVyLnBhcmVudE5vZGUgPT09IHRhcmdldENvbnRhaW5lcjtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHRhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgYW5jZXN0b3JJbnN0ID0gdGFyZ2V0SW5zdDtcblxuICBpZiAoKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSkgPT09IDAgJiYgKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19OT05fREVMRUdBVEVEKSA9PT0gMCkge1xuICAgIHZhciB0YXJnZXRDb250YWluZXJOb2RlID0gdGFyZ2V0Q29udGFpbmVyOyAvLyBJZiB3ZSBhcmUgdXNpbmcgdGhlIGxlZ2FjeSBGQiBzdXBwb3J0IGZsYWcsIHdlXG5cbiAgICBpZiAodGFyZ2V0SW5zdCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhlIGJlbG93IGxvZ2ljIGF0dGVtcHRzIHRvIHdvcmsgb3V0IGlmIHdlIG5lZWQgdG8gY2hhbmdlXG4gICAgICAvLyB0aGUgdGFyZ2V0IGZpYmVyIHRvIGEgZGlmZmVyZW50IGFuY2VzdG9yLiBXZSBoYWQgc2ltaWxhciBsb2dpY1xuICAgICAgLy8gaW4gdGhlIGxlZ2FjeSBldmVudCBzeXN0ZW0sIGV4Y2VwdCB0aGUgYmlnIGRpZmZlcmVuY2UgYmV0d2VlblxuICAgICAgLy8gc3lzdGVtcyBpcyB0aGF0IHRoZSBtb2Rlcm4gZXZlbnQgc3lzdGVtIG5vdyBoYXMgYW4gZXZlbnQgbGlzdGVuZXJcbiAgICAgIC8vIGF0dGFjaGVkIHRvIGVhY2ggUmVhY3QgUm9vdCBhbmQgUmVhY3QgUG9ydGFsIFJvb3QuIFRvZ2V0aGVyLFxuICAgICAgLy8gdGhlIERPTSBub2RlcyByZXByZXNlbnRpbmcgdGhlc2Ugcm9vdHMgYXJlIHRoZSBcInJvb3RDb250YWluZXJcIi5cbiAgICAgIC8vIFRvIGZpZ3VyZSBvdXQgd2hpY2ggYW5jZXN0b3IgaW5zdGFuY2Ugd2Ugc2hvdWxkIHVzZSwgd2UgdHJhdmVyc2VcbiAgICAgIC8vIHVwIHRoZSBmaWJlciB0cmVlIGZyb20gdGhlIHRhcmdldCBpbnN0YW5jZSBhbmQgYXR0ZW1wdCB0byBmaW5kXG4gICAgICAvLyByb290IGJvdW5kYXJpZXMgdGhhdCBtYXRjaCB0aGF0IG9mIG91ciBjdXJyZW50IFwicm9vdENvbnRhaW5lclwiLlxuICAgICAgLy8gSWYgd2UgZmluZCB0aGF0IFwicm9vdENvbnRhaW5lclwiLCB3ZSBmaW5kIHRoZSBwYXJlbnQgZmliZXJcbiAgICAgIC8vIHN1Yi10cmVlIGZvciB0aGF0IHJvb3QgYW5kIG1ha2UgdGhhdCBvdXIgYW5jZXN0b3IgaW5zdGFuY2UuXG4gICAgICB2YXIgbm9kZSA9IHRhcmdldEluc3Q7XG5cbiAgICAgIG1haW5Mb29wOiB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBub2RlVGFnID0gbm9kZS50YWc7XG5cbiAgICAgICAgaWYgKG5vZGVUYWcgPT09IEhvc3RSb290IHx8IG5vZGVUYWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgICB2YXIgY29udGFpbmVyID0gbm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICAgIGlmIChpc01hdGNoaW5nUm9vdENvbnRhaW5lcihjb250YWluZXIsIHRhcmdldENvbnRhaW5lck5vZGUpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobm9kZVRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAgICAgLy8gVGhlIHRhcmdldCBpcyBhIHBvcnRhbCwgYnV0IGl0J3Mgbm90IHRoZSByb290Q29udGFpbmVyIHdlJ3JlIGxvb2tpbmcgZm9yLlxuICAgICAgICAgICAgLy8gTm9ybWFsbHkgcG9ydGFscyBoYW5kbGUgdGhlaXIgb3duIGV2ZW50cyBhbGwgdGhlIHdheSBkb3duIHRvIHRoZSByb290LlxuICAgICAgICAgICAgLy8gU28gd2Ugc2hvdWxkIGJlIGFibGUgdG8gc3RvcCBub3cuIEhvd2V2ZXIsIHdlIGRvbid0IGtub3cgaWYgdGhpcyBwb3J0YWxcbiAgICAgICAgICAgIC8vIHdhcyBwYXJ0IG9mICpvdXIqIHJvb3QuXG4gICAgICAgICAgICB2YXIgZ3JhbmROb2RlID0gbm9kZS5yZXR1cm47XG5cbiAgICAgICAgICAgIHdoaWxlIChncmFuZE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIGdyYW5kVGFnID0gZ3JhbmROb2RlLnRhZztcblxuICAgICAgICAgICAgICBpZiAoZ3JhbmRUYWcgPT09IEhvc3RSb290IHx8IGdyYW5kVGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgICAgICAgICAgdmFyIGdyYW5kQ29udGFpbmVyID0gZ3JhbmROb2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzTWF0Y2hpbmdSb290Q29udGFpbmVyKGdyYW5kQ29udGFpbmVyLCB0YXJnZXRDb250YWluZXJOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgcm9vdENvbnRhaW5lciB3ZSdyZSBsb29raW5nIGZvciBhbmQgd2UgZm91bmQgaXQgYXNcbiAgICAgICAgICAgICAgICAgIC8vIGEgcGFyZW50IG9mIHRoZSBQb3J0YWwuIFRoYXQgbWVhbnMgd2UgY2FuIGlnbm9yZSBpdCBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gUG9ydGFsIHdpbGwgYnViYmxlIHRocm91Z2ggdG8gdXMuXG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZ3JhbmROb2RlID0gZ3JhbmROb2RlLnJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIE5vdyB3ZSBuZWVkIHRvIGZpbmQgaXQncyBjb3JyZXNwb25kaW5nIGhvc3QgZmliZXIgaW4gdGhlIG90aGVyXG4gICAgICAgICAgLy8gdHJlZS4gVG8gZG8gdGhpcyB3ZSBjYW4gdXNlIGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLCBidXQgd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGZpYmVyIGlzIGEgaG9zdCBpbnN0YW5jZSwgb3RoZXJ3aXNlXG4gICAgICAgICAgLy8gd2UgbmVlZCB0byB0cmF2ZXJzZSB1cCB0aHJvdWdoIHRoZSBET00gdGlsbCB3ZSBmaW5kIHRoZSBjb3JyZWN0XG4gICAgICAgICAgLy8gbm9kZSB0aGF0IGlzIGZyb20gdGhlIG90aGVyIHRyZWUuXG5cblxuICAgICAgICAgIHdoaWxlIChjb250YWluZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnROb2RlID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoY29udGFpbmVyKTtcblxuICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcGFyZW50VGFnID0gcGFyZW50Tm9kZS50YWc7XG5cbiAgICAgICAgICAgIGlmIChwYXJlbnRUYWcgPT09IEhvc3RDb21wb25lbnQgfHwgcGFyZW50VGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICAgICAgICBub2RlID0gYW5jZXN0b3JJbnN0ID0gcGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgY29udGludWUgbWFpbkxvb3A7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBiYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoRXZlbnRzRm9yUGx1Z2lucyhkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCBhbmNlc3Rvckluc3QpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgbGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIHtcbiAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgbGlzdGVuZXI6IGxpc3RlbmVyLFxuICAgIGN1cnJlbnRUYXJnZXQ6IGN1cnJlbnRUYXJnZXRcbiAgfTtcbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZVNpbmdsZVBoYXNlTGlzdGVuZXJzKHRhcmdldEZpYmVyLCByZWFjdE5hbWUsIG5hdGl2ZUV2ZW50VHlwZSwgaW5DYXB0dXJlUGhhc2UsIGFjY3VtdWxhdGVUYXJnZXRPbmx5LCBuYXRpdmVFdmVudCkge1xuICB2YXIgY2FwdHVyZU5hbWUgPSByZWFjdE5hbWUgIT09IG51bGwgPyByZWFjdE5hbWUgKyAnQ2FwdHVyZScgOiBudWxsO1xuICB2YXIgcmVhY3RFdmVudE5hbWUgPSBpbkNhcHR1cmVQaGFzZSA/IGNhcHR1cmVOYW1lIDogcmVhY3ROYW1lO1xuICB2YXIgbGlzdGVuZXJzID0gW107XG4gIHZhciBpbnN0YW5jZSA9IHRhcmdldEZpYmVyO1xuICB2YXIgbGFzdEhvc3RDb21wb25lbnQgPSBudWxsOyAvLyBBY2N1bXVsYXRlIGFsbCBpbnN0YW5jZXMgYW5kIGxpc3RlbmVycyB2aWEgdGhlIHRhcmdldCAtPiByb290IHBhdGguXG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgdmFyIF9pbnN0YW5jZTIgPSBpbnN0YW5jZSxcbiAgICAgICAgc3RhdGVOb2RlID0gX2luc3RhbmNlMi5zdGF0ZU5vZGUsXG4gICAgICAgIHRhZyA9IF9pbnN0YW5jZTIudGFnOyAvLyBIYW5kbGUgbGlzdGVuZXJzIHRoYXQgYXJlIG9uIEhvc3RDb21wb25lbnRzIChpLmUuIDxkaXY+KVxuXG4gICAgaWYgKHRhZyA9PT0gSG9zdENvbXBvbmVudCAmJiBzdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIGxhc3RIb3N0Q29tcG9uZW50ID0gc3RhdGVOb2RlOyAvLyBjcmVhdGVFdmVudEhhbmRsZSBsaXN0ZW5lcnNcblxuXG4gICAgICBpZiAocmVhY3RFdmVudE5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlYWN0RXZlbnROYW1lKTtcblxuICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICAgIGxpc3RlbmVycy5wdXNoKGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGxpc3RlbmVyLCBsYXN0SG9zdENvbXBvbmVudCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBJZiB3ZSBhcmUgb25seSBhY2N1bXVsYXRpbmcgZXZlbnRzIGZvciB0aGUgdGFyZ2V0LCB0aGVuIHdlIGRvbid0XG4gICAgLy8gY29udGludWUgdG8gcHJvcGFnYXRlIHRocm91Z2ggdGhlIFJlYWN0IGZpYmVyIHRyZWUgdG8gZmluZCBvdGhlclxuICAgIC8vIGxpc3RlbmVycy5cblxuXG4gICAgaWYgKGFjY3VtdWxhdGVUYXJnZXRPbmx5KSB7XG4gICAgICBicmVhaztcbiAgICB9IC8vIElmIHdlIGFyZSBwcm9jZXNzaW5nIHRoZSBvbkJlZm9yZUJsdXIgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byB0YWtlXG5cbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlLnJldHVybjtcbiAgfVxuXG4gIHJldHVybiBsaXN0ZW5lcnM7XG59IC8vIFdlIHNob3VsZCBvbmx5IHVzZSB0aGlzIGZ1bmN0aW9uIGZvcjpcbi8vIC0gQmVmb3JlSW5wdXRFdmVudFBsdWdpblxuLy8gLSBDaGFuZ2VFdmVudFBsdWdpblxuLy8gLSBTZWxlY3RFdmVudFBsdWdpblxuLy8gVGhpcyBpcyBiZWNhdXNlIHdlIG9ubHkgcHJvY2VzcyB0aGVzZSBwbHVnaW5zXG4vLyBpbiB0aGUgYnViYmxlIHBoYXNlLCBzbyB3ZSBuZWVkIHRvIGFjY3VtdWxhdGUgdHdvXG4vLyBwaGFzZSBldmVudCBsaXN0ZW5lcnMgKHZpYSBlbXVsYXRpb24pLlxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0RmliZXIsIHJlYWN0TmFtZSkge1xuICB2YXIgY2FwdHVyZU5hbWUgPSByZWFjdE5hbWUgKyAnQ2FwdHVyZSc7XG4gIHZhciBsaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIGluc3RhbmNlID0gdGFyZ2V0RmliZXI7IC8vIEFjY3VtdWxhdGUgYWxsIGluc3RhbmNlcyBhbmQgbGlzdGVuZXJzIHZpYSB0aGUgdGFyZ2V0IC0+IHJvb3QgcGF0aC5cblxuICB3aGlsZSAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICB2YXIgX2luc3RhbmNlMyA9IGluc3RhbmNlLFxuICAgICAgICBzdGF0ZU5vZGUgPSBfaW5zdGFuY2UzLnN0YXRlTm9kZSxcbiAgICAgICAgdGFnID0gX2luc3RhbmNlMy50YWc7IC8vIEhhbmRsZSBsaXN0ZW5lcnMgdGhhdCBhcmUgb24gSG9zdENvbXBvbmVudHMgKGkuZS4gPGRpdj4pXG5cbiAgICBpZiAodGFnID09PSBIb3N0Q29tcG9uZW50ICYmIHN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBzdGF0ZU5vZGU7XG4gICAgICB2YXIgY2FwdHVyZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIGNhcHR1cmVOYW1lKTtcblxuICAgICAgaWYgKGNhcHR1cmVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGNhcHR1cmVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgfVxuXG4gICAgICB2YXIgYnViYmxlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVhY3ROYW1lKTtcblxuICAgICAgaWYgKGJ1YmJsZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgbGlzdGVuZXJzLnB1c2goY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgYnViYmxlTGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlLnJldHVybjtcbiAgfVxuXG4gIHJldHVybiBsaXN0ZW5lcnM7XG59XG5cbmZ1bmN0aW9uIGdldFBhcmVudChpbnN0KSB7XG4gIGlmIChpbnN0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBkbyB7XG4gICAgaW5zdCA9IGluc3QucmV0dXJuOyAvLyBUT0RPOiBJZiB0aGlzIGlzIGEgSG9zdFJvb3Qgd2UgbWlnaHQgd2FudCB0byBiYWlsIG91dC5cbiAgICAvLyBUaGF0IGlzIGRlcGVuZGluZyBvbiBpZiB3ZSB3YW50IG5lc3RlZCBzdWJ0cmVlcyAobGF5ZXJzKSB0byBidWJibGVcbiAgICAvLyBldmVudHMgdG8gdGhlaXIgcGFyZW50LiBXZSBjb3VsZCBhbHNvIGdvIHRocm91Z2ggcGFyZW50Tm9kZSBvbiB0aGVcbiAgICAvLyBob3N0IG5vZGUgYnV0IHRoYXQgd291bGRuJ3Qgd29yayBmb3IgUmVhY3QgTmF0aXZlIGFuZCBkb2Vzbid0IGxldCB1c1xuICAgIC8vIGRvIHRoZSBwb3J0YWwgZmVhdHVyZS5cbiAgfSB3aGlsZSAoaW5zdCAmJiBpbnN0LnRhZyAhPT0gSG9zdENvbXBvbmVudCk7XG5cbiAgaWYgKGluc3QpIHtcbiAgICByZXR1cm4gaW5zdDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBSZXR1cm4gdGhlIGxvd2VzdCBjb21tb24gYW5jZXN0b3Igb2YgQSBhbmQgQiwgb3IgbnVsbCBpZiB0aGV5IGFyZSBpblxuICogZGlmZmVyZW50IHRyZWVzLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoaW5zdEEsIGluc3RCKSB7XG4gIHZhciBub2RlQSA9IGluc3RBO1xuICB2YXIgbm9kZUIgPSBpbnN0QjtcbiAgdmFyIGRlcHRoQSA9IDA7XG5cbiAgZm9yICh2YXIgdGVtcEEgPSBub2RlQTsgdGVtcEE7IHRlbXBBID0gZ2V0UGFyZW50KHRlbXBBKSkge1xuICAgIGRlcHRoQSsrO1xuICB9XG5cbiAgdmFyIGRlcHRoQiA9IDA7XG5cbiAgZm9yICh2YXIgdGVtcEIgPSBub2RlQjsgdGVtcEI7IHRlbXBCID0gZ2V0UGFyZW50KHRlbXBCKSkge1xuICAgIGRlcHRoQisrO1xuICB9IC8vIElmIEEgaXMgZGVlcGVyLCBjcmF3bCB1cC5cblxuXG4gIHdoaWxlIChkZXB0aEEgLSBkZXB0aEIgPiAwKSB7XG4gICAgbm9kZUEgPSBnZXRQYXJlbnQobm9kZUEpO1xuICAgIGRlcHRoQS0tO1xuICB9IC8vIElmIEIgaXMgZGVlcGVyLCBjcmF3bCB1cC5cblxuXG4gIHdoaWxlIChkZXB0aEIgLSBkZXB0aEEgPiAwKSB7XG4gICAgbm9kZUIgPSBnZXRQYXJlbnQobm9kZUIpO1xuICAgIGRlcHRoQi0tO1xuICB9IC8vIFdhbGsgaW4gbG9ja3N0ZXAgdW50aWwgd2UgZmluZCBhIG1hdGNoLlxuXG5cbiAgdmFyIGRlcHRoID0gZGVwdGhBO1xuXG4gIHdoaWxlIChkZXB0aC0tKSB7XG4gICAgaWYgKG5vZGVBID09PSBub2RlQiB8fCBub2RlQiAhPT0gbnVsbCAmJiBub2RlQSA9PT0gbm9kZUIuYWx0ZXJuYXRlKSB7XG4gICAgICByZXR1cm4gbm9kZUE7XG4gICAgfVxuXG4gICAgbm9kZUEgPSBnZXRQYXJlbnQobm9kZUEpO1xuICAgIG5vZGVCID0gZ2V0UGFyZW50KG5vZGVCKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGV2ZW50LCB0YXJnZXQsIGNvbW1vbiwgaW5DYXB0dXJlUGhhc2UpIHtcbiAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUgPSBldmVudC5fcmVhY3ROYW1lO1xuICB2YXIgbGlzdGVuZXJzID0gW107XG4gIHZhciBpbnN0YW5jZSA9IHRhcmdldDtcblxuICB3aGlsZSAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICBpZiAoaW5zdGFuY2UgPT09IGNvbW1vbikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIF9pbnN0YW5jZTQgPSBpbnN0YW5jZSxcbiAgICAgICAgYWx0ZXJuYXRlID0gX2luc3RhbmNlNC5hbHRlcm5hdGUsXG4gICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTQuc3RhdGVOb2RlLFxuICAgICAgICB0YWcgPSBfaW5zdGFuY2U0LnRhZztcblxuICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwgJiYgYWx0ZXJuYXRlID09PSBjb21tb24pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09IEhvc3RDb21wb25lbnQgJiYgc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudFRhcmdldCA9IHN0YXRlTm9kZTtcblxuICAgICAgaWYgKGluQ2FwdHVyZVBoYXNlKSB7XG4gICAgICAgIHZhciBjYXB0dXJlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgaWYgKGNhcHR1cmVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgICAgbGlzdGVuZXJzLnVuc2hpZnQoY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgY2FwdHVyZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWluQ2FwdHVyZVBoYXNlKSB7XG4gICAgICAgIHZhciBidWJibGVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWdpc3RyYXRpb25OYW1lKTtcblxuICAgICAgICBpZiAoYnViYmxlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICAgIGxpc3RlbmVycy5wdXNoKGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGJ1YmJsZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlLnJldHVybjtcbiAgfVxuXG4gIGlmIChsaXN0ZW5lcnMubGVuZ3RoICE9PSAwKSB7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG4gIH1cbn0gLy8gV2Ugc2hvdWxkIG9ubHkgdXNlIHRoaXMgZnVuY3Rpb24gZm9yOlxuLy8gLSBFbnRlckxlYXZlRXZlbnRQbHVnaW5cbi8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBvbmx5IHByb2Nlc3MgdGhpcyBwbHVnaW5cbi8vIGluIHRoZSBidWJibGUgcGhhc2UsIHNvIHdlIG5lZWQgdG8gYWNjdW11bGF0ZSB0d29cbi8vIHBoYXNlIGV2ZW50IGxpc3RlbmVycy5cblxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlRW50ZXJMZWF2ZVR3b1BoYXNlTGlzdGVuZXJzKGRpc3BhdGNoUXVldWUsIGxlYXZlRXZlbnQsIGVudGVyRXZlbnQsIGZyb20sIHRvKSB7XG4gIHZhciBjb21tb24gPSBmcm9tICYmIHRvID8gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoZnJvbSwgdG8pIDogbnVsbDtcblxuICBpZiAoZnJvbSAhPT0gbnVsbCkge1xuICAgIGFjY3VtdWxhdGVFbnRlckxlYXZlTGlzdGVuZXJzRm9yRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbGVhdmVFdmVudCwgZnJvbSwgY29tbW9uLCBmYWxzZSk7XG4gIH1cblxuICBpZiAodG8gIT09IG51bGwgJiYgZW50ZXJFdmVudCAhPT0gbnVsbCkge1xuICAgIGFjY3VtdWxhdGVFbnRlckxlYXZlTGlzdGVuZXJzRm9yRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZW50ZXJFdmVudCwgdG8sIGNvbW1vbiwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldExpc3RlbmVyU2V0S2V5KGRvbUV2ZW50TmFtZSwgY2FwdHVyZSkge1xuICByZXR1cm4gZG9tRXZlbnROYW1lICsgXCJfX1wiICsgKGNhcHR1cmUgPyAnY2FwdHVyZScgOiAnYnViYmxlJyk7XG59XG5cbnZhciBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IGZhbHNlO1xudmFyIERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MID0gJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJztcbnZhciBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgPSAnc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nJztcbnZhciBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyA9ICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnO1xudmFyIEFVVE9GT0NVUyA9ICdhdXRvRm9jdXMnO1xudmFyIENISUxEUkVOID0gJ2NoaWxkcmVuJztcbnZhciBTVFlMRSA9ICdzdHlsZSc7XG52YXIgSFRNTCQxID0gJ19faHRtbCc7XG52YXIgd2FybmVkVW5rbm93blRhZ3M7XG52YXIgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudDtcbnZhciB3YXJuRm9yUHJvcERpZmZlcmVuY2U7XG52YXIgd2FybkZvckV4dHJhQXR0cmlidXRlcztcbnZhciB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXI7XG52YXIgY2FuRGlmZlN0eWxlRm9ySHlkcmF0aW9uV2FybmluZztcbnZhciBub3JtYWxpemVIVE1MO1xuXG57XG4gIHdhcm5lZFVua25vd25UYWdzID0ge1xuICAgIC8vIFRoZXJlIGFyZSB3b3JraW5nIHBvbHlmaWxscyBmb3IgPGRpYWxvZz4uIExldCBwZW9wbGUgdXNlIGl0LlxuICAgIGRpYWxvZzogdHJ1ZSxcbiAgICAvLyBFbGVjdHJvbiBzaGlwcyBhIGN1c3RvbSA8d2Vidmlldz4gdGFnIHRvIGRpc3BsYXkgZXh0ZXJuYWwgd2ViIGNvbnRlbnQgaW5cbiAgICAvLyBhbiBpc29sYXRlZCBmcmFtZSBhbmQgcHJvY2Vzcy5cbiAgICAvLyBUaGlzIHRhZyBpcyBub3QgcHJlc2VudCBpbiBub24gRWxlY3Ryb24gZW52aXJvbm1lbnRzIHN1Y2ggYXMgSlNEb20gd2hpY2hcbiAgICAvLyBpcyBvZnRlbiB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICAgIC8vIEBzZWUgaHR0cHM6Ly9lbGVjdHJvbmpzLm9yZy9kb2NzL2FwaS93ZWJ2aWV3LXRhZ1xuICAgIHdlYnZpZXc6IHRydWVcbiAgfTtcblxuICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50ID0gZnVuY3Rpb24gKHR5cGUsIHByb3BzKSB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGUsIHByb3BzKTtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXMkMSh0eXBlLCBwcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzJDIodHlwZSwgcHJvcHMsIHtcbiAgICAgIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXM6IHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMsXG4gICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzOiBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzXG4gICAgfSk7XG4gIH07IC8vIElFIDExIHBhcnNlcyAmIG5vcm1hbGl6ZXMgdGhlIHN0eWxlIGF0dHJpYnV0ZSBhcyBvcHBvc2VkIHRvIG90aGVyXG4gIC8vIGJyb3dzZXJzLiBJdCBhZGRzIHNwYWNlcyBhbmQgc29ydHMgdGhlIHByb3BlcnRpZXMgaW4gc29tZVxuICAvLyBub24tYWxwaGFiZXRpY2FsIG9yZGVyLiBIYW5kbGluZyB0aGF0IHdvdWxkIHJlcXVpcmUgc29ydGluZyBDU1NcbiAgLy8gcHJvcGVydGllcyBpbiB0aGUgY2xpZW50ICYgc2VydmVyIHZlcnNpb25zIG9yIGFwcGx5aW5nXG4gIC8vIGBleHBlY3RlZFN0eWxlYCB0byBhIHRlbXBvcmFyeSBET00gbm9kZSB0byByZWFkIGl0cyBgc3R5bGVgIGF0dHJpYnV0ZVxuICAvLyBub3JtYWxpemVkLiBTaW5jZSBpdCBvbmx5IGFmZmVjdHMgSUUsIHdlJ3JlIHNraXBwaW5nIHN0eWxlIHdhcm5pbmdzXG4gIC8vIGluIHRoYXQgYnJvd3NlciBjb21wbGV0ZWx5IGluIGZhdm9yIG9mIGRvaW5nIGFsbCB0aGF0IHdvcmsuXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExODA3XG5cblxuICBjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nID0gY2FuVXNlRE9NICYmICFkb2N1bWVudC5kb2N1bWVudE1vZGU7XG5cbiAgd2FybkZvclByb3BEaWZmZXJlbmNlID0gZnVuY3Rpb24gKHByb3BOYW1lLCBzZXJ2ZXJWYWx1ZSwgY2xpZW50VmFsdWUpIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbm9ybWFsaXplZENsaWVudFZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKGNsaWVudFZhbHVlKTtcbiAgICB2YXIgbm9ybWFsaXplZFNlcnZlclZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKHNlcnZlclZhbHVlKTtcblxuICAgIGlmIChub3JtYWxpemVkU2VydmVyVmFsdWUgPT09IG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdQcm9wIGAlc2AgZGlkIG5vdCBtYXRjaC4gU2VydmVyOiAlcyBDbGllbnQ6ICVzJywgcHJvcE5hbWUsIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWRTZXJ2ZXJWYWx1ZSksIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSkpO1xuICB9O1xuXG4gIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoYXR0cmlidXRlTmFtZXMpIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG4gICAgdmFyIG5hbWVzID0gW107XG4gICAgYXR0cmlidXRlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgbmFtZXMucHVzaChuYW1lKTtcbiAgICB9KTtcblxuICAgIGVycm9yKCdFeHRyYSBhdHRyaWJ1dGVzIGZyb20gdGhlIHNlcnZlcjogJXMnLCBuYW1lcyk7XG4gIH07XG5cbiAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHJlZ2lzdHJhdGlvbk5hbWUsIGxpc3RlbmVyKSB7XG4gICAgaWYgKGxpc3RlbmVyID09PSBmYWxzZSkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGAlc2AgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYGZhbHNlYC5cXG5cXG4nICsgJ0lmIHlvdSB1c2VkIHRvIGNvbmRpdGlvbmFsbHkgb21pdCBpdCB3aXRoICVzPXtjb25kaXRpb24gJiYgdmFsdWV9LCAnICsgJ3Bhc3MgJXM9e2NvbmRpdGlvbiA/IHZhbHVlIDogdW5kZWZpbmVkfSBpbnN0ZWFkLicsIHJlZ2lzdHJhdGlvbk5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgYCVzYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBhIHZhbHVlIG9mIGAlc2AgdHlwZS4nLCByZWdpc3RyYXRpb25OYW1lLCB0eXBlb2YgbGlzdGVuZXIpO1xuICAgIH1cbiAgfTsgLy8gUGFyc2UgdGhlIEhUTUwgYW5kIHJlYWQgaXQgYmFjayB0byBub3JtYWxpemUgdGhlIEhUTUwgc3RyaW5nIHNvIHRoYXQgaXRcbiAgLy8gY2FuIGJlIHVzZWQgZm9yIGNvbXBhcmlzb24uXG5cblxuICBub3JtYWxpemVIVE1MID0gZnVuY3Rpb24gKHBhcmVudCwgaHRtbCkge1xuICAgIC8vIFdlIGNvdWxkIGhhdmUgY3JlYXRlZCBhIHNlcGFyYXRlIGRvY3VtZW50IGhlcmUgdG8gYXZvaWRcbiAgICAvLyByZS1pbml0aWFsaXppbmcgY3VzdG9tIGVsZW1lbnRzIGlmIHRoZXkgZXhpc3QuIEJ1dCB0aGlzIGJyZWFrc1xuICAgIC8vIGhvdyA8bm9zY3JpcHQ+IGlzIGJlaW5nIGhhbmRsZWQuIFNvIHdlIHVzZSB0aGUgc2FtZSBkb2N1bWVudC5cbiAgICAvLyBTZWUgdGhlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTExNTcuXG4gICAgdmFyIHRlc3RFbGVtZW50ID0gcGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UgPyBwYXJlbnQub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHBhcmVudC50YWdOYW1lKSA6IHBhcmVudC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhwYXJlbnQubmFtZXNwYWNlVVJJLCBwYXJlbnQudGFnTmFtZSk7XG4gICAgdGVzdEVsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICByZXR1cm4gdGVzdEVsZW1lbnQuaW5uZXJIVE1MO1xuICB9O1xufSAvLyBIVE1MIHBhcnNpbmcgbm9ybWFsaXplcyBDUiBhbmQgQ1JMRiB0byBMRi5cbi8vIEl0IGFsc28gY2FuIHR1cm4gXFx1MDAwMCBpbnRvIFxcdUZGRkQgaW5zaWRlIGF0dHJpYnV0ZXMuXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvc2luZ2xlLXBhZ2UuaHRtbCNwcmVwcm9jZXNzaW5nLXRoZS1pbnB1dC1zdHJlYW1cbi8vIElmIHdlIGhhdmUgYSBtaXNtYXRjaCwgaXQgbWlnaHQgYmUgY2F1c2VkIGJ5IHRoYXQuXG4vLyBXZSB3aWxsIHN0aWxsIHBhdGNoIHVwIGluIHRoaXMgY2FzZSBidXQgbm90IGZpcmUgdGhlIHdhcm5pbmcuXG5cblxudmFyIE5PUk1BTElaRV9ORVdMSU5FU19SRUdFWCA9IC9cXHJcXG4/L2c7XG52YXIgTk9STUFMSVpFX05VTExfQU5EX1JFUExBQ0VNRU5UX1JFR0VYID0gL1xcdTAwMDB8XFx1RkZGRC9nO1xuXG5mdW5jdGlvbiBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUobWFya3VwKSB7XG4gIHtcbiAgICBjaGVja0h0bWxTdHJpbmdDb2VyY2lvbihtYXJrdXApO1xuICB9XG5cbiAgdmFyIG1hcmt1cFN0cmluZyA9IHR5cGVvZiBtYXJrdXAgPT09ICdzdHJpbmcnID8gbWFya3VwIDogJycgKyBtYXJrdXA7XG4gIHJldHVybiBtYXJrdXBTdHJpbmcucmVwbGFjZShOT1JNQUxJWkVfTkVXTElORVNfUkVHRVgsICdcXG4nKS5yZXBsYWNlKE5PUk1BTElaRV9OVUxMX0FORF9SRVBMQUNFTUVOVF9SRUdFWCwgJycpO1xufVxuXG5mdW5jdGlvbiBjaGVja0ZvclVubWF0Y2hlZFRleHQoc2VydmVyVGV4dCwgY2xpZW50VGV4dCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldikge1xuICB2YXIgbm9ybWFsaXplZENsaWVudFRleHQgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoY2xpZW50VGV4dCk7XG4gIHZhciBub3JtYWxpemVkU2VydmVyVGV4dCA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShzZXJ2ZXJUZXh0KTtcblxuICBpZiAobm9ybWFsaXplZFNlcnZlclRleHQgPT09IG5vcm1hbGl6ZWRDbGllbnRUZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNob3VsZFdhcm5EZXYpIHtcbiAgICB7XG4gICAgICBpZiAoIWRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignVGV4dCBjb250ZW50IGRpZCBub3QgbWF0Y2guIFNlcnZlcjogXCIlc1wiIENsaWVudDogXCIlc1wiJywgbm9ybWFsaXplZFNlcnZlclRleHQsIG5vcm1hbGl6ZWRDbGllbnRUZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoaXNDb25jdXJyZW50TW9kZSAmJiBlbmFibGVDbGllbnRSZW5kZXJGYWxsYmFja09uVGV4dE1pc21hdGNoKSB7XG4gICAgLy8gSW4gY29uY3VycmVudCByb290cywgd2UgdGhyb3cgd2hlbiB0aGVyZSdzIGEgdGV4dCBtaXNtYXRjaCBhbmQgcmV2ZXJ0IHRvXG4gICAgLy8gY2xpZW50IHJlbmRlcmluZywgdXAgdG8gdGhlIG5lYXJlc3QgU3VzcGVuc2UgYm91bmRhcnkuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUZXh0IGNvbnRlbnQgZG9lcyBub3QgbWF0Y2ggc2VydmVyLXJlbmRlcmVkIEhUTUwuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0T3duZXJEb2N1bWVudEZyb21Sb290Q29udGFpbmVyKHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHJldHVybiByb290Q29udGFpbmVyRWxlbWVudC5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/IHJvb3RDb250YWluZXJFbGVtZW50IDogcm9vdENvbnRhaW5lckVsZW1lbnQub3duZXJEb2N1bWVudDtcbn1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbmZ1bmN0aW9uIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KG5vZGUpIHtcbiAgLy8gTW9iaWxlIFNhZmFyaSBkb2VzIG5vdCBmaXJlIHByb3Blcmx5IGJ1YmJsZSBjbGljayBldmVudHMgb25cbiAgLy8gbm9uLWludGVyYWN0aXZlIGVsZW1lbnRzLCB3aGljaCBtZWFucyBkZWxlZ2F0ZWQgY2xpY2sgbGlzdGVuZXJzIGRvIG5vdFxuICAvLyBmaXJlLiBUaGUgd29ya2Fyb3VuZCBmb3IgdGhpcyBidWcgaW52b2x2ZXMgYXR0YWNoaW5nIGFuIGVtcHR5IGNsaWNrXG4gIC8vIGxpc3RlbmVyIG9uIHRoZSB0YXJnZXQgbm9kZS5cbiAgLy8gaHR0cHM6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDEwLzA5L2NsaWNrX2V2ZW50X2RlbC5odG1sXG4gIC8vIEp1c3Qgc2V0IGl0IHVzaW5nIHRoZSBvbmNsaWNrIHByb3BlcnR5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBtYW5hZ2UgYW55XG4gIC8vIGJvb2trZWVwaW5nIGZvciBpdC4gTm90IHN1cmUgaWYgd2UgbmVlZCB0byBjbGVhciBpdCB3aGVuIHRoZSBsaXN0ZW5lciBpc1xuICAvLyByZW1vdmVkLlxuICAvLyBUT0RPOiBPbmx5IGRvIHRoaXMgZm9yIHRoZSByZWxldmFudCBTYWZhcmlzIG1heWJlP1xuICBub2RlLm9uY2xpY2sgPSBub29wO1xufVxuXG5mdW5jdGlvbiBzZXRJbml0aWFsRE9NUHJvcGVydGllcyh0YWcsIGRvbUVsZW1lbnQsIHJvb3RDb250YWluZXJFbGVtZW50LCBuZXh0UHJvcHMsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGZvciAodmFyIHByb3BLZXkgaW4gbmV4dFByb3BzKSB7XG4gICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBuZXh0UHJvcCA9IG5leHRQcm9wc1twcm9wS2V5XTtcblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAge1xuICAgICAgICBpZiAobmV4dFByb3ApIHtcbiAgICAgICAgICAvLyBGcmVlemUgdGhlIG5leHQgc3R5bGUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGFzc3VtZSBpdCB3b24ndCBiZVxuICAgICAgICAgIC8vIG11dGF0ZWQuIFdlIGhhdmUgYWxyZWFkeSB3YXJuZWQgZm9yIHRoaXMgaW4gdGhlIHBhc3QuXG4gICAgICAgICAgT2JqZWN0LmZyZWV6ZShuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gUmVsaWVzIG9uIGB1cGRhdGVTdHlsZXNCeUlEYCBub3QgbXV0YXRpbmcgYHN0eWxlVXBkYXRlc2AuXG5cblxuICAgICAgc2V0VmFsdWVGb3JTdHlsZXMoZG9tRWxlbWVudCwgbmV4dFByb3ApO1xuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKG5leHRIdG1sICE9IG51bGwpIHtcbiAgICAgICAgc2V0SW5uZXJIVE1MKGRvbUVsZW1lbnQsIG5leHRIdG1sKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBBdm9pZCBzZXR0aW5nIGluaXRpYWwgdGV4dENvbnRlbnQgd2hlbiB0aGUgdGV4dCBpcyBlbXB0eS4gSW4gSUUxMSBzZXR0aW5nXG4gICAgICAgIC8vIHRleHRDb250ZW50IG9uIGEgPHRleHRhcmVhPiB3aWxsIGNhdXNlIHRoZSBwbGFjZWhvbGRlciB0byBub3RcbiAgICAgICAgLy8gc2hvdyB3aXRoaW4gdGhlIDx0ZXh0YXJlYT4gdW50aWwgaXQgaGFzIGJlZW4gZm9jdXNlZCBhbmQgYmx1cnJlZCBhZ2Fpbi5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy82NzMxI2lzc3VlY29tbWVudC0yNTQ4NzQ1NTNcbiAgICAgICAgdmFyIGNhblNldFRleHRDb250ZW50ID0gdGFnICE9PSAndGV4dGFyZWEnIHx8IG5leHRQcm9wICE9PSAnJztcblxuICAgICAgICBpZiAoY2FuU2V0VGV4dENvbnRlbnQpIHtcbiAgICAgICAgICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnbnVtYmVyJykge1xuICAgICAgICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCAnJyArIG5leHRQcm9wKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORykgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBBVVRPRk9DVVMpIDsgZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgICAgaWYgKCB0eXBlb2YgbmV4dFByb3AgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIocHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BLZXkgPT09ICdvblNjcm9sbCcpIHtcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdzY3JvbGwnLCBkb21FbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgc2V0VmFsdWVGb3JQcm9wZXJ0eShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCwgaXNDdXN0b21Db21wb25lbnRUYWcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVET01Qcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHdhc0N1c3RvbUNvbXBvbmVudFRhZywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgLy8gVE9ETzogSGFuZGxlIHdhc0N1c3RvbUNvbXBvbmVudFRhZ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHVwZGF0ZVBheWxvYWQubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgcHJvcEtleSA9IHVwZGF0ZVBheWxvYWRbaV07XG4gICAgdmFyIHByb3BWYWx1ZSA9IHVwZGF0ZVBheWxvYWRbaSArIDFdO1xuXG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICBzZXRWYWx1ZUZvclN0eWxlcyhkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgIHNldElubmVySFRNTChkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIHByb3BWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgcHJvcFZhbHVlLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJFbGVtZW50LCBwYXJlbnROYW1lc3BhY2UpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnOyAvLyBXZSBjcmVhdGUgdGFncyBpbiB0aGUgbmFtZXNwYWNlIG9mIHRoZWlyIHBhcmVudCBjb250YWluZXIsIGV4Y2VwdCBIVE1MXG4gIC8vIHRhZ3MgZ2V0IG5vIG5hbWVzcGFjZS5cblxuICB2YXIgb3duZXJEb2N1bWVudCA9IGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCk7XG4gIHZhciBkb21FbGVtZW50O1xuICB2YXIgbmFtZXNwYWNlVVJJID0gcGFyZW50TmFtZXNwYWNlO1xuXG4gIGlmIChuYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgbmFtZXNwYWNlVVJJID0gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpO1xuICB9XG5cbiAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICB7XG4gICAgICBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHR5cGUsIHByb3BzKTsgLy8gU2hvdWxkIHRoaXMgY2hlY2sgYmUgZ2F0ZWQgYnkgcGFyZW50IG5hbWVzcGFjZT8gTm90IHN1cmUgd2Ugd2FudCB0b1xuICAgICAgLy8gYWxsb3cgPFNWRz4gb3IgPG1BVEg+LlxuXG4gICAgICBpZiAoIWlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIHR5cGUgIT09IHR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBlcnJvcignPCVzIC8+IGlzIHVzaW5nIGluY29ycmVjdCBjYXNpbmcuICcgKyAnVXNlIFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMsICcgKyAnb3IgbG93ZXJjYXNlIGZvciBIVE1MIGVsZW1lbnRzLicsIHR5cGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAnc2NyaXB0Jykge1xuICAgICAgLy8gQ3JlYXRlIHRoZSBzY3JpcHQgdmlhIC5pbm5lckhUTUwgc28gaXRzIFwicGFyc2VyLWluc2VydGVkXCIgZmxhZyBpc1xuICAgICAgLy8gc2V0IHRvIHRydWUgYW5kIGl0IGRvZXMgbm90IGV4ZWN1dGVcbiAgICAgIHZhciBkaXYgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICBkaXYuaW5uZXJIVE1MID0gJzxzY3JpcHQ+PCcgKyAnL3NjcmlwdD4nOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAvLyBUaGlzIGlzIGd1YXJhbnRlZWQgdG8geWllbGQgYSBzY3JpcHQgZWxlbWVudC5cblxuICAgICAgdmFyIGZpcnN0Q2hpbGQgPSBkaXYuZmlyc3RDaGlsZDtcbiAgICAgIGRvbUVsZW1lbnQgPSBkaXYucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcHJvcHMuaXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyAkRmxvd0lzc3VlIGBjcmVhdGVFbGVtZW50YCBzaG91bGQgYmUgdXBkYXRlZCBmb3IgV2ViIENvbXBvbmVudHNcbiAgICAgIGRvbUVsZW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSwge1xuICAgICAgICBpczogcHJvcHMuaXNcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTZXBhcmF0ZSBlbHNlIGJyYW5jaCBpbnN0ZWFkIG9mIHVzaW5nIGBwcm9wcy5pcyB8fCB1bmRlZmluZWRgIGFib3ZlIGJlY2F1c2Ugb2YgYSBGaXJlZm94IGJ1Zy5cbiAgICAgIC8vIFNlZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzY4OTZcbiAgICAgIC8vIGFuZCBkaXNjdXNzaW9uIGluIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEyNzYyNDBcbiAgICAgIGRvbUVsZW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSk7IC8vIE5vcm1hbGx5IGF0dHJpYnV0ZXMgYXJlIGFzc2lnbmVkIGluIGBzZXRJbml0aWFsRE9NUHJvcGVydGllc2AsIGhvd2V2ZXIgdGhlIGBtdWx0aXBsZWAgYW5kIGBzaXplYFxuICAgICAgLy8gYXR0cmlidXRlcyBvbiBgc2VsZWN0YHMgbmVlZHMgdG8gYmUgYWRkZWQgYmVmb3JlIGBvcHRpb25gcyBhcmUgaW5zZXJ0ZWQuXG4gICAgICAvLyBUaGlzIHByZXZlbnRzOlxuICAgICAgLy8gLSBhIGJ1ZyB3aGVyZSB0aGUgYHNlbGVjdGAgZG9lcyBub3Qgc2Nyb2xsIHRvIHRoZSBjb3JyZWN0IG9wdGlvbiBiZWNhdXNlIHNpbmd1bGFyXG4gICAgICAvLyAgYHNlbGVjdGAgZWxlbWVudHMgYXV0b21hdGljYWxseSBwaWNrIHRoZSBmaXJzdCBpdGVtICMxMzIyMlxuICAgICAgLy8gLSBhIGJ1ZyB3aGVyZSB0aGUgYHNlbGVjdGAgc2V0IHRoZSBmaXJzdCBpdGVtIGFzIHNlbGVjdGVkIGRlc3BpdGUgdGhlIGBzaXplYCBhdHRyaWJ1dGUgIzE0MjM5XG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzIyMlxuICAgICAgLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTQyMzlcblxuICAgICAgaWYgKHR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgIHZhciBub2RlID0gZG9tRWxlbWVudDtcblxuICAgICAgICBpZiAocHJvcHMubXVsdGlwbGUpIHtcbiAgICAgICAgICBub2RlLm11bHRpcGxlID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9wcy5zaXplKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBhIHNpemUgZ3JlYXRlciB0aGFuIDEgY2F1c2VzIGEgc2VsZWN0IHRvIGJlaGF2ZSBsaWtlIGBtdWx0aXBsZT10cnVlYCwgd2hlcmVcbiAgICAgICAgICAvLyBpdCBpcyBwb3NzaWJsZSB0aGF0IG5vIG9wdGlvbiBpcyBzZWxlY3RlZC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoaXMgaXMgb25seSBuZWNlc3Nhcnkgd2hlbiBhIHNlbGVjdCBpbiBcInNpbmdsZSBzZWxlY3Rpb24gbW9kZVwiLlxuICAgICAgICAgIG5vZGUuc2l6ZSA9IHByb3BzLnNpemU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwgdHlwZSk7XG4gIH1cblxuICB7XG4gICAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgIGlmICghaXNDdXN0b21Db21wb25lbnRUYWcgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRvbUVsZW1lbnQpID09PSAnW29iamVjdCBIVE1MVW5rbm93bkVsZW1lbnRdJyAmJiAhaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRVbmtub3duVGFncywgdHlwZSkpIHtcbiAgICAgICAgd2FybmVkVW5rbm93blRhZ3NbdHlwZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdUaGUgdGFnIDwlcz4gaXMgdW5yZWNvZ25pemVkIGluIHRoaXMgYnJvd3Nlci4gJyArICdJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgUmVhY3QgY29tcG9uZW50LCBzdGFydCBpdHMgbmFtZSB3aXRoICcgKyAnYW4gdXBwZXJjYXNlIGxldHRlci4nLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZG9tRWxlbWVudDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlKHRleHQsIHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHJldHVybiBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckVsZW1lbnQpLmNyZWF0ZVRleHROb2RlKHRleHQpO1xufVxuZnVuY3Rpb24gc2V0SW5pdGlhbFByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCByYXdQcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCByYXdQcm9wcyk7XG5cbiAge1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCByYXdQcm9wcyk7XG4gIH0gLy8gVE9ETzogTWFrZSBzdXJlIHRoYXQgd2UgY2hlY2sgaXNNb3VudGVkIGJlZm9yZSBmaXJpbmcgYW55IG9mIHRoZXNlIGV2ZW50cy5cblxuXG4gIHZhciBwcm9wcztcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjYW5jZWwnLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Nsb3NlJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnZW1iZWQnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGxvYWQgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd2aWRlbyc6XG4gICAgY2FzZSAnYXVkaW8nOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBhbGwgdGhlIG1lZGlhIGV2ZW50cy5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVkaWFFdmVudFR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQobWVkaWFFdmVudFR5cGVzW2ldLCBkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc291cmNlJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBlcnJvciBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgZXJyb3IgYW5kIGxvYWQgZXZlbnRzLlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RldGFpbHMnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIHRvZ2dsZSBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3RvZ2dsZScsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICB2YWxpZGF0ZVByb3BzKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMihkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgcHJvcHMpO1xuICBzZXRJbml0aWFsRE9NUHJvcGVydGllcyh0YWcsIGRvbUVsZW1lbnQsIHJvb3RDb250YWluZXJFbGVtZW50LCBwcm9wcywgaXNDdXN0b21Db21wb25lbnRUYWcpO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlcihkb21FbGVtZW50LCByYXdQcm9wcywgZmFsc2UpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDMoZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgcG9zdE1vdW50V3JhcHBlciQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cbn0gLy8gQ2FsY3VsYXRlIHRoZSBkaWZmIGJldHdlZW4gdGhlIHR3byBvYmplY3RzLlxuXG5mdW5jdGlvbiBkaWZmUHJvcGVydGllcyhkb21FbGVtZW50LCB0YWcsIGxhc3RSYXdQcm9wcywgbmV4dFJhd1Byb3BzLCByb290Q29udGFpbmVyRWxlbWVudCkge1xuICB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0YWcsIG5leHRSYXdQcm9wcyk7XG4gIH1cblxuICB2YXIgdXBkYXRlUGF5bG9hZCA9IG51bGw7XG4gIHZhciBsYXN0UHJvcHM7XG4gIHZhciBuZXh0UHJvcHM7XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICBsYXN0UHJvcHMgPSBnZXRIb3N0UHJvcHMoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTtcbiAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzJDEoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTtcbiAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyQxKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyQyKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMihkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgbGFzdFByb3BzID0gbGFzdFJhd1Byb3BzO1xuICAgICAgbmV4dFByb3BzID0gbmV4dFJhd1Byb3BzO1xuXG4gICAgICBpZiAodHlwZW9mIGxhc3RQcm9wcy5vbkNsaWNrICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBuZXh0UHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgbmV4dFByb3BzKTtcbiAgdmFyIHByb3BLZXk7XG4gIHZhciBzdHlsZU5hbWU7XG4gIHZhciBzdHlsZVVwZGF0ZXMgPSBudWxsO1xuXG4gIGZvciAocHJvcEtleSBpbiBsYXN0UHJvcHMpIHtcbiAgICBpZiAobmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8ICFsYXN0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbGFzdFByb3BzW3Byb3BLZXldID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgdmFyIGxhc3RTdHlsZSA9IGxhc3RQcm9wc1twcm9wS2V5XTtcblxuICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbGFzdFN0eWxlKSB7XG4gICAgICAgIGlmIChsYXN0U3R5bGUuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCB8fCBwcm9wS2V5ID09PSBDSElMRFJFTikgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gQVVUT0ZPQ1VTKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UuIElmIGFueSBsaXN0ZW5lciB1cGRhdGVzIHdlIG5lZWQgdG8gZW5zdXJlXG4gICAgICAvLyB0aGF0IHRoZSBcImN1cnJlbnRcIiBmaWJlciBwb2ludGVyIGdldHMgdXBkYXRlZCBzbyB3ZSBuZWVkIGEgY29tbWl0XG4gICAgICAvLyB0byB1cGRhdGUgdGhpcyBlbGVtZW50LlxuICAgICAgaWYgKCF1cGRhdGVQYXlsb2FkKSB7XG4gICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGFsbCBvdGhlciBkZWxldGVkIHByb3BlcnRpZXMgd2UgYWRkIGl0IHRvIHRoZSBxdWV1ZS4gV2UgdXNlXG4gICAgICAvLyB0aGUgYWxsb3dlZCBwcm9wZXJ0eSBsaXN0IGluIHRoZSBjb21taXQgcGhhc2UgaW5zdGVhZC5cbiAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCBudWxsKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHByb3BLZXkgaW4gbmV4dFByb3BzKSB7XG4gICAgdmFyIG5leHRQcm9wID0gbmV4dFByb3BzW3Byb3BLZXldO1xuICAgIHZhciBsYXN0UHJvcCA9IGxhc3RQcm9wcyAhPSBudWxsID8gbGFzdFByb3BzW3Byb3BLZXldIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbmV4dFByb3AgPT09IGxhc3RQcm9wIHx8IG5leHRQcm9wID09IG51bGwgJiYgbGFzdFByb3AgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICB7XG4gICAgICAgIGlmIChuZXh0UHJvcCkge1xuICAgICAgICAgIC8vIEZyZWV6ZSB0aGUgbmV4dCBzdHlsZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gYXNzdW1lIGl0IHdvbid0IGJlXG4gICAgICAgICAgLy8gbXV0YXRlZC4gV2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBmb3IgdGhpcyBpbiB0aGUgcGFzdC5cbiAgICAgICAgICBPYmplY3QuZnJlZXplKG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobGFzdFByb3ApIHtcbiAgICAgICAgLy8gVW5zZXQgc3R5bGVzIG9uIGBsYXN0UHJvcGAgYnV0IG5vdCBvbiBgbmV4dFByb3BgLlxuICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0UHJvcCkge1xuICAgICAgICAgIGlmIChsYXN0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmICghbmV4dFByb3AgfHwgIW5leHRQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpKSB7XG4gICAgICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVXBkYXRlIHN0eWxlcyB0aGF0IGNoYW5nZWQgc2luY2UgYGxhc3RQcm9wYC5cblxuXG4gICAgICAgIGZvciAoc3R5bGVOYW1lIGluIG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKG5leHRQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkgJiYgbGFzdFByb3Bbc3R5bGVOYW1lXSAhPT0gbmV4dFByb3Bbc3R5bGVOYW1lXSkge1xuICAgICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gbmV4dFByb3Bbc3R5bGVOYW1lXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlbGllcyBvbiBgdXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLlxuICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgIGlmICghdXBkYXRlUGF5bG9hZCkge1xuICAgICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQucHVzaChwcm9wS2V5LCBzdHlsZVVwZGF0ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGVVcGRhdGVzID0gbmV4dFByb3A7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgdmFyIG5leHRIdG1sID0gbmV4dFByb3AgPyBuZXh0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuICAgICAgdmFyIGxhc3RIdG1sID0gbGFzdFByb3AgPyBsYXN0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgICBpZiAobGFzdEh0bWwgIT09IG5leHRIdG1sKSB7XG4gICAgICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksIG5leHRIdG1sKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksICcnICsgbmV4dFByb3ApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIC8vIFdlIGVhZ2VybHkgbGlzdGVuIHRvIHRoaXMgZXZlbiB0aG91Z2ggd2UgaGF2ZW4ndCBjb21taXR0ZWQgeWV0LlxuICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykge1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdXBkYXRlUGF5bG9hZCAmJiBsYXN0UHJvcCAhPT0gbmV4dFByb3ApIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZS4gSWYgYW55IGxpc3RlbmVyIHVwZGF0ZXMgd2UgbmVlZCB0byBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCB0aGUgXCJjdXJyZW50XCIgcHJvcHMgcG9pbnRlciBnZXRzIHVwZGF0ZWQgc28gd2UgbmVlZCBhIGNvbW1pdFxuICAgICAgICAvLyB0byB1cGRhdGUgdGhpcyBlbGVtZW50LlxuICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBhbnkgb3RoZXIgcHJvcGVydHkgd2UgYWx3YXlzIGFkZCBpdCB0byB0aGUgcXVldWUgYW5kIHRoZW4gd2VcbiAgICAgIC8vIGZpbHRlciBpdCBvdXQgdXNpbmcgdGhlIGFsbG93ZWQgcHJvcGVydHkgbGlzdCBkdXJpbmcgdGhlIGNvbW1pdC5cbiAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0eWxlVXBkYXRlcykge1xuICAgIHtcbiAgICAgIHZhbGlkYXRlU2hvcnRoYW5kUHJvcGVydHlDb2xsaXNpb25JbkRldihzdHlsZVVwZGF0ZXMsIG5leHRQcm9wc1tTVFlMRV0pO1xuICAgIH1cblxuICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChTVFlMRSwgc3R5bGVVcGRhdGVzKTtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVQYXlsb2FkO1xufSAvLyBBcHBseSB0aGUgZGlmZi5cblxuZnVuY3Rpb24gdXBkYXRlUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB0YWcsIGxhc3RSYXdQcm9wcywgbmV4dFJhd1Byb3BzKSB7XG4gIC8vIFVwZGF0ZSBjaGVja2VkICpiZWZvcmUqIG5hbWUuXG4gIC8vIEluIHRoZSBtaWRkbGUgb2YgYW4gdXBkYXRlLCBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGNoZWNrZWQuXG4gIC8vIFdoZW4gYSBjaGVja2VkIHJhZGlvIHRyaWVzIHRvIGNoYW5nZSBuYW1lLCBicm93c2VyIG1ha2VzIGFub3RoZXIgcmFkaW8ncyBjaGVja2VkIGZhbHNlLlxuICBpZiAodGFnID09PSAnaW5wdXQnICYmIG5leHRSYXdQcm9wcy50eXBlID09PSAncmFkaW8nICYmIG5leHRSYXdQcm9wcy5uYW1lICE9IG51bGwpIHtcbiAgICB1cGRhdGVDaGVja2VkKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gIH1cblxuICB2YXIgd2FzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCBsYXN0UmF3UHJvcHMpO1xuICB2YXIgaXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIG5leHRSYXdQcm9wcyk7IC8vIEFwcGx5IHRoZSBkaWZmLlxuXG4gIHVwZGF0ZURPTVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgd2FzQ3VzdG9tQ29tcG9uZW50VGFnLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7IC8vIFRPRE86IEVuc3VyZSB0aGF0IGFuIHVwZGF0ZSBnZXRzIHNjaGVkdWxlZCBpZiBhbnkgb2YgdGhlIHNwZWNpYWwgcHJvcHNcbiAgLy8gY2hhbmdlZC5cblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFVwZGF0ZSB0aGUgd3JhcHBlciBhcm91bmQgaW5wdXRzICphZnRlciogdXBkYXRpbmcgcHJvcHMuIFRoaXMgaGFzIHRvXG4gICAgICAvLyBoYXBwZW4gYWZ0ZXIgYHVwZGF0ZURPTVByb3BlcnRpZXNgLiBPdGhlcndpc2UgSFRNTDUgaW5wdXQgdmFsaWRhdGlvbnNcbiAgICAgIC8vIHJhaXNlIHdhcm5pbmdzIGFuZCBwcmV2ZW50IHRoZSBuZXcgdmFsdWUgZnJvbSBiZWluZyBhc3NpZ25lZC5cbiAgICAgIHVwZGF0ZVdyYXBwZXIoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgdXBkYXRlV3JhcHBlciQxKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAvLyA8c2VsZWN0PiB2YWx1ZSB1cGRhdGUgbmVlZHMgdG8gb2NjdXIgYWZ0ZXIgPG9wdGlvbj4gY2hpbGRyZW5cbiAgICAgIC8vIHJlY29uY2lsaWF0aW9uXG4gICAgICBwb3N0VXBkYXRlV3JhcHBlcihkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UG9zc2libGVTdGFuZGFyZE5hbWUocHJvcE5hbWUpIHtcbiAge1xuICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IHByb3BOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAoIXBvc3NpYmxlU3RhbmRhcmROYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBwb3NzaWJsZVN0YW5kYXJkTmFtZXNbbG93ZXJDYXNlZE5hbWVdIHx8IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlmZkh5ZHJhdGVkUHJvcGVydGllcyhkb21FbGVtZW50LCB0YWcsIHJhd1Byb3BzLCBwYXJlbnROYW1lc3BhY2UsIHJvb3RDb250YWluZXJFbGVtZW50LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KSB7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZztcbiAgdmFyIGV4dHJhQXR0cmlidXRlTmFtZXM7XG5cbiAge1xuICAgIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCByYXdQcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0YWcsIHJhd1Byb3BzKTtcbiAgfSAvLyBUT0RPOiBNYWtlIHN1cmUgdGhhdCB3ZSBjaGVjayBpc01vdW50ZWQgYmVmb3JlIGZpcmluZyBhbnkgb2YgdGhlc2UgZXZlbnRzLlxuXG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2FuY2VsJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjbG9zZScsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnZW1iZWQnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGxvYWQgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICBjYXNlICdhdWRpbyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGFsbCB0aGUgbWVkaWEgZXZlbnRzLlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZWRpYUV2ZW50VHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChtZWRpYUV2ZW50VHlwZXNbaV0sIGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NvdXJjZSc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgZXJyb3IgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgZXJyb3IgYW5kIGxvYWQgZXZlbnRzLlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgdG9nZ2xlIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgndG9nZ2xlJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgdmFsaWRhdGVQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgcmF3UHJvcHMpO1xuXG4gIHtcbiAgICBleHRyYUF0dHJpYnV0ZU5hbWVzID0gbmV3IFNldCgpO1xuICAgIHZhciBhdHRyaWJ1dGVzID0gZG9tRWxlbWVudC5hdHRyaWJ1dGVzO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IGF0dHJpYnV0ZXNbX2ldLm5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgIC8vIENvbnRyb2xsZWQgYXR0cmlidXRlcyBhcmUgbm90IHZhbGlkYXRlZFxuICAgICAgICAvLyBUT0RPOiBPbmx5IGlnbm9yZSB0aGVtIG9uIGNvbnRyb2xsZWQgdGFncy5cbiAgICAgICAgY2FzZSAndmFsdWUnOlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2NoZWNrZWQnOlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkJzpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgdXNlIHRoZSBvcmlnaW5hbCBuYW1lLlxuICAgICAgICAgIC8vIFNlZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzEwNjc2LlxuICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuYWRkKGF0dHJpYnV0ZXNbX2ldLm5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciB1cGRhdGVQYXlsb2FkID0gbnVsbDtcblxuICBmb3IgKHZhciBwcm9wS2V5IGluIHJhd1Byb3BzKSB7XG4gICAgaWYgKCFyYXdQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIG5leHRQcm9wID0gcmF3UHJvcHNbcHJvcEtleV07XG5cbiAgICBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIC8vIEZvciB0ZXh0IGNvbnRlbnQgY2hpbGRyZW4gd2UgY29tcGFyZSBhZ2FpbnN0IHRleHRDb250ZW50LiBUaGlzXG4gICAgICAvLyBtaWdodCBtYXRjaCBhZGRpdGlvbmFsIEhUTUwgdGhhdCBpcyBoaWRkZW4gd2hlbiB3ZSByZWFkIGl0IHVzaW5nXG4gICAgICAvLyB0ZXh0Q29udGVudC4gRS5nLiBcImZvb1wiIHdpbGwgbWF0Y2ggXCJmPHNwYW4+b288L3NwYW4+XCIgYnV0IHRoYXQgc3RpbGxcbiAgICAgIC8vIHNhdGlzZmllcyBvdXIgcmVxdWlyZW1lbnQuIE91ciByZXF1aXJlbWVudCBpcyBub3QgdG8gcHJvZHVjZSBwZXJmZWN0XG4gICAgICAvLyBIVE1MIGFuZCBhdHRyaWJ1dGVzLiBJZGVhbGx5IHdlIHNob3VsZCBwcmVzZXJ2ZSBzdHJ1Y3R1cmUgYnV0IGl0J3NcbiAgICAgIC8vIG9rIG5vdCB0byBpZiB0aGUgdmlzaWJsZSBjb250ZW50IGlzIHN0aWxsIGVub3VnaCB0byBpbmRpY2F0ZSB3aGF0XG4gICAgICAvLyBldmVuIGxpc3RlbmVycyB0aGVzZSBub2RlcyBtaWdodCBiZSB3aXJlZCB1cCB0by5cbiAgICAgIC8vIFRPRE86IFdhcm4gaWYgdGhlcmUgaXMgbW9yZSB0aGFuIGEgc2luZ2xlIHRleHROb2RlIGFzIGEgY2hpbGQuXG4gICAgICAvLyBUT0RPOiBTaG91bGQgd2UgdXNlIGRvbUVsZW1lbnQuZmlyc3RDaGlsZC5ub2RlVmFsdWUgdG8gY29tcGFyZT9cbiAgICAgIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChkb21FbGVtZW50LnRleHRDb250ZW50ICE9PSBuZXh0UHJvcCkge1xuICAgICAgICAgIGlmIChyYXdQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklOR10gIT09IHRydWUpIHtcbiAgICAgICAgICAgIGNoZWNrRm9yVW5tYXRjaGVkVGV4dChkb21FbGVtZW50LnRleHRDb250ZW50LCBuZXh0UHJvcCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtDSElMRFJFTiwgbmV4dFByb3BdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQudGV4dENvbnRlbnQgIT09ICcnICsgbmV4dFByb3ApIHtcbiAgICAgICAgICBpZiAocmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBjaGVja0ZvclVubWF0Y2hlZFRleHQoZG9tRWxlbWVudC50ZXh0Q29udGVudCwgbmV4dFByb3AsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbQ0hJTERSRU4sICcnICsgbmV4dFByb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykge1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzaG91bGRXYXJuRGV2ICYmIHRydWUgJiYgLy8gQ29udmluY2UgRmxvdyB3ZSd2ZSBjYWxjdWxhdGVkIGl0IChpdCdzIERFVi1vbmx5IGluIHRoaXMgbWV0aG9kLilcbiAgICB0eXBlb2YgaXNDdXN0b21Db21wb25lbnRUYWcgPT09ICdib29sZWFuJykge1xuICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgcHJvcGVydGllcyBjb3JyZXNwb25kIHRvIHRoZWlyIGV4cGVjdGVkIHZhbHVlcy5cbiAgICAgIHZhciBzZXJ2ZXJWYWx1ZSA9IHZvaWQgMDtcbiAgICAgIHZhciBwcm9wZXJ0eUluZm8gPSBpc0N1c3RvbUNvbXBvbmVudFRhZyAmJiBlbmFibGVDdXN0b21FbGVtZW50UHJvcGVydHlTdXBwb3J0ID8gbnVsbCA6IGdldFByb3BlcnR5SW5mbyhwcm9wS2V5KTtcblxuICAgICAgaWYgKHJhd1Byb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSA9PT0gdHJ1ZSkgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcgfHwgLy8gQ29udHJvbGxlZCBhdHRyaWJ1dGVzIGFyZSBub3QgdmFsaWRhdGVkXG4gICAgICAvLyBUT0RPOiBPbmx5IGlnbm9yZSB0aGVtIG9uIGNvbnRyb2xsZWQgdGFncy5cbiAgICAgIHByb3BLZXkgPT09ICd2YWx1ZScgfHwgcHJvcEtleSA9PT0gJ2NoZWNrZWQnIHx8IHByb3BLZXkgPT09ICdzZWxlY3RlZCcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgICAgdmFyIHNlcnZlckhUTUwgPSBkb21FbGVtZW50LmlubmVySFRNTDtcbiAgICAgICAgdmFyIG5leHRIdG1sID0gbmV4dFByb3AgPyBuZXh0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIGV4cGVjdGVkSFRNTCA9IG5vcm1hbGl6ZUhUTUwoZG9tRWxlbWVudCwgbmV4dEh0bWwpO1xuXG4gICAgICAgICAgaWYgKGV4cGVjdGVkSFRNTCAhPT0gc2VydmVySFRNTCkge1xuICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlckhUTUwsIGV4cGVjdGVkSFRNTCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleSk7XG5cbiAgICAgICAgaWYgKGNhbkRpZmZTdHlsZUZvckh5ZHJhdGlvbldhcm5pbmcpIHtcbiAgICAgICAgICB2YXIgZXhwZWN0ZWRTdHlsZSA9IGNyZWF0ZURhbmdlcm91c1N0cmluZ0ZvclN0eWxlcyhuZXh0UHJvcCk7XG4gICAgICAgICAgc2VydmVyVmFsdWUgPSBkb21FbGVtZW50LmdldEF0dHJpYnV0ZSgnc3R5bGUnKTtcblxuICAgICAgICAgIGlmIChleHBlY3RlZFN0eWxlICE9PSBzZXJ2ZXJWYWx1ZSkge1xuICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlclZhbHVlLCBleHBlY3RlZFN0eWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcgJiYgIWVuYWJsZUN1c3RvbUVsZW1lbnRQcm9wZXJ0eVN1cHBvcnQpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGdldFZhbHVlRm9yQXR0cmlidXRlKGRvbUVsZW1lbnQsIHByb3BLZXksIG5leHRQcm9wKTtcblxuICAgICAgICBpZiAobmV4dFByb3AgIT09IHNlcnZlclZhbHVlKSB7XG4gICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlclZhbHVlLCBuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXNob3VsZElnbm9yZUF0dHJpYnV0ZShwcm9wS2V5LCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSAmJiAhc2hvdWxkUmVtb3ZlQXR0cmlidXRlKHByb3BLZXksIG5leHRQcm9wLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgICAgICB2YXIgaXNNaXNtYXRjaER1ZVRvQmFkQ2FzaW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZSk7XG4gICAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvclByb3BlcnR5KGRvbUVsZW1lbnQsIHByb3BLZXksIG5leHRQcm9wLCBwcm9wZXJ0eUluZm8pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBvd25OYW1lc3BhY2UgPSBwYXJlbnROYW1lc3BhY2U7XG5cbiAgICAgICAgICBpZiAob3duTmFtZXNwYWNlID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICAgICAgb3duTmFtZXNwYWNlID0gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHRhZyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG93bk5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZShwcm9wS2V5KTtcblxuICAgICAgICAgICAgaWYgKHN0YW5kYXJkTmFtZSAhPT0gbnVsbCAmJiBzdGFuZGFyZE5hbWUgIT09IHByb3BLZXkpIHtcbiAgICAgICAgICAgICAgLy8gSWYgYW4gU1ZHIHByb3AgaXMgc3VwcGxpZWQgd2l0aCBiYWQgY2FzaW5nLCBpdCB3aWxsXG4gICAgICAgICAgICAgIC8vIGJlIHN1Y2Nlc3NmdWxseSBwYXJzZWQgZnJvbSBIVE1MLCBidXQgd2lsbCBwcm9kdWNlIGEgbWlzbWF0Y2hcbiAgICAgICAgICAgICAgLy8gKGFuZCB3b3VsZCBiZSBpbmNvcnJlY3RseSByZW5kZXJlZCBvbiB0aGUgY2xpZW50KS5cbiAgICAgICAgICAgICAgLy8gSG93ZXZlciwgd2UgYWxyZWFkeSB3YXJuIGFib3V0IGJhZCBjYXNpbmcgZWxzZXdoZXJlLlxuICAgICAgICAgICAgICAvLyBTbyB3ZSdsbCBza2lwIHRoZSBtaXNsZWFkaW5nIGV4dHJhIG1pc21hdGNoIHdhcm5pbmcgaW4gdGhpcyBjYXNlLlxuICAgICAgICAgICAgICBpc01pc21hdGNoRHVlVG9CYWRDYXNpbmcgPSB0cnVlOyAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG5cbiAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUoc3RhbmRhcmROYW1lKTtcbiAgICAgICAgICAgIH0gLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuXG5cbiAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlcnZlclZhbHVlID0gZ2V0VmFsdWVGb3JBdHRyaWJ1dGUoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRvbnRXYXJuQ3VzdG9tRWxlbWVudCA9IGVuYWJsZUN1c3RvbUVsZW1lbnRQcm9wZXJ0eVN1cHBvcnQgIDtcblxuICAgICAgICBpZiAoIWRvbnRXYXJuQ3VzdG9tRWxlbWVudCAmJiBuZXh0UHJvcCAhPT0gc2VydmVyVmFsdWUgJiYgIWlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZykge1xuICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChzaG91bGRXYXJuRGV2KSB7XG4gICAgICBpZiAoIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuc2l6ZSA+IDAgJiYgcmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddICE9PSB0cnVlKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgd2FybkZvckV4dHJhQXR0cmlidXRlcyhleHRyYUF0dHJpYnV0ZU5hbWVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIoZG9tRWxlbWVudCwgcmF3UHJvcHMsIHRydWUpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDMoZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIC8vIEZvciBpbnB1dCBhbmQgdGV4dGFyZWEgd2UgY3VycmVudCBhbHdheXMgc2V0IHRoZSB2YWx1ZSBwcm9wZXJ0eSBhdFxuICAgICAgLy8gcG9zdCBtb3VudCB0byBmb3JjZSBpdCB0byBkaXZlcmdlIGZyb20gYXR0cmlidXRlcy4gSG93ZXZlciwgZm9yXG4gICAgICAvLyBvcHRpb24gYW5kIHNlbGVjdCB3ZSBkb24ndCBxdWl0ZSBkbyB0aGUgc2FtZSB0aGluZyBhbmQgc2VsZWN0XG4gICAgICAvLyBpcyBub3QgcmVzaWxpZW50IHRvIHRoZSBET00gc3RhdGUgY2hhbmdpbmcgc28gd2UgZG9uJ3QgZG8gdGhhdCBoZXJlLlxuICAgICAgLy8gVE9ETzogQ29uc2lkZXIgbm90IGRvaW5nIHRoaXMgZm9yIGlucHV0IGFuZCB0ZXh0YXJlYS5cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0eXBlb2YgcmF3UHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlUGF5bG9hZDtcbn1cbmZ1bmN0aW9uIGRpZmZIeWRyYXRlZFRleHQodGV4dE5vZGUsIHRleHQsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAgdmFyIGlzRGlmZmVyZW50ID0gdGV4dE5vZGUubm9kZVZhbHVlICE9PSB0ZXh0O1xuICByZXR1cm4gaXNEaWZmZXJlbnQ7XG59XG5mdW5jdGlvbiB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudE5vZGUsIGNoaWxkKSB7XG4gIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRGlkIG5vdCBleHBlY3Qgc2VydmVyIEhUTUwgdG8gY29udGFpbiBhIDwlcz4gaW4gPCVzPi4nLCBjaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudE5vZGUsIGNoaWxkKSB7XG4gIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRGlkIG5vdCBleHBlY3Qgc2VydmVyIEhUTUwgdG8gY29udGFpbiB0aGUgdGV4dCBub2RlIFwiJXNcIiBpbiA8JXM+LicsIGNoaWxkLm5vZGVWYWx1ZSwgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50KHBhcmVudE5vZGUsIHRhZywgcHJvcHMpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdFeHBlY3RlZCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIGEgbWF0Y2hpbmcgPCVzPiBpbiA8JXM+LicsIHRhZywgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudE5vZGUsIHRleHQpIHtcbiAge1xuICAgIGlmICh0ZXh0ID09PSAnJykge1xuICAgICAgLy8gV2UgZXhwZWN0IHRvIGluc2VydCBlbXB0eSB0ZXh0IG5vZGVzIHNpbmNlIHRoZXkncmUgbm90IHJlcHJlc2VudGVkIGluXG4gICAgICAvLyB0aGUgSFRNTC5cbiAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIHNwZWNpYWwgY2FzZSBpZiB3ZSBjYW4ganVzdCBhdm9pZCBpbnNlcnRpbmcgZW1wdHlcbiAgICAgIC8vIHRleHQgbm9kZXMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0V4cGVjdGVkIHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gYSBtYXRjaGluZyB0ZXh0IG5vZGUgZm9yIFwiJXNcIiBpbiA8JXM+LicsIHRleHQsIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMyhkb21FbGVtZW50LCB0YWcsIHByb3BzKSB7XG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZShkb21FbGVtZW50LCBwcm9wcyk7XG4gICAgICByZXR1cm47XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDIoZG9tRWxlbWVudCwgcHJvcHMpO1xuICAgICAgcmV0dXJuO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMShkb21FbGVtZW50LCBwcm9wcyk7XG4gICAgICByZXR1cm47XG4gIH1cbn1cblxudmFyIHZhbGlkYXRlRE9NTmVzdGluZyA9IGZ1bmN0aW9uICgpIHt9O1xuXG52YXIgdXBkYXRlZEFuY2VzdG9ySW5mbyA9IGZ1bmN0aW9uICgpIHt9O1xuXG57XG4gIC8vIFRoaXMgdmFsaWRhdGlvbiBjb2RlIHdhcyB3cml0dGVuIGJhc2VkIG9uIHRoZSBIVE1MNSBwYXJzaW5nIHNwZWM6XG4gIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLXNjb3BlXG4gIC8vXG4gIC8vIE5vdGU6IHRoaXMgZG9lcyBub3QgY2F0Y2ggYWxsIGludmFsaWQgbmVzdGluZywgbm9yIGRvZXMgaXQgdHJ5IHRvIChhcyBpdCdzXG4gIC8vIG5vdCBjbGVhciB3aGF0IHByYWN0aWNhbCBiZW5lZml0IGRvaW5nIHNvIHByb3ZpZGVzKTsgaW5zdGVhZCwgd2Ugd2FybiBvbmx5XG4gIC8vIGZvciBjYXNlcyB3aGVyZSB0aGUgcGFyc2VyIHdpbGwgZ2l2ZSBhIHBhcnNlIHRyZWUgZGlmZmVyaW5nIGZyb20gd2hhdCBSZWFjdFxuICAvLyBpbnRlbmRlZC4gRm9yIGV4YW1wbGUsIDxiPjxkaXY+PC9kaXY+PC9iPiBpcyBpbnZhbGlkIGJ1dCB3ZSBkb24ndCB3YXJuXG4gIC8vIGJlY2F1c2UgaXQgc3RpbGwgcGFyc2VzIGNvcnJlY3RseTsgd2UgZG8gd2FybiBmb3Igb3RoZXIgY2FzZXMgbGlrZSBuZXN0ZWRcbiAgLy8gPHA+IHRhZ3Mgd2hlcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Vjb25kIGVsZW1lbnQgaW1wbGljaXRseSBjbG9zZXMgdGhlXG4gIC8vIGZpcnN0LCBjYXVzaW5nIGEgY29uZnVzaW5nIG1lc3MuXG4gIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3NwZWNpYWxcbiAgdmFyIHNwZWNpYWxUYWdzID0gWydhZGRyZXNzJywgJ2FwcGxldCcsICdhcmVhJywgJ2FydGljbGUnLCAnYXNpZGUnLCAnYmFzZScsICdiYXNlZm9udCcsICdiZ3NvdW5kJywgJ2Jsb2NrcXVvdGUnLCAnYm9keScsICdicicsICdidXR0b24nLCAnY2FwdGlvbicsICdjZW50ZXInLCAnY29sJywgJ2NvbGdyb3VwJywgJ2RkJywgJ2RldGFpbHMnLCAnZGlyJywgJ2RpdicsICdkbCcsICdkdCcsICdlbWJlZCcsICdmaWVsZHNldCcsICdmaWdjYXB0aW9uJywgJ2ZpZ3VyZScsICdmb290ZXInLCAnZm9ybScsICdmcmFtZScsICdmcmFtZXNldCcsICdoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNicsICdoZWFkJywgJ2hlYWRlcicsICdoZ3JvdXAnLCAnaHInLCAnaHRtbCcsICdpZnJhbWUnLCAnaW1nJywgJ2lucHV0JywgJ2lzaW5kZXgnLCAnbGknLCAnbGluaycsICdsaXN0aW5nJywgJ21haW4nLCAnbWFycXVlZScsICdtZW51JywgJ21lbnVpdGVtJywgJ21ldGEnLCAnbmF2JywgJ25vZW1iZWQnLCAnbm9mcmFtZXMnLCAnbm9zY3JpcHQnLCAnb2JqZWN0JywgJ29sJywgJ3AnLCAncGFyYW0nLCAncGxhaW50ZXh0JywgJ3ByZScsICdzY3JpcHQnLCAnc2VjdGlvbicsICdzZWxlY3QnLCAnc291cmNlJywgJ3N0eWxlJywgJ3N1bW1hcnknLCAndGFibGUnLCAndGJvZHknLCAndGQnLCAndGVtcGxhdGUnLCAndGV4dGFyZWEnLCAndGZvb3QnLCAndGgnLCAndGhlYWQnLCAndGl0bGUnLCAndHInLCAndHJhY2snLCAndWwnLCAnd2JyJywgJ3htcCddOyAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMtYW4tZWxlbWVudC1pbi1zY29wZVxuXG4gIHZhciBpblNjb3BlVGFncyA9IFsnYXBwbGV0JywgJ2NhcHRpb24nLCAnaHRtbCcsICd0YWJsZScsICd0ZCcsICd0aCcsICdtYXJxdWVlJywgJ29iamVjdCcsICd0ZW1wbGF0ZScsIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2h0bWwtaW50ZWdyYXRpb24tcG9pbnRcbiAgLy8gVE9ETzogRGlzdGluZ3Vpc2ggYnkgbmFtZXNwYWNlIGhlcmUgLS0gZm9yIDx0aXRsZT4sIGluY2x1ZGluZyBpdCBoZXJlXG4gIC8vIGVycnMgb24gdGhlIHNpZGUgb2YgZmV3ZXIgd2FybmluZ3NcbiAgJ2ZvcmVpZ25PYmplY3QnLCAnZGVzYycsICd0aXRsZSddOyAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMtYW4tZWxlbWVudC1pbi1idXR0b24tc2NvcGVcblxuICB2YXIgYnV0dG9uU2NvcGVUYWdzID0gaW5TY29wZVRhZ3MuY29uY2F0KFsnYnV0dG9uJ10pOyAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNnZW5lcmF0ZS1pbXBsaWVkLWVuZC10YWdzXG5cbiAgdmFyIGltcGxpZWRFbmRUYWdzID0gWydkZCcsICdkdCcsICdsaScsICdvcHRpb24nLCAnb3B0Z3JvdXAnLCAncCcsICdycCcsICdydCddO1xuICB2YXIgZW1wdHlBbmNlc3RvckluZm8gPSB7XG4gICAgY3VycmVudDogbnVsbCxcbiAgICBmb3JtVGFnOiBudWxsLFxuICAgIGFUYWdJblNjb3BlOiBudWxsLFxuICAgIGJ1dHRvblRhZ0luU2NvcGU6IG51bGwsXG4gICAgbm9iclRhZ0luU2NvcGU6IG51bGwsXG4gICAgcFRhZ0luQnV0dG9uU2NvcGU6IG51bGwsXG4gICAgbGlzdEl0ZW1UYWdBdXRvY2xvc2luZzogbnVsbCxcbiAgICBkbEl0ZW1UYWdBdXRvY2xvc2luZzogbnVsbFxuICB9O1xuXG4gIHVwZGF0ZWRBbmNlc3RvckluZm8gPSBmdW5jdGlvbiAob2xkSW5mbywgdGFnKSB7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IGFzc2lnbih7fSwgb2xkSW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbyk7XG5cbiAgICB2YXIgaW5mbyA9IHtcbiAgICAgIHRhZzogdGFnXG4gICAgfTtcblxuICAgIGlmIChpblNjb3BlVGFncy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoYnV0dG9uU2NvcGVUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZSA9IG51bGw7XG4gICAgfSAvLyBTZWUgcnVsZXMgZm9yICdsaScsICdkZCcsICdkdCcgc3RhcnQgdGFncyBpblxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHlcblxuXG4gICAgaWYgKHNwZWNpYWxUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEgJiYgdGFnICE9PSAnYWRkcmVzcycgJiYgdGFnICE9PSAnZGl2JyAmJiB0YWcgIT09ICdwJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gbnVsbDtcbiAgICB9XG5cbiAgICBhbmNlc3RvckluZm8uY3VycmVudCA9IGluZm87XG5cbiAgICBpZiAodGFnID09PSAnZm9ybScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5mb3JtVGFnID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnYScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2J1dHRvbicpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnbm9icicpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ3AnKSB7XG4gICAgICBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdsaScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnZGQnIHx8IHRhZyA9PT0gJ2R0Jykge1xuICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICB9XG5cbiAgICByZXR1cm4gYW5jZXN0b3JJbmZvO1xuICB9O1xuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyXG4gICAqL1xuXG5cbiAgdmFyIGlzVGFnVmFsaWRXaXRoUGFyZW50ID0gZnVuY3Rpb24gKHRhZywgcGFyZW50VGFnKSB7XG4gICAgLy8gRmlyc3QsIGxldCdzIGNoZWNrIGlmIHdlJ3JlIGluIGFuIHVudXN1YWwgcGFyc2luZyBtb2RlLi4uXG4gICAgc3dpdGNoIChwYXJlbnRUYWcpIHtcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnNlbGVjdFxuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ29wdGlvbicgfHwgdGFnID09PSAnb3B0Z3JvdXAnIHx8IHRhZyA9PT0gJyN0ZXh0JztcblxuICAgICAgY2FzZSAnb3B0Z3JvdXAnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnb3B0aW9uJyB8fCB0YWcgPT09ICcjdGV4dCc7XG4gICAgICAvLyBTdHJpY3RseSBzcGVha2luZywgc2VlaW5nIGFuIDxvcHRpb24+IGRvZXNuJ3QgbWVhbiB3ZSdyZSBpbiBhIDxzZWxlY3Q+XG4gICAgICAvLyBidXRcblxuICAgICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJyN0ZXh0JztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRkXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5jYXB0aW9uXG4gICAgICAvLyBObyBzcGVjaWFsIGJlaGF2aW9yIHNpbmNlIHRoZXNlIHJ1bGVzIGZhbGwgYmFjayB0byBcImluIGJvZHlcIiBtb2RlIGZvclxuICAgICAgLy8gYWxsIGV4Y2VwdCBzcGVjaWFsIHRhYmxlIG5vZGVzIHdoaWNoIGNhdXNlIGJhZCBwYXJzaW5nIGJlaGF2aW9yIGFueXdheS5cbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRyXG5cbiAgICAgIGNhc2UgJ3RyJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ3RoJyB8fCB0YWcgPT09ICd0ZCcgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGJvZHlcblxuICAgICAgY2FzZSAndGJvZHknOlxuICAgICAgY2FzZSAndGhlYWQnOlxuICAgICAgY2FzZSAndGZvb3QnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAndHInIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmNvbGdyb3VwXG5cbiAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2NvbCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGFibGVcblxuICAgICAgY2FzZSAndGFibGUnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnY2FwdGlvbicgfHwgdGFnID09PSAnY29sZ3JvdXAnIHx8IHRhZyA9PT0gJ3Rib2R5JyB8fCB0YWcgPT09ICd0Zm9vdCcgfHwgdGFnID09PSAndGhlYWQnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmhlYWRcblxuICAgICAgY2FzZSAnaGVhZCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdiYXNlJyB8fCB0YWcgPT09ICdiYXNlZm9udCcgfHwgdGFnID09PSAnYmdzb3VuZCcgfHwgdGFnID09PSAnbGluaycgfHwgdGFnID09PSAnbWV0YScgfHwgdGFnID09PSAndGl0bGUnIHx8IHRhZyA9PT0gJ25vc2NyaXB0JyB8fCB0YWcgPT09ICdub2ZyYW1lcycgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VtYW50aWNzLmh0bWwjdGhlLWh0bWwtZWxlbWVudFxuXG4gICAgICBjYXNlICdodG1sJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2hlYWQnIHx8IHRhZyA9PT0gJ2JvZHknIHx8IHRhZyA9PT0gJ2ZyYW1lc2V0JztcblxuICAgICAgY2FzZSAnZnJhbWVzZXQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnZnJhbWUnO1xuXG4gICAgICBjYXNlICcjZG9jdW1lbnQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnaHRtbCc7XG4gICAgfSAvLyBQcm9iYWJseSBpbiB0aGUgXCJpbiBib2R5XCIgcGFyc2luZyBtb2RlLCBzbyB3ZSBvdXRsYXcgb25seSB0YWcgY29tYm9zXG4gICAgLy8gd2hlcmUgdGhlIHBhcnNpbmcgcnVsZXMgY2F1c2UgaW1wbGljaXQgb3BlbnMgb3IgY2xvc2VzIHRvIGJlIGFkZGVkLlxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHlcblxuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ2gxJzpcbiAgICAgIGNhc2UgJ2gyJzpcbiAgICAgIGNhc2UgJ2gzJzpcbiAgICAgIGNhc2UgJ2g0JzpcbiAgICAgIGNhc2UgJ2g1JzpcbiAgICAgIGNhc2UgJ2g2JzpcbiAgICAgICAgcmV0dXJuIHBhcmVudFRhZyAhPT0gJ2gxJyAmJiBwYXJlbnRUYWcgIT09ICdoMicgJiYgcGFyZW50VGFnICE9PSAnaDMnICYmIHBhcmVudFRhZyAhPT0gJ2g0JyAmJiBwYXJlbnRUYWcgIT09ICdoNScgJiYgcGFyZW50VGFnICE9PSAnaDYnO1xuXG4gICAgICBjYXNlICdycCc6XG4gICAgICBjYXNlICdydCc6XG4gICAgICAgIHJldHVybiBpbXBsaWVkRW5kVGFncy5pbmRleE9mKHBhcmVudFRhZykgPT09IC0xO1xuXG4gICAgICBjYXNlICdib2R5JzpcbiAgICAgIGNhc2UgJ2NhcHRpb24nOlxuICAgICAgY2FzZSAnY29sJzpcbiAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcbiAgICAgIGNhc2UgJ2ZyYW1lc2V0JzpcbiAgICAgIGNhc2UgJ2ZyYW1lJzpcbiAgICAgIGNhc2UgJ2hlYWQnOlxuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICBjYXNlICd0Ym9keSc6XG4gICAgICBjYXNlICd0ZCc6XG4gICAgICBjYXNlICd0Zm9vdCc6XG4gICAgICBjYXNlICd0aCc6XG4gICAgICBjYXNlICd0aGVhZCc6XG4gICAgICBjYXNlICd0cic6XG4gICAgICAgIC8vIFRoZXNlIHRhZ3MgYXJlIG9ubHkgdmFsaWQgd2l0aCBhIGZldyBwYXJlbnRzIHRoYXQgaGF2ZSBzcGVjaWFsIGNoaWxkXG4gICAgICAgIC8vIHBhcnNpbmcgcnVsZXMgLS0gaWYgd2UncmUgZG93biBoZXJlLCB0aGVuIG5vbmUgb2YgdGhvc2UgbWF0Y2hlZCBhbmRcbiAgICAgICAgLy8gc28gd2UgYWxsb3cgaXQgb25seSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIHBhcmVudCBpcywgYXMgYWxsIG90aGVyXG4gICAgICAgIC8vIGNhc2VzIGFyZSBpbnZhbGlkLlxuICAgICAgICByZXR1cm4gcGFyZW50VGFnID09IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXJcbiAgICovXG5cblxuICB2YXIgZmluZEludmFsaWRBbmNlc3RvckZvclRhZyA9IGZ1bmN0aW9uICh0YWcsIGFuY2VzdG9ySW5mbykge1xuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdhZGRyZXNzJzpcbiAgICAgIGNhc2UgJ2FydGljbGUnOlxuICAgICAgY2FzZSAnYXNpZGUnOlxuICAgICAgY2FzZSAnYmxvY2txdW90ZSc6XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgY2FzZSAnZGlyJzpcbiAgICAgIGNhc2UgJ2Rpdic6XG4gICAgICBjYXNlICdkbCc6XG4gICAgICBjYXNlICdmaWVsZHNldCc6XG4gICAgICBjYXNlICdmaWdjYXB0aW9uJzpcbiAgICAgIGNhc2UgJ2ZpZ3VyZSc6XG4gICAgICBjYXNlICdmb290ZXInOlxuICAgICAgY2FzZSAnaGVhZGVyJzpcbiAgICAgIGNhc2UgJ2hncm91cCc6XG4gICAgICBjYXNlICdtYWluJzpcbiAgICAgIGNhc2UgJ21lbnUnOlxuICAgICAgY2FzZSAnbmF2JzpcbiAgICAgIGNhc2UgJ29sJzpcbiAgICAgIGNhc2UgJ3AnOlxuICAgICAgY2FzZSAnc2VjdGlvbic6XG4gICAgICBjYXNlICdzdW1tYXJ5JzpcbiAgICAgIGNhc2UgJ3VsJzpcbiAgICAgIGNhc2UgJ3ByZSc6XG4gICAgICBjYXNlICdsaXN0aW5nJzpcbiAgICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgIGNhc2UgJ2hyJzpcbiAgICAgIGNhc2UgJ3htcCc6XG4gICAgICBjYXNlICdoMSc6XG4gICAgICBjYXNlICdoMic6XG4gICAgICBjYXNlICdoMyc6XG4gICAgICBjYXNlICdoNCc6XG4gICAgICBjYXNlICdoNSc6XG4gICAgICBjYXNlICdoNic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2Zvcm0nOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmZvcm1UYWcgfHwgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlO1xuXG4gICAgICBjYXNlICdsaSc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZztcblxuICAgICAgY2FzZSAnZGQnOlxuICAgICAgY2FzZSAnZHQnOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nO1xuXG4gICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2EnOlxuICAgICAgICAvLyBTcGVjIHNheXMgc29tZXRoaW5nIGFib3V0IHN0b3JpbmcgYSBsaXN0IG9mIG1hcmtlcnMsIGJ1dCBpdCBzb3VuZHNcbiAgICAgICAgLy8gZXF1aXZhbGVudCB0byB0aGlzIGNoZWNrLlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlO1xuXG4gICAgICBjYXNlICdub2JyJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICB2YXIgZGlkV2FybiQxID0ge307XG5cbiAgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKGNoaWxkVGFnLCBjaGlsZFRleHQsIGFuY2VzdG9ySW5mbykge1xuICAgIGFuY2VzdG9ySW5mbyA9IGFuY2VzdG9ySW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbztcbiAgICB2YXIgcGFyZW50SW5mbyA9IGFuY2VzdG9ySW5mby5jdXJyZW50O1xuICAgIHZhciBwYXJlbnRUYWcgPSBwYXJlbnRJbmZvICYmIHBhcmVudEluZm8udGFnO1xuXG4gICAgaWYgKGNoaWxkVGV4dCAhPSBudWxsKSB7XG4gICAgICBpZiAoY2hpbGRUYWcgIT0gbnVsbCkge1xuICAgICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nOiB3aGVuIGNoaWxkVGV4dCBpcyBwYXNzZWQsIGNoaWxkVGFnIHNob3VsZCBiZSBudWxsJyk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkVGFnID0gJyN0ZXh0JztcbiAgICB9XG5cbiAgICB2YXIgaW52YWxpZFBhcmVudCA9IGlzVGFnVmFsaWRXaXRoUGFyZW50KGNoaWxkVGFnLCBwYXJlbnRUYWcpID8gbnVsbCA6IHBhcmVudEluZm87XG4gICAgdmFyIGludmFsaWRBbmNlc3RvciA9IGludmFsaWRQYXJlbnQgPyBudWxsIDogZmluZEludmFsaWRBbmNlc3RvckZvclRhZyhjaGlsZFRhZywgYW5jZXN0b3JJbmZvKTtcbiAgICB2YXIgaW52YWxpZFBhcmVudE9yQW5jZXN0b3IgPSBpbnZhbGlkUGFyZW50IHx8IGludmFsaWRBbmNlc3RvcjtcblxuICAgIGlmICghaW52YWxpZFBhcmVudE9yQW5jZXN0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYW5jZXN0b3JUYWcgPSBpbnZhbGlkUGFyZW50T3JBbmNlc3Rvci50YWc7XG4gICAgdmFyIHdhcm5LZXkgPSAhIWludmFsaWRQYXJlbnQgKyAnfCcgKyBjaGlsZFRhZyArICd8JyArIGFuY2VzdG9yVGFnO1xuXG4gICAgaWYgKGRpZFdhcm4kMVt3YXJuS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm4kMVt3YXJuS2V5XSA9IHRydWU7XG4gICAgdmFyIHRhZ0Rpc3BsYXlOYW1lID0gY2hpbGRUYWc7XG4gICAgdmFyIHdoaXRlc3BhY2VJbmZvID0gJyc7XG5cbiAgICBpZiAoY2hpbGRUYWcgPT09ICcjdGV4dCcpIHtcbiAgICAgIGlmICgvXFxTLy50ZXN0KGNoaWxkVGV4dCkpIHtcbiAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnVGV4dCBub2Rlcyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YWdEaXNwbGF5TmFtZSA9ICdXaGl0ZXNwYWNlIHRleHQgbm9kZXMnO1xuICAgICAgICB3aGl0ZXNwYWNlSW5mbyA9IFwiIE1ha2Ugc3VyZSB5b3UgZG9uJ3QgaGF2ZSBhbnkgZXh0cmEgd2hpdGVzcGFjZSBiZXR3ZWVuIHRhZ3Mgb24gXCIgKyAnZWFjaCBsaW5lIG9mIHlvdXIgc291cmNlIGNvZGUuJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGFnRGlzcGxheU5hbWUgPSAnPCcgKyBjaGlsZFRhZyArICc+JztcbiAgICB9XG5cbiAgICBpZiAoaW52YWxpZFBhcmVudCkge1xuICAgICAgdmFyIGluZm8gPSAnJztcblxuICAgICAgaWYgKGFuY2VzdG9yVGFnID09PSAndGFibGUnICYmIGNoaWxkVGFnID09PSAndHInKSB7XG4gICAgICAgIGluZm8gKz0gJyBBZGQgYSA8dGJvZHk+LCA8dGhlYWQ+IG9yIDx0Zm9vdD4gdG8geW91ciBjb2RlIHRvIG1hdGNoIHRoZSBET00gdHJlZSBnZW5lcmF0ZWQgYnkgJyArICd0aGUgYnJvd3Nlci4nO1xuICAgICAgfVxuXG4gICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nKC4uLik6ICVzIGNhbm5vdCBhcHBlYXIgYXMgYSBjaGlsZCBvZiA8JXM+LiVzJXMnLCB0YWdEaXNwbGF5TmFtZSwgYW5jZXN0b3JUYWcsIHdoaXRlc3BhY2VJbmZvLCBpbmZvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3IoJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgZGVzY2VuZGFudCBvZiAnICsgJzwlcz4uJywgdGFnRGlzcGxheU5hbWUsIGFuY2VzdG9yVGFnKTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxID0gJ3N1cHByZXNzSHlkcmF0aW9uV2FybmluZyc7XG52YXIgU1VTUEVOU0VfU1RBUlRfREFUQSA9ICckJztcbnZhciBTVVNQRU5TRV9FTkRfREFUQSA9ICcvJCc7XG52YXIgU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBID0gJyQ/JztcbnZhciBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBID0gJyQhJztcbnZhciBTVFlMRSQxID0gJ3N0eWxlJztcbnZhciBldmVudHNFbmFibGVkID0gbnVsbDtcbnZhciBzZWxlY3Rpb25JbmZvcm1hdGlvbiA9IG51bGw7XG5mdW5jdGlvbiBnZXRSb290SG9zdENvbnRleHQocm9vdENvbnRhaW5lckluc3RhbmNlKSB7XG4gIHZhciB0eXBlO1xuICB2YXIgbmFtZXNwYWNlO1xuICB2YXIgbm9kZVR5cGUgPSByb290Q29udGFpbmVySW5zdGFuY2Uubm9kZVR5cGU7XG5cbiAgc3dpdGNoIChub2RlVHlwZSkge1xuICAgIGNhc2UgRE9DVU1FTlRfTk9ERTpcbiAgICBjYXNlIERPQ1VNRU5UX0ZSQUdNRU5UX05PREU6XG4gICAgICB7XG4gICAgICAgIHR5cGUgPSBub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/ICcjZG9jdW1lbnQnIDogJyNmcmFnbWVudCc7XG4gICAgICAgIHZhciByb290ID0gcm9vdENvbnRhaW5lckluc3RhbmNlLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgbmFtZXNwYWNlID0gcm9vdCA/IHJvb3QubmFtZXNwYWNlVVJJIDogZ2V0Q2hpbGROYW1lc3BhY2UobnVsbCwgJycpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHZhciBjb250YWluZXIgPSBub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gcm9vdENvbnRhaW5lckluc3RhbmNlLnBhcmVudE5vZGUgOiByb290Q29udGFpbmVySW5zdGFuY2U7XG4gICAgICAgIHZhciBvd25OYW1lc3BhY2UgPSBjb250YWluZXIubmFtZXNwYWNlVVJJIHx8IG51bGw7XG4gICAgICAgIHR5cGUgPSBjb250YWluZXIudGFnTmFtZTtcbiAgICAgICAgbmFtZXNwYWNlID0gZ2V0Q2hpbGROYW1lc3BhY2Uob3duTmFtZXNwYWNlLCB0eXBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cblxuICB7XG4gICAgdmFyIHZhbGlkYXRlZFRhZyA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgYW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhudWxsLCB2YWxpZGF0ZWRUYWcpO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZSxcbiAgICAgIGFuY2VzdG9ySW5mbzogYW5jZXN0b3JJbmZvXG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0Q2hpbGRIb3N0Q29udGV4dChwYXJlbnRIb3N0Q29udGV4dCwgdHlwZSwgcm9vdENvbnRhaW5lckluc3RhbmNlKSB7XG4gIHtcbiAgICB2YXIgcGFyZW50SG9zdENvbnRleHREZXYgPSBwYXJlbnRIb3N0Q29udGV4dDtcbiAgICB2YXIgbmFtZXNwYWNlID0gZ2V0Q2hpbGROYW1lc3BhY2UocGFyZW50SG9zdENvbnRleHREZXYubmFtZXNwYWNlLCB0eXBlKTtcbiAgICB2YXIgYW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhwYXJlbnRIb3N0Q29udGV4dERldi5hbmNlc3RvckluZm8sIHR5cGUpO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZSxcbiAgICAgIGFuY2VzdG9ySW5mbzogYW5jZXN0b3JJbmZvXG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0UHVibGljSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gcHJlcGFyZUZvckNvbW1pdChjb250YWluZXJJbmZvKSB7XG4gIGV2ZW50c0VuYWJsZWQgPSBpc0VuYWJsZWQoKTtcbiAgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBnZXRTZWxlY3Rpb25JbmZvcm1hdGlvbigpO1xuICB2YXIgYWN0aXZlSW5zdGFuY2UgPSBudWxsO1xuXG4gIHNldEVuYWJsZWQoZmFsc2UpO1xuICByZXR1cm4gYWN0aXZlSW5zdGFuY2U7XG59XG5mdW5jdGlvbiByZXNldEFmdGVyQ29tbWl0KGNvbnRhaW5lckluZm8pIHtcbiAgcmVzdG9yZVNlbGVjdGlvbihzZWxlY3Rpb25JbmZvcm1hdGlvbik7XG4gIHNldEVuYWJsZWQoZXZlbnRzRW5hYmxlZCk7XG4gIGV2ZW50c0VuYWJsZWQgPSBudWxsO1xuICBzZWxlY3Rpb25JbmZvcm1hdGlvbiA9IG51bGw7XG59XG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZSh0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICB2YXIgcGFyZW50TmFtZXNwYWNlO1xuXG4gIHtcbiAgICAvLyBUT0RPOiB0YWtlIG5hbWVzcGFjZSBpbnRvIGFjY291bnQgd2hlbiB2YWxpZGF0aW5nLlxuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuICAgIHZhbGlkYXRlRE9NTmVzdGluZyh0eXBlLCBudWxsLCBob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8pO1xuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJykge1xuICAgICAgdmFyIHN0cmluZyA9ICcnICsgcHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgb3duQW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8sIHR5cGUpO1xuICAgICAgdmFsaWRhdGVET01OZXN0aW5nKG51bGwsIHN0cmluZywgb3duQW5jZXN0b3JJbmZvKTtcbiAgICB9XG5cbiAgICBwYXJlbnROYW1lc3BhY2UgPSBob3N0Q29udGV4dERldi5uYW1lc3BhY2U7XG4gIH1cblxuICB2YXIgZG9tRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgcGFyZW50TmFtZXNwYWNlKTtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgZG9tRWxlbWVudCk7XG4gIHVwZGF0ZUZpYmVyUHJvcHMoZG9tRWxlbWVudCwgcHJvcHMpO1xuICByZXR1cm4gZG9tRWxlbWVudDtcbn1cbmZ1bmN0aW9uIGFwcGVuZEluaXRpYWxDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UuYXBwZW5kQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gZmluYWxpemVJbml0aWFsQ2hpbGRyZW4oZG9tRWxlbWVudCwgdHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQpIHtcbiAgc2V0SW5pdGlhbFByb3BlcnRpZXMoZG9tRWxlbWVudCwgdHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnYnV0dG9uJzpcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICByZXR1cm4gISFwcm9wcy5hdXRvRm9jdXM7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBwcmVwYXJlVXBkYXRlKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCkge1xuICB7XG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG5cbiAgICBpZiAodHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuICE9PSB0eXBlb2Ygb2xkUHJvcHMuY2hpbGRyZW4gJiYgKHR5cGVvZiBuZXdQcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJykpIHtcbiAgICAgIHZhciBzdHJpbmcgPSAnJyArIG5ld1Byb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIG93bkFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8oaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBzdHJpbmcsIG93bkFuY2VzdG9ySW5mbyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpZmZQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcyk7XG59XG5mdW5jdGlvbiBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBwcm9wcykge1xuICByZXR1cm4gdHlwZSA9PT0gJ3RleHRhcmVhJyB8fCB0eXBlID09PSAnbm9zY3JpcHQnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPT09ICdvYmplY3QnICYmIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9PSBudWxsICYmIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbCAhPSBudWxsO1xufVxuZnVuY3Rpb24gY3JlYXRlVGV4dEluc3RhbmNlKHRleHQsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAge1xuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCB0ZXh0LCBob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8pO1xuICB9XG5cbiAgdmFyIHRleHROb2RlID0gY3JlYXRlVGV4dE5vZGUodGV4dCwgcm9vdENvbnRhaW5lckluc3RhbmNlKTtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgdGV4dE5vZGUpO1xuICByZXR1cm4gdGV4dE5vZGU7XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50RXZlbnRQcmlvcml0eSgpIHtcbiAgdmFyIGN1cnJlbnRFdmVudCA9IHdpbmRvdy5ldmVudDtcblxuICBpZiAoY3VycmVudEV2ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gIH1cblxuICByZXR1cm4gZ2V0RXZlbnRQcmlvcml0eShjdXJyZW50RXZlbnQudHlwZSk7XG59XG4vLyBpZiBhIGNvbXBvbmVudCBqdXN0IGltcG9ydHMgUmVhY3RET00gKGUuZy4gZm9yIGZpbmRET01Ob2RlKS5cbi8vIFNvbWUgZW52aXJvbm1lbnRzIG1pZ2h0IG5vdCBoYXZlIHNldFRpbWVvdXQgb3IgY2xlYXJUaW1lb3V0LlxuXG52YXIgc2NoZWR1bGVUaW1lb3V0ID0gdHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBzZXRUaW1lb3V0IDogdW5kZWZpbmVkO1xudmFyIGNhbmNlbFRpbWVvdXQgPSB0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gY2xlYXJUaW1lb3V0IDogdW5kZWZpbmVkO1xudmFyIG5vVGltZW91dCA9IC0xO1xudmFyIGxvY2FsUHJvbWlzZSA9IHR5cGVvZiBQcm9taXNlID09PSAnZnVuY3Rpb24nID8gUHJvbWlzZSA6IHVuZGVmaW5lZDsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIHNjaGVkdWxlTWljcm90YXNrID0gdHlwZW9mIHF1ZXVlTWljcm90YXNrID09PSAnZnVuY3Rpb24nID8gcXVldWVNaWNyb3Rhc2sgOiB0eXBlb2YgbG9jYWxQcm9taXNlICE9PSAndW5kZWZpbmVkJyA/IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICByZXR1cm4gbG9jYWxQcm9taXNlLnJlc29sdmUobnVsbCkudGhlbihjYWxsYmFjaykuY2F0Y2goaGFuZGxlRXJyb3JJbk5leHRUaWNrKTtcbn0gOiBzY2hlZHVsZVRpbWVvdXQ7IC8vIFRPRE86IERldGVybWluZSB0aGUgYmVzdCBmYWxsYmFjayBoZXJlLlxuXG5mdW5jdGlvbiBoYW5kbGVFcnJvckluTmV4dFRpY2soZXJyb3IpIHtcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0pO1xufSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBjb21taXRNb3VudChkb21FbGVtZW50LCB0eXBlLCBuZXdQcm9wcywgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICAvLyBEZXNwaXRlIHRoZSBuYW1pbmcgdGhhdCBtaWdodCBpbXBseSBvdGhlcndpc2UsIHRoaXMgbWV0aG9kIG9ubHlcbiAgLy8gZmlyZXMgaWYgdGhlcmUgaXMgYW4gYFVwZGF0ZWAgZWZmZWN0IHNjaGVkdWxlZCBkdXJpbmcgbW91bnRpbmcuXG4gIC8vIFRoaXMgaGFwcGVucyBpZiBgZmluYWxpemVJbml0aWFsQ2hpbGRyZW5gIHJldHVybnMgYHRydWVgICh3aGljaCBpdFxuICAvLyBkb2VzIHRvIGltcGxlbWVudCB0aGUgYGF1dG9Gb2N1c2AgYXR0cmlidXRlIG9uIHRoZSBjbGllbnQpLiBCdXRcbiAgLy8gdGhlcmUgYXJlIGFsc28gb3RoZXIgY2FzZXMgd2hlbiB0aGlzIG1pZ2h0IGhhcHBlbiAoc3VjaCBhcyBwYXRjaGluZ1xuICAvLyB1cCB0ZXh0IGNvbnRlbnQgZHVyaW5nIGh5ZHJhdGlvbiBtaXNtYXRjaCkuIFNvIHdlJ2xsIGNoZWNrIHRoaXMgYWdhaW4uXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaWYgKG5ld1Byb3BzLmF1dG9Gb2N1cykge1xuICAgICAgICBkb21FbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcblxuICAgIGNhc2UgJ2ltZyc6XG4gICAgICB7XG4gICAgICAgIGlmIChuZXdQcm9wcy5zcmMpIHtcbiAgICAgICAgICBkb21FbGVtZW50LnNyYyA9IG5ld1Byb3BzLnNyYztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY29tbWl0VXBkYXRlKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICAvLyBBcHBseSB0aGUgZGlmZiB0byB0aGUgRE9NIG5vZGUuXG4gIHVwZGF0ZVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzKTsgLy8gVXBkYXRlIHRoZSBwcm9wcyBoYW5kbGUgc28gdGhhdCB3ZSBrbm93IHdoaWNoIHByb3BzIGFyZSB0aGUgb25lcyB3aXRoXG4gIC8vIHdpdGggY3VycmVudCBldmVudCBoYW5kbGVycy5cblxuICB1cGRhdGVGaWJlclByb3BzKGRvbUVsZW1lbnQsIG5ld1Byb3BzKTtcbn1cbmZ1bmN0aW9uIHJlc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCkge1xuICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCAnJyk7XG59XG5mdW5jdGlvbiBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gbmV3VGV4dDtcbn1cbmZ1bmN0aW9uIGFwcGVuZENoaWxkKHBhcmVudEluc3RhbmNlLCBjaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5hcHBlbmRDaGlsZChjaGlsZCk7XG59XG5mdW5jdGlvbiBhcHBlbmRDaGlsZFRvQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHtcbiAgdmFyIHBhcmVudE5vZGU7XG5cbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgcGFyZW50Tm9kZSA9IGNvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBjb250YWluZXIpO1xuICB9IGVsc2Uge1xuICAgIHBhcmVudE5vZGUgPSBjb250YWluZXI7XG4gICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gIH0gLy8gVGhpcyBjb250YWluZXIgbWlnaHQgYmUgdXNlZCBmb3IgYSBwb3J0YWwuXG4gIC8vIElmIHNvbWV0aGluZyBpbnNpZGUgYSBwb3J0YWwgaXMgY2xpY2tlZCwgdGhhdCBjbGljayBzaG91bGQgYnViYmxlXG4gIC8vIHRocm91Z2ggdGhlIFJlYWN0IHRyZWUuIEhvd2V2ZXIsIG9uIE1vYmlsZSBTYWZhcmkgdGhlIGNsaWNrIHdvdWxkXG4gIC8vIG5ldmVyIGJ1YmJsZSB0aHJvdWdoIHRoZSAqRE9NKiB0cmVlIHVubGVzcyBhbiBhbmNlc3RvciB3aXRoIG9uY2xpY2tcbiAgLy8gZXZlbnQgZXhpc3RzLiBTbyB3ZSB3b3VsZG4ndCBzZWUgaXQgYW5kIGRpc3BhdGNoIGl0LlxuICAvLyBUaGlzIGlzIHdoeSB3ZSBlbnN1cmUgdGhhdCBub24gUmVhY3Qgcm9vdCBjb250YWluZXJzIGhhdmUgaW5saW5lIG9uY2xpY2tcbiAgLy8gZGVmaW5lZC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTkxOFxuXG5cbiAgdmFyIHJlYWN0Um9vdENvbnRhaW5lciA9IGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyO1xuXG4gIGlmICgocmVhY3RSb290Q29udGFpbmVyID09PSBudWxsIHx8IHJlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSAmJiBwYXJlbnROb2RlLm9uY2xpY2sgPT09IG51bGwpIHtcbiAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KHBhcmVudE5vZGUpO1xuICB9XG59XG5mdW5jdGlvbiBpbnNlcnRCZWZvcmUocGFyZW50SW5zdGFuY2UsIGNoaWxkLCBiZWZvcmVDaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbn1cbmZ1bmN0aW9uIGluc2VydEluQ29udGFpbmVyQmVmb3JlKGNvbnRhaW5lciwgY2hpbGQsIGJlZm9yZUNoaWxkKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIGNvbnRhaW5lci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlQ2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGRGcm9tQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjaGlsZCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNsZWFyU3VzcGVuc2VCb3VuZGFyeShwYXJlbnRJbnN0YW5jZSwgc3VzcGVuc2VJbnN0YW5jZSkge1xuICB2YXIgbm9kZSA9IHN1c3BlbnNlSW5zdGFuY2U7IC8vIERlbGV0ZSBhbGwgbm9kZXMgd2l0aGluIHRoaXMgc3VzcGVuc2UgYm91bmRhcnkuXG4gIC8vIFRoZXJlIG1pZ2h0IGJlIG5lc3RlZCBub2RlcyBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaG93XG4gIC8vIGRlZXAgd2UgYXJlIGFuZCBvbmx5IGJyZWFrIG91dCB3aGVuIHdlJ3JlIGJhY2sgb24gdG9wLlxuXG4gIHZhciBkZXB0aCA9IDA7XG5cbiAgZG8ge1xuICAgIHZhciBuZXh0Tm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQobm9kZSk7XG5cbiAgICBpZiAobmV4dE5vZGUgJiYgbmV4dE5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGRhdGEgPSBuZXh0Tm9kZS5kYXRhO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQobmV4dE5vZGUpOyAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG5cbiAgICAgICAgICByZXRyeUlmQmxvY2tlZE9uKHN1c3BlbnNlSW5zdGFuY2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0gbmV4dE5vZGU7XG4gIH0gd2hpbGUgKG5vZGUpOyAvLyBUT0RPOiBXYXJuLCB3ZSBkaWRuJ3QgZmluZCB0aGUgZW5kIGNvbW1lbnQgYm91bmRhcnkuXG4gIC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cblxuXG4gIHJldHJ5SWZCbG9ja2VkT24oc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBjbGVhclN1c3BlbnNlQm91bmRhcnlGcm9tQ29udGFpbmVyKGNvbnRhaW5lciwgc3VzcGVuc2VJbnN0YW5jZSkge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICBjbGVhclN1c3BlbnNlQm91bmRhcnkoY29udGFpbmVyLnBhcmVudE5vZGUsIHN1c3BlbnNlSW5zdGFuY2UpO1xuICB9IGVsc2UgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KGNvbnRhaW5lciwgc3VzcGVuc2VJbnN0YW5jZSk7XG4gIH0gLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuXG5cbiAgcmV0cnlJZkJsb2NrZWRPbihjb250YWluZXIpO1xufVxuZnVuY3Rpb24gaGlkZUluc3RhbmNlKGluc3RhbmNlKSB7XG4gIC8vIFRPRE86IERvZXMgdGhpcyB3b3JrIGZvciBhbGwgZWxlbWVudCB0eXBlcz8gV2hhdCBhYm91dCBNYXRoTUw/IFNob3VsZCB3ZVxuICAvLyBwYXNzIGhvc3QgY29udGV4dCB0byB0aGlzIG1ldGhvZD9cbiAgaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgdmFyIHN0eWxlID0gaW5zdGFuY2Uuc3R5bGU7XG5cbiAgaWYgKHR5cGVvZiBzdHlsZS5zZXRQcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywgJ25vbmUnLCAnaW1wb3J0YW50Jyk7XG4gIH0gZWxzZSB7XG4gICAgc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxufVxuZnVuY3Rpb24gaGlkZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UpIHtcbiAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9ICcnO1xufVxuZnVuY3Rpb24gdW5oaWRlSW5zdGFuY2UoaW5zdGFuY2UsIHByb3BzKSB7XG4gIGluc3RhbmNlID0gaW5zdGFuY2U7XG4gIHZhciBzdHlsZVByb3AgPSBwcm9wc1tTVFlMRSQxXTtcbiAgdmFyIGRpc3BsYXkgPSBzdHlsZVByb3AgIT09IHVuZGVmaW5lZCAmJiBzdHlsZVByb3AgIT09IG51bGwgJiYgc3R5bGVQcm9wLmhhc093blByb3BlcnR5KCdkaXNwbGF5JykgPyBzdHlsZVByb3AuZGlzcGxheSA6IG51bGw7XG4gIGluc3RhbmNlLnN0eWxlLmRpc3BsYXkgPSBkYW5nZXJvdXNTdHlsZVZhbHVlKCdkaXNwbGF5JywgZGlzcGxheSk7XG59XG5mdW5jdGlvbiB1bmhpZGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlLCB0ZXh0KSB7XG4gIHRleHRJbnN0YW5jZS5ub2RlVmFsdWUgPSB0ZXh0O1xufVxuZnVuY3Rpb24gY2xlYXJDb250YWluZXIoY29udGFpbmVyKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgIGNvbnRhaW5lci50ZXh0Q29udGVudCA9ICcnO1xuICB9IGVsc2UgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSkge1xuICAgIGlmIChjb250YWluZXIuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY29udGFpbmVyLmRvY3VtZW50RWxlbWVudCk7XG4gICAgfVxuICB9XG59IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGNhbkh5ZHJhdGVJbnN0YW5jZShpbnN0YW5jZSwgdHlwZSwgcHJvcHMpIHtcbiAgaWYgKGluc3RhbmNlLm5vZGVUeXBlICE9PSBFTEVNRU5UX05PREUgfHwgdHlwZS50b0xvd2VyQ2FzZSgpICE9PSBpbnN0YW5jZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gVGhpcyBoYXMgbm93IGJlZW4gcmVmaW5lZCB0byBhbiBlbGVtZW50IG5vZGUuXG5cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBjYW5IeWRyYXRlVGV4dEluc3RhbmNlKGluc3RhbmNlLCB0ZXh0KSB7XG4gIGlmICh0ZXh0ID09PSAnJyB8fCBpbnN0YW5jZS5ub2RlVHlwZSAhPT0gVEVYVF9OT0RFKSB7XG4gICAgLy8gRW1wdHkgc3RyaW5ncyBhcmUgbm90IHBhcnNlZCBieSBIVE1MIHNvIHRoZXJlIHdvbid0IGJlIGEgY29ycmVjdCBtYXRjaCBoZXJlLlxuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoaXMgaGFzIG5vdyBiZWVuIHJlZmluZWQgdG8gYSB0ZXh0IG5vZGUuXG5cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBjYW5IeWRyYXRlU3VzcGVuc2VJbnN0YW5jZShpbnN0YW5jZSkge1xuICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgIC8vIEVtcHR5IHN0cmluZ3MgYXJlIG5vdCBwYXJzZWQgYnkgSFRNTCBzbyB0aGVyZSB3b24ndCBiZSBhIGNvcnJlY3QgbWF0Y2ggaGVyZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGhhcyBub3cgYmVlbiByZWZpbmVkIHRvIGEgc3VzcGVuc2Ugbm9kZS5cblxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2VJbnN0YW5jZVBlbmRpbmcoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlLmRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZS5kYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBO1xufVxuZnVuY3Rpb24gZ2V0U3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrRXJyb3JEZXRhaWxzKGluc3RhbmNlKSB7XG4gIHZhciBkYXRhc2V0ID0gaW5zdGFuY2UubmV4dFNpYmxpbmcgJiYgaW5zdGFuY2UubmV4dFNpYmxpbmcuZGF0YXNldDtcbiAgdmFyIGRpZ2VzdCwgbWVzc2FnZSwgc3RhY2s7XG5cbiAgaWYgKGRhdGFzZXQpIHtcbiAgICBkaWdlc3QgPSBkYXRhc2V0LmRnc3Q7XG5cbiAgICB7XG4gICAgICBtZXNzYWdlID0gZGF0YXNldC5tc2c7XG4gICAgICBzdGFjayA9IGRhdGFzZXQuc3RjaztcbiAgICB9XG4gIH1cblxuICB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICBkaWdlc3Q6IGRpZ2VzdCxcbiAgICAgIHN0YWNrOiBzdGFja1xuICAgIH07XG4gIH0gLy8gbGV0IHZhbHVlID0ge21lc3NhZ2U6IHVuZGVmaW5lZCwgaGFzaDogdW5kZWZpbmVkfTtcbiAgLy8gY29uc3QgbmV4dFNpYmxpbmcgPSBpbnN0YW5jZS5uZXh0U2libGluZztcbiAgLy8gaWYgKG5leHRTaWJsaW5nKSB7XG4gIC8vICAgY29uc3QgZGF0YXNldCA9ICgobmV4dFNpYmxpbmc6IGFueSk6IEhUTUxUZW1wbGF0ZUVsZW1lbnQpLmRhdGFzZXQ7XG4gIC8vICAgdmFsdWUubWVzc2FnZSA9IGRhdGFzZXQubXNnO1xuICAvLyAgIHZhbHVlLmhhc2ggPSBkYXRhc2V0Lmhhc2g7XG4gIC8vICAgaWYgKHRydWUpIHtcbiAgLy8gICAgIHZhbHVlLnN0YWNrID0gZGF0YXNldC5zdGFjaztcbiAgLy8gICB9XG4gIC8vIH1cbiAgLy8gcmV0dXJuIHZhbHVlO1xuXG59XG5mdW5jdGlvbiByZWdpc3RlclN1c3BlbnNlSW5zdGFuY2VSZXRyeShpbnN0YW5jZSwgY2FsbGJhY2spIHtcbiAgaW5zdGFuY2UuX3JlYWN0UmV0cnkgPSBjYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGUobm9kZSkge1xuICAvLyBTa2lwIG5vbi1oeWRyYXRhYmxlIG5vZGVzLlxuICBmb3IgKDsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5uZXh0U2libGluZykge1xuICAgIHZhciBub2RlVHlwZSA9IG5vZGUubm9kZVR5cGU7XG5cbiAgICBpZiAobm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSB8fCBub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAobm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIG5vZGVEYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAobm9kZURhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgbm9kZURhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEgfHwgbm9kZURhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGVEYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGluc3RhbmNlKSB7XG4gIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZShpbnN0YW5jZS5uZXh0U2libGluZyk7XG59XG5mdW5jdGlvbiBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZChwYXJlbnRJbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUocGFyZW50SW5zdGFuY2UuZmlyc3RDaGlsZCk7XG59XG5mdW5jdGlvbiBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKHBhcmVudENvbnRhaW5lci5maXJzdENoaWxkKTtcbn1cbmZ1bmN0aW9uIGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkV2l0aGluU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRJbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUocGFyZW50SW5zdGFuY2UubmV4dFNpYmxpbmcpO1xufVxuZnVuY3Rpb24gaHlkcmF0ZUluc3RhbmNlKGluc3RhbmNlLCB0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgc2hvdWxkV2FybkRldikge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBpbnN0YW5jZSk7IC8vIFRPRE86IFBvc3NpYmx5IGRlZmVyIHRoaXMgdW50aWwgdGhlIGNvbW1pdCBwaGFzZSB3aGVyZSBhbGwgdGhlIGV2ZW50c1xuICAvLyBnZXQgYXR0YWNoZWQuXG5cbiAgdXBkYXRlRmliZXJQcm9wcyhpbnN0YW5jZSwgcHJvcHMpO1xuICB2YXIgcGFyZW50TmFtZXNwYWNlO1xuXG4gIHtcbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICBwYXJlbnROYW1lc3BhY2UgPSBob3N0Q29udGV4dERldi5uYW1lc3BhY2U7XG4gIH0gLy8gVE9ETzogVGVtcG9yYXJ5IGhhY2sgdG8gY2hlY2sgaWYgd2UncmUgaW4gYSBjb25jdXJyZW50IHJvb3QuIFdlIGNhbiBkZWxldGVcbiAgLy8gd2hlbiB0aGUgbGVnYWN5IHJvb3QgQVBJIGlzIHJlbW92ZWQuXG5cblxuICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChpbnRlcm5hbEluc3RhbmNlSGFuZGxlLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcbiAgcmV0dXJuIGRpZmZIeWRyYXRlZFByb3BlcnRpZXMoaW5zdGFuY2UsIHR5cGUsIHByb3BzLCBwYXJlbnROYW1lc3BhY2UsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG59XG5mdW5jdGlvbiBoeWRyYXRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgc2hvdWxkV2FybkRldikge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCB0ZXh0SW5zdGFuY2UpOyAvLyBUT0RPOiBUZW1wb3JhcnkgaGFjayB0byBjaGVjayBpZiB3ZSdyZSBpbiBhIGNvbmN1cnJlbnQgcm9vdC4gV2UgY2FuIGRlbGV0ZVxuICAvLyB3aGVuIHRoZSBsZWdhY3kgcm9vdCBBUEkgaXMgcmVtb3ZlZC5cblxuICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChpbnRlcm5hbEluc3RhbmNlSGFuZGxlLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcbiAgcmV0dXJuIGRpZmZIeWRyYXRlZFRleHQodGV4dEluc3RhbmNlLCB0ZXh0KTtcbn1cbmZ1bmN0aW9uIGh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBnZXROZXh0SHlkcmF0YWJsZUluc3RhbmNlQWZ0ZXJTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSBzdXNwZW5zZUluc3RhbmNlLm5leHRTaWJsaW5nOyAvLyBTa2lwIHBhc3QgYWxsIG5vZGVzIHdpdGhpbiB0aGlzIHN1c3BlbnNlIGJvdW5kYXJ5LlxuICAvLyBUaGVyZSBtaWdodCBiZSBuZXN0ZWQgbm9kZXMgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGhvd1xuICAvLyBkZWVwIHdlIGFyZSBhbmQgb25seSBicmVhayBvdXQgd2hlbiB3ZSdyZSBiYWNrIG9uIHRvcC5cblxuICB2YXIgZGVwdGggPSAwO1xuXG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGRhdGEgPSBub2RlLmRhdGE7XG5cbiAgICAgIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKG5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSkge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICB9IC8vIFRPRE86IFdhcm4sIHdlIGRpZG4ndCBmaW5kIHRoZSBlbmQgY29tbWVudCBib3VuZGFyeS5cblxuXG4gIHJldHVybiBudWxsO1xufSAvLyBSZXR1cm5zIHRoZSBTdXNwZW5zZUluc3RhbmNlIGlmIHRoaXMgbm9kZSBpcyBhIGRpcmVjdCBjaGlsZCBvZiBhXG4vLyBTdXNwZW5zZUluc3RhbmNlLiBJLmUuIGlmIGl0cyBwcmV2aW91cyBzaWJsaW5nIGlzIGEgQ29tbWVudCB3aXRoXG4vLyBTVVNQRU5TRV94X1NUQVJUX0RBVEEuIE90aGVyd2lzZSwgbnVsbC5cblxuZnVuY3Rpb24gZ2V0UGFyZW50U3VzcGVuc2VJbnN0YW5jZSh0YXJnZXRJbnN0YW5jZSkge1xuICB2YXIgbm9kZSA9IHRhcmdldEluc3RhbmNlLnByZXZpb3VzU2libGluZzsgLy8gU2tpcCBwYXN0IGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS5cbiAgLy8gVGhlcmUgbWlnaHQgYmUgbmVzdGVkIG5vZGVzIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBob3dcbiAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuXG5cbiAgdmFyIGRlcHRoID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBkYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSkge1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX0VORF9EQVRBKSB7XG4gICAgICAgIGRlcHRoKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBjb21taXRIeWRyYXRlZENvbnRhaW5lcihjb250YWluZXIpIHtcbiAgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuICByZXRyeUlmQmxvY2tlZE9uKGNvbnRhaW5lcik7XG59XG5mdW5jdGlvbiBjb21taXRIeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSkge1xuICAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG4gIHJldHJ5SWZCbG9ja2VkT24oc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBzaG91bGREZWxldGVVbmh5ZHJhdGVkVGFpbEluc3RhbmNlcyhwYXJlbnRUeXBlKSB7XG4gIHJldHVybiBwYXJlbnRUeXBlICE9PSAnaGVhZCcgJiYgcGFyZW50VHlwZSAhPT0gJ2JvZHknO1xufVxuZnVuY3Rpb24gZGlkTm90TWF0Y2hIeWRyYXRlZENvbnRhaW5lclRleHRJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHRleHRJbnN0YW5jZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSkge1xuICB2YXIgc2hvdWxkV2FybkRldiA9IHRydWU7XG4gIGNoZWNrRm9yVW5tYXRjaGVkVGV4dCh0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbn1cbmZ1bmN0aW9uIGRpZE5vdE1hdGNoSHlkcmF0ZWRUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0SW5zdGFuY2UsIHRleHQsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAgaWYgKHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgdmFyIHNob3VsZFdhcm5EZXYgPSB0cnVlO1xuICAgIGNoZWNrRm9yVW5tYXRjaGVkVGV4dCh0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpIHtcbiAge1xuICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSkge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZTogT25seSBFbGVtZW50IG9yIERvY3VtZW50IGNhbiBiZSBwYXJlbnQgbm9kZXMuXG4gICAgdmFyIHBhcmVudE5vZGUgPSBwYXJlbnRJbnN0YW5jZS5wYXJlbnROb2RlO1xuXG4gICAgaWYgKHBhcmVudE5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50Tm9kZSwgaW5zdGFuY2UpO1xuICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSA7IGVsc2Uge1xuICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudE5vZGUsIGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIGluc3RhbmNlLCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHtcbiAgICBpZiAoaXNDb25jdXJyZW50TW9kZSB8fCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgICAgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlRWxlbWVudChwYXJlbnRJbnN0YW5jZSwgaW5zdGFuY2UpO1xuICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSA7IGVsc2Uge1xuICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnRDb250YWluZXIsIHR5cGUpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHRleHQpIHtcbiAge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnRDb250YWluZXIsIHRleHQpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRJbnN0YW5jZSwgdHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWU6IE9ubHkgRWxlbWVudCBvciBEb2N1bWVudCBjYW4gYmUgcGFyZW50IG5vZGVzLlxuICAgIHZhciBwYXJlbnROb2RlID0gcGFyZW50SW5zdGFuY2UucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50Tm9kZSAhPT0gbnVsbCkgd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50KHBhcmVudE5vZGUsIHR5cGUpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UocGFyZW50SW5zdGFuY2UsIHRleHQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWU6IE9ubHkgRWxlbWVudCBvciBEb2N1bWVudCBjYW4gYmUgcGFyZW50IG5vZGVzLlxuICAgIHZhciBwYXJlbnROb2RlID0gcGFyZW50SW5zdGFuY2UucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50Tm9kZSAhPT0gbnVsbCkgd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudE5vZGUsIHRleHQpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdHlwZSwgcHJvcHMsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAge1xuICAgIGlmIChpc0NvbmN1cnJlbnRNb2RlIHx8IHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50SW5zdGFuY2UsIHR5cGUpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHtcbiAgICBpZiAoaXNDb25jdXJyZW50TW9kZSB8fCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgICAgd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudEluc3RhbmNlLCB0ZXh0KTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGVycm9ySHlkcmF0aW5nQ29udGFpbmVyKHBhcmVudENvbnRhaW5lcikge1xuICB7XG4gICAgLy8gVE9ETzogVGhpcyBnZXRzIGxvZ2dlZCBieSBvblJlY292ZXJhYmxlRXJyb3IsIHRvbywgc28gd2Ugc2hvdWxkIGJlXG4gICAgLy8gYWJsZSB0byByZW1vdmUgaXQuXG4gICAgZXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIGR1cmluZyBoeWRyYXRpb24uIFRoZSBzZXJ2ZXIgSFRNTCB3YXMgcmVwbGFjZWQgd2l0aCBjbGllbnQgY29udGVudCBpbiA8JXM+LicsIHBhcmVudENvbnRhaW5lci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZVBvcnRhbE1vdW50KHBvcnRhbEluc3RhbmNlKSB7XG4gIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHBvcnRhbEluc3RhbmNlKTtcbn1cblxudmFyIHJhbmRvbUtleSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO1xudmFyIGludGVybmFsSW5zdGFuY2VLZXkgPSAnX19yZWFjdEZpYmVyJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxQcm9wc0tleSA9ICdfX3JlYWN0UHJvcHMkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5ID0gJ19fcmVhY3RDb250YWluZXIkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbEV2ZW50SGFuZGxlcnNLZXkgPSAnX19yZWFjdEV2ZW50cyQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsRXZlbnRIYW5kbGVyTGlzdGVuZXJzS2V5ID0gJ19fcmVhY3RMaXN0ZW5lcnMkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbEV2ZW50SGFuZGxlc1NldEtleSA9ICdfX3JlYWN0SGFuZGxlcyQnICsgcmFuZG9tS2V5O1xuZnVuY3Rpb24gZGV0YWNoRGVsZXRlZEluc3RhbmNlKG5vZGUpIHtcbiAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBvbiBob3N0IGNvbXBvbmVudHMuIEkgZG9uJ3QgdGhpbmsgYWxsIG9mXG4gIC8vIHRoZXNlIGZpZWxkcyBhcmUgcmVsZXZhbnQuXG4gIGRlbGV0ZSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuICBkZWxldGUgbm9kZVtpbnRlcm5hbFByb3BzS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJMaXN0ZW5lcnNLZXldO1xuICBkZWxldGUgbm9kZVtpbnRlcm5hbEV2ZW50SGFuZGxlc1NldEtleV07XG59XG5mdW5jdGlvbiBwcmVjYWNoZUZpYmVyTm9kZShob3N0SW5zdCwgbm9kZSkge1xuICBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldID0gaG9zdEluc3Q7XG59XG5mdW5jdGlvbiBtYXJrQ29udGFpbmVyQXNSb290KGhvc3RSb290LCBub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBob3N0Um9vdDtcbn1cbmZ1bmN0aW9uIHVubWFya0NvbnRhaW5lckFzUm9vdChub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBudWxsO1xufVxuZnVuY3Rpb24gaXNDb250YWluZXJNYXJrZWRBc1Jvb3Qobm9kZSkge1xuICByZXR1cm4gISFub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldO1xufSAvLyBHaXZlbiBhIERPTSBub2RlLCByZXR1cm4gdGhlIGNsb3Nlc3QgSG9zdENvbXBvbmVudCBvciBIb3N0VGV4dCBmaWJlciBhbmNlc3Rvci5cbi8vIElmIHRoZSB0YXJnZXQgbm9kZSBpcyBwYXJ0IG9mIGEgaHlkcmF0ZWQgb3Igbm90IHlldCByZW5kZXJlZCBzdWJ0cmVlLCB0aGVuXG4vLyB0aGlzIG1heSBhbHNvIHJldHVybiBhIFN1c3BlbnNlQ29tcG9uZW50IG9yIEhvc3RSb290IHRvIGluZGljYXRlIHRoYXQuXG4vLyBDb25jZXB0dWFsbHkgdGhlIEhvc3RSb290IGZpYmVyIGlzIGEgY2hpbGQgb2YgdGhlIENvbnRhaW5lciBub2RlLiBTbyBpZiB5b3Vcbi8vIHBhc3MgdGhlIENvbnRhaW5lciBub2RlIGFzIHRoZSB0YXJnZXROb2RlLCB5b3Ugd2lsbCBub3QgYWN0dWFsbHkgZ2V0IHRoZVxuLy8gSG9zdFJvb3QgYmFjay4gVG8gZ2V0IHRvIHRoZSBIb3N0Um9vdCwgeW91IG5lZWQgdG8gcGFzcyBhIGNoaWxkIG9mIGl0LlxuLy8gVGhlIHNhbWUgdGhpbmcgYXBwbGllcyB0byBTdXNwZW5zZSBib3VuZGFyaWVzLlxuXG5mdW5jdGlvbiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXROb2RlKSB7XG4gIHZhciB0YXJnZXRJbnN0ID0gdGFyZ2V0Tm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcblxuICBpZiAodGFyZ2V0SW5zdCkge1xuICAgIC8vIERvbid0IHJldHVybiBIb3N0Um9vdCBvciBTdXNwZW5zZUNvbXBvbmVudCBoZXJlLlxuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9IC8vIElmIHRoZSBkaXJlY3QgZXZlbnQgdGFyZ2V0IGlzbid0IGEgUmVhY3Qgb3duZWQgRE9NIG5vZGUsIHdlIG5lZWQgdG8gbG9va1xuICAvLyB0byBzZWUgaWYgb25lIG9mIGl0cyBwYXJlbnRzIGlzIGEgUmVhY3Qgb3duZWQgRE9NIG5vZGUuXG5cblxuICB2YXIgcGFyZW50Tm9kZSA9IHRhcmdldE5vZGUucGFyZW50Tm9kZTtcblxuICB3aGlsZSAocGFyZW50Tm9kZSkge1xuICAgIC8vIFdlJ2xsIGNoZWNrIGlmIHRoaXMgaXMgYSBjb250YWluZXIgcm9vdCB0aGF0IGNvdWxkIGluY2x1ZGVcbiAgICAvLyBSZWFjdCBub2RlcyBpbiB0aGUgZnV0dXJlLiBXZSBuZWVkIHRvIGNoZWNrIHRoaXMgZmlyc3QgYmVjYXVzZVxuICAgIC8vIGlmIHdlJ3JlIGEgY2hpbGQgb2YgYSBkZWh5ZHJhdGVkIGNvbnRhaW5lciwgd2UgbmVlZCB0byBmaXJzdFxuICAgIC8vIGZpbmQgdGhhdCBpbm5lciBjb250YWluZXIgYmVmb3JlIG1vdmluZyBvbiB0byBmaW5kaW5nIHRoZSBwYXJlbnRcbiAgICAvLyBpbnN0YW5jZS4gTm90ZSB0aGF0IHdlIGRvbid0IGNoZWNrIHRoaXMgZmllbGQgb24gIHRoZSB0YXJnZXROb2RlXG4gICAgLy8gaXRzZWxmIGJlY2F1c2UgdGhlIGZpYmVycyBhcmUgY29uY2VwdHVhbGx5IGJldHdlZW4gdGhlIGNvbnRhaW5lclxuICAgIC8vIG5vZGUgYW5kIHRoZSBmaXJzdCBjaGlsZC4gSXQgaXNuJ3Qgc3Vycm91bmRpbmcgdGhlIGNvbnRhaW5lciBub2RlLlxuICAgIC8vIElmIGl0J3Mgbm90IGEgY29udGFpbmVyLCB3ZSBjaGVjayBpZiBpdCdzIGFuIGluc3RhbmNlLlxuICAgIHRhcmdldEluc3QgPSBwYXJlbnROb2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldIHx8IHBhcmVudE5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgICBpZiAodGFyZ2V0SW5zdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyB3YXNuJ3QgdGhlIGRpcmVjdCB0YXJnZXQgb2YgdGhlIGV2ZW50LCB3ZSBtaWdodCBoYXZlXG4gICAgICAvLyBzdGVwcGVkIHBhc3QgZGVoeWRyYXRlZCBET00gbm9kZXMgdG8gZ2V0IGhlcmUuIEhvd2V2ZXIgdGhleSBjb3VsZFxuICAgICAgLy8gYWxzbyBoYXZlIGJlZW4gbm9uLVJlYWN0IG5vZGVzLiBXZSBuZWVkIHRvIGFuc3dlciB3aGljaCBvbmUuXG4gICAgICAvLyBJZiB3ZSB0aGUgaW5zdGFuY2UgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiwgdGhlbiB0aGVyZSBjYW4ndCBiZVxuICAgICAgLy8gYSBuZXN0ZWQgc3VzcGVuc2UgYm91bmRhcnkgd2l0aGluIGl0LiBTbyB3ZSBjYW4gdXNlIHRoaXMgYXMgYSBmYXN0XG4gICAgICAvLyBiYWlsb3V0LiBNb3N0IG9mIHRoZSB0aW1lLCB3aGVuIHBlb3BsZSBhZGQgbm9uLVJlYWN0IGNoaWxkcmVuIHRvXG4gICAgICAvLyB0aGUgdHJlZSwgaXQgaXMgdXNpbmcgYSByZWYgdG8gYSBjaGlsZC1sZXNzIERPTSBub2RlLlxuICAgICAgLy8gTm9ybWFsbHkgd2UnZCBvbmx5IG5lZWQgdG8gY2hlY2sgb25lIG9mIHRoZSBmaWJlcnMgYmVjYXVzZSBpZiBpdFxuICAgICAgLy8gaGFzIGV2ZXIgZ29uZSBmcm9tIGhhdmluZyBjaGlsZHJlbiB0byBkZWxldGluZyB0aGVtIG9yIHZpY2UgdmVyc2FcbiAgICAgIC8vIGl0IHdvdWxkIGhhdmUgZGVsZXRlZCB0aGUgZGVoeWRyYXRlZCBib3VuZGFyeSBuZXN0ZWQgaW5zaWRlIGFscmVhZHkuXG4gICAgICAvLyBIb3dldmVyLCBzaW5jZSB0aGUgSG9zdFJvb3Qgc3RhcnRzIG91dCB3aXRoIGFuIGFsdGVybmF0ZSBpdCBtaWdodFxuICAgICAgLy8gaGF2ZSBvbmUgb24gdGhlIGFsdGVybmF0ZSBzbyB3ZSBuZWVkIHRvIGNoZWNrIGluIGNhc2UgdGhpcyB3YXMgYVxuICAgICAgLy8gcm9vdC5cbiAgICAgIHZhciBhbHRlcm5hdGUgPSB0YXJnZXRJbnN0LmFsdGVybmF0ZTtcblxuICAgICAgaWYgKHRhcmdldEluc3QuY2hpbGQgIT09IG51bGwgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBOZXh0IHdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgbm9kZSB0aGF0IHNraXBwZWQgcGFzdCBpc1xuICAgICAgICAvLyBuZXN0ZWQgd2l0aGluIGEgZGVoeWRyYXRlZCBib3VuZGFyeSBhbmQgaWYgc28sIHdoaWNoIG9uZS5cbiAgICAgICAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHRhcmdldE5vZGUpO1xuXG4gICAgICAgIHdoaWxlIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgZm91bmQgYSBzdXNwZW5zZSBpbnN0YW5jZS4gVGhhdCBtZWFucyB0aGF0IHdlIGhhdmVuJ3RcbiAgICAgICAgICAvLyBoeWRyYXRlZCBpdCB5ZXQuIEV2ZW4gdGhvdWdoIHdlIGxlYXZlIHRoZSBjb21tZW50cyBpbiB0aGVcbiAgICAgICAgICAvLyBET00gYWZ0ZXIgaHlkcmF0aW5nLCBhbmQgdGhlcmUgYXJlIGJvdW5kYXJpZXMgaW4gdGhlIERPTVxuICAgICAgICAgIC8vIHRoYXQgY291bGQgYWxyZWFkeSBiZSBoeWRyYXRlZCwgd2Ugd291bGRuJ3QgaGF2ZSBmb3VuZCB0aGVtXG4gICAgICAgICAgLy8gdGhyb3VnaCB0aGlzIHBhc3Mgc2luY2UgaWYgdGhlIHRhcmdldCBpcyBoeWRyYXRlZCBpdCB3b3VsZFxuICAgICAgICAgIC8vIGhhdmUgaGFkIGFuIGludGVybmFsSW5zdGFuY2VLZXkgb24gaXQuXG4gICAgICAgICAgLy8gTGV0J3MgZ2V0IHRoZSBmaWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIFN1c3BlbnNlQ29tcG9uZW50XG4gICAgICAgICAgLy8gYXMgdGhlIGRlZXBlc3QgaW5zdGFuY2UuXG4gICAgICAgICAgdmFyIHRhcmdldFN1c3BlbnNlSW5zdCA9IHN1c3BlbnNlSW5zdGFuY2VbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgICAgICAgICBpZiAodGFyZ2V0U3VzcGVuc2VJbnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0U3VzcGVuc2VJbnN0O1xuICAgICAgICAgIH0gLy8gSWYgd2UgZG9uJ3QgZmluZCBhIEZpYmVyIG9uIHRoZSBjb21tZW50LCBpdCBtaWdodCBiZSBiZWNhdXNlXG4gICAgICAgICAgLy8gd2UgaGF2ZW4ndCBnb3R0ZW4gdG8gaHlkcmF0ZSBpdCB5ZXQuIFRoZXJlIG1pZ2h0IHN0aWxsIGJlIGFcbiAgICAgICAgICAvLyBwYXJlbnQgYm91bmRhcnkgdGhhdCBoYXNuJ3QgYWJvdmUgdGhpcyBvbmUgc28gd2UgbmVlZCB0byBmaW5kXG4gICAgICAgICAgLy8gdGhlIG91dGVyIG1vc3QgdGhhdCBpcyBrbm93bi5cblxuXG4gICAgICAgICAgc3VzcGVuc2VJbnN0YW5jZSA9IGdldFBhcmVudFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7IC8vIElmIHdlIGRvbid0IGZpbmQgb25lLCB0aGVuIHRoYXQgc2hvdWxkIG1lYW4gdGhhdCB0aGUgcGFyZW50XG4gICAgICAgICAgLy8gaG9zdCBjb21wb25lbnQgYWxzbyBoYXNuJ3QgaHlkcmF0ZWQgeWV0LiBXZSBjYW4gcmV0dXJuIGl0XG4gICAgICAgICAgLy8gYmVsb3cgc2luY2UgaXQgd2lsbCBiYWlsIG91dCBvbiB0aGUgaXNNb3VudGVkIGNoZWNrIGxhdGVyLlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICAgIH1cblxuICAgIHRhcmdldE5vZGUgPSBwYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUgPSB0YXJnZXROb2RlLnBhcmVudE5vZGU7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnRcbiAqIGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBub2RlIHdhcyBub3QgcmVuZGVyZWQgYnkgdGhpcyBSZWFjdC5cbiAqL1xuXG5mdW5jdGlvbiBnZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpIHtcbiAgdmFyIGluc3QgPSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldIHx8IG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV07XG5cbiAgaWYgKGluc3QpIHtcbiAgICBpZiAoaW5zdC50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgaW5zdC50YWcgPT09IEhvc3RUZXh0IHx8IGluc3QudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgIHJldHVybiBpbnN0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2l2ZW4gYSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnQsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZ1xuICogRE9NIG5vZGUuXG4gKi9cblxuZnVuY3Rpb24gZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KSB7XG4gIGlmIChpbnN0LnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAvLyBJbiBGaWJlciB0aGlzLCBpcyBqdXN0IHRoZSBzdGF0ZSBub2RlIHJpZ2h0IG5vdy4gV2UgYXNzdW1lIGl0IHdpbGwgYmVcbiAgICAvLyBhIGhvc3QgY29tcG9uZW50IG9yIGhvc3QgdGV4dC5cbiAgICByZXR1cm4gaW5zdC5zdGF0ZU5vZGU7XG4gIH0gLy8gV2l0aG91dCB0aGlzIGZpcnN0IGludmFyaWFudCwgcGFzc2luZyBhIG5vbi1ET00tY29tcG9uZW50IHRyaWdnZXJzIHRoZSBuZXh0XG4gIC8vIGludmFyaWFudCBmb3IgYSBtaXNzaW5nIHBhcmVudCwgd2hpY2ggaXMgc3VwZXIgY29uZnVzaW5nLlxuXG5cbiAgdGhyb3cgbmV3IEVycm9yKCdnZXROb2RlRnJvbUluc3RhbmNlOiBJbnZhbGlkIGFyZ3VtZW50LicpO1xufVxuZnVuY3Rpb24gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShub2RlKSB7XG4gIHJldHVybiBub2RlW2ludGVybmFsUHJvcHNLZXldIHx8IG51bGw7XG59XG5mdW5jdGlvbiB1cGRhdGVGaWJlclByb3BzKG5vZGUsIHByb3BzKSB7XG4gIG5vZGVbaW50ZXJuYWxQcm9wc0tleV0gPSBwcm9wcztcbn1cbmZ1bmN0aW9uIGdldEV2ZW50TGlzdGVuZXJTZXQobm9kZSkge1xuICB2YXIgZWxlbWVudExpc3RlbmVyU2V0ID0gbm9kZVtpbnRlcm5hbEV2ZW50SGFuZGxlcnNLZXldO1xuXG4gIGlmIChlbGVtZW50TGlzdGVuZXJTZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVsZW1lbnRMaXN0ZW5lclNldCA9IG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XSA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50TGlzdGVuZXJTZXQ7XG59XG5cbnZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZWxlbWVudCkge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZSBUaGlzIGlzIG9rYXkgYnV0IEZsb3cgZG9lc24ndCBrbm93IGl0LlxuICAgIHZhciBoYXMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoaGFzT3duUHJvcGVydHkpO1xuXG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yJDEgPSB2b2lkIDA7IC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICsgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJyArICdUaGlzIG9mdGVuIGhhcHBlbnMgYmVjYXVzZSBvZiB0eXBvcyBzdWNoIGFzIGBQcm9wVHlwZXMuZnVuY3Rpb25gIGluc3RlYWQgb2YgYFByb3BUeXBlcy5mdW5jYC4nKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yJDEgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCcpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yJDEgPSBleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxICYmICEoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMnICsgJyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IkMSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvciQxLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yJDEubWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJ0ZhaWxlZCAlcyB0eXBlOiAlcycsIGxvY2F0aW9uLCBlcnJvciQxLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIHZhbHVlU3RhY2sgPSBbXTtcbnZhciBmaWJlclN0YWNrO1xuXG57XG4gIGZpYmVyU3RhY2sgPSBbXTtcbn1cblxudmFyIGluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNyZWF0ZUN1cnNvcihkZWZhdWx0VmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50OiBkZWZhdWx0VmFsdWVcbiAgfTtcbn1cblxuZnVuY3Rpb24gcG9wKGN1cnNvciwgZmliZXIpIHtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHtcbiAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHBvcC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgaWYgKGZpYmVyICE9PSBmaWJlclN0YWNrW2luZGV4XSkge1xuICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgRmliZXIgcG9wcGVkLicpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnNvci5jdXJyZW50ID0gdmFsdWVTdGFja1tpbmRleF07XG4gIHZhbHVlU3RhY2tbaW5kZXhdID0gbnVsbDtcblxuICB7XG4gICAgZmliZXJTdGFja1tpbmRleF0gPSBudWxsO1xuICB9XG5cbiAgaW5kZXgtLTtcbn1cblxuZnVuY3Rpb24gcHVzaChjdXJzb3IsIHZhbHVlLCBmaWJlcikge1xuICBpbmRleCsrO1xuICB2YWx1ZVN0YWNrW2luZGV4XSA9IGN1cnNvci5jdXJyZW50O1xuXG4gIHtcbiAgICBmaWJlclN0YWNrW2luZGV4XSA9IGZpYmVyO1xuICB9XG5cbiAgY3Vyc29yLmN1cnJlbnQgPSB2YWx1ZTtcbn1cblxudmFyIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dDtcblxue1xuICB3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHQgPSB7fTtcbn1cblxudmFyIGVtcHR5Q29udGV4dE9iamVjdCA9IHt9O1xuXG57XG4gIE9iamVjdC5mcmVlemUoZW1wdHlDb250ZXh0T2JqZWN0KTtcbn0gLy8gQSBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgbWVyZ2VkIGNvbnRleHQgb2JqZWN0IG9uIHRoZSBzdGFjay5cblxuXG52YXIgY29udGV4dFN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKGVtcHR5Q29udGV4dE9iamVjdCk7IC8vIEEgY3Vyc29yIHRvIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNvbnRleHQgaGFzIGNoYW5nZWQuXG5cbnZhciBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKGZhbHNlKTsgLy8gS2VlcCB0cmFjayBvZiB0aGUgcHJldmlvdXMgY29udGV4dCBvYmplY3QgdGhhdCB3YXMgb24gdGhlIHN0YWNrLlxuLy8gV2UgdXNlIHRoaXMgdG8gZ2V0IGFjY2VzcyB0byB0aGUgcGFyZW50IGNvbnRleHQgYWZ0ZXIgd2UgaGF2ZSBhbHJlYWR5XG4vLyBwdXNoZWQgdGhlIG5leHQgY29udGV4dCBwcm92aWRlciwgYW5kIG5vdyBuZWVkIHRvIG1lcmdlIHRoZWlyIGNvbnRleHRzLlxuXG52YXIgcHJldmlvdXNDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuXG5mdW5jdGlvbiBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZGlkUHVzaE93bkNvbnRleHRJZlByb3ZpZGVyKSB7XG4gIHtcbiAgICBpZiAoZGlkUHVzaE93bkNvbnRleHRJZlByb3ZpZGVyICYmIGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgIC8vIElmIHRoZSBmaWJlciBpcyBhIGNvbnRleHQgcHJvdmlkZXIgaXRzZWxmLCB3aGVuIHdlIHJlYWQgaXRzIGNvbnRleHRcbiAgICAgIC8vIHdlIG1heSBoYXZlIGFscmVhZHkgcHVzaGVkIGl0cyBvd24gY2hpbGQgY29udGV4dCBvbiB0aGUgc3RhY2suIEEgY29udGV4dFxuICAgICAgLy8gcHJvdmlkZXIgc2hvdWxkIG5vdCBcInNlZVwiIGl0cyBvd24gY2hpbGQgY29udGV4dC4gVGhlcmVmb3JlIHdlIHJlYWQgdGhlXG4gICAgICAvLyBwcmV2aW91cyAocGFyZW50KSBjb250ZXh0IGluc3RlYWQgZm9yIGEgY29udGV4dCBwcm92aWRlci5cbiAgICAgIHJldHVybiBwcmV2aW91c0NvbnRleHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhY2hlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0LCBtYXNrZWRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dCA9IHVubWFza2VkQ29udGV4dDtcbiAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dCA9IG1hc2tlZENvbnRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgdmFyIGNvbnRleHRUeXBlcyA9IHR5cGUuY29udGV4dFR5cGVzO1xuXG4gICAgaWYgKCFjb250ZXh0VHlwZXMpIHtcbiAgICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gICAgfSAvLyBBdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyB1bm1hc2tlZCBjb250ZXh0IGhhcyBjaGFuZ2VkLlxuICAgIC8vIEZhaWxpbmcgdG8gZG8gdGhpcyB3aWxsIHJlc3VsdCBpbiB1bm5lY2Vzc2FyeSBjYWxscyB0byBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLlxuICAgIC8vIFRoaXMgbWF5IHRyaWdnZXIgaW5maW5pdGUgbG9vcHMgaWYgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBjYWxscyBzZXRTdGF0ZS5cblxuXG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQgPT09IHVubWFza2VkQ29udGV4dCkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O1xuICAgIH1cblxuICAgIHZhciBjb250ZXh0ID0ge307XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gY29udGV4dFR5cGVzKSB7XG4gICAgICBjb250ZXh0W2tleV0gPSB1bm1hc2tlZENvbnRleHRba2V5XTtcbiAgICB9XG5cbiAgICB7XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdVbmtub3duJztcbiAgICAgIGNoZWNrUHJvcFR5cGVzKGNvbnRleHRUeXBlcywgY29udGV4dCwgJ2NvbnRleHQnLCBuYW1lKTtcbiAgICB9IC8vIENhY2hlIHVubWFza2VkIGNvbnRleHQgc28gd2UgY2FuIGF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIG5lY2Vzc2FyeS5cbiAgICAvLyBDb250ZXh0IGlzIGNyZWF0ZWQgYmVmb3JlIHRoZSBjbGFzcyBjb21wb25lbnQgaXMgaW5zdGFudGlhdGVkIHNvIGNoZWNrIGZvciBpbnN0YW5jZS5cblxuXG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzQ29udGV4dENoYW5nZWQoKSB7XG4gIHtcbiAgICByZXR1cm4gZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvci5jdXJyZW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKHR5cGUpIHtcbiAge1xuICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IHR5cGUuY2hpbGRDb250ZXh0VHlwZXM7XG4gICAgcmV0dXJuIGNoaWxkQ29udGV4dFR5cGVzICE9PSBudWxsICYmIGNoaWxkQ29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wQ29udGV4dChmaWJlcikge1xuICB7XG4gICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGZpYmVyKSB7XG4gIHtcbiAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZmliZXIpO1xuICAgIHBvcChjb250ZXh0U3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGZpYmVyLCBjb250ZXh0LCBkaWRDaGFuZ2UpIHtcbiAge1xuICAgIGlmIChjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudCAhPT0gZW1wdHlDb250ZXh0T2JqZWN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgY29udGV4dCBmb3VuZCBvbiBzdGFjay4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBjb250ZXh0LCBmaWJlcik7XG4gICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRDaGFuZ2UsIGZpYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzQ2hpbGRDb250ZXh0KGZpYmVyLCB0eXBlLCBwYXJlbnRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gICAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gdHlwZS5jaGlsZENvbnRleHRUeXBlczsgLy8gVE9ETyAoYnZhdWdobikgUmVwbGFjZSB0aGlzIGJlaGF2aW9yIHdpdGggYW4gaW52YXJpYW50KCkgaW4gdGhlIGZ1dHVyZS5cbiAgICAvLyBJdCBoYXMgb25seSBiZWVuIGFkZGVkIGluIEZpYmVyIHRvIG1hdGNoIHRoZSAodW5pbnRlbnRpb25hbCkgYmVoYXZpb3IgaW4gU3RhY2suXG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAge1xuICAgICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJztcblxuICAgICAgICBpZiAoIXdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignJXMuY2hpbGRDb250ZXh0VHlwZXMgaXMgc3BlY2lmaWVkIGJ1dCB0aGVyZSBpcyBubyBnZXRDaGlsZENvbnRleHQoKSBtZXRob2QgJyArICdvbiB0aGUgaW5zdGFuY2UuIFlvdSBjYW4gZWl0aGVyIGRlZmluZSBnZXRDaGlsZENvbnRleHQoKSBvbiAlcyBvciByZW1vdmUgJyArICdjaGlsZENvbnRleHRUeXBlcyBmcm9tIGl0LicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJlbnRDb250ZXh0O1xuICAgIH1cblxuICAgIHZhciBjaGlsZENvbnRleHQgPSBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQoKTtcblxuICAgIGZvciAodmFyIGNvbnRleHRLZXkgaW4gY2hpbGRDb250ZXh0KSB7XG4gICAgICBpZiAoIShjb250ZXh0S2V5IGluIGNoaWxkQ29udGV4dFR5cGVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJykgKyBcIi5nZXRDaGlsZENvbnRleHQoKToga2V5IFxcXCJcIiArIGNvbnRleHRLZXkgKyBcIlxcXCIgaXMgbm90IGRlZmluZWQgaW4gY2hpbGRDb250ZXh0VHlwZXMuXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nO1xuICAgICAgY2hlY2tQcm9wVHlwZXMoY2hpbGRDb250ZXh0VHlwZXMsIGNoaWxkQ29udGV4dCwgJ2NoaWxkIGNvbnRleHQnLCBuYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXNzaWduKHt9LCBwYXJlbnRDb250ZXh0LCBjaGlsZENvbnRleHQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsgLy8gV2UgcHVzaCB0aGUgY29udGV4dCBhcyBlYXJseSBhcyBwb3NzaWJsZSB0byBlbnN1cmUgc3RhY2sgaW50ZWdyaXR5LlxuICAgIC8vIElmIHRoZSBpbnN0YW5jZSBkb2VzIG5vdCBleGlzdCB5ZXQsIHdlIHdpbGwgcHVzaCBudWxsIGF0IGZpcnN0LFxuICAgIC8vIGFuZCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBsYXRlciB3aGVuIGludmFsaWRhdGluZyB0aGUgY29udGV4dC5cblxuICAgIHZhciBtZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCA9IGluc3RhbmNlICYmIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0IHx8IGVtcHR5Q29udGV4dE9iamVjdDsgLy8gUmVtZW1iZXIgdGhlIHBhcmVudCBjb250ZXh0IHNvIHdlIGNhbiBtZXJnZSB3aXRoIGl0IGxhdGVyLlxuICAgIC8vIEluaGVyaXQgdGhlIHBhcmVudCdzIGRpZC1wZXJmb3JtLXdvcmsgdmFsdWUgdG8gYXZvaWQgaW5hZHZlcnRlbnRseSBibG9ja2luZyB1cGRhdGVzLlxuXG4gICAgcHJldmlvdXNDb250ZXh0ID0gY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLmN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZhbGlkYXRlQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCB0eXBlLCBkaWRDaGFuZ2UpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gaGF2ZSBhbiBpbnN0YW5jZSBieSB0aGlzIHBvaW50LiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgaWYgKGRpZENoYW5nZSkge1xuICAgICAgLy8gTWVyZ2UgcGFyZW50IGFuZCBvd24gY29udGV4dC5cbiAgICAgIC8vIFNraXAgdGhpcyBpZiB3ZSdyZSBub3QgdXBkYXRpbmcgZHVlIHRvIHNDVS5cbiAgICAgIC8vIFRoaXMgYXZvaWRzIHVubmVjZXNzYXJpbHkgcmVjb21wdXRpbmcgbWVtb2l6ZWQgdmFsdWVzLlxuICAgICAgdmFyIG1lcmdlZENvbnRleHQgPSBwcm9jZXNzQ2hpbGRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB0eXBlLCBwcmV2aW91c0NvbnRleHQpO1xuICAgICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgPSBtZXJnZWRDb250ZXh0OyAvLyBSZXBsYWNlIHRoZSBvbGQgKG9yIGVtcHR5KSBjb250ZXh0IHdpdGggdGhlIG5ldyBvbmUuXG4gICAgICAvLyBJdCBpcyBpbXBvcnRhbnQgdG8gdW53aW5kIHRoZSBjb250ZXh0IGluIHRoZSByZXZlcnNlIG9yZGVyLlxuXG4gICAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpOyAvLyBOb3cgcHVzaCB0aGUgbmV3IGNvbnRleHQgYW5kIG1hcmsgdGhhdCBpdCBoYXMgY2hhbmdlZC5cblxuICAgICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lcmdlZENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcikge1xuICB7XG4gICAgLy8gQ3VycmVudGx5IHRoaXMgaXMgb25seSB1c2VkIHdpdGggcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7IG5vdCBzdXJlIGlmIGl0XG4gICAgLy8gbWFrZXMgc2Vuc2UgZWxzZXdoZXJlXG4gICAgaWYgKCFpc0ZpYmVyTW91bnRlZChmaWJlcikgfHwgZmliZXIudGFnICE9PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBzdWJ0cmVlIHBhcmVudCB0byBiZSBhIG1vdW50ZWQgY2xhc3MgY29tcG9uZW50LiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgdmFyIG5vZGUgPSBmaWJlcjtcblxuICAgIGRvIHtcbiAgICAgIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICByZXR1cm4gbm9kZS5zdGF0ZU5vZGUuY29udGV4dDtcblxuICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBDb21wb25lbnQgPSBub2RlLnR5cGU7XG5cbiAgICAgICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBub2RlLnN0YXRlTm9kZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfSB3aGlsZSAobm9kZSAhPT0gbnVsbCk7XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIHVuZXhwZWN0ZWQgZGV0YWNoZWQgc3VidHJlZSBwYXJlbnQuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxufVxuXG52YXIgTGVnYWN5Um9vdCA9IDA7XG52YXIgQ29uY3VycmVudFJvb3QgPSAxO1xuXG52YXIgc3luY1F1ZXVlID0gbnVsbDtcbnZhciBpbmNsdWRlc0xlZ2FjeVN5bmNDYWxsYmFja3MgPSBmYWxzZTtcbnZhciBpc0ZsdXNoaW5nU3luY1F1ZXVlID0gZmFsc2U7XG5mdW5jdGlvbiBzY2hlZHVsZVN5bmNDYWxsYmFjayhjYWxsYmFjaykge1xuICAvLyBQdXNoIHRoaXMgY2FsbGJhY2sgaW50byBhbiBpbnRlcm5hbCBxdWV1ZS4gV2UnbGwgZmx1c2ggdGhlc2UgZWl0aGVyIGluXG4gIC8vIHRoZSBuZXh0IHRpY2ssIG9yIGVhcmxpZXIgaWYgc29tZXRoaW5nIGNhbGxzIGBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlYC5cbiAgaWYgKHN5bmNRdWV1ZSA9PT0gbnVsbCkge1xuICAgIHN5bmNRdWV1ZSA9IFtjYWxsYmFja107XG4gIH0gZWxzZSB7XG4gICAgLy8gUHVzaCBvbnRvIGV4aXN0aW5nIHF1ZXVlLiBEb24ndCBuZWVkIHRvIHNjaGVkdWxlIGEgY2FsbGJhY2sgYmVjYXVzZVxuICAgIC8vIHdlIGFscmVhZHkgc2NoZWR1bGVkIG9uZSB3aGVuIHdlIGNyZWF0ZWQgdGhlIHF1ZXVlLlxuICAgIHN5bmNRdWV1ZS5wdXNoKGNhbGxiYWNrKTtcbiAgfVxufVxuZnVuY3Rpb24gc2NoZWR1bGVMZWdhY3lTeW5jQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzID0gdHJ1ZTtcbiAgc2NoZWR1bGVTeW5jQ2FsbGJhY2soY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gZmx1c2hTeW5jQ2FsbGJhY2tzT25seUluTGVnYWN5TW9kZSgpIHtcbiAgLy8gT25seSBmbHVzaGVzIHRoZSBxdWV1ZSBpZiB0aGVyZSdzIGEgbGVnYWN5IHN5bmMgY2FsbGJhY2sgc2NoZWR1bGVkLlxuICAvLyBUT0RPOiBUaGVyZSdzIG9ubHkgYSBzaW5nbGUgdHlwZSBvZiBjYWxsYmFjazogcGVyZm9ybVN5bmNPbldvcmtPblJvb3QuIFNvXG4gIC8vIGl0IG1pZ2h0IG1ha2UgbW9yZSBzZW5zZSBmb3IgdGhlIHF1ZXVlIHRvIGJlIGEgbGlzdCBvZiByb290cyBpbnN0ZWFkIG9mIGFcbiAgLy8gbGlzdCBvZiBnZW5lcmljIGNhbGxiYWNrcy4gVGhlbiB3ZSBjYW4gaGF2ZSB0d286IG9uZSBmb3IgbGVnYWN5IHJvb3RzLCBvbmVcbiAgLy8gZm9yIGNvbmN1cnJlbnQgcm9vdHMuIEFuZCB0aGlzIG1ldGhvZCB3b3VsZCBvbmx5IGZsdXNoIHRoZSBsZWdhY3kgb25lcy5cbiAgaWYgKGluY2x1ZGVzTGVnYWN5U3luY0NhbGxiYWNrcykge1xuICAgIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuICB9XG59XG5mdW5jdGlvbiBmbHVzaFN5bmNDYWxsYmFja3MoKSB7XG4gIGlmICghaXNGbHVzaGluZ1N5bmNRdWV1ZSAmJiBzeW5jUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBQcmV2ZW50IHJlLWVudHJhbmNlLlxuICAgIGlzRmx1c2hpbmdTeW5jUXVldWUgPSB0cnVlO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcHJldmlvdXNVcGRhdGVQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBpc1N5bmMgPSB0cnVlO1xuICAgICAgdmFyIHF1ZXVlID0gc3luY1F1ZXVlOyAvLyBUT0RPOiBJcyB0aGlzIG5lY2Vzc2FyeSBhbnltb3JlPyBUaGUgb25seSB1c2VyIGNvZGUgdGhhdCBydW5zIGluIHRoaXNcbiAgICAgIC8vIHF1ZXVlIGlzIGluIHRoZSByZW5kZXIgb3IgY29tbWl0IHBoYXNlcy5cblxuICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG5cbiAgICAgIGZvciAoOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gcXVldWVbaV07XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2soaXNTeW5jKTtcbiAgICAgICAgfSB3aGlsZSAoY2FsbGJhY2sgIT09IG51bGwpO1xuICAgICAgfVxuXG4gICAgICBzeW5jUXVldWUgPSBudWxsO1xuICAgICAgaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzID0gZmFsc2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJvd3MsIGxlYXZlIHRoZSByZW1haW5pbmcgY2FsbGJhY2tzIG9uIHRoZSBxdWV1ZS5cbiAgICAgIGlmIChzeW5jUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgc3luY1F1ZXVlID0gc3luY1F1ZXVlLnNsaWNlKGkgKyAxKTtcbiAgICAgIH0gLy8gUmVzdW1lIGZsdXNoaW5nIGluIHRoZSBuZXh0IHRpY2tcblxuXG4gICAgICBzY2hlZHVsZUNhbGxiYWNrKEltbWVkaWF0ZVByaW9yaXR5LCBmbHVzaFN5bmNDYWxsYmFja3MpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1VwZGF0ZVByaW9yaXR5KTtcbiAgICAgIGlzRmx1c2hpbmdTeW5jUXVldWUgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gVE9ETzogVXNlIHRoZSB1bmlmaWVkIGZpYmVyIHN0YWNrIG1vZHVsZSBpbnN0ZWFkIG9mIHRoaXMgbG9jYWwgb25lP1xuLy8gSW50ZW50aW9uYWxseSBub3QgdXNpbmcgaXQgeWV0IHRvIGRlcmlzayB0aGUgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiwgYmVjYXVzZVxuLy8gdGhlIHdheSB3ZSBwdXNoL3BvcCB0aGVzZSB2YWx1ZXMgaXMgYSBiaXQgdW51c3VhbC4gSWYgdGhlcmUncyBhIG1pc3Rha2UsIEknZFxuLy8gcmF0aGVyIHRoZSBpZHMgYmUgd3JvbmcgdGhhbiBjcmFzaCB0aGUgd2hvbGUgcmVjb25jaWxlci5cbnZhciBmb3JrU3RhY2sgPSBbXTtcbnZhciBmb3JrU3RhY2tJbmRleCA9IDA7XG52YXIgdHJlZUZvcmtQcm92aWRlciA9IG51bGw7XG52YXIgdHJlZUZvcmtDb3VudCA9IDA7XG52YXIgaWRTdGFjayA9IFtdO1xudmFyIGlkU3RhY2tJbmRleCA9IDA7XG52YXIgdHJlZUNvbnRleHRQcm92aWRlciA9IG51bGw7XG52YXIgdHJlZUNvbnRleHRJZCA9IDE7XG52YXIgdHJlZUNvbnRleHRPdmVyZmxvdyA9ICcnO1xuZnVuY3Rpb24gaXNGb3JrZWRDaGlsZCh3b3JrSW5Qcm9ncmVzcykge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgcmV0dXJuICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmtlZCkgIT09IE5vRmxhZ3M7XG59XG5mdW5jdGlvbiBnZXRGb3Jrc0F0TGV2ZWwod29ya0luUHJvZ3Jlc3MpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIHJldHVybiB0cmVlRm9ya0NvdW50O1xufVxuZnVuY3Rpb24gZ2V0VHJlZUlkKCkge1xuICB2YXIgb3ZlcmZsb3cgPSB0cmVlQ29udGV4dE92ZXJmbG93O1xuICB2YXIgaWRXaXRoTGVhZGluZ0JpdCA9IHRyZWVDb250ZXh0SWQ7XG4gIHZhciBpZCA9IGlkV2l0aExlYWRpbmdCaXQgJiB+Z2V0TGVhZGluZ0JpdChpZFdpdGhMZWFkaW5nQml0KTtcbiAgcmV0dXJuIGlkLnRvU3RyaW5nKDMyKSArIG92ZXJmbG93O1xufVxuZnVuY3Rpb24gcHVzaFRyZWVGb3JrKHdvcmtJblByb2dyZXNzLCB0b3RhbENoaWxkcmVuKSB7XG4gIC8vIFRoaXMgaXMgY2FsbGVkIHJpZ2h0IGFmdGVyIHdlIHJlY29uY2lsZSBhbiBhcnJheSAob3IgaXRlcmF0b3IpIG9mIGNoaWxkXG4gIC8vIGZpYmVycywgYmVjYXVzZSB0aGF0J3MgdGhlIG9ubHkgcGxhY2Ugd2hlcmUgd2Uga25vdyBob3cgbWFueSBjaGlsZHJlbiBpblxuICAvLyB0aGUgd2hvbGUgc2V0IHdpdGhvdXQgZG9pbmcgZXh0cmEgd29yayBsYXRlciwgb3Igc3RvcmluZyBhZGR0aW9uYWxcbiAgLy8gaW5mb3JtYXRpb24gb24gdGhlIGZpYmVyLlxuICAvL1xuICAvLyBUaGF0J3Mgd2h5IHRoaXMgZnVuY3Rpb24gaXMgc2VwYXJhdGUgZnJvbSBwdXNoVHJlZUlkIOKAlCBpdCdzIGNhbGxlZCBkdXJpbmdcbiAgLy8gdGhlIHJlbmRlciBwaGFzZSBvZiB0aGUgZm9yayBwYXJlbnQsIG5vdCB0aGUgY2hpbGQsIHdoaWNoIGlzIHdoZXJlIHdlIHB1c2hcbiAgLy8gdGhlIG90aGVyIGNvbnRleHQgdmFsdWVzLlxuICAvL1xuICAvLyBJbiB0aGUgRml6eiBpbXBsZW1lbnRhdGlvbiB0aGlzIGlzIG11Y2ggc2ltcGxlciBiZWNhdXNlIHRoZSBjaGlsZCBpc1xuICAvLyByZW5kZXJlZCBpbiB0aGUgc2FtZSBjYWxsc3RhY2sgYXMgdGhlIHBhcmVudC5cbiAgLy9cbiAgLy8gSXQgbWlnaHQgYmUgYmV0dGVyIHRvIGp1c3QgYWRkIGEgYGZvcmtzYCBmaWVsZCB0byB0aGUgRmliZXIgdHlwZS4gSXQgd291bGRcbiAgLy8gbWFrZSB0aGlzIG1vZHVsZSBzaW1wbGVyLlxuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4KytdID0gdHJlZUZvcmtDb3VudDtcbiAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4KytdID0gdHJlZUZvcmtQcm92aWRlcjtcbiAgdHJlZUZvcmtQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xuICB0cmVlRm9ya0NvdW50ID0gdG90YWxDaGlsZHJlbjtcbn1cbmZ1bmN0aW9uIHB1c2hUcmVlSWQod29ya0luUHJvZ3Jlc3MsIHRvdGFsQ2hpbGRyZW4sIGluZGV4KSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0SWQ7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRPdmVyZmxvdztcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dFByb3ZpZGVyO1xuICB0cmVlQ29udGV4dFByb3ZpZGVyID0gd29ya0luUHJvZ3Jlc3M7XG4gIHZhciBiYXNlSWRXaXRoTGVhZGluZ0JpdCA9IHRyZWVDb250ZXh0SWQ7XG4gIHZhciBiYXNlT3ZlcmZsb3cgPSB0cmVlQ29udGV4dE92ZXJmbG93OyAvLyBUaGUgbGVmdG1vc3QgMSBtYXJrcyB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZSwgbm9uLWluY2x1c2l2ZS4gSXQncyBub3QgcGFydFxuICAvLyBvZiB0aGUgaWQ7IHdlIHVzZSBpdCB0byBhY2NvdW50IGZvciBsZWFkaW5nIDBzLlxuXG4gIHZhciBiYXNlTGVuZ3RoID0gZ2V0Qml0TGVuZ3RoKGJhc2VJZFdpdGhMZWFkaW5nQml0KSAtIDE7XG4gIHZhciBiYXNlSWQgPSBiYXNlSWRXaXRoTGVhZGluZ0JpdCAmIH4oMSA8PCBiYXNlTGVuZ3RoKTtcbiAgdmFyIHNsb3QgPSBpbmRleCArIDE7XG4gIHZhciBsZW5ndGggPSBnZXRCaXRMZW5ndGgodG90YWxDaGlsZHJlbikgKyBiYXNlTGVuZ3RoOyAvLyAzMCBpcyB0aGUgbWF4IGxlbmd0aCB3ZSBjYW4gc3RvcmUgd2l0aG91dCBvdmVyZmxvd2luZywgdGFraW5nIGludG9cbiAgLy8gY29uc2lkZXJhdGlvbiB0aGUgbGVhZGluZyAxIHdlIHVzZSB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLlxuXG4gIGlmIChsZW5ndGggPiAzMCkge1xuICAgIC8vIFdlIG92ZXJmbG93ZWQgdGhlIGJpdHdpc2Utc2FmZSByYW5nZS4gRmFsbCBiYWNrIHRvIHNsb3dlciBhbGdvcml0aG0uXG4gICAgLy8gVGhpcyBicmFuY2ggYXNzdW1lcyB0aGUgbGVuZ3RoIG9mIHRoZSBiYXNlIGlkIGlzIGdyZWF0ZXIgdGhhbiA1OyBpdCB3b24ndFxuICAgIC8vIHdvcmsgZm9yIHNtYWxsZXIgaWRzLCBiZWNhdXNlIHlvdSBuZWVkIDUgYml0cyBwZXIgY2hhcmFjdGVyLlxuICAgIC8vXG4gICAgLy8gV2UgZW5jb2RlIHRoZSBpZCBpbiBtdWx0aXBsZSBzdGVwczogZmlyc3QgdGhlIGJhc2UgaWQsIHRoZW4gdGhlXG4gICAgLy8gcmVtYWluaW5nIGRpZ2l0cy5cbiAgICAvL1xuICAgIC8vIEVhY2ggNSBiaXQgc2VxdWVuY2UgY29ycmVzcG9uZHMgdG8gYSBzaW5nbGUgYmFzZSAzMiBjaGFyYWN0ZXIuIFNvIGZvclxuICAgIC8vIGV4YW1wbGUsIGlmIHRoZSBjdXJyZW50IGlkIGlzIDIzIGJpdHMgbG9uZywgd2UgY2FuIGNvbnZlcnQgMjAgb2YgdGhvc2VcbiAgICAvLyBiaXRzIGludG8gYSBzdHJpbmcgb2YgNCBjaGFyYWN0ZXJzLCB3aXRoIDMgYml0cyBsZWZ0IG92ZXIuXG4gICAgLy9cbiAgICAvLyBGaXJzdCBjYWxjdWxhdGUgaG93IG1hbnkgYml0cyBpbiB0aGUgYmFzZSBpZCByZXByZXNlbnQgYSBjb21wbGV0ZVxuICAgIC8vIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMuXG4gICAgdmFyIG51bWJlck9mT3ZlcmZsb3dCaXRzID0gYmFzZUxlbmd0aCAtIGJhc2VMZW5ndGggJSA1OyAvLyBUaGVuIGNyZWF0ZSBhIGJpdG1hc2sgdGhhdCBzZWxlY3RzIG9ubHkgdGhvc2UgYml0cy5cblxuICAgIHZhciBuZXdPdmVyZmxvd0JpdHMgPSAoMSA8PCBudW1iZXJPZk92ZXJmbG93Qml0cykgLSAxOyAvLyBTZWxlY3QgdGhlIGJpdHMsIGFuZCBjb252ZXJ0IHRoZW0gdG8gYSBiYXNlIDMyIHN0cmluZy5cblxuICAgIHZhciBuZXdPdmVyZmxvdyA9IChiYXNlSWQgJiBuZXdPdmVyZmxvd0JpdHMpLnRvU3RyaW5nKDMyKTsgLy8gTm93IHdlIGNhbiByZW1vdmUgdGhvc2UgYml0cyBmcm9tIHRoZSBiYXNlIGlkLlxuXG4gICAgdmFyIHJlc3RPZkJhc2VJZCA9IGJhc2VJZCA+PiBudW1iZXJPZk92ZXJmbG93Qml0cztcbiAgICB2YXIgcmVzdE9mQmFzZUxlbmd0aCA9IGJhc2VMZW5ndGggLSBudW1iZXJPZk92ZXJmbG93Qml0czsgLy8gRmluYWxseSwgZW5jb2RlIHRoZSByZXN0IG9mIHRoZSBiaXRzIHVzaW5nIHRoZSBub3JtYWwgYWxnb3JpdGhtLiBCZWNhdXNlXG4gICAgLy8gd2UgbWFkZSBtb3JlIHJvb20sIHRoaXMgdGltZSBpdCB3b24ndCBvdmVyZmxvdy5cblxuICAgIHZhciByZXN0T2ZMZW5ndGggPSBnZXRCaXRMZW5ndGgodG90YWxDaGlsZHJlbikgKyByZXN0T2ZCYXNlTGVuZ3RoO1xuICAgIHZhciByZXN0T2ZOZXdCaXRzID0gc2xvdCA8PCByZXN0T2ZCYXNlTGVuZ3RoO1xuICAgIHZhciBpZCA9IHJlc3RPZk5ld0JpdHMgfCByZXN0T2ZCYXNlSWQ7XG4gICAgdmFyIG92ZXJmbG93ID0gbmV3T3ZlcmZsb3cgKyBiYXNlT3ZlcmZsb3c7XG4gICAgdHJlZUNvbnRleHRJZCA9IDEgPDwgcmVzdE9mTGVuZ3RoIHwgaWQ7XG4gICAgdHJlZUNvbnRleHRPdmVyZmxvdyA9IG92ZXJmbG93O1xuICB9IGVsc2Uge1xuICAgIC8vIE5vcm1hbCBwYXRoXG4gICAgdmFyIG5ld0JpdHMgPSBzbG90IDw8IGJhc2VMZW5ndGg7XG5cbiAgICB2YXIgX2lkID0gbmV3Qml0cyB8IGJhc2VJZDtcblxuICAgIHZhciBfb3ZlcmZsb3cgPSBiYXNlT3ZlcmZsb3c7XG4gICAgdHJlZUNvbnRleHRJZCA9IDEgPDwgbGVuZ3RoIHwgX2lkO1xuICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBfb3ZlcmZsb3c7XG4gIH1cbn1cbmZ1bmN0aW9uIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7IC8vIFRoaXMgY29tcG9uZW50IG1hdGVyaWFsaXplZCBhbiBpZC4gVGhpcyB3aWxsIGFmZmVjdCBhbnkgaWRzIHRoYXQgYXBwZWFyXG4gIC8vIGluIGl0cyBjaGlsZHJlbi5cblxuICB2YXIgcmV0dXJuRmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG5cbiAgaWYgKHJldHVybkZpYmVyICE9PSBudWxsKSB7XG4gICAgdmFyIG51bWJlck9mRm9ya3MgPSAxO1xuICAgIHZhciBzbG90SW5kZXggPSAwO1xuICAgIHB1c2hUcmVlRm9yayh3b3JrSW5Qcm9ncmVzcywgbnVtYmVyT2ZGb3Jrcyk7XG4gICAgcHVzaFRyZWVJZCh3b3JrSW5Qcm9ncmVzcywgbnVtYmVyT2ZGb3Jrcywgc2xvdEluZGV4KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRCaXRMZW5ndGgobnVtYmVyKSB7XG4gIHJldHVybiAzMiAtIGNsejMyKG51bWJlcik7XG59XG5cbmZ1bmN0aW9uIGdldExlYWRpbmdCaXQoaWQpIHtcbiAgcmV0dXJuIDEgPDwgZ2V0Qml0TGVuZ3RoKGlkKSAtIDE7XG59XG5cbmZ1bmN0aW9uIHBvcFRyZWVDb250ZXh0KHdvcmtJblByb2dyZXNzKSB7XG4gIC8vIFJlc3RvcmUgdGhlIHByZXZpb3VzIHZhbHVlcy5cbiAgLy8gVGhpcyBpcyBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gb3RoZXIgY29udGV4dC1saWtlIG1vZHVsZXMgaW4gRmliZXJcbiAgLy8gYmVjYXVzZSB0aGUgc2FtZSBGaWJlciBtYXkgYXBwZWFyIG9uIHRoZSBzdGFjayBtdWx0aXBsZSB0aW1lcyBhbmQgZm9yXG4gIC8vIGRpZmZlcmVudCByZWFzb25zLiBXZSBoYXZlIHRvIGtlZXAgcG9wcGluZyB1bnRpbCB0aGUgd29yay1pbi1wcm9ncmVzcyBpc1xuICAvLyBubyBsb25nZXIgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2suXG4gIHdoaWxlICh3b3JrSW5Qcm9ncmVzcyA9PT0gdHJlZUZvcmtQcm92aWRlcikge1xuICAgIHRyZWVGb3JrUHJvdmlkZXIgPSBmb3JrU3RhY2tbLS1mb3JrU3RhY2tJbmRleF07XG4gICAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4XSA9IG51bGw7XG4gICAgdHJlZUZvcmtDb3VudCA9IGZvcmtTdGFja1stLWZvcmtTdGFja0luZGV4XTtcbiAgICBmb3JrU3RhY2tbZm9ya1N0YWNrSW5kZXhdID0gbnVsbDtcbiAgfVxuXG4gIHdoaWxlICh3b3JrSW5Qcm9ncmVzcyA9PT0gdHJlZUNvbnRleHRQcm92aWRlcikge1xuICAgIHRyZWVDb250ZXh0UHJvdmlkZXIgPSBpZFN0YWNrWy0taWRTdGFja0luZGV4XTtcbiAgICBpZFN0YWNrW2lkU3RhY2tJbmRleF0gPSBudWxsO1xuICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBpZFN0YWNrWy0taWRTdGFja0luZGV4XTtcbiAgICBpZFN0YWNrW2lkU3RhY2tJbmRleF0gPSBudWxsO1xuICAgIHRyZWVDb250ZXh0SWQgPSBpZFN0YWNrWy0taWRTdGFja0luZGV4XTtcbiAgICBpZFN0YWNrW2lkU3RhY2tJbmRleF0gPSBudWxsO1xuICB9XG59XG5mdW5jdGlvbiBnZXRTdXNwZW5kZWRUcmVlQ29udGV4dCgpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG5cbiAgaWYgKHRyZWVDb250ZXh0UHJvdmlkZXIgIT09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRyZWVDb250ZXh0SWQsXG4gICAgICBvdmVyZmxvdzogdHJlZUNvbnRleHRPdmVyZmxvd1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVTdXNwZW5kZWRUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuZGVkQ29udGV4dCkge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dElkO1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0T3ZlcmZsb3c7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRQcm92aWRlcjtcbiAgdHJlZUNvbnRleHRJZCA9IHN1c3BlbmRlZENvbnRleHQuaWQ7XG4gIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBzdXNwZW5kZWRDb250ZXh0Lm92ZXJmbG93O1xuICB0cmVlQ29udGV4dFByb3ZpZGVyID0gd29ya0luUHJvZ3Jlc3M7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZk5vdEh5ZHJhdGluZygpIHtcbiAge1xuICAgIGlmICghZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHRvIGJlIGh5ZHJhdGluZy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgJyArICdhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhpcyBtYXkgaGF2ZSBiZWVuIGFuIGluc2VydGlvbiBvciBhIGh5ZHJhdGlvbi5cblxudmFyIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gbnVsbDtcbnZhciBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbnZhciBpc0h5ZHJhdGluZyA9IGZhbHNlOyAvLyBUaGlzIGZsYWcgYWxsb3dzIGZvciB3YXJuaW5nIHN1cHJlc3Npb24gd2hlbiB3ZSBleHBlY3QgdGhlcmUgdG8gYmUgbWlzbWF0Y2hlc1xuLy8gZHVlIHRvIGVhcmxpZXIgbWlzbWF0Y2hlcyBvciBhIHN1c3BlbmRlZCBmaWJlci5cblxudmFyIGRpZFN1c3BlbmRPckVycm9yREVWID0gZmFsc2U7IC8vIEh5ZHJhdGlvbiBlcnJvcnMgdGhhdCB3ZXJlIHRocm93biBpbnNpZGUgdGhpcyBib3VuZGFyeVxuXG52YXIgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcblxuZnVuY3Rpb24gd2FybklmSHlkcmF0aW5nKCkge1xuICB7XG4gICAgaWYgKGlzSHlkcmF0aW5nKSB7XG4gICAgICBlcnJvcignV2Ugc2hvdWxkIG5vdCBiZSBoeWRyYXRpbmcgaGVyZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYSBidWcuJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtEaWRUaHJvd1doaWxlSHlkcmF0aW5nREVWKCkge1xuICB7XG4gICAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSB0cnVlO1xuICB9XG59XG5mdW5jdGlvbiBkaWRTdXNwZW5kT3JFcnJvcldoaWxlSHlkcmF0aW5nREVWKCkge1xuICB7XG4gICAgcmV0dXJuIGRpZFN1c3BlbmRPckVycm9yREVWO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVudGVySHlkcmF0aW9uU3RhdGUoZmliZXIpIHtcblxuICB2YXIgcGFyZW50SW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkV2l0aGluQ29udGFpbmVyKHBhcmVudEluc3RhbmNlKTtcbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgaXNIeWRyYXRpbmcgPSB0cnVlO1xuICBoeWRyYXRpb25FcnJvcnMgPSBudWxsO1xuICBkaWRTdXNwZW5kT3JFcnJvckRFViA9IGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVlbnRlckh5ZHJhdGlvblN0YXRlRnJvbURlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKGZpYmVyLCBzdXNwZW5zZUluc3RhbmNlLCB0cmVlQ29udGV4dCkge1xuXG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpblN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gIGlzSHlkcmF0aW5nID0gdHJ1ZTtcbiAgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcbiAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTtcblxuICBpZiAodHJlZUNvbnRleHQgIT09IG51bGwpIHtcbiAgICByZXN0b3JlU3VzcGVuZGVkVHJlZUNvbnRleHQoZmliZXIsIHRyZWVDb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB3YXJuVW5oeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBpbnN0YW5jZSkge1xuICB7XG4gICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5Db250YWluZXIocmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8sIGluc3RhbmNlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gICAgICAgICAgZGlkTm90SHlkcmF0ZUluc3RhbmNlKHJldHVybkZpYmVyLnR5cGUsIHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHMsIHJldHVybkZpYmVyLnN0YXRlTm9kZSwgaW5zdGFuY2UsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgaXNDb25jdXJyZW50TW9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gcmV0dXJuRmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICBpZiAoc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCwgaW5zdGFuY2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShyZXR1cm5GaWJlciwgaW5zdGFuY2UpIHtcbiAgd2FyblVuaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgaW5zdGFuY2UpO1xuICB2YXIgY2hpbGRUb0RlbGV0ZSA9IGNyZWF0ZUZpYmVyRnJvbUhvc3RJbnN0YW5jZUZvckRlbGV0aW9uKCk7XG4gIGNoaWxkVG9EZWxldGUuc3RhdGVOb2RlID0gaW5zdGFuY2U7XG4gIGNoaWxkVG9EZWxldGUucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gIHZhciBkZWxldGlvbnMgPSByZXR1cm5GaWJlci5kZWxldGlvbnM7XG5cbiAgaWYgKGRlbGV0aW9ucyA9PT0gbnVsbCkge1xuICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjaGlsZFRvRGVsZXRlXTtcbiAgICByZXR1cm5GaWJlci5mbGFncyB8PSBDaGlsZERlbGV0aW9uO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0aW9ucy5wdXNoKGNoaWxkVG9EZWxldGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5Ob25oeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBmaWJlcikge1xuICB7XG4gICAgaWYgKGRpZFN1c3BlbmRPckVycm9yREVWKSB7XG4gICAgICAvLyBJbnNpZGUgYSBib3VuZGFyeSB0aGF0IGFscmVhZHkgc3VzcGVuZGVkLiBXZSdyZSBjdXJyZW50bHkgcmVuZGVyaW5nIHRoZVxuICAgICAgLy8gc2libGluZ3Mgb2YgYSBzdXNwZW5kZWQgbm9kZS4gVGhlIG1pc21hdGNoIG1heSBiZSBkdWUgdG8gdGhlIG1pc3NpbmdcbiAgICAgIC8vIGRhdGEsIHNvIGl0J3MgcHJvYmFibHkgYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBwYXJlbnRDb250YWluZXIgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgIHZhciB0eXBlID0gZmliZXIudHlwZTtcbiAgICAgICAgICAgICAgdmFyIHByb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdHlwZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICAgICAgICB2YXIgdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2VXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyLCB0ZXh0KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHBhcmVudFR5cGUgPSByZXR1cm5GaWJlci50eXBlO1xuICAgICAgICAgIHZhciBwYXJlbnRQcm9wcyA9IHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgdmFyIHBhcmVudEluc3RhbmNlID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBfdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgICAgdmFyIF9wcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gICAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIF90eXBlLCBfcHJvcHMsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgICAgICAgaXNDb25jdXJyZW50TW9kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBfdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wcztcblxuICAgICAgICAgICAgICAgIHZhciBfaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG5cbiAgICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIF90ZXh0LCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgICAgIF9pc0NvbmN1cnJlbnRNb2RlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHJldHVybkZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIF9wYXJlbnRJbnN0YW5jZSA9IHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZDtcbiAgICAgICAgICBpZiAoX3BhcmVudEluc3RhbmNlICE9PSBudWxsKSBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICB2YXIgX3R5cGUyID0gZmliZXIudHlwZTtcbiAgICAgICAgICAgICAgdmFyIF9wcm9wczIgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKF9wYXJlbnRJbnN0YW5jZSwgX3R5cGUyKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICAgICAgICAgIHZhciBfdGV4dDIgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShfcGFyZW50SW5zdGFuY2UsIF90ZXh0Mik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydE5vbkh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGZpYmVyKSB7XG4gIGZpYmVyLmZsYWdzID0gZmliZXIuZmxhZ3MgJiB+SHlkcmF0aW5nIHwgUGxhY2VtZW50O1xuICB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiB0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpIHtcbiAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciB0eXBlID0gZmliZXIudHlwZTtcbiAgICAgICAgdmFyIHByb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBjYW5IeWRyYXRlSW5zdGFuY2UobmV4dEluc3RhbmNlLCB0eXBlKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBmaWJlci5zdGF0ZU5vZGUgPSBpbnN0YW5jZTtcbiAgICAgICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICAgICAgICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZChpbnN0YW5jZSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICB2YXIgdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIHRleHRJbnN0YW5jZSA9IGNhbkh5ZHJhdGVUZXh0SW5zdGFuY2UobmV4dEluc3RhbmNlLCB0ZXh0KTtcblxuICAgICAgICBpZiAodGV4dEluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgZmliZXIuc3RhdGVOb2RlID0gdGV4dEluc3RhbmNlO1xuICAgICAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7IC8vIFRleHQgSW5zdGFuY2VzIGRvbid0IGhhdmUgY2hpbGRyZW4gc28gdGhlcmUncyBub3RoaW5nIHRvIGh5ZHJhdGUuXG5cbiAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBzdXNwZW5zZUluc3RhbmNlID0gY2FuSHlkcmF0ZVN1c3BlbnNlSW5zdGFuY2UobmV4dEluc3RhbmNlKTtcblxuICAgICAgICBpZiAoc3VzcGVuc2VJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0ge1xuICAgICAgICAgICAgZGVoeWRyYXRlZDogc3VzcGVuc2VJbnN0YW5jZSxcbiAgICAgICAgICAgIHRyZWVDb250ZXh0OiBnZXRTdXNwZW5kZWRUcmVlQ29udGV4dCgpLFxuICAgICAgICAgICAgcmV0cnlMYW5lOiBPZmZzY3JlZW5MYW5lXG4gICAgICAgICAgfTtcbiAgICAgICAgICBmaWJlci5tZW1vaXplZFN0YXRlID0gc3VzcGVuc2VTdGF0ZTsgLy8gU3RvcmUgdGhlIGRlaHlkcmF0ZWQgZnJhZ21lbnQgYXMgYSBjaGlsZCBmaWJlci5cbiAgICAgICAgICAvLyBUaGlzIHNpbXBsaWZpZXMgdGhlIGNvZGUgZm9yIGdldEhvc3RTaWJsaW5nIGFuZCBkZWxldGluZyBub2RlcyxcbiAgICAgICAgICAvLyBzaW5jZSBpdCBkb2Vzbid0IGhhdmUgdG8gY29uc2lkZXIgYWxsIFN1c3BlbnNlIGJvdW5kYXJpZXMgYW5kXG4gICAgICAgICAgLy8gY2hlY2sgaWYgdGhleSdyZSBkZWh5ZHJhdGVkIG9uZXMgb3Igbm90LlxuXG4gICAgICAgICAgdmFyIGRlaHlkcmF0ZWRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbURlaHlkcmF0ZWRGcmFnbWVudChzdXNwZW5zZUluc3RhbmNlKTtcbiAgICAgICAgICBkZWh5ZHJhdGVkRnJhZ21lbnQucmV0dXJuID0gZmliZXI7XG4gICAgICAgICAgZmliZXIuY2hpbGQgPSBkZWh5ZHJhdGVkRnJhZ21lbnQ7XG4gICAgICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjsgLy8gV2hpbGUgYSBTdXNwZW5zZSBJbnN0YW5jZSBkb2VzIGhhdmUgY2hpbGRyZW4sIHdlIHdvbid0IHN0ZXAgaW50b1xuICAgICAgICAgIC8vIGl0IGR1cmluZyB0aGUgZmlyc3QgcGFzcy4gSW5zdGVhZCwgd2UnbGwgcmVlbnRlciBpdCBsYXRlci5cblxuICAgICAgICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBudWxsO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDbGllbnRSZW5kZXJPbk1pc21hdGNoKGZpYmVyKSB7XG4gIHJldHVybiAoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlICYmIChmaWJlci5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzO1xufVxuXG5mdW5jdGlvbiB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2goZmliZXIpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdIeWRyYXRpb24gZmFpbGVkIGJlY2F1c2UgdGhlIGluaXRpYWwgVUkgZG9lcyBub3QgbWF0Y2ggd2hhdCB3YXMgJyArICdyZW5kZXJlZCBvbiB0aGUgc2VydmVyLicpO1xufVxuXG5mdW5jdGlvbiB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZShmaWJlcikge1xuICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIG5leHRJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG5cbiAgaWYgKCFuZXh0SW5zdGFuY2UpIHtcbiAgICBpZiAoc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikpIHtcbiAgICAgIHdhcm5Ob25oeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgICB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2goKTtcbiAgICB9IC8vIE5vdGhpbmcgdG8gaHlkcmF0ZS4gTWFrZSBpdCBhbiBpbnNlcnRpb24uXG5cblxuICAgIGluc2VydE5vbkh5ZHJhdGVkSW5zdGFuY2UoaHlkcmF0aW9uUGFyZW50RmliZXIsIGZpYmVyKTtcbiAgICBpc0h5ZHJhdGluZyA9IGZhbHNlO1xuICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UgPSBuZXh0SW5zdGFuY2U7XG5cbiAgaWYgKCF0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpKSB7XG4gICAgaWYgKHNob3VsZENsaWVudFJlbmRlck9uTWlzbWF0Y2goZmliZXIpKSB7XG4gICAgICB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpO1xuICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKCk7XG4gICAgfSAvLyBJZiB3ZSBjYW4ndCBoeWRyYXRlIHRoaXMgaW5zdGFuY2UgbGV0J3MgdHJ5IHRoZSBuZXh0IG9uZS5cbiAgICAvLyBXZSB1c2UgdGhpcyBhcyBhIGhldXJpc3RpYy4gSXQncyBiYXNlZCBvbiBpbnR1aXRpb24gYW5kIG5vdCBkYXRhIHNvIGl0XG4gICAgLy8gbWlnaHQgYmUgZmxhd2VkIG9yIHVubmVjZXNzYXJ5LlxuXG5cbiAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoZmlyc3RBdHRlbXB0ZWRJbnN0YW5jZSk7XG4gICAgdmFyIHByZXZIeWRyYXRpb25QYXJlbnRGaWJlciA9IGh5ZHJhdGlvblBhcmVudEZpYmVyO1xuXG4gICAgaWYgKCFuZXh0SW5zdGFuY2UgfHwgIXRyeUh5ZHJhdGUoZmliZXIsIG5leHRJbnN0YW5jZSkpIHtcbiAgICAgIC8vIE5vdGhpbmcgdG8gaHlkcmF0ZS4gTWFrZSBpdCBhbiBpbnNlcnRpb24uXG4gICAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgICBpc0h5ZHJhdGluZyA9IGZhbHNlO1xuICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFdlIG1hdGNoZWQgdGhlIG5leHQgb25lLCB3ZSdsbCBub3cgYXNzdW1lIHRoYXQgdGhlIGZpcnN0IG9uZSB3YXNcbiAgICAvLyBzdXBlcmZsdW91cyBhbmQgd2UnbGwgZGVsZXRlIGl0LiBTaW5jZSB3ZSBjYW4ndCBlYWdlcmx5IGRlbGV0ZSBpdFxuICAgIC8vIHdlJ2xsIGhhdmUgdG8gc2NoZWR1bGUgYSBkZWxldGlvbi4gVG8gZG8gdGhhdCwgdGhpcyBub2RlIG5lZWRzIGEgZHVtbXlcbiAgICAvLyBmaWJlciBhc3NvY2lhdGVkIHdpdGggaXQuXG5cblxuICAgIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShwcmV2SHlkcmF0aW9uUGFyZW50RmliZXIsIGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVUb0h5ZHJhdGVIb3N0SW5zdGFuY2UoZmliZXIsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQpIHtcblxuICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gIHZhciBzaG91bGRXYXJuSWZNaXNtYXRjaERldiA9ICFkaWRTdXNwZW5kT3JFcnJvckRFVjtcbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBoeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIGZpYmVyLnR5cGUsIGZpYmVyLm1lbW9pemVkUHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGZpYmVyLCBzaG91bGRXYXJuSWZNaXNtYXRjaERldik7IC8vIFRPRE86IFR5cGUgdGhpcyBzcGVjaWZpYyB0byB0aGlzIHR5cGUgb2YgY29tcG9uZW50LlxuXG4gIGZpYmVyLnVwZGF0ZVF1ZXVlID0gdXBkYXRlUGF5bG9hZDsgLy8gSWYgdGhlIHVwZGF0ZSBwYXlsb2FkIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEgY2hhbmdlIG9yIGlmIHRoZXJlXG4gIC8vIGlzIGEgbmV3IHJlZiB3ZSBtYXJrIHRoaXMgYXMgYW4gdXBkYXRlLlxuXG4gIGlmICh1cGRhdGVQYXlsb2FkICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVUb0h5ZHJhdGVIb3N0VGV4dEluc3RhbmNlKGZpYmVyKSB7XG5cbiAgdmFyIHRleHRJbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgdmFyIHRleHRDb250ZW50ID0gZmliZXIubWVtb2l6ZWRQcm9wcztcbiAgdmFyIHNob3VsZFVwZGF0ZSA9IGh5ZHJhdGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlLCB0ZXh0Q29udGVudCwgZmliZXIpO1xuXG4gIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAvLyBXZSBhc3N1bWUgdGhhdCBwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZSBpcyBjYWxsZWQgaW4gYSBjb250ZXh0IHdoZXJlIHRoZVxuICAgIC8vIGh5ZHJhdGlvbiBwYXJlbnQgaXMgdGhlIHBhcmVudCBob3N0IGNvbXBvbmVudCBvZiB0aGlzIGhvc3QgdGV4dC5cbiAgICB2YXIgcmV0dXJuRmliZXIgPSBoeWRyYXRpb25QYXJlbnRGaWJlcjtcblxuICAgIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGFyZW50Q29udGFpbmVyID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gICAgICAgICAgICBkaWROb3RNYXRjaEh5ZHJhdGVkQ29udGFpbmVyVGV4dEluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgdGV4dEluc3RhbmNlLCB0ZXh0Q29udGVudCwgLy8gVE9ETzogRGVsZXRlIHRoaXMgYXJndW1lbnQgd2hlbiB3ZSByZW1vdmUgdGhlIGxlZ2FjeSByb290IEFQSS5cbiAgICAgICAgICAgIGlzQ29uY3VycmVudE1vZGUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGFyZW50VHlwZSA9IHJldHVybkZpYmVyLnR5cGU7XG4gICAgICAgICAgICB2YXIgcGFyZW50UHJvcHMgPSByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzO1xuICAgICAgICAgICAgdmFyIHBhcmVudEluc3RhbmNlID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICB2YXIgX2lzQ29uY3VycmVudE1vZGUyID0gKHJldHVybkZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcblxuICAgICAgICAgICAgZGlkTm90TWF0Y2hIeWRyYXRlZFRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgICBfaXNDb25jdXJyZW50TW9kZTIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVUb0h5ZHJhdGVIb3N0U3VzcGVuc2VJbnN0YW5jZShmaWJlcikge1xuXG4gIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBzdXNwZW5zZVN0YXRlICE9PSBudWxsID8gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkIDogbnVsbDtcblxuICBpZiAoIXN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGhhdmUgYSBoeWRyYXRlZCBzdXNwZW5zZSBpbnN0YW5jZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgaHlkcmF0ZVN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBza2lwUGFzdERlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKGZpYmVyKSB7XG5cbiAgdmFyIHN1c3BlbnNlU3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IHN1c3BlbnNlU3RhdGUgIT09IG51bGwgPyBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgOiBudWxsO1xuXG4gIGlmICghc3VzcGVuc2VJbnN0YW5jZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gaGF2ZSBhIGh5ZHJhdGVkIHN1c3BlbnNlIGluc3RhbmNlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGVJbnN0YW5jZUFmdGVyU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcikge1xuICB2YXIgcGFyZW50ID0gZmliZXIucmV0dXJuO1xuXG4gIHdoaWxlIChwYXJlbnQgIT09IG51bGwgJiYgcGFyZW50LnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiBwYXJlbnQudGFnICE9PSBIb3N0Um9vdCAmJiBwYXJlbnQudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gIH1cblxuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IHBhcmVudDtcbn1cblxuZnVuY3Rpb24gcG9wSHlkcmF0aW9uU3RhdGUoZmliZXIpIHtcblxuICBpZiAoZmliZXIgIT09IGh5ZHJhdGlvblBhcmVudEZpYmVyKSB7XG4gICAgLy8gV2UncmUgZGVlcGVyIHRoYW4gdGhlIGN1cnJlbnQgaHlkcmF0aW9uIGNvbnRleHQsIGluc2lkZSBhbiBpbnNlcnRlZFxuICAgIC8vIHRyZWUuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgIC8vIElmIHdlJ3JlIG5vdCBjdXJyZW50bHkgaHlkcmF0aW5nIGJ1dCB3ZSdyZSBpbiBhIGh5ZHJhdGlvbiBjb250ZXh0LCB0aGVuXG4gICAgLy8gd2Ugd2VyZSBhbiBpbnNlcnRpb24gYW5kIG5vdyBuZWVkIHRvIHBvcCB1cCByZWVudGVyIGh5ZHJhdGlvbiBvZiBvdXJcbiAgICAvLyBzaWJsaW5ncy5cbiAgICBwb3BUb05leHRIb3N0UGFyZW50KGZpYmVyKTtcbiAgICBpc0h5ZHJhdGluZyA9IHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIElmIHdlIGhhdmUgYW55IHJlbWFpbmluZyBoeWRyYXRhYmxlIG5vZGVzLCB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGVtIG5vdy5cbiAgLy8gV2Ugb25seSBkbyB0aGlzIGRlZXBlciB0aGFuIGhlYWQgYW5kIGJvZHkgc2luY2UgdGhleSB0ZW5kIHRvIGhhdmUgcmFuZG9tXG4gIC8vIG90aGVyIG5vZGVzIGluIHRoZW0uIFdlIGFsc28gaWdub3JlIGNvbXBvbmVudHMgd2l0aCBwdXJlIHRleHQgY29udGVudCBpblxuICAvLyBzaWRlIG9mIHRoZW0uIFdlIGFsc28gZG9uJ3QgZGVsZXRlIGFueXRoaW5nIGluc2lkZSB0aGUgcm9vdCBjb250YWluZXIuXG5cblxuICBpZiAoZmliZXIudGFnICE9PSBIb3N0Um9vdCAmJiAoZmliZXIudGFnICE9PSBIb3N0Q29tcG9uZW50IHx8IHNob3VsZERlbGV0ZVVuaHlkcmF0ZWRUYWlsSW5zdGFuY2VzKGZpYmVyLnR5cGUpICYmICFzaG91bGRTZXRUZXh0Q29udGVudChmaWJlci50eXBlLCBmaWJlci5tZW1vaXplZFByb3BzKSkpIHtcbiAgICB2YXIgbmV4dEluc3RhbmNlID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZTtcblxuICAgIGlmIChuZXh0SW5zdGFuY2UpIHtcbiAgICAgIGlmIChzaG91bGRDbGllbnRSZW5kZXJPbk1pc21hdGNoKGZpYmVyKSkge1xuICAgICAgICB3YXJuSWZVbmh5ZHJhdGVkVGFpbE5vZGVzKGZpYmVyKTtcbiAgICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aGlsZSAobmV4dEluc3RhbmNlKSB7XG4gICAgICAgICAgZGVsZXRlSHlkcmF0YWJsZUluc3RhbmNlKGZpYmVyLCBuZXh0SW5zdGFuY2UpO1xuICAgICAgICAgIG5leHRJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhuZXh0SW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcik7XG5cbiAgaWYgKGZpYmVyLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gc2tpcFBhc3REZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlcik7XG4gIH0gZWxzZSB7XG4gICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGh5ZHJhdGlvblBhcmVudEZpYmVyID8gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGZpYmVyLnN0YXRlTm9kZSkgOiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGhhc1VuaHlkcmF0ZWRUYWlsTm9kZXMoKSB7XG4gIHJldHVybiBpc0h5ZHJhdGluZyAmJiBuZXh0SHlkcmF0YWJsZUluc3RhbmNlICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZVbmh5ZHJhdGVkVGFpbE5vZGVzKGZpYmVyKSB7XG4gIHZhciBuZXh0SW5zdGFuY2UgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlO1xuXG4gIHdoaWxlIChuZXh0SW5zdGFuY2UpIHtcbiAgICB3YXJuVW5oeWRyYXRlZEluc3RhbmNlKGZpYmVyLCBuZXh0SW5zdGFuY2UpO1xuICAgIG5leHRJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhuZXh0SW5zdGFuY2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0SHlkcmF0aW9uU3RhdGUoKSB7XG5cbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBudWxsO1xuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbiAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdXBncmFkZUh5ZHJhdGlvbkVycm9yc1RvUmVjb3ZlcmFibGUoKSB7XG4gIGlmIChoeWRyYXRpb25FcnJvcnMgIT09IG51bGwpIHtcbiAgICAvLyBTdWNjZXNzZnVsbHkgY29tcGxldGVkIGEgZm9yY2VkIGNsaWVudCByZW5kZXIuIFRoZSBlcnJvcnMgdGhhdCBvY2N1cnJlZFxuICAgIC8vIGR1cmluZyB0aGUgaHlkcmF0aW9uIGF0dGVtcHQgYXJlIG5vdyByZWNvdmVyZWQuIFdlIHdpbGwgbG9nIHRoZW0gaW5cbiAgICAvLyBjb21taXQgcGhhc2UsIG9uY2UgdGhlIGVudGlyZSB0cmVlIGhhcyBmaW5pc2hlZC5cbiAgICBxdWV1ZVJlY292ZXJhYmxlRXJyb3JzKGh5ZHJhdGlvbkVycm9ycyk7XG4gICAgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRJc0h5ZHJhdGluZygpIHtcbiAgcmV0dXJuIGlzSHlkcmF0aW5nO1xufVxuXG5mdW5jdGlvbiBxdWV1ZUh5ZHJhdGlvbkVycm9yKGVycm9yKSB7XG4gIGlmIChoeWRyYXRpb25FcnJvcnMgPT09IG51bGwpIHtcbiAgICBoeWRyYXRpb25FcnJvcnMgPSBbZXJyb3JdO1xuICB9IGVsc2Uge1xuICAgIGh5ZHJhdGlvbkVycm9ycy5wdXNoKGVycm9yKTtcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO1xudmFyIE5vVHJhbnNpdGlvbiA9IG51bGw7XG5mdW5jdGlvbiByZXF1ZXN0Q3VycmVudFRyYW5zaXRpb24oKSB7XG4gIHJldHVybiBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQxLnRyYW5zaXRpb247XG59XG5cbnZhciBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncyA9IHtcbiAgcmVjb3JkVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3M6IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHt9LFxuICBmbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5nczogZnVuY3Rpb24gKCkge30sXG4gIHJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nOiBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7fSxcbiAgZmx1c2hMZWdhY3lDb250ZXh0V2FybmluZzogZnVuY3Rpb24gKCkge30sXG4gIGRpc2NhcmRQZW5kaW5nV2FybmluZ3M6IGZ1bmN0aW9uICgpIHt9XG59O1xuXG57XG4gIHZhciBmaW5kU3RyaWN0Um9vdCA9IGZ1bmN0aW9uIChmaWJlcikge1xuICAgIHZhciBtYXliZVN0cmljdFJvb3QgPSBudWxsO1xuICAgIHZhciBub2RlID0gZmliZXI7XG5cbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgbWF5YmVTdHJpY3RSb290ID0gbm9kZTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBtYXliZVN0cmljdFJvb3Q7XG4gIH07XG5cbiAgdmFyIHNldFRvU29ydGVkU3RyaW5nID0gZnVuY3Rpb24gKHNldCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgYXJyYXkucHVzaCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFycmF5LnNvcnQoKS5qb2luKCcsICcpO1xuICB9O1xuXG4gIHZhciBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgdmFyIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgdmFyIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgdmFyIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdOyAvLyBUcmFja3MgY29tcG9uZW50cyB3ZSBoYXZlIGFscmVhZHkgd2FybmVkIGFib3V0LlxuXG4gIHZhciBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzID0gbmV3IFNldCgpO1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzID0gZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge1xuICAgIC8vIERlZHVwZSBzdHJhdGVneTogV2FybiBvbmNlIHBlciBjb21wb25lbnQuXG4gICAgaWYgKGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuaGFzKGZpYmVyLnR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgJiYgLy8gRG9uJ3Qgd2FybiBhYm91dCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMuXG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50Ll9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZS5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSAmJiB0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBXZSBkbyBhbiBpbml0aWFsIHBhc3MgdG8gZ2F0aGVyIGNvbXBvbmVudCBuYW1lc1xuICAgIHZhciBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIGNvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgfSAvLyBGaW5hbGx5LCB3ZSBmbHVzaCBhbGwgdGhlIHdhcm5pbmdzXG4gICAgLy8gVU5TQUZFXyBvbmVzIGJlZm9yZSB0aGUgZGVwcmVjYXRlZCBvbmVzLCBzaW5jZSB0aGV5J2xsIGJlICdsb3VkZXInXG5cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBzb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyk7XG5cbiAgICAgIGVycm9yKCdVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCBhbmQgbWF5IGluZGljYXRlIGJ1Z3MgaW4geW91ciBjb2RlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGNvZGUgd2l0aCBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkTW91bnQsIGFuZCBzZXQgaW5pdGlhbCBzdGF0ZSBpbiB0aGUgY29uc3RydWN0b3IuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBzb3J0ZWROYW1lcyk7XG4gICAgfVxuXG4gICAgaWYgKFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzKTtcblxuICAgICAgZXJyb3IoJ1VzaW5nIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCAnICsgJ2FuZCBtYXkgaW5kaWNhdGUgYnVncyBpbiB5b3VyIGNvZGUuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArIFwiKiBJZiB5b3UncmUgdXBkYXRpbmcgc3RhdGUgd2hlbmV2ZXIgcHJvcHMgY2hhbmdlLCBcIiArICdyZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIG1lbW9pemF0aW9uIHRlY2huaXF1ZXMgb3IgbW92ZSBpdCB0byAnICsgJ3N0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuIExlYXJuIG1vcmUgYXQ6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9kZXJpdmVkLXN0YXRlXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMpO1xuICAgIH1cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzMiA9IHNldFRvU29ydGVkU3RyaW5nKFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMpO1xuXG4gICAgICBlcnJvcignVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgaW4gc3RyaWN0IG1vZGUgaXMgbm90IHJlY29tbWVuZGVkICcgKyAnYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczIpO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczMgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyk7XG5cbiAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxNb3VudCBoYXMgYmVlbiByZW5hbWVkLCBhbmQgaXMgbm90IHJlY29tbWVuZGVkIGZvciB1c2UuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgY29kZSB3aXRoIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRNb3VudCwgYW5kIHNldCBpbml0aWFsIHN0YXRlIGluIHRoZSBjb25zdHJ1Y3Rvci5cXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxNb3VudCB0byBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IHRvIHN1cHByZXNzICcgKyAndGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gJyArICdUbyByZW5hbWUgYWxsIGRlcHJlY2F0ZWQgbGlmZWN5Y2xlcyB0byB0aGVpciBuZXcgbmFtZXMsIHlvdSBjYW4gcnVuICcgKyAnYG5weCByZWFjdC1jb2RlbW9kIHJlbmFtZS11bnNhZmUtbGlmZWN5Y2xlc2AgaW4geW91ciBwcm9qZWN0IHNvdXJjZSBmb2xkZXIuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMzKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzNCA9IHNldFRvU29ydGVkU3RyaW5nKGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyk7XG5cbiAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbicgKyBcIiogSWYgeW91J3JlIHVwZGF0aW5nIHN0YXRlIHdoZW5ldmVyIHByb3BzIGNoYW5nZSwgcmVmYWN0b3IgeW91ciBcIiArICdjb2RlIHRvIHVzZSBtZW1vaXphdGlvbiB0ZWNobmlxdWVzIG9yIG1vdmUgaXQgdG8gJyArICdzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBMZWFybiBtb3JlIGF0OiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGVyaXZlZC1zdGF0ZVxcbicgKyAnKiBSZW5hbWUgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB0byBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB0byBzdXBwcmVzcyAnICsgJ3RoaXMgd2FybmluZyBpbiBub24tc3RyaWN0IG1vZGUuIEluIFJlYWN0IDE4LngsIG9ubHkgdGhlIFVOU0FGRV8gbmFtZSB3aWxsIHdvcmsuICcgKyAnVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biAnICsgJ2BucHggcmVhY3QtY29kZW1vZCByZW5hbWUtdW5zYWZlLWxpZmVjeWNsZXNgIGluIHlvdXIgcHJvamVjdCBzb3VyY2UgZm9sZGVyLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzNCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczUgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsVXBkYXRlIGhhcyBiZWVuIHJlbmFtZWQsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxVcGRhdGUgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgdG8gc3VwcHJlc3MgJyArICd0aGlzIHdhcm5pbmcgaW4gbm9uLXN0cmljdCBtb2RlLiBJbiBSZWFjdCAxOC54LCBvbmx5IHRoZSBVTlNBRkVfIG5hbWUgd2lsbCB3b3JrLiAnICsgJ1RvIHJlbmFtZSBhbGwgZGVwcmVjYXRlZCBsaWZlY3ljbGVzIHRvIHRoZWlyIG5ldyBuYW1lcywgeW91IGNhbiBydW4gJyArICdgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczUpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nID0gbmV3IE1hcCgpOyAvLyBUcmFja3MgY29tcG9uZW50cyB3ZSBoYXZlIGFscmVhZHkgd2FybmVkIGFib3V0LlxuXG4gIHZhciBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0ID0gbmV3IFNldCgpO1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nID0gZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge1xuICAgIHZhciBzdHJpY3RSb290ID0gZmluZFN0cmljdFJvb3QoZmliZXIpO1xuXG4gICAgaWYgKHN0cmljdFJvb3QgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBmaW5kIGEgU3RyaWN0TW9kZSBjb21wb25lbnQgaW4gYSBzdHJpY3QgbW9kZSB0cmVlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIERlZHVwIHN0cmF0ZWd5OiBXYXJuIG9uY2UgcGVyIGNvbXBvbmVudC5cblxuXG4gICAgaWYgKGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQuaGFzKGZpYmVyLnR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHdhcm5pbmdzRm9yUm9vdCA9IHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZy5nZXQoc3RyaWN0Um9vdCk7XG5cbiAgICBpZiAoZmliZXIudHlwZS5jb250ZXh0VHlwZXMgIT0gbnVsbCB8fCBmaWJlci50eXBlLmNoaWxkQ29udGV4dFR5cGVzICE9IG51bGwgfHwgaW5zdGFuY2UgIT09IG51bGwgJiYgdHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHdhcm5pbmdzRm9yUm9vdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHdhcm5pbmdzRm9yUm9vdCA9IFtdO1xuICAgICAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuc2V0KHN0cmljdFJvb3QsIHdhcm5pbmdzRm9yUm9vdCk7XG4gICAgICB9XG5cbiAgICAgIHdhcm5pbmdzRm9yUm9vdC5wdXNoKGZpYmVyKTtcbiAgICB9XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hMZWdhY3lDb250ZXh0V2FybmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuZm9yRWFjaChmdW5jdGlvbiAoZmliZXJBcnJheSwgc3RyaWN0Um9vdCkge1xuICAgICAgaWYgKGZpYmVyQXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGZpcnN0RmliZXIgPSBmaWJlckFycmF5WzBdO1xuICAgICAgdmFyIHVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuICAgICAgZmliZXJBcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICB1bmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0LmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIHNvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcodW5pcXVlTmFtZXMpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBzZXRDdXJyZW50RmliZXIoZmlyc3RGaWJlcik7XG5cbiAgICAgICAgZXJyb3IoJ0xlZ2FjeSBjb250ZXh0IEFQSSBoYXMgYmVlbiBkZXRlY3RlZCB3aXRoaW4gYSBzdHJpY3QtbW9kZSB0cmVlLicgKyAnXFxuXFxuVGhlIG9sZCBBUEkgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gYWxsIDE2LnggcmVsZWFzZXMsIGJ1dCBhcHBsaWNhdGlvbnMgJyArICd1c2luZyBpdCBzaG91bGQgbWlncmF0ZSB0byB0aGUgbmV3IHZlcnNpb24uJyArICdcXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnICsgJ1xcblxcbkxlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9sZWdhY3ktY29udGV4dCcsIHNvcnRlZE5hbWVzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZGlzY2FyZFBlbmRpbmdXYXJuaW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nID0gbmV3IE1hcCgpO1xuICB9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudCwgYmFzZVByb3BzKSB7XG4gIGlmIChDb21wb25lbnQgJiYgQ29tcG9uZW50LmRlZmF1bHRQcm9wcykge1xuICAgIC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wcy4gVGFrZW4gZnJvbSBSZWFjdEVsZW1lbnRcbiAgICB2YXIgcHJvcHMgPSBhc3NpZ24oe30sIGJhc2VQcm9wcyk7XG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IENvbXBvbmVudC5kZWZhdWx0UHJvcHM7XG5cbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwcm9wcztcbiAgfVxuXG4gIHJldHVybiBiYXNlUHJvcHM7XG59XG5cbnZhciB2YWx1ZUN1cnNvciA9IGNyZWF0ZUN1cnNvcihudWxsKTtcbnZhciByZW5kZXJlclNpZ2lsO1xuXG57XG4gIC8vIFVzZSB0aGlzIHRvIGRldGVjdCBtdWx0aXBsZSByZW5kZXJlcnMgdXNpbmcgdGhlIHNhbWUgY29udGV4dFxuICByZW5kZXJlclNpZ2lsID0ge307XG59XG5cbnZhciBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG52YXIgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbnVsbDtcbnZhciBsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPSBudWxsO1xudmFyIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbmZ1bmN0aW9uIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpIHtcbiAgLy8gVGhpcyBpcyBjYWxsZWQgcmlnaHQgYmVmb3JlIFJlYWN0IHlpZWxkcyBleGVjdXRpb24sIHRvIGVuc3VyZSBgcmVhZENvbnRleHRgXG4gIC8vIGNhbm5vdCBiZSBjYWxsZWQgb3V0c2lkZSB0aGUgcmVuZGVyIHBoYXNlLlxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG4gIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG4gIGxhc3RGdWxseU9ic2VydmVkQ29udGV4dCA9IG51bGw7XG5cbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpIHtcbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSB0cnVlO1xuICB9XG59XG5mdW5jdGlvbiBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKSB7XG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHB1c2hQcm92aWRlcihwcm92aWRlckZpYmVyLCBjb250ZXh0LCBuZXh0VmFsdWUpIHtcbiAge1xuICAgIHB1c2godmFsdWVDdXJzb3IsIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSwgcHJvdmlkZXJGaWJlcik7XG4gICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gbmV4dFZhbHVlO1xuXG4gICAge1xuICAgICAgaWYgKGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gbnVsbCAmJiBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgIT09IHJlbmRlcmVyU2lnaWwpIHtcbiAgICAgICAgZXJyb3IoJ0RldGVjdGVkIG11bHRpcGxlIHJlbmRlcmVycyBjb25jdXJyZW50bHkgcmVuZGVyaW5nIHRoZSAnICsgJ3NhbWUgY29udGV4dCBwcm92aWRlci4gVGhpcyBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWQuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IHJlbmRlcmVyU2lnaWw7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3BQcm92aWRlcihjb250ZXh0LCBwcm92aWRlckZpYmVyKSB7XG4gIHZhciBjdXJyZW50VmFsdWUgPSB2YWx1ZUN1cnNvci5jdXJyZW50O1xuICBwb3AodmFsdWVDdXJzb3IsIHByb3ZpZGVyRmliZXIpO1xuXG4gIHtcbiAgICB7XG4gICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKHBhcmVudCwgcmVuZGVyTGFuZXMsIHByb3BhZ2F0aW9uUm9vdCkge1xuICAvLyBVcGRhdGUgdGhlIGNoaWxkIGxhbmVzIG9mIGFsbCB0aGUgYW5jZXN0b3JzLCBpbmNsdWRpbmcgdGhlIGFsdGVybmF0ZXMuXG4gIHZhciBub2RlID0gcGFyZW50O1xuXG4gIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgdmFyIGFsdGVybmF0ZSA9IG5vZGUuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKCFpc1N1YnNldE9mTGFuZXMobm9kZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgIG5vZGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobm9kZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgYWx0ZXJuYXRlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChhbHRlcm5hdGUgIT09IG51bGwgJiYgIWlzU3Vic2V0T2ZMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgICBhbHRlcm5hdGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gcHJvcGFnYXRpb25Sb290KSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gIH1cblxuICB7XG4gICAgaWYgKG5vZGUgIT09IHByb3BhZ2F0aW9uUm9vdCkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgdGhlIHByb3BhZ2F0aW9uIHJvb3Qgd2hlbiBzY2hlZHVsaW5nIGNvbnRleHQgd29yay4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcHJvcGFnYXRlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2VfZWFnZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlX2VhZ2VyKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCByZW5kZXJMYW5lcykge1xuXG4gIHZhciBmaWJlciA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gIGlmIChmaWJlciAhPT0gbnVsbCkge1xuICAgIC8vIFNldCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIGNoaWxkIHRvIHRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuICAgIGZpYmVyLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB9XG5cbiAgd2hpbGUgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgdmFyIG5leHRGaWJlciA9IHZvaWQgMDsgLy8gVmlzaXQgdGhpcyBmaWJlci5cblxuICAgIHZhciBsaXN0ID0gZmliZXIuZGVwZW5kZW5jaWVzO1xuXG4gICAgaWYgKGxpc3QgIT09IG51bGwpIHtcbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLmNoaWxkO1xuICAgICAgdmFyIGRlcGVuZGVuY3kgPSBsaXN0LmZpcnN0Q29udGV4dDtcblxuICAgICAgd2hpbGUgKGRlcGVuZGVuY3kgIT09IG51bGwpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNvbnRleHQgbWF0Y2hlcy5cbiAgICAgICAgaWYgKGRlcGVuZGVuY3kuY29udGV4dCA9PT0gY29udGV4dCkge1xuICAgICAgICAgIC8vIE1hdGNoISBTY2hlZHVsZSBhbiB1cGRhdGUgb24gdGhpcyBmaWJlci5cbiAgICAgICAgICBpZiAoZmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgLy8gU2NoZWR1bGUgYSBmb3JjZSB1cGRhdGUgb24gdGhlIHdvcmstaW4tcHJvZ3Jlc3MuXG4gICAgICAgICAgICB2YXIgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKHJlbmRlckxhbmVzKTtcbiAgICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIGxhbmUpO1xuICAgICAgICAgICAgdXBkYXRlLnRhZyA9IEZvcmNlVXBkYXRlOyAvLyBUT0RPOiBCZWNhdXNlIHdlIGRvbid0IGhhdmUgYSB3b3JrLWluLXByb2dyZXNzLCB0aGlzIHdpbGwgYWRkIHRoZVxuICAgICAgICAgICAgLy8gdXBkYXRlIHRvIHRoZSBjdXJyZW50IGZpYmVyLCB0b28sIHdoaWNoIG1lYW5zIGl0IHdpbGwgcGVyc2lzdCBldmVuIGlmXG4gICAgICAgICAgICAvLyB0aGlzIHJlbmRlciBpcyB0aHJvd24gYXdheS4gU2luY2UgaXQncyBhIHJhY2UgY29uZGl0aW9uLCBub3Qgc3VyZSBpdCdzXG4gICAgICAgICAgICAvLyB3b3J0aCBmaXhpbmcuXG4gICAgICAgICAgICAvLyBJbmxpbmVkIGBlbnF1ZXVlVXBkYXRlYCB0byByZW1vdmUgaW50ZXJsZWF2ZWQgdXBkYXRlIGNoZWNrXG5cbiAgICAgICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpYmVyLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgICBpZiAodXBkYXRlUXVldWUgPT09IG51bGwpIDsgZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBzaGFyZWRRdWV1ZSA9IHVwZGF0ZVF1ZXVlLnNoYXJlZDtcbiAgICAgICAgICAgICAgdmFyIHBlbmRpbmcgPSBzaGFyZWRRdWV1ZS5wZW5kaW5nO1xuXG4gICAgICAgICAgICAgIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgICAgICAgICAgICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVwZGF0ZS5uZXh0ID0gcGVuZGluZy5uZXh0O1xuICAgICAgICAgICAgICAgIHBlbmRpbmcubmV4dCA9IHVwZGF0ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNoYXJlZFF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKGZpYmVyLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGFsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChmaWJlci5yZXR1cm4sIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7IC8vIE1hcmsgdGhlIHVwZGF0ZWQgbGFuZXMgb24gdGhlIGxpc3QsIHRvby5cblxuICAgICAgICAgIGxpc3QubGFuZXMgPSBtZXJnZUxhbmVzKGxpc3QubGFuZXMsIHJlbmRlckxhbmVzKTsgLy8gU2luY2Ugd2UgYWxyZWFkeSBmb3VuZCBhIG1hdGNoLCB3ZSBjYW4gc3RvcCB0cmF2ZXJzaW5nIHRoZVxuICAgICAgICAgIC8vIGRlcGVuZGVuY3kgbGlzdC5cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVwZW5kZW5jeSA9IGRlcGVuZGVuY3kubmV4dDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gQ29udGV4dFByb3ZpZGVyKSB7XG4gICAgICAvLyBEb24ndCBzY2FuIGRlZXBlciBpZiB0aGlzIGlzIGEgbWF0Y2hpbmcgcHJvdmlkZXJcbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLnR5cGUgPT09IHdvcmtJblByb2dyZXNzLnR5cGUgPyBudWxsIDogZmliZXIuY2hpbGQ7XG4gICAgfSBlbHNlIGlmIChmaWJlci50YWcgPT09IERlaHlkcmF0ZWRGcmFnbWVudCkge1xuICAgICAgLy8gSWYgYSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGJvdW5kYXJ5IGlzIGluIHRoaXMgc3VidHJlZSwgd2UgZG9uJ3Qga25vd1xuICAgICAgLy8gaWYgaXQgd2lsbCBoYXZlIGFueSBjb250ZXh0IGNvbnN1bWVycyBpbiBpdC4gVGhlIGJlc3Qgd2UgY2FuIGRvIGlzXG4gICAgICAvLyBtYXJrIGl0IGFzIGhhdmluZyB1cGRhdGVzLlxuICAgICAgdmFyIHBhcmVudFN1c3BlbnNlID0gZmliZXIucmV0dXJuO1xuXG4gICAgICBpZiAocGFyZW50U3VzcGVuc2UgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZSBqdXN0IGNhbWUgZnJvbSBhIHBhcmVudCBzbyB3ZSBtdXN0IGhhdmUgaGFkIGEgcGFyZW50LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRTdXNwZW5zZS5sYW5lcyA9IG1lcmdlTGFuZXMocGFyZW50U3VzcGVuc2UubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIHZhciBfYWx0ZXJuYXRlID0gcGFyZW50U3VzcGVuc2UuYWx0ZXJuYXRlO1xuXG4gICAgICBpZiAoX2FsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBfYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhfYWx0ZXJuYXRlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBwYXNzaW5nIHRoaXMgZmliZXIgYXMgdGhlIHBhcmVudFxuICAgICAgLy8gYmVjYXVzZSB3ZSB3YW50IHRvIHNjaGVkdWxlIHRoaXMgZmliZXIgYXMgaGF2aW5nIHdvcmtcbiAgICAgIC8vIG9uIGl0cyBjaGlsZHJlbi4gV2UnbGwgdXNlIHRoZSBjaGlsZExhbmVzIG9uXG4gICAgICAvLyB0aGlzIGZpYmVyIHRvIGluZGljYXRlIHRoYXQgYSBjb250ZXh0IGhhcyBjaGFuZ2VkLlxuXG5cbiAgICAgIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgocGFyZW50U3VzcGVuc2UsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5zaWJsaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUcmF2ZXJzZSBkb3duLlxuICAgICAgbmV4dEZpYmVyID0gZmliZXIuY2hpbGQ7XG4gICAgfVxuXG4gICAgaWYgKG5leHRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgLy8gU2V0IHRoZSByZXR1cm4gcG9pbnRlciBvZiB0aGUgY2hpbGQgdG8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuXG4gICAgICBuZXh0RmliZXIucmV0dXJuID0gZmliZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGNoaWxkLiBUcmF2ZXJzZSB0byBuZXh0IHNpYmxpbmcuXG4gICAgICBuZXh0RmliZXIgPSBmaWJlcjtcblxuICAgICAgd2hpbGUgKG5leHRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICBpZiAobmV4dEZpYmVyID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIC8vIFdlJ3JlIGJhY2sgdG8gdGhlIHJvb3Qgb2YgdGhpcyBzdWJ0cmVlLiBFeGl0LlxuICAgICAgICAgIG5leHRGaWJlciA9IG51bGw7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2libGluZyA9IG5leHRGaWJlci5zaWJsaW5nO1xuXG4gICAgICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gU2V0IHRoZSByZXR1cm4gcG9pbnRlciBvZiB0aGUgc2libGluZyB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICAgICAgICBzaWJsaW5nLnJldHVybiA9IG5leHRGaWJlci5yZXR1cm47XG4gICAgICAgICAgbmV4dEZpYmVyID0gc2libGluZztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSAvLyBObyBtb3JlIHNpYmxpbmdzLiBUcmF2ZXJzZSB1cC5cblxuXG4gICAgICAgIG5leHRGaWJlciA9IG5leHRGaWJlci5yZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmliZXIgPSBuZXh0RmliZXI7XG4gIH1cbn1cbmZ1bmN0aW9uIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IHdvcmtJblByb2dyZXNzO1xuICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBudWxsO1xuICBsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPSBudWxsO1xuICB2YXIgZGVwZW5kZW5jaWVzID0gd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzO1xuXG4gIGlmIChkZXBlbmRlbmNpZXMgIT09IG51bGwpIHtcbiAgICB7XG4gICAgICB2YXIgZmlyc3RDb250ZXh0ID0gZGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dDtcblxuICAgICAgaWYgKGZpcnN0Q29udGV4dCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShkZXBlbmRlbmNpZXMubGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgICAgICAgIC8vIENvbnRleHQgbGlzdCBoYXMgYSBwZW5kaW5nIHVwZGF0ZS4gTWFyayB0aGF0IHRoaXMgZmliZXIgcGVyZm9ybWVkIHdvcmsuXG4gICAgICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICAgICAgfSAvLyBSZXNldCB0aGUgd29yay1pbi1wcm9ncmVzcyBsaXN0XG5cblxuICAgICAgICBkZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHJlYWRDb250ZXh0KGNvbnRleHQpIHtcbiAge1xuICAgIC8vIFRoaXMgd2FybmluZyB3b3VsZCBmaXJlIGlmIHlvdSByZWFkIGNvbnRleHQgaW5zaWRlIGEgSG9vayBsaWtlIHVzZU1lbW8uXG4gICAgLy8gVW5saWtlIHRoZSBjbGFzcyBjaGVjayBiZWxvdywgaXQncyBub3QgZW5mb3JjZWQgaW4gcHJvZHVjdGlvbiBmb3IgcGVyZi5cbiAgICBpZiAoaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVikge1xuICAgICAgZXJyb3IoJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciB2YWx1ZSA9ICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgO1xuXG4gIGlmIChsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPT09IGNvbnRleHQpIDsgZWxzZSB7XG4gICAgdmFyIGNvbnRleHRJdGVtID0ge1xuICAgICAgY29udGV4dDogY29udGV4dCxcbiAgICAgIG1lbW9pemVkVmFsdWU6IHZhbHVlLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG5cbiAgICBpZiAobGFzdENvbnRleHREZXBlbmRlbmN5ID09PSBudWxsKSB7XG4gICAgICBpZiAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgICAgIH0gLy8gVGhpcyBpcyB0aGUgZmlyc3QgZGVwZW5kZW5jeSBmb3IgdGhpcyBjb21wb25lbnQuIENyZWF0ZSBhIG5ldyBsaXN0LlxuXG5cbiAgICAgIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IGNvbnRleHRJdGVtO1xuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIuZGVwZW5kZW5jaWVzID0ge1xuICAgICAgICBsYW5lczogTm9MYW5lcyxcbiAgICAgICAgZmlyc3RDb250ZXh0OiBjb250ZXh0SXRlbVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXBwZW5kIGEgbmV3IGNvbnRleHQgaXRlbS5cbiAgICAgIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IGxhc3RDb250ZXh0RGVwZW5kZW5jeS5uZXh0ID0gY29udGV4dEl0ZW07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vLyByZW5kZXIuIFdoZW4gdGhpcyByZW5kZXIgZXhpdHMsIGVpdGhlciBiZWNhdXNlIGl0IGZpbmlzaGVzIG9yIGJlY2F1c2UgaXQgaXNcbi8vIGludGVycnVwdGVkLCB0aGUgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsIGJlIHRyYW5zZmVycmVkIG9udG8gdGhlIG1haW4gcGFydFxuLy8gb2YgdGhlIHF1ZXVlLlxuXG52YXIgY29uY3VycmVudFF1ZXVlcyA9IG51bGw7XG5mdW5jdGlvbiBwdXNoQ29uY3VycmVudFVwZGF0ZVF1ZXVlKHF1ZXVlKSB7XG4gIGlmIChjb25jdXJyZW50UXVldWVzID09PSBudWxsKSB7XG4gICAgY29uY3VycmVudFF1ZXVlcyA9IFtxdWV1ZV07XG4gIH0gZWxzZSB7XG4gICAgY29uY3VycmVudFF1ZXVlcy5wdXNoKHF1ZXVlKTtcbiAgfVxufVxuZnVuY3Rpb24gZmluaXNoUXVldWVpbmdDb25jdXJyZW50VXBkYXRlcygpIHtcbiAgLy8gVHJhbnNmZXIgdGhlIGludGVybGVhdmVkIHVwZGF0ZXMgb250byB0aGUgbWFpbiBxdWV1ZS4gRWFjaCBxdWV1ZSBoYXMgYVxuICAvLyBgcGVuZGluZ2AgZmllbGQgYW5kIGFuIGBpbnRlcmxlYXZlZGAgZmllbGQuIFdoZW4gdGhleSBhcmUgbm90IG51bGwsIHRoZXlcbiAgLy8gcG9pbnQgdG8gdGhlIGxhc3Qgbm9kZSBpbiBhIGNpcmN1bGFyIGxpbmtlZCBsaXN0LiBXZSBuZWVkIHRvIGFwcGVuZCB0aGVcbiAgLy8gaW50ZXJsZWF2ZWQgbGlzdCB0byB0aGUgZW5kIG9mIHRoZSBwZW5kaW5nIGxpc3QgYnkgam9pbmluZyB0aGVtIGludG8gYVxuICAvLyBzaW5nbGUsIGNpcmN1bGFyIGxpc3QuXG4gIGlmIChjb25jdXJyZW50UXVldWVzICE9PSBudWxsKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25jdXJyZW50UXVldWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVldWUgPSBjb25jdXJyZW50UXVldWVzW2ldO1xuICAgICAgdmFyIGxhc3RJbnRlcmxlYXZlZFVwZGF0ZSA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gICAgICBpZiAobGFzdEludGVybGVhdmVkVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgIHF1ZXVlLmludGVybGVhdmVkID0gbnVsbDtcbiAgICAgICAgdmFyIGZpcnN0SW50ZXJsZWF2ZWRVcGRhdGUgPSBsYXN0SW50ZXJsZWF2ZWRVcGRhdGUubmV4dDtcbiAgICAgICAgdmFyIGxhc3RQZW5kaW5nVXBkYXRlID0gcXVldWUucGVuZGluZztcblxuICAgICAgICBpZiAobGFzdFBlbmRpbmdVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgZmlyc3RQZW5kaW5nVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGUubmV4dDtcbiAgICAgICAgICBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0ID0gZmlyc3RJbnRlcmxlYXZlZFVwZGF0ZTtcbiAgICAgICAgICBsYXN0SW50ZXJsZWF2ZWRVcGRhdGUubmV4dCA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlLnBlbmRpbmcgPSBsYXN0SW50ZXJsZWF2ZWRVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uY3VycmVudFF1ZXVlcyA9IG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSkge1xuICB2YXIgaW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICBpZiAoaW50ZXJsZWF2ZWQgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7IC8vIEF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcmVuZGVyLCB0aGlzIHF1ZXVlJ3MgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsXG4gICAgLy8gYmUgdHJhbnNmZXJyZWQgdG8gdGhlIHBlbmRpbmcgcXVldWUuXG5cbiAgICBwdXNoQ29uY3VycmVudFVwZGF0ZVF1ZXVlKHF1ZXVlKTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUubmV4dCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgaW50ZXJsZWF2ZWQubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLmludGVybGVhdmVkID0gdXBkYXRlO1xuICByZXR1cm4gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRIb29rVXBkYXRlQW5kRWFnZXJseUJhaWxvdXQoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpIHtcbiAgdmFyIGludGVybGVhdmVkID0gcXVldWUuaW50ZXJsZWF2ZWQ7XG5cbiAgaWYgKGludGVybGVhdmVkID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlOyAvLyBBdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJlbmRlciwgdGhpcyBxdWV1ZSdzIGludGVybGVhdmVkIHVwZGF0ZXMgd2lsbFxuICAgIC8vIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBwZW5kaW5nIHF1ZXVlLlxuXG4gICAgcHVzaENvbmN1cnJlbnRVcGRhdGVRdWV1ZShxdWV1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlLm5leHQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgIGludGVybGVhdmVkLm5leHQgPSB1cGRhdGU7XG4gIH1cblxuICBxdWV1ZS5pbnRlcmxlYXZlZCA9IHVwZGF0ZTtcbn1cbmZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50Q2xhc3NVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpIHtcbiAgdmFyIGludGVybGVhdmVkID0gcXVldWUuaW50ZXJsZWF2ZWQ7XG5cbiAgaWYgKGludGVybGVhdmVkID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlOyAvLyBBdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJlbmRlciwgdGhpcyBxdWV1ZSdzIGludGVybGVhdmVkIHVwZGF0ZXMgd2lsbFxuICAgIC8vIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBwZW5kaW5nIHF1ZXVlLlxuXG4gICAgcHVzaENvbmN1cnJlbnRVcGRhdGVRdWV1ZShxdWV1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlLm5leHQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgIGludGVybGVhdmVkLm5leHQgPSB1cGRhdGU7XG4gIH1cblxuICBxdWV1ZS5pbnRlcmxlYXZlZCA9IHVwZGF0ZTtcbiAgcmV0dXJuIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgbGFuZSkge1xuICByZXR1cm4gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoZmliZXIsIGxhbmUpO1xufSAvLyBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gb3V0c2lkZSB0aGlzIG1vZHVsZSBzaG91bGQgb25seSBiZSBkb25lIGZvciBiYWNrd2FyZHNcbi8vIGNvbXBhdGliaWxpdHkgYW5kIHNob3VsZCBhbHdheXMgYmUgYWNjb21wYW5pZWQgYnkgYSB3YXJuaW5nLlxuXG52YXIgdW5zYWZlX21hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290ID0gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3Q7XG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KHNvdXJjZUZpYmVyLCBsYW5lKSB7XG4gIC8vIFVwZGF0ZSB0aGUgc291cmNlIGZpYmVyJ3MgbGFuZXNcbiAgc291cmNlRmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKHNvdXJjZUZpYmVyLmxhbmVzLCBsYW5lKTtcbiAgdmFyIGFsdGVybmF0ZSA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUubGFuZXMsIGxhbmUpO1xuICB9XG5cbiAge1xuICAgIGlmIChhbHRlcm5hdGUgPT09IG51bGwgJiYgKHNvdXJjZUZpYmVyLmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICB3YXJuQWJvdXRVcGRhdGVPbk5vdFlldE1vdW50ZWRGaWJlckluREVWKHNvdXJjZUZpYmVyKTtcbiAgICB9XG4gIH0gLy8gV2FsayB0aGUgcGFyZW50IHBhdGggdG8gdGhlIHJvb3QgYW5kIHVwZGF0ZSB0aGUgY2hpbGQgbGFuZXMuXG5cblxuICB2YXIgbm9kZSA9IHNvdXJjZUZpYmVyO1xuICB2YXIgcGFyZW50ID0gc291cmNlRmliZXIucmV0dXJuO1xuXG4gIHdoaWxlIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICBwYXJlbnQuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMocGFyZW50LmNoaWxkTGFuZXMsIGxhbmUpO1xuICAgIGFsdGVybmF0ZSA9IHBhcmVudC5hbHRlcm5hdGU7XG5cbiAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICBhbHRlcm5hdGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIGxhbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB7XG4gICAgICAgIGlmICgocGFyZW50LmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgd2FybkFib3V0VXBkYXRlT25Ob3RZZXRNb3VudGVkRmliZXJJbkRFVihzb3VyY2VGaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0gcGFyZW50O1xuICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gIH1cblxuICBpZiAobm9kZS50YWcgPT09IEhvc3RSb290KSB7XG4gICAgdmFyIHJvb3QgPSBub2RlLnN0YXRlTm9kZTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG52YXIgVXBkYXRlU3RhdGUgPSAwO1xudmFyIFJlcGxhY2VTdGF0ZSA9IDE7XG52YXIgRm9yY2VVcGRhdGUgPSAyO1xudmFyIENhcHR1cmVVcGRhdGUgPSAzOyAvLyBHbG9iYWwgc3RhdGUgdGhhdCBpcyByZXNldCBhdCB0aGUgYmVnaW5uaW5nIG9mIGNhbGxpbmcgYHByb2Nlc3NVcGRhdGVRdWV1ZWAuXG4vLyBJdCBzaG91bGQgb25seSBiZSByZWFkIHJpZ2h0IGFmdGVyIGNhbGxpbmcgYHByb2Nlc3NVcGRhdGVRdWV1ZWAsIHZpYVxuLy8gYGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmdgLlxuXG52YXIgaGFzRm9yY2VVcGRhdGUgPSBmYWxzZTtcbnZhciBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlO1xudmFyIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZTtcblxue1xuICBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlID0gZmFsc2U7XG4gIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGluaXRpYWxpemVVcGRhdGVRdWV1ZShmaWJlcikge1xuICB2YXIgcXVldWUgPSB7XG4gICAgYmFzZVN0YXRlOiBmaWJlci5tZW1vaXplZFN0YXRlLFxuICAgIGZpcnN0QmFzZVVwZGF0ZTogbnVsbCxcbiAgICBsYXN0QmFzZVVwZGF0ZTogbnVsbCxcbiAgICBzaGFyZWQ6IHtcbiAgICAgIHBlbmRpbmc6IG51bGwsXG4gICAgICBpbnRlcmxlYXZlZDogbnVsbCxcbiAgICAgIGxhbmVzOiBOb0xhbmVzXG4gICAgfSxcbiAgICBlZmZlY3RzOiBudWxsXG4gIH07XG4gIGZpYmVyLnVwZGF0ZVF1ZXVlID0gcXVldWU7XG59XG5mdW5jdGlvbiBjbG9uZVVwZGF0ZVF1ZXVlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIC8vIENsb25lIHRoZSB1cGRhdGUgcXVldWUgZnJvbSBjdXJyZW50LiBVbmxlc3MgaXQncyBhbHJlYWR5IGEgY2xvbmUuXG4gIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICB2YXIgY3VycmVudFF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcblxuICBpZiAocXVldWUgPT09IGN1cnJlbnRRdWV1ZSkge1xuICAgIHZhciBjbG9uZSA9IHtcbiAgICAgIGJhc2VTdGF0ZTogY3VycmVudFF1ZXVlLmJhc2VTdGF0ZSxcbiAgICAgIGZpcnN0QmFzZVVwZGF0ZTogY3VycmVudFF1ZXVlLmZpcnN0QmFzZVVwZGF0ZSxcbiAgICAgIGxhc3RCYXNlVXBkYXRlOiBjdXJyZW50UXVldWUubGFzdEJhc2VVcGRhdGUsXG4gICAgICBzaGFyZWQ6IGN1cnJlbnRRdWV1ZS5zaGFyZWQsXG4gICAgICBlZmZlY3RzOiBjdXJyZW50UXVldWUuZWZmZWN0c1xuICAgIH07XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjbG9uZTtcbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSkge1xuICB2YXIgdXBkYXRlID0ge1xuICAgIGV2ZW50VGltZTogZXZlbnRUaW1lLFxuICAgIGxhbmU6IGxhbmUsXG4gICAgdGFnOiBVcGRhdGVTdGF0ZSxcbiAgICBwYXlsb2FkOiBudWxsLFxuICAgIGNhbGxiYWNrOiBudWxsLFxuICAgIG5leHQ6IG51bGxcbiAgfTtcbiAgcmV0dXJuIHVwZGF0ZTtcbn1cbmZ1bmN0aW9uIGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgbGFuZSkge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaWJlci51cGRhdGVRdWV1ZTtcblxuICBpZiAodXBkYXRlUXVldWUgPT09IG51bGwpIHtcbiAgICAvLyBPbmx5IG9jY3VycyBpZiB0aGUgZmliZXIgaGFzIGJlZW4gdW5tb3VudGVkLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHNoYXJlZFF1ZXVlID0gdXBkYXRlUXVldWUuc2hhcmVkO1xuXG4gIHtcbiAgICBpZiAoY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID09PSBzaGFyZWRRdWV1ZSAmJiAhZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSkge1xuICAgICAgZXJyb3IoJ0FuIHVwZGF0ZSAoc2V0U3RhdGUsIHJlcGxhY2VTdGF0ZSwgb3IgZm9yY2VVcGRhdGUpIHdhcyBzY2hlZHVsZWQgJyArICdmcm9tIGluc2lkZSBhbiB1cGRhdGUgZnVuY3Rpb24uIFVwZGF0ZSBmdW5jdGlvbnMgc2hvdWxkIGJlIHB1cmUsICcgKyAnd2l0aCB6ZXJvIHNpZGUtZWZmZWN0cy4gQ29uc2lkZXIgdXNpbmcgY29tcG9uZW50RGlkVXBkYXRlIG9yIGEgJyArICdjYWxsYmFjay4nKTtcblxuICAgICAgZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzVW5zYWZlQ2xhc3NSZW5kZXJQaGFzZVVwZGF0ZSgpKSB7XG4gICAgLy8gVGhpcyBpcyBhbiB1bnNhZmUgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gQWRkIGRpcmVjdGx5IHRvIHRoZSB1cGRhdGVcbiAgICAvLyBxdWV1ZSBzbyB3ZSBjYW4gcHJvY2VzcyBpdCBpbW1lZGlhdGVseSBkdXJpbmcgdGhlIGN1cnJlbnQgcmVuZGVyLlxuICAgIHZhciBwZW5kaW5nID0gc2hhcmVkUXVldWUucGVuZGluZztcblxuICAgIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXBkYXRlLm5leHQgPSBwZW5kaW5nLm5leHQ7XG4gICAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7XG4gICAgfVxuXG4gICAgc2hhcmVkUXVldWUucGVuZGluZyA9IHVwZGF0ZTsgLy8gVXBkYXRlIHRoZSBjaGlsZExhbmVzIGV2ZW4gdGhvdWdoIHdlJ3JlIG1vc3QgbGlrZWx5IGFscmVhZHkgcmVuZGVyaW5nXG4gICAgLy8gdGhpcyBmaWJlci4gVGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaW4gdGhlIGNhc2Ugd2hlcmUgeW91XG4gICAgLy8gdXBkYXRlIGEgZGlmZmVyZW50IGNvbXBvbmVudCBkdXJpbmcgcmVuZGVyIHBoYXNlIHRoYW4gdGhlIG9uZSB0aGF0IGlzXG4gICAgLy8gY3VycmVudGx5IHJlbmRlcmluZ3MgKGEgcGF0dGVybiB0aGF0IGlzIGFjY29tcGFuaWVkIGJ5IGEgd2FybmluZykuXG5cbiAgICByZXR1cm4gdW5zYWZlX21hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZW5xdWV1ZUNvbmN1cnJlbnRDbGFzc1VwZGF0ZShmaWJlciwgc2hhcmVkUXVldWUsIHVwZGF0ZSwgbGFuZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmliZXIudXBkYXRlUXVldWU7XG5cbiAgaWYgKHVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgLy8gT25seSBvY2N1cnMgaWYgdGhlIGZpYmVyIGhhcyBiZWVuIHVubW91bnRlZC5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2hhcmVkUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG5cbiAgaWYgKGlzVHJhbnNpdGlvbkxhbmUobGFuZSkpIHtcbiAgICB2YXIgcXVldWVMYW5lcyA9IHNoYXJlZFF1ZXVlLmxhbmVzOyAvLyBJZiBhbnkgZW50YW5nbGVkIGxhbmVzIGFyZSBubyBsb25nZXIgcGVuZGluZyBvbiB0aGUgcm9vdCwgdGhlbiB0aGV5IG11c3RcbiAgICAvLyBoYXZlIGZpbmlzaGVkLiBXZSBjYW4gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgc2hhcmVkIHF1ZXVlLCB3aGljaCByZXByZXNlbnRzXG4gICAgLy8gYSBzdXBlcnNldCBvZiB0aGUgYWN0dWFsbHkgcGVuZGluZyBsYW5lcy4gSW4gc29tZSBjYXNlcyB3ZSBtYXkgZW50YW5nbGVcbiAgICAvLyBtb3JlIHRoYW4gd2UgbmVlZCB0bywgYnV0IHRoYXQncyBPSy4gSW4gZmFjdCBpdCdzIHdvcnNlIGlmIHdlICpkb24ndCpcbiAgICAvLyBlbnRhbmdsZSB3aGVuIHdlIHNob3VsZC5cblxuICAgIHF1ZXVlTGFuZXMgPSBpbnRlcnNlY3RMYW5lcyhxdWV1ZUxhbmVzLCByb290LnBlbmRpbmdMYW5lcyk7IC8vIEVudGFuZ2xlIHRoZSBuZXcgdHJhbnNpdGlvbiBsYW5lIHdpdGggdGhlIG90aGVyIHRyYW5zaXRpb24gbGFuZXMuXG5cbiAgICB2YXIgbmV3UXVldWVMYW5lcyA9IG1lcmdlTGFuZXMocXVldWVMYW5lcywgbGFuZSk7XG4gICAgc2hhcmVkUXVldWUubGFuZXMgPSBuZXdRdWV1ZUxhbmVzOyAvLyBFdmVuIGlmIHF1ZXVlLmxhbmVzIGFscmVhZHkgaW5jbHVkZSBsYW5lLCB3ZSBkb24ndCBrbm93IGZvciBjZXJ0YWluIGlmXG4gICAgLy8gdGhlIGxhbmUgZmluaXNoZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBlbnRhbmdsZWQgaXQuIFNvIHdlIG5lZWQgdG9cbiAgICAvLyBlbnRhbmdsZSBpdCBhZ2FpbiwganVzdCB0byBiZSBzdXJlLlxuXG4gICAgbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgbmV3UXVldWVMYW5lcyk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY2FwdHVyZWRVcGRhdGUpIHtcbiAgLy8gQ2FwdHVyZWQgdXBkYXRlcyBhcmUgdXBkYXRlcyB0aGF0IGFyZSB0aHJvd24gYnkgYSBjaGlsZCBkdXJpbmcgdGhlIHJlbmRlclxuICAvLyBwaGFzZS4gVGhleSBzaG91bGQgYmUgZGlzY2FyZGVkIGlmIHRoZSByZW5kZXIgaXMgYWJvcnRlZC4gVGhlcmVmb3JlLFxuICAvLyB3ZSBzaG91bGQgb25seSBwdXQgdGhlbSBvbiB0aGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSwgbm90IHRoZSBjdXJyZW50IG9uZS5cbiAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7IC8vIENoZWNrIGlmIHRoZSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIGlzIGEgY2xvbmUuXG5cbiAgdmFyIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudFF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcblxuICAgIGlmIChxdWV1ZSA9PT0gY3VycmVudFF1ZXVlKSB7XG4gICAgICAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LiBUaGlzIGhhcHBlbnMgd2hlblxuICAgICAgLy8gd2UgYmFpbCBvdXQgb24gYSBwYXJlbnQgZmliZXIgdGhhdCB0aGVuIGNhcHR1cmVzIGFuIGVycm9yIHRocm93biBieVxuICAgICAgLy8gYSBjaGlsZC4gU2luY2Ugd2Ugd2FudCB0byBhcHBlbmQgdGhlIHVwZGF0ZSBvbmx5IHRvIHRoZSB3b3JrLWluXG4gICAgICAvLyAtcHJvZ3Jlc3MgcXVldWUsIHdlIG5lZWQgdG8gY2xvbmUgdGhlIHVwZGF0ZXMuIFdlIHVzdWFsbHkgY2xvbmUgZHVyaW5nXG4gICAgICAvLyBwcm9jZXNzVXBkYXRlUXVldWUsIGJ1dCB0aGF0IGRpZG4ndCBoYXBwZW4gaW4gdGhpcyBjYXNlIGJlY2F1c2Ugd2VcbiAgICAgIC8vIHNraXBwZWQgb3ZlciB0aGUgcGFyZW50IHdoZW4gd2UgYmFpbGVkIG91dC5cbiAgICAgIHZhciBuZXdGaXJzdCA9IG51bGw7XG4gICAgICB2YXIgbmV3TGFzdCA9IG51bGw7XG4gICAgICB2YXIgZmlyc3RCYXNlVXBkYXRlID0gcXVldWUuZmlyc3RCYXNlVXBkYXRlO1xuXG4gICAgICBpZiAoZmlyc3RCYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgdXBkYXRlcyBhbmQgY2xvbmUgdGhlbS5cbiAgICAgICAgdmFyIHVwZGF0ZSA9IGZpcnN0QmFzZVVwZGF0ZTtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgdmFyIGNsb25lID0ge1xuICAgICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGUuZXZlbnRUaW1lLFxuICAgICAgICAgICAgbGFuZTogdXBkYXRlLmxhbmUsXG4gICAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUucGF5bG9hZCxcbiAgICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChuZXdMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjbG9uZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3TGFzdC5uZXh0ID0gY2xvbmU7XG4gICAgICAgICAgICBuZXdMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gICAgICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gbnVsbCk7IC8vIEFwcGVuZCB0aGUgY2FwdHVyZWQgdXBkYXRlIHRoZSBlbmQgb2YgdGhlIGNsb25lZCBsaXN0LlxuXG5cbiAgICAgICAgaWYgKG5ld0xhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdMYXN0Lm5leHQgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgICAgICBuZXdMYXN0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZXJlIGFyZSBubyBiYXNlIHVwZGF0ZXMuXG4gICAgICAgIG5ld0ZpcnN0ID0gbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZSA9IHtcbiAgICAgICAgYmFzZVN0YXRlOiBjdXJyZW50UXVldWUuYmFzZVN0YXRlLFxuICAgICAgICBmaXJzdEJhc2VVcGRhdGU6IG5ld0ZpcnN0LFxuICAgICAgICBsYXN0QmFzZVVwZGF0ZTogbmV3TGFzdCxcbiAgICAgICAgc2hhcmVkOiBjdXJyZW50UXVldWUuc2hhcmVkLFxuICAgICAgICBlZmZlY3RzOiBjdXJyZW50UXVldWUuZWZmZWN0c1xuICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gcXVldWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IC8vIEFwcGVuZCB0aGUgdXBkYXRlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuXG5cblxuICB2YXIgbGFzdEJhc2VVcGRhdGUgPSBxdWV1ZS5sYXN0QmFzZVVwZGF0ZTtcblxuICBpZiAobGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgfSBlbHNlIHtcbiAgICBsYXN0QmFzZVVwZGF0ZS5uZXh0ID0gY2FwdHVyZWRVcGRhdGU7XG4gIH1cblxuICBxdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IGNhcHR1cmVkVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBnZXRTdGF0ZUZyb21VcGRhdGUod29ya0luUHJvZ3Jlc3MsIHF1ZXVlLCB1cGRhdGUsIHByZXZTdGF0ZSwgbmV4dFByb3BzLCBpbnN0YW5jZSkge1xuICBzd2l0Y2ggKHVwZGF0ZS50YWcpIHtcbiAgICBjYXNlIFJlcGxhY2VTdGF0ZTpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBheWxvYWQgPSB1cGRhdGUucGF5bG9hZDtcblxuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBVcGRhdGVyIGZ1bmN0aW9uXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBuZXh0U3RhdGUgPSBwYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXhpdERpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICAgICAgfSAvLyBTdGF0ZSBvYmplY3RcblxuXG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgfVxuXG4gICAgY2FzZSBDYXB0dXJlVXBkYXRlOlxuICAgICAge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IHdvcmtJblByb2dyZXNzLmZsYWdzICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlO1xuICAgICAgfVxuICAgIC8vIEludGVudGlvbmFsIGZhbGx0aHJvdWdoXG5cbiAgICBjYXNlIFVwZGF0ZVN0YXRlOlxuICAgICAge1xuICAgICAgICB2YXIgX3BheWxvYWQgPSB1cGRhdGUucGF5bG9hZDtcbiAgICAgICAgdmFyIHBhcnRpYWxTdGF0ZTtcblxuICAgICAgICBpZiAodHlwZW9mIF9wYXlsb2FkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gVXBkYXRlciBmdW5jdGlvblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJ0aWFsU3RhdGUgPSBfcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgX3BheWxvYWQuY2FsbChpbnN0YW5jZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMpO1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUGFydGlhbCBzdGF0ZSBvYmplY3RcbiAgICAgICAgICBwYXJ0aWFsU3RhdGUgPSBfcGF5bG9hZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0aWFsU3RhdGUgPT09IG51bGwgfHwgcGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBOdWxsIGFuZCB1bmRlZmluZWQgYXJlIHRyZWF0ZWQgYXMgbm8tb3BzLlxuICAgICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICAgIH0gLy8gTWVyZ2UgdGhlIHBhcnRpYWwgc3RhdGUgYW5kIHRoZSBwcmV2aW91cyBzdGF0ZS5cblxuXG4gICAgICAgIHJldHVybiBhc3NpZ24oe30sIHByZXZTdGF0ZSwgcGFydGlhbFN0YXRlKTtcbiAgICAgIH1cblxuICAgIGNhc2UgRm9yY2VVcGRhdGU6XG4gICAgICB7XG4gICAgICAgIGhhc0ZvcmNlVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZTtcbiAgICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcmV2U3RhdGU7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgcHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIGlzIGFsd2F5cyBub24tbnVsbCBvbiBhIENsYXNzQ29tcG9uZW50IG9yIEhvc3RSb290XG4gIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xuXG4gIHtcbiAgICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQ7XG4gIH1cblxuICB2YXIgZmlyc3RCYXNlVXBkYXRlID0gcXVldWUuZmlyc3RCYXNlVXBkYXRlO1xuICB2YXIgbGFzdEJhc2VVcGRhdGUgPSBxdWV1ZS5sYXN0QmFzZVVwZGF0ZTsgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIHBlbmRpbmcgdXBkYXRlcy4gSWYgc28sIHRyYW5zZmVyIHRoZW0gdG8gdGhlIGJhc2UgcXVldWUuXG5cbiAgdmFyIHBlbmRpbmdRdWV1ZSA9IHF1ZXVlLnNoYXJlZC5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nUXVldWUgIT09IG51bGwpIHtcbiAgICBxdWV1ZS5zaGFyZWQucGVuZGluZyA9IG51bGw7IC8vIFRoZSBwZW5kaW5nIHF1ZXVlIGlzIGNpcmN1bGFyLiBEaXNjb25uZWN0IHRoZSBwb2ludGVyIGJldHdlZW4gZmlyc3RcbiAgICAvLyBhbmQgbGFzdCBzbyB0aGF0IGl0J3Mgbm9uLWNpcmN1bGFyLlxuXG4gICAgdmFyIGxhc3RQZW5kaW5nVXBkYXRlID0gcGVuZGluZ1F1ZXVlO1xuICAgIHZhciBmaXJzdFBlbmRpbmdVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0O1xuICAgIGxhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBudWxsOyAvLyBBcHBlbmQgcGVuZGluZyB1cGRhdGVzIHRvIGJhc2UgcXVldWVcblxuICAgIGlmIChsYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgZmlyc3RCYXNlVXBkYXRlID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0QmFzZVVwZGF0ZS5uZXh0ID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgIH1cblxuICAgIGxhc3RCYXNlVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGU7IC8vIElmIHRoZXJlJ3MgYSBjdXJyZW50IHF1ZXVlLCBhbmQgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgYmFzZSBxdWV1ZSwgdGhlblxuICAgIC8vIHdlIG5lZWQgdG8gdHJhbnNmZXIgdGhlIHVwZGF0ZXMgdG8gdGhhdCBxdWV1ZSwgdG9vLiBCZWNhdXNlIHRoZSBiYXNlXG4gICAgLy8gcXVldWUgaXMgYSBzaW5nbHktbGlua2VkIGxpc3Qgd2l0aCBubyBjeWNsZXMsIHdlIGNhbiBhcHBlbmQgdG8gYm90aFxuICAgIC8vIGxpc3RzIGFuZCB0YWtlIGFkdmFudGFnZSBvZiBzdHJ1Y3R1cmFsIHNoYXJpbmcuXG4gICAgLy8gVE9ETzogUGFzcyBgY3VycmVudGAgYXMgYXJndW1lbnRcblxuICAgIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgYWx3YXlzIG5vbi1udWxsIG9uIGEgQ2xhc3NDb21wb25lbnQgb3IgSG9zdFJvb3RcbiAgICAgIHZhciBjdXJyZW50UXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuICAgICAgdmFyIGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSA9IGN1cnJlbnRRdWV1ZS5sYXN0QmFzZVVwZGF0ZTtcblxuICAgICAgaWYgKGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSAhPT0gbGFzdEJhc2VVcGRhdGUpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGN1cnJlbnRRdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudExhc3RCYXNlVXBkYXRlLm5leHQgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50UXVldWUubGFzdEJhc2VVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gVGhlc2UgdmFsdWVzIG1heSBjaGFuZ2UgYXMgd2UgcHJvY2VzcyB0aGUgcXVldWUuXG5cblxuICBpZiAoZmlyc3RCYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBsaXN0IG9mIHVwZGF0ZXMgdG8gY29tcHV0ZSB0aGUgcmVzdWx0LlxuICAgIHZhciBuZXdTdGF0ZSA9IHF1ZXVlLmJhc2VTdGF0ZTsgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byBhY2N1bXVsYXRlIHRoaXMuIEluc3RlYWQsIHdlIGNhbiByZW1vdmUgcmVuZGVyTGFuZXNcbiAgICAvLyBmcm9tIHRoZSBvcmlnaW5hbCBsYW5lcy5cblxuICAgIHZhciBuZXdMYW5lcyA9IE5vTGFuZXM7XG4gICAgdmFyIG5ld0Jhc2VTdGF0ZSA9IG51bGw7XG4gICAgdmFyIG5ld0ZpcnN0QmFzZVVwZGF0ZSA9IG51bGw7XG4gICAgdmFyIG5ld0xhc3RCYXNlVXBkYXRlID0gbnVsbDtcbiAgICB2YXIgdXBkYXRlID0gZmlyc3RCYXNlVXBkYXRlO1xuXG4gICAgZG8ge1xuICAgICAgdmFyIHVwZGF0ZUxhbmUgPSB1cGRhdGUubGFuZTtcbiAgICAgIHZhciB1cGRhdGVFdmVudFRpbWUgPSB1cGRhdGUuZXZlbnRUaW1lO1xuXG4gICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhyZW5kZXJMYW5lcywgdXBkYXRlTGFuZSkpIHtcbiAgICAgICAgLy8gUHJpb3JpdHkgaXMgaW5zdWZmaWNpZW50LiBTa2lwIHRoaXMgdXBkYXRlLiBJZiB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAvLyBza2lwcGVkIHVwZGF0ZSwgdGhlIHByZXZpb3VzIHVwZGF0ZS9zdGF0ZSBpcyB0aGUgbmV3IGJhc2VcbiAgICAgICAgLy8gdXBkYXRlL3N0YXRlLlxuICAgICAgICB2YXIgY2xvbmUgPSB7XG4gICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGVFdmVudFRpbWUsXG4gICAgICAgICAgbGFuZTogdXBkYXRlTGFuZSxcbiAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgcGF5bG9hZDogdXBkYXRlLnBheWxvYWQsXG4gICAgICAgICAgY2FsbGJhY2s6IHVwZGF0ZS5jYWxsYmFjayxcbiAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG5ld0xhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3Rmlyc3RCYXNlVXBkYXRlID0gbmV3TGFzdEJhc2VVcGRhdGUgPSBjbG9uZTtcbiAgICAgICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdMYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlLm5leHQgPSBjbG9uZTtcbiAgICAgICAgfSAvLyBVcGRhdGUgdGhlIHJlbWFpbmluZyBwcmlvcml0eSBpbiB0aGUgcXVldWUuXG5cblxuICAgICAgICBuZXdMYW5lcyA9IG1lcmdlTGFuZXMobmV3TGFuZXMsIHVwZGF0ZUxhbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyB1cGRhdGUgZG9lcyBoYXZlIHN1ZmZpY2llbnQgcHJpb3JpdHkuXG4gICAgICAgIGlmIChuZXdMYXN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfY2xvbmUgPSB7XG4gICAgICAgICAgICBldmVudFRpbWU6IHVwZGF0ZUV2ZW50VGltZSxcbiAgICAgICAgICAgIC8vIFRoaXMgdXBkYXRlIGlzIGdvaW5nIHRvIGJlIGNvbW1pdHRlZCBzbyB3ZSBuZXZlciB3YW50IHVuY29tbWl0XG4gICAgICAgICAgICAvLyBpdC4gVXNpbmcgTm9MYW5lIHdvcmtzIGJlY2F1c2UgMCBpcyBhIHN1YnNldCBvZiBhbGwgYml0bWFza3MsIHNvXG4gICAgICAgICAgICAvLyB0aGlzIHdpbGwgbmV2ZXIgYmUgc2tpcHBlZCBieSB0aGUgY2hlY2sgYWJvdmUuXG4gICAgICAgICAgICBsYW5lOiBOb0xhbmUsXG4gICAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUucGF5bG9hZCxcbiAgICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBuZXdMYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlLm5leHQgPSBfY2xvbmU7XG4gICAgICAgIH0gLy8gUHJvY2VzcyB0aGlzIHVwZGF0ZS5cblxuXG4gICAgICAgIG5ld1N0YXRlID0gZ2V0U3RhdGVGcm9tVXBkYXRlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgdXBkYXRlLCBuZXdTdGF0ZSwgcHJvcHMsIGluc3RhbmNlKTtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdXBkYXRlLmNhbGxiYWNrO1xuXG4gICAgICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCAmJiAvLyBJZiB0aGUgdXBkYXRlIHdhcyBhbHJlYWR5IGNvbW1pdHRlZCwgd2Ugc2hvdWxkIG5vdCBxdWV1ZSBpdHNcbiAgICAgICAgLy8gY2FsbGJhY2sgYWdhaW4uXG4gICAgICAgIHVwZGF0ZS5sYW5lICE9PSBOb0xhbmUpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDYWxsYmFjaztcbiAgICAgICAgICB2YXIgZWZmZWN0cyA9IHF1ZXVlLmVmZmVjdHM7XG5cbiAgICAgICAgICBpZiAoZWZmZWN0cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWUuZWZmZWN0cyA9IFt1cGRhdGVdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlZmZlY3RzLnB1c2godXBkYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG5cbiAgICAgIGlmICh1cGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgcGVuZGluZ1F1ZXVlID0gcXVldWUuc2hhcmVkLnBlbmRpbmc7XG5cbiAgICAgICAgaWYgKHBlbmRpbmdRdWV1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIGZyb20gaW5zaWRlIGEgcmVkdWNlci4gQWRkIHRoZSBuZXdcbiAgICAgICAgICAvLyBwZW5kaW5nIHVwZGF0ZXMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBhbmQga2VlcCBwcm9jZXNzaW5nLlxuICAgICAgICAgIHZhciBfbGFzdFBlbmRpbmdVcGRhdGUgPSBwZW5kaW5nUXVldWU7IC8vIEludGVudGlvbmFsbHkgdW5zb3VuZC4gUGVuZGluZyB1cGRhdGVzIGZvcm0gYSBjaXJjdWxhciBsaXN0LCBidXQgd2VcbiAgICAgICAgICAvLyB1bnJhdmVsIHRoZW0gd2hlbiB0cmFuc2ZlcnJpbmcgdGhlbSB0byB0aGUgYmFzZSBxdWV1ZS5cblxuICAgICAgICAgIHZhciBfZmlyc3RQZW5kaW5nVXBkYXRlID0gX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQ7XG4gICAgICAgICAgX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBudWxsO1xuICAgICAgICAgIHVwZGF0ZSA9IF9maXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBfbGFzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUuc2hhcmVkLnBlbmRpbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIG5ld0Jhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIH1cblxuICAgIHF1ZXVlLmJhc2VTdGF0ZSA9IG5ld0Jhc2VTdGF0ZTtcbiAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBuZXdGaXJzdEJhc2VVcGRhdGU7XG4gICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZTsgLy8gSW50ZXJsZWF2ZWQgdXBkYXRlcyBhcmUgc3RvcmVkIG9uIGEgc2VwYXJhdGUgcXVldWUuIFdlIGFyZW4ndCBnb2luZyB0b1xuICAgIC8vIHByb2Nlc3MgdGhlbSBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCB3ZSBkbyBuZWVkIHRvIHRyYWNrIHdoaWNoIGxhbmVzXG4gICAgLy8gYXJlIHJlbWFpbmluZy5cblxuICAgIHZhciBsYXN0SW50ZXJsZWF2ZWQgPSBxdWV1ZS5zaGFyZWQuaW50ZXJsZWF2ZWQ7XG5cbiAgICBpZiAobGFzdEludGVybGVhdmVkICE9PSBudWxsKSB7XG4gICAgICB2YXIgaW50ZXJsZWF2ZWQgPSBsYXN0SW50ZXJsZWF2ZWQ7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgbmV3TGFuZXMgPSBtZXJnZUxhbmVzKG5ld0xhbmVzLCBpbnRlcmxlYXZlZC5sYW5lKTtcbiAgICAgICAgaW50ZXJsZWF2ZWQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgICAgfSB3aGlsZSAoaW50ZXJsZWF2ZWQgIT09IGxhc3RJbnRlcmxlYXZlZCk7XG4gICAgfSBlbHNlIGlmIChmaXJzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIC8vIGBxdWV1ZS5sYW5lc2AgaXMgdXNlZCBmb3IgZW50YW5nbGluZyB0cmFuc2l0aW9ucy4gV2UgY2FuIHNldCBpdCBiYWNrIHRvXG4gICAgICAvLyB6ZXJvIG9uY2UgdGhlIHF1ZXVlIGlzIGVtcHR5LlxuICAgICAgcXVldWUuc2hhcmVkLmxhbmVzID0gTm9MYW5lcztcbiAgICB9IC8vIFNldCB0aGUgcmVtYWluaW5nIGV4cGlyYXRpb24gdGltZSB0byBiZSB3aGF0ZXZlciBpcyByZW1haW5pbmcgaW4gdGhlIHF1ZXVlLlxuICAgIC8vIFRoaXMgc2hvdWxkIGJlIGZpbmUgYmVjYXVzZSB0aGUgb25seSB0d28gb3RoZXIgdGhpbmdzIHRoYXQgY29udHJpYnV0ZSB0b1xuICAgIC8vIGV4cGlyYXRpb24gdGltZSBhcmUgcHJvcHMgYW5kIGNvbnRleHQuIFdlJ3JlIGFscmVhZHkgaW4gdGhlIG1pZGRsZSBvZiB0aGVcbiAgICAvLyBiZWdpbiBwaGFzZSBieSB0aGUgdGltZSB3ZSBzdGFydCBwcm9jZXNzaW5nIHRoZSBxdWV1ZSwgc28gd2UndmUgYWxyZWFkeVxuICAgIC8vIGRlYWx0IHdpdGggdGhlIHByb3BzLiBDb250ZXh0IGluIGNvbXBvbmVudHMgdGhhdCBzcGVjaWZ5XG4gICAgLy8gc2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIHRyaWNreTsgYnV0IHdlJ2xsIGhhdmUgdG8gYWNjb3VudCBmb3JcbiAgICAvLyB0aGF0IHJlZ2FyZGxlc3MuXG5cblxuICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMobmV3TGFuZXMpO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbmV3TGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9XG5cbiAge1xuICAgIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIGFzIGNhbGxiYWNrLiBFeHBlY3RlZCBhIGZ1bmN0aW9uLiBJbnN0ZWFkICcgKyAoXCJyZWNlaXZlZDogXCIgKyBjYWxsYmFjaykpO1xuICB9XG5cbiAgY2FsbGJhY2suY2FsbChjb250ZXh0KTtcbn1cblxuZnVuY3Rpb24gcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKSB7XG4gIGhhc0ZvcmNlVXBkYXRlID0gZmFsc2U7XG59XG5mdW5jdGlvbiBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkge1xuICByZXR1cm4gaGFzRm9yY2VVcGRhdGU7XG59XG5mdW5jdGlvbiBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIGZpbmlzaGVkUXVldWUsIGluc3RhbmNlKSB7XG4gIC8vIENvbW1pdCB0aGUgZWZmZWN0c1xuICB2YXIgZWZmZWN0cyA9IGZpbmlzaGVkUXVldWUuZWZmZWN0cztcbiAgZmluaXNoZWRRdWV1ZS5lZmZlY3RzID0gbnVsbDtcblxuICBpZiAoZWZmZWN0cyAhPT0gbnVsbCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWZmZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVmZmVjdCA9IGVmZmVjdHNbaV07XG4gICAgICB2YXIgY2FsbGJhY2sgPSBlZmZlY3QuY2FsbGJhY2s7XG5cbiAgICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgICBlZmZlY3QuY2FsbGJhY2sgPSBudWxsO1xuICAgICAgICBjYWxsQ2FsbGJhY2soY2FsbGJhY2ssIGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGZha2VJbnRlcm5hbEluc3RhbmNlID0ge307IC8vIFJlYWN0LkNvbXBvbmVudCB1c2VzIGEgc2hhcmVkIGZyb3plbiBvYmplY3QgYnkgZGVmYXVsdC5cbi8vIFdlJ2xsIHVzZSBpdCB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBuZWVkIHRvIGluaXRpYWxpemUgbGVnYWN5IHJlZnMuXG5cbnZhciBlbXB0eVJlZnNPYmplY3QgPSBuZXcgUmVhY3QuQ29tcG9uZW50KCkucmVmcztcbnZhciBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlO1xudmFyIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlO1xudmFyIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZTtcbnZhciB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGU7XG52YXIgd2Fybk9uSW52YWxpZENhbGxiYWNrO1xudmFyIGRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlO1xudmFyIGRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzO1xudmFyIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZTtcblxue1xuICBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcyA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlID0gbmV3IFNldCgpO1xuICB2YXIgZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrID0gbmV3IFNldCgpO1xuXG4gIHdhcm5PbkludmFsaWRDYWxsYmFjayA9IGZ1bmN0aW9uIChjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIGlmIChjYWxsYmFjayA9PT0gbnVsbCB8fCB0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIga2V5ID0gY2FsbGVyTmFtZSArICdfJyArIGNhbGxiYWNrO1xuXG4gICAgaWYgKCFkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2suaGFzKGtleSkpIHtcbiAgICAgIGRpZFdhcm5PbkludmFsaWRDYWxsYmFjay5hZGQoa2V5KTtcblxuICAgICAgZXJyb3IoJyVzKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsZXJOYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuICB9O1xuXG4gIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZSA9IGZ1bmN0aW9uICh0eXBlLCBwYXJ0aWFsU3RhdGUpIHtcbiAgICBpZiAocGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlLmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignJXMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCk6IEEgdmFsaWQgc3RhdGUgb2JqZWN0IChvciBudWxsKSBtdXN0IGJlIHJldHVybmVkLiAnICsgJ1lvdSBoYXZlIHJldHVybmVkIHVuZGVmaW5lZC4nLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07IC8vIFRoaXMgaXMgc28gZ3Jvc3MgYnV0IGl0J3MgYXQgbGVhc3Qgbm9uLWNyaXRpY2FsIGFuZCBjYW4gYmUgcmVtb3ZlZCBpZlxuICAvLyBpdCBjYXVzZXMgcHJvYmxlbXMuIFRoaXMgaXMgbWVhbnQgdG8gZ2l2ZSBhIG5pY2VyIGVycm9yIG1lc3NhZ2UgZm9yXG4gIC8vIFJlYWN0RE9NMTUudW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocmVhY3RET00xNkNvbXBvbmVudCxcbiAgLy8gLi4uKSkgd2hpY2ggb3RoZXJ3aXNlIHRocm93cyBhIFwiX3Byb2Nlc3NDaGlsZENvbnRleHQgaXMgbm90IGEgZnVuY3Rpb25cIlxuICAvLyBleGNlcHRpb24uXG5cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZmFrZUludGVybmFsSW5zdGFuY2UsICdfcHJvY2Vzc0NoaWxkQ29udGV4dCcsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdfcHJvY2Vzc0NoaWxkQ29udGV4dCBpcyBub3QgYXZhaWxhYmxlIGluIFJlYWN0IDE2Ky4gVGhpcyBsaWtlbHkgJyArICdtZWFucyB5b3UgaGF2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgUmVhY3QgYW5kIGFyZSBhdHRlbXB0aW5nIHRvIG5lc3QgJyArICdhIFJlYWN0IDE1IHRyZWUgaW5zaWRlIGEgUmVhY3QgMTYgdHJlZSB1c2luZyAnICsgXCJ1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lciwgd2hpY2ggaXNuJ3Qgc3VwcG9ydGVkLiBUcnkgXCIgKyAndG8gbWFrZSBzdXJlIHlvdSBoYXZlIG9ubHkgb25lIGNvcHkgb2YgUmVhY3QgKGFuZCBpZGVhbGx5LCBzd2l0Y2ggJyArICd0byBSZWFjdERPTS5jcmVhdGVQb3J0YWwpLicpO1xuICAgIH1cbiAgfSk7XG4gIE9iamVjdC5mcmVlemUoZmFrZUludGVybmFsSW5zdGFuY2UpO1xufVxuXG5mdW5jdGlvbiBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXh0UHJvcHMpIHtcbiAgdmFyIHByZXZTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBwYXJ0aWFsU3RhdGUgPSBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpO1xuXG4gIHtcbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbiBleHRyYSB0aW1lIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cbiAgICAgICAgcGFydGlhbFN0YXRlID0gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcywgcHJldlN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGUoY3RvciwgcGFydGlhbFN0YXRlKTtcbiAgfSAvLyBNZXJnZSB0aGUgcGFydGlhbCBzdGF0ZSBhbmQgdGhlIHByZXZpb3VzIHN0YXRlLlxuXG5cbiAgdmFyIG1lbW9pemVkU3RhdGUgPSBwYXJ0aWFsU3RhdGUgPT09IG51bGwgfHwgcGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQgPyBwcmV2U3RhdGUgOiBhc3NpZ24oe30sIHByZXZTdGF0ZSwgcGFydGlhbFN0YXRlKTtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG1lbW9pemVkU3RhdGU7IC8vIE9uY2UgdGhlIHVwZGF0ZSBxdWV1ZSBpcyBlbXB0eSwgcGVyc2lzdCB0aGUgZGVyaXZlZCBzdGF0ZSBvbnRvIHRoZVxuICAvLyBiYXNlIHN0YXRlLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFF1ZXVlIGlzIGFsd2F5cyBub24tbnVsbCBmb3IgY2xhc3Nlc1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICAgIHVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IG1lbW9pemVkU3RhdGU7XG4gIH1cbn1cblxudmFyIGNsYXNzQ29tcG9uZW50VXBkYXRlciA9IHtcbiAgaXNNb3VudGVkOiBpc01vdW50ZWQsXG4gIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKGluc3QsIHBheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICAgIHVwZGF0ZS5wYXlsb2FkID0gcGF5bG9hZDtcblxuICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjaywgJ3NldFN0YXRlJyk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBsYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGZpYmVyLCBsYW5lKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBtYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfSxcbiAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKGluc3QsIHBheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICAgIHVwZGF0ZS50YWcgPSBSZXBsYWNlU3RhdGU7XG4gICAgdXBkYXRlLnBheWxvYWQgPSBwYXlsb2FkO1xuXG4gICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgd2Fybk9uSW52YWxpZENhbGxiYWNrKGNhbGxiYWNrLCAncmVwbGFjZVN0YXRlJyk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBsYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGZpYmVyLCBsYW5lKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBtYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfSxcbiAgZW5xdWV1ZUZvcmNlVXBkYXRlOiBmdW5jdGlvbiAoaW5zdCwgY2FsbGJhY2spIHtcbiAgICB2YXIgZmliZXIgPSBnZXQoaW5zdCk7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7XG4gICAgdXBkYXRlLnRhZyA9IEZvcmNlVXBkYXRlO1xuXG4gICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgd2Fybk9uSW52YWxpZENhbGxiYWNrKGNhbGxiYWNrLCAnZm9yY2VVcGRhdGUnKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3Rvciwgb2xkUHJvcHMsIG5ld1Byb3BzLCBvbGRTdGF0ZSwgbmV3U3RhdGUsIG5leHRDb250ZXh0KSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICBpZiAodHlwZW9mIGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBzaG91bGRVcGRhdGUgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgICB7XG4gICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbiBleHRyYSB0aW1lIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cbiAgICAgICAgICBzaG91bGRVcGRhdGUgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRVcGRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlcnJvcignJXMuc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk6IFJldHVybmVkIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIGEgJyArICdib29sZWFuIHZhbHVlLiBNYWtlIHN1cmUgdG8gcmV0dXJuIHRydWUgb3IgZmFsc2UuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2hvdWxkVXBkYXRlO1xuICB9XG5cbiAgaWYgKGN0b3IucHJvdG90eXBlICYmIGN0b3IucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50KSB7XG4gICAgcmV0dXJuICFzaGFsbG93RXF1YWwob2xkUHJvcHMsIG5ld1Byb3BzKSB8fCAhc2hhbGxvd0VxdWFsKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY2hlY2tDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcykge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAge1xuICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuICAgIHZhciByZW5kZXJQcmVzZW50ID0gaW5zdGFuY2UucmVuZGVyO1xuXG4gICAgaWYgKCFyZW5kZXJQcmVzZW50KSB7XG4gICAgICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgdHlwZW9mIGN0b3IucHJvdG90eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcignJXMoLi4uKTogTm8gYHJlbmRlcmAgbWV0aG9kIGZvdW5kIG9uIHRoZSByZXR1cm5lZCBjb21wb25lbnQgJyArICdpbnN0YW5jZTogZGlkIHlvdSBhY2NpZGVudGFsbHkgcmV0dXJuIGFuIG9iamVjdCBmcm9tIHRoZSBjb25zdHJ1Y3Rvcj8nLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBObyBgcmVuZGVyYCBtZXRob2QgZm91bmQgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudCAnICsgJ2luc3RhbmNlOiB5b3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIGRlZmluZSBgcmVuZGVyYC4nLCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZ2V0SW5pdGlhbFN0YXRlICYmICFpbnN0YW5jZS5nZXRJbml0aWFsU3RhdGUuaXNSZWFjdENsYXNzQXBwcm92ZWQgJiYgIWluc3RhbmNlLnN0YXRlKSB7XG4gICAgICBlcnJvcignZ2V0SW5pdGlhbFN0YXRlIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBkZWZpbmUgYSBzdGF0ZSBwcm9wZXJ0eSBpbnN0ZWFkPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5nZXREZWZhdWx0UHJvcHMgJiYgIWluc3RhbmNlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyB3YXMgZGVmaW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiAnICsgJ1RoaXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGNsYXNzZXMgY3JlYXRlZCB1c2luZyBSZWFjdC5jcmVhdGVDbGFzcy4gJyArICdVc2UgYSBzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGRlZmF1bHRQcm9wcyBpbnN0ZWFkLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5wcm9wVHlwZXMpIHtcbiAgICAgIGVycm9yKCdwcm9wVHlwZXMgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBwcm9wVHlwZXMgaW5zdGVhZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuY29udGV4dFR5cGUpIHtcbiAgICAgIGVycm9yKCdjb250ZXh0VHlwZSB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIGNvbnRleHRUeXBlIGluc3RlYWQuJywgbmFtZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGluc3RhbmNlLmNvbnRleHRUeXBlcykge1xuICAgICAgICBlcnJvcignY29udGV4dFR5cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5cGVzIGluc3RlYWQuJywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdG9yLmNvbnRleHRUeXBlICYmIGN0b3IuY29udGV4dFR5cGVzICYmICFkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcy5oYXMoY3RvcikpIHtcbiAgICAgICAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMuYWRkKGN0b3IpO1xuXG4gICAgICAgIGVycm9yKCclcyBkZWNsYXJlcyBib3RoIGNvbnRleHRUeXBlcyBhbmQgY29udGV4dFR5cGUgc3RhdGljIHByb3BlcnRpZXMuICcgKyAnVGhlIGxlZ2FjeSBjb250ZXh0VHlwZXMgcHJvcGVydHkgd2lsbCBiZSBpZ25vcmVkLicsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50U2hvdWxkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudFNob3VsZFVwZGF0ZSgpLiBEaWQgeW91IG1lYW4gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk/ICcgKyAnVGhlIG5hbWUgaXMgcGhyYXNlZCBhcyBhIHF1ZXN0aW9uIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGlzICcgKyAnZXhwZWN0ZWQgdG8gcmV0dXJuIGEgdmFsdWUuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGN0b3IucHJvdG90eXBlICYmIGN0b3IucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ICYmIHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCBzaG91bGRDb21wb25lbnRVcGRhdGUoKS4gJyArICdzaG91bGRDb21wb25lbnRVcGRhdGUgc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4gZXh0ZW5kaW5nIFJlYWN0LlB1cmVDb21wb25lbnQuICcgKyAnUGxlYXNlIGV4dGVuZCBSZWFjdC5Db21wb25lbnQgaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIHVzZWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdBIHB1cmUgY29tcG9uZW50Jyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudERpZFVubW91bnQoKS4gQnV0IHRoZXJlIGlzIG5vIHN1Y2ggbGlmZWN5Y2xlIG1ldGhvZC4gJyArICdEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFVubW91bnQoKT8nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnREaWRSZWNlaXZlUHJvcHMoKS4gQnV0IHRoZXJlIGlzIG5vIHN1Y2ggbGlmZWN5Y2xlIG1ldGhvZC4gJyArICdJZiB5b3UgbWVhbnQgdG8gdXBkYXRlIHRoZSBzdGF0ZSBpbiByZXNwb25zZSB0byBjaGFuZ2luZyBwcm9wcywgJyArICd1c2UgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpLiBJZiB5b3UgbWVhbnQgdG8gZmV0Y2ggZGF0YSBvciAnICsgJ3J1biBzaWRlLWVmZmVjdHMgb3IgbXV0YXRpb25zIGFmdGVyIFJlYWN0IGhhcyB1cGRhdGVkIHRoZSBVSSwgdXNlIGNvbXBvbmVudERpZFVwZGF0ZSgpLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzKCkuIERpZCB5b3UgbWVhbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdVTlNBRkVfY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKT8nLCBuYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgaGFzTXV0YXRlZFByb3BzID0gaW5zdGFuY2UucHJvcHMgIT09IG5ld1Byb3BzO1xuXG4gICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSB1bmRlZmluZWQgJiYgaGFzTXV0YXRlZFByb3BzKSB7XG4gICAgICBlcnJvcignJXMoLi4uKTogV2hlbiBjYWxsaW5nIHN1cGVyKCkgaW4gYCVzYCwgbWFrZSBzdXJlIHRvIHBhc3MgJyArIFwidXAgdGhlIHNhbWUgcHJvcHMgdGhhdCB5b3VyIGNvbXBvbmVudCdzIGNvbnN0cnVjdG9yIHdhcyBwYXNzZWQuXCIsIG5hbWUsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIGVycm9yKCdTZXR0aW5nIGRlZmF1bHRQcm9wcyBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcyBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIGlnbm9yZWQuJyArICcgSW5zdGVhZCwgZGVmaW5lIGRlZmF1bHRQcm9wcyBhcyBhIHN0YXRpYyBwcm9wZXJ0eSBvbiAlcy4nLCBuYW1lLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgIT09ICdmdW5jdGlvbicgJiYgIWRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZS5oYXMoY3RvcikpIHtcbiAgICAgIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZS5hZGQoY3Rvcik7XG5cbiAgICAgIGVycm9yKCclczogZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBzaG91bGQgYmUgdXNlZCB3aXRoIGNvbXBvbmVudERpZFVwZGF0ZSgpLiAnICsgJ1RoaXMgY29tcG9uZW50IGRlZmluZXMgZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBvbmx5LicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclczogZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCkgaXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBtZXRob2QgJyArICdhbmQgd2lsbCBiZSBpZ25vcmVkLiBJbnN0ZWFkLCBkZWNsYXJlIGl0IGFzIGEgc3RhdGljIG1ldGhvZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzOiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoKSBpcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIG1ldGhvZCAnICsgJ2FuZCB3aWxsIGJlIGlnbm9yZWQuIEluc3RlYWQsIGRlY2xhcmUgaXQgYXMgYSBzdGF0aWMgbWV0aG9kLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY3Rvci5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzOiBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIGlzIGRlZmluZWQgYXMgYSBzdGF0aWMgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhbiBpbnN0YW5jZSBtZXRob2QuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIF9zdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gICAgaWYgKF9zdGF0ZSAmJiAodHlwZW9mIF9zdGF0ZSAhPT0gJ29iamVjdCcgfHwgaXNBcnJheShfc3RhdGUpKSkge1xuICAgICAgZXJyb3IoJyVzLnN0YXRlOiBtdXN0IGJlIHNldCB0byBhbiBvYmplY3Qgb3IgbnVsbCcsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBjdG9yLmNoaWxkQ29udGV4dFR5cGVzICE9PSAnb2JqZWN0Jykge1xuICAgICAgZXJyb3IoJyVzLmdldENoaWxkQ29udGV4dCgpOiBjaGlsZENvbnRleHRUeXBlcyBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgdG8gJyArICd1c2UgZ2V0Q2hpbGRDb250ZXh0KCkuJywgbmFtZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkb3B0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UudXBkYXRlciA9IGNsYXNzQ29tcG9uZW50VXBkYXRlcjtcbiAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gaW5zdGFuY2U7IC8vIFRoZSBpbnN0YW5jZSBuZWVkcyBhY2Nlc3MgdG8gdGhlIGZpYmVyIHNvIHRoYXQgaXQgY2FuIHNjaGVkdWxlIHVwZGF0ZXNcblxuICBzZXQoaW5zdGFuY2UsIHdvcmtJblByb2dyZXNzKTtcblxuICB7XG4gICAgaW5zdGFuY2UuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSA9IGZha2VJbnRlcm5hbEluc3RhbmNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHByb3BzKSB7XG4gIHZhciBpc0xlZ2FjeUNvbnRleHRDb25zdW1lciA9IGZhbHNlO1xuICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuICB2YXIgY29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcblxuICB7XG4gICAgaWYgKCdjb250ZXh0VHlwZScgaW4gY3Rvcikge1xuICAgICAgdmFyIGlzVmFsaWQgPSAvLyBBbGxvdyBudWxsIGZvciBjb25kaXRpb25hbCBkZWNsYXJhdGlvblxuICAgICAgY29udGV4dFR5cGUgPT09IG51bGwgfHwgY29udGV4dFR5cGUgIT09IHVuZGVmaW5lZCAmJiBjb250ZXh0VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFICYmIGNvbnRleHRUeXBlLl9jb250ZXh0ID09PSB1bmRlZmluZWQ7IC8vIE5vdCBhIDxDb250ZXh0LkNvbnN1bWVyPlxuXG4gICAgICBpZiAoIWlzVmFsaWQgJiYgIWRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZS5oYXMoY3RvcikpIHtcbiAgICAgICAgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlLmFkZChjdG9yKTtcbiAgICAgICAgdmFyIGFkZGVuZHVtID0gJyc7XG5cbiAgICAgICAgaWYgKGNvbnRleHRUeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIHVuZGVmaW5lZC4gJyArICdUaGlzIGNhbiBiZSBjYXVzZWQgYnkgYSB0eXBvIG9yIGJ5IG1peGluZyB1cCBuYW1lZCBhbmQgZGVmYXVsdCBpbXBvcnRzLiAnICsgJ1RoaXMgY2FuIGFsc28gaGFwcGVuIGR1ZSB0byBhIGNpcmN1bGFyIGRlcGVuZGVuY3ksIHNvICcgKyAndHJ5IG1vdmluZyB0aGUgY3JlYXRlQ29udGV4dCgpIGNhbGwgdG8gYSBzZXBhcmF0ZSBmaWxlLic7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRleHRUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBIb3dldmVyLCBpdCBpcyBzZXQgdG8gYSAnICsgdHlwZW9mIGNvbnRleHRUeXBlICsgJy4nO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFKSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIERpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgdGhlIENvbnRleHQuUHJvdmlkZXIgaW5zdGVhZD8nO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlLl9jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyA8Q29udGV4dC5Db25zdW1lcj5cbiAgICAgICAgICBhZGRlbmR1bSA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyB0aGUgQ29udGV4dC5Db25zdW1lciBpbnN0ZWFkPyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIEhvd2V2ZXIsIGl0IGlzIHNldCB0byBhbiBvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY29udGV4dFR5cGUpLmpvaW4oJywgJykgKyAnfS4nO1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3IoJyVzIGRlZmluZXMgYW4gaW52YWxpZCBjb250ZXh0VHlwZS4gJyArICdjb250ZXh0VHlwZSBzaG91bGQgcG9pbnQgdG8gdGhlIENvbnRleHQgb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZUNvbnRleHQoKS4lcycsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JywgYWRkZW5kdW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgY29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIHZhciBjb250ZXh0VHlwZXMgPSBjdG9yLmNvbnRleHRUeXBlcztcbiAgICBpc0xlZ2FjeUNvbnRleHRDb25zdW1lciA9IGNvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjb250ZXh0VHlwZXMgIT09IHVuZGVmaW5lZDtcbiAgICBjb250ZXh0ID0gaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPyBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpIDogZW1wdHlDb250ZXh0T2JqZWN0O1xuICB9XG5cbiAgdmFyIGluc3RhbmNlID0gbmV3IGN0b3IocHJvcHMsIGNvbnRleHQpOyAvLyBJbnN0YW50aWF0ZSB0d2ljZSB0byBoZWxwIGRldGVjdCBzaWRlLWVmZmVjdHMuXG5cbiAge1xuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpbnN0YW5jZSA9IG5ldyBjdG9yKHByb3BzLCBjb250ZXh0KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGUgIT09IG51bGwgJiYgaW5zdGFuY2Uuc3RhdGUgIT09IHVuZGVmaW5lZCA/IGluc3RhbmNlLnN0YXRlIDogbnVsbDtcbiAgYWRvcHRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7XG5cbiAge1xuICAgIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgc3RhdGUgPT09IG51bGwpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlLmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignYCVzYCB1c2VzIGBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNgIGJ1dCBpdHMgaW5pdGlhbCBzdGF0ZSBpcyAnICsgJyVzLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZC4gSW5zdGVhZCwgZGVmaW5lIHRoZSBpbml0aWFsIHN0YXRlIGJ5ICcgKyAnYXNzaWduaW5nIGFuIG9iamVjdCB0byBgdGhpcy5zdGF0ZWAgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIGAlc2AuICcgKyAnVGhpcyBlbnN1cmVzIHRoYXQgYGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc2AgYXJndW1lbnRzIGhhdmUgYSBjb25zaXN0ZW50IHNoYXBlLicsIGNvbXBvbmVudE5hbWUsIGluc3RhbmNlLnN0YXRlID09PSBudWxsID8gJ251bGwnIDogJ3VuZGVmaW5lZCcsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH0gLy8gSWYgbmV3IGNvbXBvbmVudCBBUElzIGFyZSBkZWZpbmVkLCBcInVuc2FmZVwiIGxpZmVjeWNsZXMgd29uJ3QgYmUgY2FsbGVkLlxuICAgIC8vIFdhcm4gYWJvdXQgdGhlc2UgbGlmZWN5Y2xlcyBpZiB0aGV5IGFyZSBwcmVzZW50LlxuICAgIC8vIERvbid0IHdhcm4gYWJvdXQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBtZXRob2RzIHRob3VnaC5cblxuXG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBmb3VuZFdpbGxNb3VudE5hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSBudWxsO1xuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxNb3VudE5hbWUgPSAnY29tcG9uZW50V2lsbE1vdW50JztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsTW91bnROYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsTW91bnQnO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICAgIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSAnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJztcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxVcGRhdGVOYW1lID0gJ2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsVXBkYXRlTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSc7XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3VuZFdpbGxNb3VudE5hbWUgIT09IG51bGwgfHwgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSAhPT0gbnVsbCB8fCBmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBfY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgICB2YXIgbmV3QXBpTmFtZSA9IHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/ICdnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKScgOiAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSc7XG5cbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlLmhhcyhfY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgICBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlLmFkZChfY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgICBlcnJvcignVW5zYWZlIGxlZ2FjeSBsaWZlY3ljbGVzIHdpbGwgbm90IGJlIGNhbGxlZCBmb3IgY29tcG9uZW50cyB1c2luZyBuZXcgY29tcG9uZW50IEFQSXMuXFxuXFxuJyArICclcyB1c2VzICVzIGJ1dCBhbHNvIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbGVnYWN5IGxpZmVjeWNsZXM6JXMlcyVzXFxuXFxuJyArICdUaGUgYWJvdmUgbGlmZWN5Y2xlcyBzaG91bGQgYmUgcmVtb3ZlZC4gTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTpcXG4nICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMnLCBfY29tcG9uZW50TmFtZSwgbmV3QXBpTmFtZSwgZm91bmRXaWxsTW91bnROYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsTW91bnROYW1lIDogJycsIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgIT09IG51bGwgPyBcIlxcbiAgXCIgKyBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lIDogJycsIGZvdW5kV2lsbFVwZGF0ZU5hbWUgIT09IG51bGwgPyBcIlxcbiAgXCIgKyBmb3VuZFdpbGxVcGRhdGVOYW1lIDogJycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENhY2hlIHVubWFza2VkIGNvbnRleHQgc28gd2UgY2FuIGF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIG5lY2Vzc2FyeS5cbiAgLy8gUmVhY3RGaWJlckNvbnRleHQgdXN1YWxseSB1cGRhdGVzIHRoaXMgY2FjaGUgYnV0IGNhbid0IGZvciBuZXdseS1jcmVhdGVkIGluc3RhbmNlcy5cblxuXG4gIGlmIChpc0xlZ2FjeUNvbnRleHRDb25zdW1lcikge1xuICAgIGNhY2hlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0LCBjb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cblxuZnVuY3Rpb24gY2FsbENvbXBvbmVudFdpbGxNb3VudCh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpIHtcbiAgdmFyIG9sZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgfVxuXG4gIGlmIChvbGRTdGF0ZSAhPT0gaW5zdGFuY2Uuc3RhdGUpIHtcbiAgICB7XG4gICAgICBlcnJvcignJXMuY29tcG9uZW50V2lsbE1vdW50KCk6IEFzc2lnbmluZyBkaXJlY3RseSB0byB0aGlzLnN0YXRlIGlzICcgKyBcImRlcHJlY2F0ZWQgKGV4Y2VwdCBpbnNpZGUgYSBjb21wb25lbnQncyBcIiArICdjb25zdHJ1Y3RvcikuIFVzZSBzZXRTdGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdDb21wb25lbnQnKTtcbiAgICB9XG5cbiAgICBjbGFzc0NvbXBvbmVudFVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZShpbnN0YW5jZSwgaW5zdGFuY2Uuc3RhdGUsIG51bGwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KSB7XG4gIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICB9XG5cbiAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBvbGRTdGF0ZSkge1xuICAgIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50Lmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclcy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk6IEFzc2lnbmluZyBkaXJlY3RseSB0byAnICsgXCJ0aGlzLnN0YXRlIGlzIGRlcHJlY2F0ZWQgKGV4Y2VwdCBpbnNpZGUgYSBjb21wb25lbnQncyBcIiArICdjb25zdHJ1Y3RvcikuIFVzZSBzZXRTdGF0ZSBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNsYXNzQ29tcG9uZW50VXBkYXRlci5lbnF1ZXVlUmVwbGFjZVN0YXRlKGluc3RhbmNlLCBpbnN0YW5jZS5zdGF0ZSwgbnVsbCk7XG4gIH1cbn0gLy8gSW52b2tlcyB0aGUgbW91bnQgbGlmZS1jeWNsZXMgb24gYSBwcmV2aW91c2x5IG5ldmVyIHJlbmRlcmVkIGluc3RhbmNlLlxuXG5cbmZ1bmN0aW9uIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICBjaGVja0NsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzKTtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICBpbnN0YW5jZS5yZWZzID0gZW1wdHlSZWZzT2JqZWN0O1xuICBpbml0aWFsaXplVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgaW5zdGFuY2UuY29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICBpbnN0YW5jZS5jb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHtcbiAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgPT09IG5ld1Byb3BzKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclczogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFzc2lnbiBwcm9wcyBkaXJlY3RseSB0byBzdGF0ZSAnICsgXCJiZWNhdXNlIHVwZGF0ZXMgdG8gcHJvcHMgd29uJ3QgYmUgcmVmbGVjdGVkIGluIHN0YXRlLiBcIiArICdJbiBtb3N0IGNhc2VzLCBpdCBpcyBiZXR0ZXIgdG8gdXNlIHByb3BzIGRpcmVjdGx5LicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmcod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuXG4gIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfSAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuXG4gIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTsgLy8gSWYgd2UgaGFkIGFkZGl0aW9uYWwgc3RhdGUgdXBkYXRlcyBkdXJpbmcgdGhpcyBsaWZlLWN5Y2xlLCBsZXQnc1xuICAgIC8vIHByb2Nlc3MgdGhlbSBub3cuXG5cbiAgICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICAgIHtcbiAgICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICAgIH1cblxuICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBmaWJlckZsYWdzO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3VtZU1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcztcbiAgaW5zdGFuY2UucHJvcHMgPSBvbGRQcm9wcztcbiAgdmFyIG9sZENvbnRleHQgPSBpbnN0YW5jZS5jb250ZXh0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuICB2YXIgbmV4dENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBuZXh0Q29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmV4dExlZ2FjeVVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgbmV4dENvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBuZXh0TGVnYWN5VW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgdmFyIGhhc05ld0xpZmVjeWNsZXMgPSB0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJzsgLy8gTm90ZTogRHVyaW5nIHRoZXNlIGxpZmUtY3ljbGVzLCBpbnN0YW5jZS5wcm9wcy9pbnN0YW5jZS5zdGF0ZSBhcmUgd2hhdFxuICAvLyBldmVyIHRoZSBwcmV2aW91c2x5IGF0dGVtcHRlZCB0byByZW5kZXIgLSBub3QgdGhlIFwiY3VycmVudFwiLiBIb3dldmVyLFxuICAvLyBkdXJpbmcgY29tcG9uZW50RGlkVXBkYXRlIHdlIHBhc3MgdGhlIFwiY3VycmVudFwiIHByb3BzLlxuICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzIHx8IG9sZENvbnRleHQgIT09IG5leHRDb250ZXh0KSB7XG4gICAgICBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKTtcbiAgdmFyIG9sZFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIG5ld1N0YXRlID0gaW5zdGFuY2Uuc3RhdGUgPSBvbGRTdGF0ZTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKTtcbiAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChvbGRQcm9wcyA9PT0gbmV3UHJvcHMgJiYgb2xkU3RhdGUgPT09IG5ld1N0YXRlICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpICYmICFjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkpIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBmaWJlckZsYWdzID0gVXBkYXRlO1xuXG4gICAgICB7XG4gICAgICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICAgICAgfVxuXG4gICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFwcGx5RGVyaXZlZFN0YXRlRnJvbVByb3BzKHdvcmtJblByb2dyZXNzLCBjdG9yLCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIG5ld1Byb3BzKTtcbiAgICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIH1cblxuICB2YXIgc2hvdWxkVXBkYXRlID0gY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpIHx8IGNoZWNrU2hvdWxkQ29tcG9uZW50VXBkYXRlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBvbGRQcm9wcywgbmV3UHJvcHMsIG9sZFN0YXRlLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuXG4gIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuICAgIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICAgICAge1xuICAgICAgICBfZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gICAgICB9XG5cbiAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICBfZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gX2ZpYmVyRmxhZ3M7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIF9maWJlckZsYWdzMiA9IFVwZGF0ZTtcblxuICAgICAge1xuICAgICAgICBfZmliZXJGbGFnczIgfD0gTGF5b3V0U3RhdGljO1xuICAgICAgfVxuXG4gICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgX2ZpYmVyRmxhZ3MyIHw9IE1vdW50TGF5b3V0RGV2O1xuICAgICAgfVxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBfZmliZXJGbGFnczI7XG4gICAgfSAvLyBJZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJuZWQgZmFsc2UsIHdlIHNob3VsZCBzdGlsbCB1cGRhdGUgdGhlXG4gICAgLy8gbWVtb2l6ZWQgc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHdvcmsgY2FuIGJlIHJldXNlZC5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5ld1Byb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfSAvLyBVcGRhdGUgdGhlIGV4aXN0aW5nIGluc3RhbmNlJ3Mgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCBwb2ludGVycyBldmVuXG4gIC8vIGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5zIGZhbHNlLlxuXG5cbiAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgaW5zdGFuY2UuY29udGV4dCA9IG5leHRDb250ZXh0O1xuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufSAvLyBJbnZva2VzIHRoZSB1cGRhdGUgbGlmZS1jeWNsZXMgYW5kIHJldHVybnMgZmFsc2UgaWYgaXQgc2hvdWxkbid0IHJlcmVuZGVyLlxuXG5cbmZ1bmN0aW9uIHVwZGF0ZUNsYXNzSW5zdGFuY2UoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzLCByZW5kZXJMYW5lcykge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgdW5yZXNvbHZlZE9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcztcbiAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MudHlwZSA9PT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPyB1bnJlc29sdmVkT2xkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKHdvcmtJblByb2dyZXNzLnR5cGUsIHVucmVzb2x2ZWRPbGRQcm9wcyk7XG4gIGluc3RhbmNlLnByb3BzID0gb2xkUHJvcHM7XG4gIHZhciB1bnJlc29sdmVkTmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBvbGRDb250ZXh0ID0gaW5zdGFuY2UuY29udGV4dDtcbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcbiAgdmFyIG5leHRDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgbmV4dENvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5leHRVbm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIG5leHRDb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgbmV4dFVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XG4gIHZhciBoYXNOZXdMaWZlY3ljbGVzID0gdHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbic7IC8vIE5vdGU6IER1cmluZyB0aGVzZSBsaWZlLWN5Y2xlcywgaW5zdGFuY2UucHJvcHMvaW5zdGFuY2Uuc3RhdGUgYXJlIHdoYXRcbiAgLy8gZXZlciB0aGUgcHJldmlvdXNseSBhdHRlbXB0ZWQgdG8gcmVuZGVyIC0gbm90IHRoZSBcImN1cnJlbnRcIi4gSG93ZXZlcixcbiAgLy8gZHVyaW5nIGNvbXBvbmVudERpZFVwZGF0ZSB3ZSBwYXNzIHRoZSBcImN1cnJlbnRcIiBwcm9wcy5cbiAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG5cbiAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gdW5yZXNvbHZlZE5ld1Byb3BzIHx8IG9sZENvbnRleHQgIT09IG5leHRDb250ZXh0KSB7XG4gICAgICBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKTtcbiAgdmFyIG9sZFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIG5ld1N0YXRlID0gaW5zdGFuY2Uuc3RhdGUgPSBvbGRTdGF0ZTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKTtcbiAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgPT09IHVucmVzb2x2ZWROZXdQcm9wcyAmJiBvbGRTdGF0ZSA9PT0gbmV3U3RhdGUgJiYgIWhhc0NvbnRleHRDaGFuZ2VkKCkgJiYgIWNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSAmJiAhKGVuYWJsZUxhenlDb250ZXh0UHJvcGFnYXRpb24gICApKSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCkgfHwgLy8gVE9ETzogSW4gc29tZSBjYXNlcywgd2UnbGwgZW5kIHVwIGNoZWNraW5nIGlmIGNvbnRleHQgaGFzIGNoYW5nZWQgdHdpY2UsXG4gIC8vIGJvdGggYmVmb3JlIGFuZCBhZnRlciBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCBoYXMgYmVlbiBjYWxsZWQuIE5vdCBpZGVhbCxcbiAgLy8gYnV0IEknbSBsb2F0aCB0byByZWZhY3RvciB0aGlzIGZ1bmN0aW9uLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgbWVtb2l6ZWRcbiAgLy8gY29tcG9uZW50cyBzbyBpdCdzIG5vdCB0aGF0IGNvbW1vbi5cbiAgZW5hYmxlTGF6eUNvbnRleHRQcm9wYWdhdGlvbiAgIDtcblxuICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gICAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cbiAgICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDtcbiAgICAgIH1cbiAgICB9IC8vIElmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5lZCBmYWxzZSwgd2Ugc2hvdWxkIHN0aWxsIHVwZGF0ZSB0aGVcbiAgICAvLyBtZW1vaXplZCBwcm9wcy9zdGF0ZSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgd29yayBjYW4gYmUgcmV1c2VkLlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gbmV3UHJvcHM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UncyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHBvaW50ZXJzIGV2ZW5cbiAgLy8gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2UuXG5cblxuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IG5ld1N0YXRlO1xuICBpbnN0YW5jZS5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59XG5cbnZhciBkaWRXYXJuQWJvdXRNYXBzO1xudmFyIGRpZFdhcm5BYm91dEdlbmVyYXRvcnM7XG52YXIgZGlkV2FybkFib3V0U3RyaW5nUmVmcztcbnZhciBvd25lckhhc0tleVVzZVdhcm5pbmc7XG52YXIgb3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nO1xuXG52YXIgd2FybkZvck1pc3NpbmdLZXkgPSBmdW5jdGlvbiAoY2hpbGQsIHJldHVybkZpYmVyKSB7fTtcblxue1xuICBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dEdlbmVyYXRvcnMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0U3RyaW5nUmVmcyA9IHt9O1xuICAvKipcbiAgICogV2FybiBpZiB0aGVyZSdzIG5vIGtleSBleHBsaWNpdGx5IHNldCBvbiBkeW5hbWljIGFycmF5cyBvZiBjaGlsZHJlbiBvclxuICAgKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAgICogdXBkYXRlcy5cbiAgICovXG5cbiAgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG4gIG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZyA9IHt9O1xuXG4gIHdhcm5Gb3JNaXNzaW5nS2V5ID0gZnVuY3Rpb24gKGNoaWxkLCByZXR1cm5GaWJlcikge1xuICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFjaGlsZC5fc3RvcmUgfHwgY2hpbGQuX3N0b3JlLnZhbGlkYXRlZCB8fCBjaGlsZC5rZXkgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2hpbGQuX3N0b3JlICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdCBDb21wb25lbnQgaW4gd2FybkZvck1pc3NpbmdLZXkgc2hvdWxkIGhhdmUgYSBfc3RvcmUuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBjaGlsZC5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIocmV0dXJuRmliZXIpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjb21wb25lbnROYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG93bmVySGFzS2V5VXNlV2FybmluZ1tjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgJyArICdcImtleVwiIHByb3AuIFNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd2FybmluZy1rZXlzIGZvciAnICsgJ21vcmUgaW5mb3JtYXRpb24uJyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudCkge1xuICB2YXIgbWl4ZWRSZWYgPSBlbGVtZW50LnJlZjtcblxuICBpZiAobWl4ZWRSZWYgIT09IG51bGwgJiYgdHlwZW9mIG1peGVkUmVmICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtaXhlZFJlZiAhPT0gJ29iamVjdCcpIHtcbiAgICB7XG4gICAgICAvLyBUT0RPOiBDbGVhbiB0aGlzIHVwIG9uY2Ugd2UgdHVybiBvbiB0aGUgc3RyaW5nIHJlZiB3YXJuaW5nIGZvclxuICAgICAgLy8gZXZlcnlvbmUsIGJlY2F1c2UgdGhlIHN0cmljdCBtb2RlIGNhc2Ugd2lsbCBubyBsb25nZXIgYmUgcmVsZXZhbnRcbiAgICAgIGlmICgocmV0dXJuRmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgfHwgd2FybkFib3V0U3RyaW5nUmVmcykgJiYgLy8gV2Ugd2FybiBpbiBSZWFjdEVsZW1lbnQuanMgaWYgb3duZXIgYW5kIHNlbGYgYXJlIGVxdWFsIGZvciBzdHJpbmcgcmVmc1xuICAgICAgLy8gYmVjYXVzZSB0aGVzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb25cbiAgICAgIC8vIHVzaW5nIGEgY29kZW1vZC4gVGhlcmVmb3JlLCB3ZSBkb24ndCBoYXZlIHRvIHdhcm4gYWJvdXQgc3RyaW5nIHJlZnMgYWdhaW4uXG4gICAgICAhKGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX3NlbGYgJiYgZWxlbWVudC5fb3duZXIuc3RhdGVOb2RlICE9PSBlbGVtZW50Ll9zZWxmKSkge1xuICAgICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIocmV0dXJuRmliZXIpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVycm9yKCdBIHN0cmluZyByZWYsIFwiJXNcIiwgaGFzIGJlZW4gZm91bmQgd2l0aGluIGEgc3RyaWN0IG1vZGUgdHJlZS4gJyArICdTdHJpbmcgcmVmcyBhcmUgYSBzb3VyY2Ugb2YgcG90ZW50aWFsIGJ1Z3MgYW5kIHNob3VsZCBiZSBhdm9pZGVkLiAnICsgJ1dlIHJlY29tbWVuZCB1c2luZyB1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIG1peGVkUmVmKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbGVtZW50Ll9vd25lcikge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgaW5zdDtcblxuICAgICAgaWYgKG93bmVyKSB7XG4gICAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7XG5cbiAgICAgICAgaWYgKG93bmVyRmliZXIudGFnICE9PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgaGF2ZSBzdHJpbmcgcmVmcy4gJyArICdXZSByZWNvbW1lbmQgdXNpbmcgdXNlUmVmKCkgaW5zdGVhZC4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLXN0cmluZy1yZWYnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluc3QgPSBvd25lckZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpbnN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3Npbmcgb3duZXIgZm9yIHN0cmluZyByZWYgXCIgKyBtaXhlZFJlZiArIFwiLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBcIiArICdidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgfSAvLyBBc3NpZ25pbmcgdGhpcyB0byBhIGNvbnN0IHNvIEZsb3cga25vd3MgaXQgd29uJ3QgY2hhbmdlIGluIHRoZSBjbG9zdXJlXG5cblxuICAgICAgdmFyIHJlc29sdmVkSW5zdCA9IGluc3Q7XG5cbiAgICAgIHtcbiAgICAgICAgY2hlY2tQcm9wU3RyaW5nQ29lcmNpb24obWl4ZWRSZWYsICdyZWYnKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0cmluZ1JlZiA9ICcnICsgbWl4ZWRSZWY7IC8vIENoZWNrIGlmIHByZXZpb3VzIHN0cmluZyByZWYgbWF0Y2hlcyBuZXcgc3RyaW5nIHJlZlxuXG4gICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnJlZiAhPT0gbnVsbCAmJiB0eXBlb2YgY3VycmVudC5yZWYgPT09ICdmdW5jdGlvbicgJiYgY3VycmVudC5yZWYuX3N0cmluZ1JlZiA9PT0gc3RyaW5nUmVmKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50LnJlZjtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlZiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgcmVmcyA9IHJlc29sdmVkSW5zdC5yZWZzO1xuXG4gICAgICAgIGlmIChyZWZzID09PSBlbXB0eVJlZnNPYmplY3QpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgbGF6eSBwb29sZWQgZnJvemVuIG9iamVjdCwgc28gd2UgbmVlZCB0byBpbml0aWFsaXplLlxuICAgICAgICAgIHJlZnMgPSByZXNvbHZlZEluc3QucmVmcyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgZGVsZXRlIHJlZnNbc3RyaW5nUmVmXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWZzW3N0cmluZ1JlZl0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmVmLl9zdHJpbmdSZWYgPSBzdHJpbmdSZWY7XG4gICAgICByZXR1cm4gcmVmO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIG1peGVkUmVmICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHJlZiB0byBiZSBhIGZ1bmN0aW9uLCBhIHN0cmluZywgYW4gb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZVJlZigpLCBvciBudWxsLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVsZW1lbnQuX293bmVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVsZW1lbnQgcmVmIHdhcyBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgKFwiICsgbWl4ZWRSZWYgKyBcIikgYnV0IG5vIG93bmVyIHdhcyBzZXQuIFRoaXMgY291bGQgaGFwcGVuIGZvciBvbmUgb2ZcIiArICcgdGhlIGZvbGxvd2luZyByZWFzb25zOlxcbicgKyAnMS4gWW91IG1heSBiZSBhZGRpbmcgYSByZWYgdG8gYSBmdW5jdGlvbiBjb21wb25lbnRcXG4nICsgXCIyLiBZb3UgbWF5IGJlIGFkZGluZyBhIHJlZiB0byBhIGNvbXBvbmVudCB0aGF0IHdhcyBub3QgY3JlYXRlZCBpbnNpZGUgYSBjb21wb25lbnQncyByZW5kZXIgbWV0aG9kXFxuXCIgKyAnMy4gWW91IGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IGxvYWRlZFxcbicgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWZzLW11c3QtaGF2ZS1vd25lciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWl4ZWRSZWY7XG59XG5cbmZ1bmN0aW9uIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpIHtcbiAgdmFyIGNoaWxkU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG5ld0NoaWxkKTtcbiAgdGhyb3cgbmV3IEVycm9yKFwiT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiBcIiArIChjaGlsZFN0cmluZyA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKG5ld0NoaWxkKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRTdHJpbmcpICsgXCIpLiBcIiArICdJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5ICcgKyAnaW5zdGVhZC4nKTtcbn1cblxuZnVuY3Rpb24gd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKSB7XG4gIHtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIocmV0dXJuRmliZXIpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgaWYgKG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZ1tjb21wb25lbnROYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZ1tjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignRnVuY3Rpb25zIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZC4gVGhpcyBtYXkgaGFwcGVuIGlmICcgKyAneW91IHJldHVybiBhIENvbXBvbmVudCBpbnN0ZWFkIG9mIDxDb21wb25lbnQgLz4gZnJvbSByZW5kZXIuICcgKyAnT3IgbWF5YmUgeW91IG1lYW50IHRvIGNhbGwgdGhpcyBmdW5jdGlvbiByYXRoZXIgdGhhbiByZXR1cm4gaXQuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUxhenkobGF6eVR5cGUpIHtcbiAgdmFyIHBheWxvYWQgPSBsYXp5VHlwZS5fcGF5bG9hZDtcbiAgdmFyIGluaXQgPSBsYXp5VHlwZS5faW5pdDtcbiAgcmV0dXJuIGluaXQocGF5bG9hZCk7XG59IC8vIFRoaXMgd3JhcHBlciBmdW5jdGlvbiBleGlzdHMgYmVjYXVzZSBJIGV4cGVjdCB0byBjbG9uZSB0aGUgY29kZSBpbiBlYWNoIHBhdGhcbi8vIHRvIGJlIGFibGUgdG8gb3B0aW1pemUgZWFjaCBwYXRoIGluZGl2aWR1YWxseSBieSBicmFuY2hpbmcgZWFybHkuIFRoaXMgbmVlZHNcbi8vIGEgY29tcGlsZXIgb3Igd2UgY2FuIGRvIGl0IG1hbnVhbGx5LiBIZWxwZXJzIHRoYXQgZG9uJ3QgbmVlZCB0aGlzIGJyYW5jaGluZ1xuLy8gbGl2ZSBvdXRzaWRlIG9mIHRoaXMgZnVuY3Rpb24uXG5cblxuZnVuY3Rpb24gQ2hpbGRSZWNvbmNpbGVyKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgZnVuY3Rpb24gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkVG9EZWxldGUpIHtcbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIE5vb3AuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGRlbGV0aW9ucyA9IHJldHVybkZpYmVyLmRlbGV0aW9ucztcblxuICAgIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjaGlsZFRvRGVsZXRlXTtcbiAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IENoaWxkRGVsZXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0aW9ucy5wdXNoKGNoaWxkVG9EZWxldGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCkge1xuICAgIGlmICghc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gTm9vcC5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gLy8gVE9ETzogRm9yIHRoZSBzaG91bGRDbG9uZSBjYXNlLCB0aGlzIGNvdWxkIGJlIG1pY3JvLW9wdGltaXplZCBhIGJpdCBieVxuICAgIC8vIGFzc3VtaW5nIHRoYXQgYWZ0ZXIgdGhlIGZpcnN0IGNoaWxkIHdlJ3ZlIGFscmVhZHkgYWRkZWQgZXZlcnl0aGluZy5cblxuXG4gICAgdmFyIGNoaWxkVG9EZWxldGUgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZFRvRGVsZXRlICE9PSBudWxsKSB7XG4gICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGRUb0RlbGV0ZSk7XG4gICAgICBjaGlsZFRvRGVsZXRlID0gY2hpbGRUb0RlbGV0ZS5zaWJsaW5nO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKSB7XG4gICAgLy8gQWRkIHRoZSByZW1haW5pbmcgY2hpbGRyZW4gdG8gYSB0ZW1wb3JhcnkgbWFwIHNvIHRoYXQgd2UgY2FuIGZpbmQgdGhlbSBieVxuICAgIC8vIGtleXMgcXVpY2tseS4gSW1wbGljaXQgKG51bGwpIGtleXMgZ2V0IGFkZGVkIHRvIHRoaXMgc2V0IHdpdGggdGhlaXIgaW5kZXhcbiAgICAvLyBpbnN0ZWFkLlxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbmV3IE1hcCgpO1xuICAgIHZhciBleGlzdGluZ0NoaWxkID0gY3VycmVudEZpcnN0Q2hpbGQ7XG5cbiAgICB3aGlsZSAoZXhpc3RpbmdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGV4aXN0aW5nQ2hpbGQua2V5ICE9PSBudWxsKSB7XG4gICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uc2V0KGV4aXN0aW5nQ2hpbGQua2V5LCBleGlzdGluZ0NoaWxkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uc2V0KGV4aXN0aW5nQ2hpbGQuaW5kZXgsIGV4aXN0aW5nQ2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBleGlzdGluZ0NoaWxkID0gZXhpc3RpbmdDaGlsZC5zaWJsaW5nO1xuICAgIH1cblxuICAgIHJldHVybiBleGlzdGluZ0NoaWxkcmVuO1xuICB9XG5cbiAgZnVuY3Rpb24gdXNlRmliZXIoZmliZXIsIHBlbmRpbmdQcm9wcykge1xuICAgIC8vIFdlIGN1cnJlbnRseSBzZXQgc2libGluZyB0byBudWxsIGFuZCBpbmRleCB0byAwIGhlcmUgYmVjYXVzZSBpdCBpcyBlYXN5XG4gICAgLy8gdG8gZm9yZ2V0IHRvIGRvIGJlZm9yZSByZXR1cm5pbmcgaXQuIEUuZy4gZm9yIHRoZSBzaW5nbGUgY2hpbGQgY2FzZS5cbiAgICB2YXIgY2xvbmUgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhmaWJlciwgcGVuZGluZ1Byb3BzKTtcbiAgICBjbG9uZS5pbmRleCA9IDA7XG4gICAgY2xvbmUuc2libGluZyA9IG51bGw7XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgZnVuY3Rpb24gcGxhY2VDaGlsZChuZXdGaWJlciwgbGFzdFBsYWNlZEluZGV4LCBuZXdJbmRleCkge1xuICAgIG5ld0ZpYmVyLmluZGV4ID0gbmV3SW5kZXg7XG5cbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIER1cmluZyBoeWRyYXRpb24sIHRoZSB1c2VJZCBhbGdvcml0aG0gbmVlZHMgdG8ga25vdyB3aGljaCBmaWJlcnMgYXJlXG4gICAgICAvLyBwYXJ0IG9mIGEgbGlzdCBvZiBjaGlsZHJlbiAoYXJyYXlzLCBpdGVyYXRvcnMpLlxuICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gRm9ya2VkO1xuICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICB9XG5cbiAgICB2YXIgY3VycmVudCA9IG5ld0ZpYmVyLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICB2YXIgb2xkSW5kZXggPSBjdXJyZW50LmluZGV4O1xuXG4gICAgICBpZiAob2xkSW5kZXggPCBsYXN0UGxhY2VkSW5kZXgpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIG1vdmUuXG4gICAgICAgIG5ld0ZpYmVyLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgaXRlbSBjYW4gc3RheSBpbiBwbGFjZS5cbiAgICAgICAgcmV0dXJuIG9sZEluZGV4O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIGFuIGluc2VydGlvbi5cbiAgICAgIG5ld0ZpYmVyLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGxhY2VTaW5nbGVDaGlsZChuZXdGaWJlcikge1xuICAgIC8vIFRoaXMgaXMgc2ltcGxlciBmb3IgdGhlIHNpbmdsZSBjaGlsZCBjYXNlLiBXZSBvbmx5IG5lZWQgdG8gZG8gYVxuICAgIC8vIHBsYWNlbWVudCBmb3IgaW5zZXJ0aW5nIG5ldyBjaGlsZHJlbi5cbiAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cyAmJiBuZXdGaWJlci5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgIG5ld0ZpYmVyLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3RmliZXI7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudCwgdGV4dENvbnRlbnQsIGxhbmVzKSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC50YWcgIT09IEhvc3RUZXh0KSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tVGV4dCh0ZXh0Q29udGVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIHRleHRDb250ZW50KTtcbiAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUVsZW1lbnQocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQsIGxhbmVzKSB7XG4gICAgdmFyIGVsZW1lbnRUeXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgaWYgKGVsZW1lbnRUeXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sIGxhbmVzLCBlbGVtZW50LmtleSk7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIGlmIChjdXJyZW50LmVsZW1lbnRUeXBlID09PSBlbGVtZW50VHlwZSB8fCAoIC8vIEtlZXAgdGhpcyBjaGVjayBpbmxpbmUgc28gaXQgb25seSBydW5zIG9uIHRoZSBmYWxzZSBwYXRoOlxuICAgICAgIGlzQ29tcGF0aWJsZUZhbWlseUZvckhvdFJlbG9hZGluZyhjdXJyZW50LCBlbGVtZW50KSApIHx8IC8vIExhenkgdHlwZXMgc2hvdWxkIHJlY29uY2lsZSB0aGVpciByZXNvbHZlZCB0eXBlLlxuICAgICAgLy8gV2UgbmVlZCB0byBkbyB0aGlzIGFmdGVyIHRoZSBIb3QgUmVsb2FkaW5nIGNoZWNrIGFib3ZlLFxuICAgICAgLy8gYmVjYXVzZSBob3QgcmVsb2FkaW5nIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIHRoYW4gcHJvZCBiZWNhdXNlXG4gICAgICAvLyBpdCBkb2Vzbid0IHJlc3VzcGVuZC4gU28gd2UgY2FuJ3QgbGV0IHRoZSBjYWxsIGJlbG93IHN1c3BlbmQuXG4gICAgICB0eXBlb2YgZWxlbWVudFR5cGUgPT09ICdvYmplY3QnICYmIGVsZW1lbnRUeXBlICE9PSBudWxsICYmIGVsZW1lbnRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgJiYgcmVzb2x2ZUxhenkoZWxlbWVudFR5cGUpID09PSBjdXJyZW50LnR5cGUpIHtcbiAgICAgICAgLy8gTW92ZSBiYXNlZCBvbiBpbmRleFxuICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCBlbGVtZW50LnByb3BzKTtcbiAgICAgICAgZXhpc3RpbmcucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50KTtcbiAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAge1xuICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICAgICAgICBleGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgfVxuICAgIH0gLy8gSW5zZXJ0XG5cblxuICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQpO1xuICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnQsIHBvcnRhbCwgbGFuZXMpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gSG9zdFBvcnRhbCB8fCBjdXJyZW50LnN0YXRlTm9kZS5jb250YWluZXJJbmZvICE9PSBwb3J0YWwuY29udGFpbmVySW5mbyB8fCBjdXJyZW50LnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiAhPT0gcG9ydGFsLmltcGxlbWVudGF0aW9uKSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIHBvcnRhbC5jaGlsZHJlbiB8fCBbXSk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgY3VycmVudCwgZnJhZ21lbnQsIGxhbmVzLCBrZXkpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gRnJhZ21lbnQpIHtcbiAgICAgIC8vIEluc2VydFxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmcmFnbWVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIGtleSk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZVxuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgZnJhZ21lbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnICYmIG5ld0NoaWxkICE9PSAnJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cy4gSWYgdGhlIHByZXZpb3VzIG5vZGUgaXMgaW1wbGljaXRseSBrZXllZFxuICAgICAgLy8gd2UgY2FuIGNvbnRpbnVlIHRvIHJlcGxhY2UgaXQgd2l0aG91dCBhYm9ydGluZyBldmVuIGlmIGl0IGlzIG5vdCBhIHRleHRcbiAgICAgIC8vIG5vZGUuXG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVRleHQoJycgKyBuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQobmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcblxuICAgICAgICAgICAgX2NyZWF0ZWQucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBudWxsLCBuZXdDaGlsZCk7XG4gICAgICAgICAgICBfY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgICAgIHJldHVybiBfY3JlYXRlZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX2NyZWF0ZWQyID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG5cbiAgICAgICAgICAgIF9jcmVhdGVkMi5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgICAgIHJldHVybiBfY3JlYXRlZDI7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwYXlsb2FkID0gbmV3Q2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgICB2YXIgaW5pdCA9IG5ld0NoaWxkLl9pbml0O1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBpbml0KHBheWxvYWQpLCBsYW5lcyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgdmFyIF9jcmVhdGVkMyA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcywgbnVsbCk7XG5cbiAgICAgICAgX2NyZWF0ZWQzLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICByZXR1cm4gX2NyZWF0ZWQzO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgLy8gVXBkYXRlIHRoZSBmaWJlciBpZiB0aGUga2V5cyBtYXRjaCwgb3RoZXJ3aXNlIHJldHVybiBudWxsLlxuICAgIHZhciBrZXkgPSBvbGRGaWJlciAhPT0gbnVsbCA/IG9sZEZpYmVyLmtleSA6IG51bGw7XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyAmJiBuZXdDaGlsZCAhPT0gJycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVGV4dCBub2RlcyBkb24ndCBoYXZlIGtleXMuIElmIHRoZSBwcmV2aW91cyBub2RlIGlzIGltcGxpY2l0bHkga2V5ZWRcbiAgICAgIC8vIHdlIGNhbiBjb250aW51ZSB0byByZXBsYWNlIGl0IHdpdGhvdXQgYWJvcnRpbmcgZXZlbiBpZiBpdCBpcyBub3QgYSB0ZXh0XG4gICAgICAvLyBub2RlLlxuICAgICAgaWYgKGtleSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZVRleHROb2RlKHJldHVybkZpYmVyLCBvbGRGaWJlciwgJycgKyBuZXdDaGlsZCwgbGFuZXMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChuZXdDaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlRWxlbWVudChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAobmV3Q2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBheWxvYWQgPSBuZXdDaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIGluaXQocGF5bG9hZCksIGxhbmVzKTtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICBpZiAoa2V5ICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMsIG51bGwpO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVGcm9tTWFwKGV4aXN0aW5nQ2hpbGRyZW4sIHJldHVybkZpYmVyLCBuZXdJZHgsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnICYmIG5ld0NoaWxkICE9PSAnJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cywgc28gd2UgbmVpdGhlciBoYXZlIHRvIGNoZWNrIHRoZSBvbGQgbm9yXG4gICAgICAvLyBuZXcgbm9kZSBmb3IgdGhlIGtleS4gSWYgYm90aCBhcmUgdGV4dCBub2RlcywgdGhleSBtYXRjaC5cbiAgICAgIHZhciBtYXRjaGVkRmliZXIgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdJZHgpIHx8IG51bGw7XG4gICAgICByZXR1cm4gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIG1hdGNoZWRGaWJlciwgJycgKyBuZXdDaGlsZCwgbGFuZXMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfbWF0Y2hlZEZpYmVyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3Q2hpbGQua2V5ID09PSBudWxsID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5KSB8fCBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlRWxlbWVudChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX21hdGNoZWRGaWJlcjIgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdDaGlsZC5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBuZXdDaGlsZC5rZXkpIHx8IG51bGw7XG5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIyLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgaW5pdChwYXlsb2FkKSwgbGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIzID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3SWR4KSB8fCBudWxsO1xuXG4gICAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlcjMsIG5ld0NoaWxkLCBsYW5lcywgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogV2FybnMgaWYgdGhlcmUgaXMgYSBkdXBsaWNhdGUgb3IgbWlzc2luZyBrZXlcbiAgICovXG5cblxuICBmdW5jdGlvbiB3YXJuT25JbnZhbGlkS2V5KGNoaWxkLCBrbm93bktleXMsIHJldHVybkZpYmVyKSB7XG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcgfHwgY2hpbGQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGtub3duS2V5cztcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChjaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB3YXJuRm9yTWlzc2luZ0tleShjaGlsZCwgcmV0dXJuRmliZXIpO1xuICAgICAgICAgIHZhciBrZXkgPSBjaGlsZC5rZXk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChrbm93bktleXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGtub3duS2V5cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIGtub3duS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgha25vd25LZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBrbm93bktleXMuYWRkKGtleSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvcignRW5jb3VudGVyZWQgdHdvIGNoaWxkcmVuIHdpdGggdGhlIHNhbWUga2V5LCBgJXNgLiAnICsgJ0tleXMgc2hvdWxkIGJlIHVuaXF1ZSBzbyB0aGF0IGNvbXBvbmVudHMgbWFpbnRhaW4gdGhlaXIgaWRlbnRpdHkgJyArICdhY3Jvc3MgdXBkYXRlcy4gTm9uLXVuaXF1ZSBrZXlzIG1heSBjYXVzZSBjaGlsZHJlbiB0byBiZSAnICsgJ2R1cGxpY2F0ZWQgYW5kL29yIG9taXR0ZWQg4oCUIHRoZSBiZWhhdmlvciBpcyB1bnN1cHBvcnRlZCBhbmQgJyArICdjb3VsZCBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbi4nLCBrZXkpO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBjaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGNoaWxkLl9pbml0O1xuICAgICAgICAgIHdhcm5PbkludmFsaWRLZXkoaW5pdChwYXlsb2FkKSwga25vd25LZXlzLCByZXR1cm5GaWJlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGtub3duS2V5cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZHJlbiwgbGFuZXMpIHtcbiAgICAvLyBUaGlzIGFsZ29yaXRobSBjYW4ndCBvcHRpbWl6ZSBieSBzZWFyY2hpbmcgZnJvbSBib3RoIGVuZHMgc2luY2Ugd2VcbiAgICAvLyBkb24ndCBoYXZlIGJhY2twb2ludGVycyBvbiBmaWJlcnMuIEknbSB0cnlpbmcgdG8gc2VlIGhvdyBmYXIgd2UgY2FuIGdldFxuICAgIC8vIHdpdGggdGhhdCBtb2RlbC4gSWYgaXQgZW5kcyB1cCBub3QgYmVpbmcgd29ydGggdGhlIHRyYWRlb2Zmcywgd2UgY2FuXG4gICAgLy8gYWRkIGl0IGxhdGVyLlxuICAgIC8vIEV2ZW4gd2l0aCBhIHR3byBlbmRlZCBvcHRpbWl6YXRpb24sIHdlJ2Qgd2FudCB0byBvcHRpbWl6ZSBmb3IgdGhlIGNhc2VcbiAgICAvLyB3aGVyZSB0aGVyZSBhcmUgZmV3IGNoYW5nZXMgYW5kIGJydXRlIGZvcmNlIHRoZSBjb21wYXJpc29uIGluc3RlYWQgb2ZcbiAgICAvLyBnb2luZyBmb3IgdGhlIE1hcC4gSXQnZCBsaWtlIHRvIGV4cGxvcmUgaGl0dGluZyB0aGF0IHBhdGggZmlyc3QgaW5cbiAgICAvLyBmb3J3YXJkLW9ubHkgbW9kZSBhbmQgb25seSBnbyBmb3IgdGhlIE1hcCBvbmNlIHdlIG5vdGljZSB0aGF0IHdlIG5lZWRcbiAgICAvLyBsb3RzIG9mIGxvb2sgYWhlYWQuIFRoaXMgZG9lc24ndCBoYW5kbGUgcmV2ZXJzYWwgYXMgd2VsbCBhcyB0d28gZW5kZWRcbiAgICAvLyBzZWFyY2ggYnV0IHRoYXQncyB1bnVzdWFsLiBCZXNpZGVzLCBmb3IgdGhlIHR3byBlbmRlZCBvcHRpbWl6YXRpb24gdG9cbiAgICAvLyB3b3JrIG9uIEl0ZXJhYmxlcywgd2UnZCBuZWVkIHRvIGNvcHkgdGhlIHdob2xlIHNldC5cbiAgICAvLyBJbiB0aGlzIGZpcnN0IGl0ZXJhdGlvbiwgd2UnbGwganVzdCBsaXZlIHdpdGggaGl0dGluZyB0aGUgYmFkIGNhc2VcbiAgICAvLyAoYWRkaW5nIGV2ZXJ5dGhpbmcgdG8gYSBNYXApIGluIGZvciBldmVyeSBpbnNlcnQvbW92ZS5cbiAgICAvLyBJZiB5b3UgY2hhbmdlIHRoaXMgY29kZSwgYWxzbyB1cGRhdGUgcmVjb25jaWxlQ2hpbGRyZW5JdGVyYXRvcigpIHdoaWNoXG4gICAgLy8gdXNlcyB0aGUgc2FtZSBhbGdvcml0aG0uXG4gICAge1xuICAgICAgLy8gRmlyc3QsIHZhbGlkYXRlIGtleXMuXG4gICAgICB2YXIga25vd25LZXlzID0gbnVsbDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGQgPSBuZXdDaGlsZHJlbltpXTtcbiAgICAgICAga25vd25LZXlzID0gd2Fybk9uSW52YWxpZEtleShjaGlsZCwga25vd25LZXlzLCByZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91c05ld0ZpYmVyID0gbnVsbDtcbiAgICB2YXIgb2xkRmliZXIgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB2YXIgbGFzdFBsYWNlZEluZGV4ID0gMDtcbiAgICB2YXIgbmV3SWR4ID0gMDtcbiAgICB2YXIgbmV4dE9sZEZpYmVyID0gbnVsbDtcblxuICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICBpZiAob2xkRmliZXIuaW5kZXggPiBuZXdJZHgpIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXI7XG4gICAgICAgIG9sZEZpYmVyID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdGaWJlciA9IHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgIGlmIChuZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGJyZWFrcyBvbiBlbXB0eSBzbG90cyBsaWtlIG51bGwgY2hpbGRyZW4uIFRoYXQnc1xuICAgICAgICAvLyB1bmZvcnR1bmF0ZSBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBzbG93IHBhdGggYWxsIHRoZSB0aW1lLiBXZSBuZWVkXG4gICAgICAgIC8vIGEgYmV0dGVyIHdheSB0byBjb21tdW5pY2F0ZSB3aGV0aGVyIHRoaXMgd2FzIGEgbWlzcyBvciBudWxsLFxuICAgICAgICAvLyBib29sZWFuLCB1bmRlZmluZWQsIGV0Yy5cbiAgICAgICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgaWYgKG9sZEZpYmVyICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIG1hdGNoZWQgdGhlIHNsb3QsIGJ1dCB3ZSBkaWRuJ3QgcmV1c2UgdGhlIGV4aXN0aW5nIGZpYmVyLCBzbyB3ZVxuICAgICAgICAgIC8vIG5lZWQgdG8gZGVsZXRlIHRoZSBleGlzdGluZyBjaGlsZC5cbiAgICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQobmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gbmV3RmliZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPOiBEZWZlciBzaWJsaW5ncyBpZiB3ZSdyZSBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IGZvciB0aGlzIHNsb3QuXG4gICAgICAgIC8vIEkuZS4gaWYgd2UgaGFkIG51bGwgdmFsdWVzIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIGRlZmVyIHRoaXNcbiAgICAgICAgLy8gZm9yIGVhY2ggbnVsbCB2YWx1ZS4gSG93ZXZlciwgd2UgYWxzbyBkb24ndCB3YW50IHRvIGNhbGwgdXBkYXRlU2xvdFxuICAgICAgICAvLyB3aXRoIHRoZSBwcmV2aW91cyBvbmUuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5ld0ZpYmVyO1xuICAgICAgfVxuXG4gICAgICBwcmV2aW91c05ld0ZpYmVyID0gbmV3RmliZXI7XG4gICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICB9XG5cbiAgICBpZiAobmV3SWR4ID09PSBuZXdDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbmV3IGNoaWxkcmVuLiBXZSBjYW4gZGVsZXRlIHRoZSByZXN0LlxuICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcblxuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgICAgdmFyIG51bWJlck9mRm9ya3MgPSBuZXdJZHg7XG4gICAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgbnVtYmVyT2ZGb3Jrcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH1cblxuICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSBleGlzdGluZyBjaGlsZHJlbiB3ZSBjYW4gY2hvb3NlIGEgZmFzdCBwYXRoXG4gICAgICAvLyBzaW5jZSB0aGUgcmVzdCB3aWxsIGFsbCBiZSBpbnNlcnRpb25zLlxuICAgICAgZm9yICg7IG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgICAgdmFyIF9uZXdGaWJlciA9IGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgICAgaWYgKF9uZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICAgIHZhciBfbnVtYmVyT2ZGb3JrcyA9IG5ld0lkeDtcbiAgICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBfbnVtYmVyT2ZGb3Jrcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH0gLy8gQWRkIGFsbCBjaGlsZHJlbiB0byBhIGtleSBtYXAgZm9yIHF1aWNrIGxvb2t1cHMuXG5cblxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTsgLy8gS2VlcCBzY2FubmluZyBhbmQgdXNlIHRoZSBtYXAgdG8gcmVzdG9yZSBkZWxldGVkIGl0ZW1zIGFzIG1vdmVzLlxuXG4gICAgZm9yICg7IG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgIHZhciBfbmV3RmliZXIyID0gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgIGlmIChfbmV3RmliZXIyICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgICAgaWYgKF9uZXdGaWJlcjIuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgbmV3IGZpYmVyIGlzIGEgd29yayBpbiBwcm9ncmVzcywgYnV0IGlmIHRoZXJlIGV4aXN0cyBhXG4gICAgICAgICAgICAvLyBjdXJyZW50LCB0aGF0IG1lYW5zIHRoYXQgd2UgcmV1c2VkIHRoZSBmaWJlci4gV2UgbmVlZCB0byBkZWxldGVcbiAgICAgICAgICAgIC8vIGl0IGZyb20gdGhlIGNoaWxkIGxpc3Qgc28gdGhhdCB3ZSBkb24ndCBhZGQgaXQgdG8gdGhlIGRlbGV0aW9uXG4gICAgICAgICAgICAvLyBsaXN0LlxuICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5kZWxldGUoX25ld0ZpYmVyMi5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBfbmV3RmliZXIyLmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXIyO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIEFueSBleGlzdGluZyBjaGlsZHJlbiB0aGF0IHdlcmVuJ3QgY29uc3VtZWQgYWJvdmUgd2VyZSBkZWxldGVkLiBXZSBuZWVkXG4gICAgICAvLyB0byBhZGQgdGhlbSB0byB0aGUgZGVsZXRpb24gbGlzdC5cbiAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgdmFyIF9udW1iZXJPZkZvcmtzMiA9IG5ld0lkeDtcbiAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgX251bWJlck9mRm9ya3MyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZHJlbkl0ZXJhYmxlLCBsYW5lcykge1xuICAgIC8vIFRoaXMgaXMgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gYXMgcmVjb25jaWxlQ2hpbGRyZW5BcnJheSgpLFxuICAgIC8vIGJ1dCB1c2luZyB0aGUgaXRlcmF0b3IgaW5zdGVhZC5cbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQW4gb2JqZWN0IGlzIG5vdCBhbiBpdGVyYWJsZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluICcgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgcmVuZGVyaW5nIEdlbmVyYXRvcnMgYmVjYXVzZSBpdCdzIGEgbXV0YXRpb24uXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjk5NVxuICAgICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCB0b1N0cmluZ1RhZ1xuICAgICAgbmV3Q2hpbGRyZW5JdGVyYWJsZVtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnR2VuZXJhdG9yJykge1xuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dEdlbmVyYXRvcnMpIHtcbiAgICAgICAgICBlcnJvcignVXNpbmcgR2VuZXJhdG9ycyBhcyBjaGlsZHJlbiBpcyB1bnN1cHBvcnRlZCBhbmQgd2lsbCBsaWtlbHkgeWllbGQgJyArICd1bmV4cGVjdGVkIHJlc3VsdHMgYmVjYXVzZSBlbnVtZXJhdGluZyBhIGdlbmVyYXRvciBtdXRhdGVzIGl0LiAnICsgJ1lvdSBtYXkgY29udmVydCBpdCB0byBhbiBhcnJheSB3aXRoIGBBcnJheS5mcm9tKClgIG9yIHRoZSAnICsgJ2BbLi4uc3ByZWFkXWAgb3BlcmF0b3IgYmVmb3JlIHJlbmRlcmluZy4gS2VlcCBpbiBtaW5kICcgKyAneW91IG1pZ2h0IG5lZWQgdG8gcG9seWZpbGwgdGhlc2UgZmVhdHVyZXMgZm9yIG9sZGVyIGJyb3dzZXJzLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlkV2FybkFib3V0R2VuZXJhdG9ycyA9IHRydWU7XG4gICAgICB9IC8vIFdhcm4gYWJvdXQgdXNpbmcgTWFwcyBhcyBjaGlsZHJlblxuXG5cbiAgICAgIGlmIChuZXdDaGlsZHJlbkl0ZXJhYmxlLmVudHJpZXMgPT09IGl0ZXJhdG9yRm4pIHtcbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNYXBzKSB7XG4gICAgICAgICAgZXJyb3IoJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHN1cHBvcnRlZC4gJyArICdVc2UgYW4gYXJyYXkgb2Yga2V5ZWQgUmVhY3RFbGVtZW50cyBpbnN0ZWFkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICB9IC8vIEZpcnN0LCB2YWxpZGF0ZSBrZXlzLlxuICAgICAgLy8gV2UnbGwgZ2V0IGEgZGlmZmVyZW50IGl0ZXJhdG9yIGxhdGVyIGZvciB0aGUgbWFpbiBwYXNzLlxuXG5cbiAgICAgIHZhciBfbmV3Q2hpbGRyZW4gPSBpdGVyYXRvckZuLmNhbGwobmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICAgIGlmIChfbmV3Q2hpbGRyZW4pIHtcbiAgICAgICAgdmFyIGtub3duS2V5cyA9IG51bGw7XG5cbiAgICAgICAgdmFyIF9zdGVwID0gX25ld0NoaWxkcmVuLm5leHQoKTtcblxuICAgICAgICBmb3IgKDsgIV9zdGVwLmRvbmU7IF9zdGVwID0gX25ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgICAgIHZhciBjaGlsZCA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgIGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cywgcmV0dXJuRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG5ld0NoaWxkcmVuID0gaXRlcmF0b3JGbi5jYWxsKG5ld0NoaWxkcmVuSXRlcmFibGUpO1xuXG4gICAgaWYgKG5ld0NoaWxkcmVuID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQW4gaXRlcmFibGUgb2JqZWN0IHByb3ZpZGVkIG5vIGl0ZXJhdG9yLicpO1xuICAgIH1cblxuICAgIHZhciByZXN1bHRpbmdGaXJzdENoaWxkID0gbnVsbDtcbiAgICB2YXIgcHJldmlvdXNOZXdGaWJlciA9IG51bGw7XG4gICAgdmFyIG9sZEZpYmVyID0gY3VycmVudEZpcnN0Q2hpbGQ7XG4gICAgdmFyIGxhc3RQbGFjZWRJbmRleCA9IDA7XG4gICAgdmFyIG5ld0lkeCA9IDA7XG4gICAgdmFyIG5leHRPbGRGaWJlciA9IG51bGw7XG4gICAgdmFyIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCk7XG5cbiAgICBmb3IgKDsgb2xkRmliZXIgIT09IG51bGwgJiYgIXN0ZXAuZG9uZTsgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgIGlmIChvbGRGaWJlci5pbmRleCA+IG5ld0lkeCkge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlcjtcbiAgICAgICAgb2xkRmliZXIgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXIuc2libGluZztcbiAgICAgIH1cblxuICAgICAgdmFyIG5ld0ZpYmVyID0gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIHN0ZXAudmFsdWUsIGxhbmVzKTtcblxuICAgICAgaWYgKG5ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgYnJlYWtzIG9uIGVtcHR5IHNsb3RzIGxpa2UgbnVsbCBjaGlsZHJlbi4gVGhhdCdzXG4gICAgICAgIC8vIHVuZm9ydHVuYXRlIGJlY2F1c2UgaXQgdHJpZ2dlcnMgdGhlIHNsb3cgcGF0aCBhbGwgdGhlIHRpbWUuIFdlIG5lZWRcbiAgICAgICAgLy8gYSBiZXR0ZXIgd2F5IHRvIGNvbW11bmljYXRlIHdoZXRoZXIgdGhpcyB3YXMgYSBtaXNzIG9yIG51bGwsXG4gICAgICAgIC8vIGJvb2xlYW4sIHVuZGVmaW5lZCwgZXRjLlxuICAgICAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICBpZiAob2xkRmliZXIgJiYgbmV3RmliZXIuYWx0ZXJuYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgbWF0Y2hlZCB0aGUgc2xvdCwgYnV0IHdlIGRpZG4ndCByZXVzZSB0aGUgZXhpc3RpbmcgZmliZXIsIHNvIHdlXG4gICAgICAgICAgLy8gbmVlZCB0byBkZWxldGUgdGhlIGV4aXN0aW5nIGNoaWxkLlxuICAgICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChuZXdGaWJlciwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uXG4gICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBuZXdGaWJlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IERlZmVyIHNpYmxpbmdzIGlmIHdlJ3JlIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXggZm9yIHRoaXMgc2xvdC5cbiAgICAgICAgLy8gSS5lLiBpZiB3ZSBoYWQgbnVsbCB2YWx1ZXMgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gZGVmZXIgdGhpc1xuICAgICAgICAvLyBmb3IgZWFjaCBudWxsIHZhbHVlLiBIb3dldmVyLCB3ZSBhbHNvIGRvbid0IHdhbnQgdG8gY2FsbCB1cGRhdGVTbG90XG4gICAgICAgIC8vIHdpdGggdGhlIHByZXZpb3VzIG9uZS5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gbmV3RmliZXI7XG4gICAgICB9XG5cbiAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBuZXdGaWJlcjtcbiAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgIH1cblxuICAgIGlmIChzdGVwLmRvbmUpIHtcbiAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbmV3IGNoaWxkcmVuLiBXZSBjYW4gZGVsZXRlIHRoZSByZXN0LlxuICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcblxuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgICAgdmFyIG51bWJlck9mRm9ya3MgPSBuZXdJZHg7XG4gICAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgbnVtYmVyT2ZGb3Jrcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH1cblxuICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSBleGlzdGluZyBjaGlsZHJlbiB3ZSBjYW4gY2hvb3NlIGEgZmFzdCBwYXRoXG4gICAgICAvLyBzaW5jZSB0aGUgcmVzdCB3aWxsIGFsbCBiZSBpbnNlcnRpb25zLlxuICAgICAgZm9yICg7ICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICAgIHZhciBfbmV3RmliZXIzID0gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIHN0ZXAudmFsdWUsIGxhbmVzKTtcblxuICAgICAgICBpZiAoX25ld0ZpYmVyMyA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIzLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uXG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyMztcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXIzO1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgICB2YXIgX251bWJlck9mRm9ya3MzID0gbmV3SWR4O1xuICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIF9udW1iZXJPZkZvcmtzMyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH0gLy8gQWRkIGFsbCBjaGlsZHJlbiB0byBhIGtleSBtYXAgZm9yIHF1aWNrIGxvb2t1cHMuXG5cblxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTsgLy8gS2VlcCBzY2FubmluZyBhbmQgdXNlIHRoZSBtYXAgdG8gcmVzdG9yZSBkZWxldGVkIGl0ZW1zIGFzIG1vdmVzLlxuXG4gICAgZm9yICg7ICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICB2YXIgX25ld0ZpYmVyNCA9IHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICBpZiAoX25ld0ZpYmVyNCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICAgIGlmIChfbmV3RmliZXI0LmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlIG5ldyBmaWJlciBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MsIGJ1dCBpZiB0aGVyZSBleGlzdHMgYVxuICAgICAgICAgICAgLy8gY3VycmVudCwgdGhhdCBtZWFucyB0aGF0IHdlIHJldXNlZCB0aGUgZmliZXIuIFdlIG5lZWQgdG8gZGVsZXRlXG4gICAgICAgICAgICAvLyBpdCBmcm9tIHRoZSBjaGlsZCBsaXN0IHNvIHRoYXQgd2UgZG9uJ3QgYWRkIGl0IHRvIHRoZSBkZWxldGlvblxuICAgICAgICAgICAgLy8gbGlzdC5cbiAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZGVsZXRlKF9uZXdGaWJlcjQua2V5ID09PSBudWxsID8gbmV3SWR4IDogX25ld0ZpYmVyNC5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyNCwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyNDtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXI0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBBbnkgZXhpc3RpbmcgY2hpbGRyZW4gdGhhdCB3ZXJlbid0IGNvbnN1bWVkIGFib3ZlIHdlcmUgZGVsZXRlZC4gV2UgbmVlZFxuICAgICAgLy8gdG8gYWRkIHRoZW0gdG8gdGhlIGRlbGV0aW9uIGxpc3QuXG4gICAgICBleGlzdGluZ0NoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgIHZhciBfbnVtYmVyT2ZGb3JrczQgPSBuZXdJZHg7XG4gICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIF9udW1iZXJPZkZvcmtzNCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVTaW5nbGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIHRleHRDb250ZW50LCBsYW5lcykge1xuICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBjaGVjayBmb3Iga2V5cyBvbiB0ZXh0IG5vZGVzIHNpbmNlIHdlIGRvbid0IGhhdmUgYVxuICAgIC8vIHdheSB0byBkZWZpbmUgdGhlbS5cbiAgICBpZiAoY3VycmVudEZpcnN0Q2hpbGQgIT09IG51bGwgJiYgY3VycmVudEZpcnN0Q2hpbGQudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG5vZGUgc28gbGV0J3MganVzdCB1cGRhdGUgaXQgYW5kIGRlbGV0ZVxuICAgICAgLy8gdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQuc2libGluZyk7XG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50Rmlyc3RDaGlsZCwgdGV4dENvbnRlbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfSAvLyBUaGUgZXhpc3RpbmcgZmlyc3QgY2hpbGQgaXMgbm90IGEgdGV4dCBub2RlIHNvIHdlIG5lZWQgdG8gY3JlYXRlIG9uZVxuICAgIC8vIGFuZCBkZWxldGUgdGhlIGV4aXN0aW5nIG9uZXMuXG5cblxuICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KHRleHRDb250ZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZUVsZW1lbnQocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBlbGVtZW50LCBsYW5lcykge1xuICAgIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgICB2YXIgY2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgLy8gVE9ETzogSWYga2V5ID09PSBudWxsIGFuZCBjaGlsZC5rZXkgPT09IG51bGwsIHRoZW4gdGhpcyBvbmx5IGFwcGxpZXMgdG9cbiAgICAgIC8vIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LlxuICAgICAgaWYgKGNoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIHZhciBlbGVtZW50VHlwZSA9IGVsZW1lbnQudHlwZTtcblxuICAgICAgICBpZiAoZWxlbWVudFR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICAgICAgICBpZiAoY2hpbGQudGFnID09PSBGcmFnbWVudCkge1xuICAgICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkLnNpYmxpbmcpO1xuICAgICAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY2hpbGQsIGVsZW1lbnQucHJvcHMuY2hpbGRyZW4pO1xuICAgICAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXhpc3RpbmcuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgICAgICAgICAgICBleGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChjaGlsZC5lbGVtZW50VHlwZSA9PT0gZWxlbWVudFR5cGUgfHwgKCAvLyBLZWVwIHRoaXMgY2hlY2sgaW5saW5lIHNvIGl0IG9ubHkgcnVucyBvbiB0aGUgZmFsc2UgcGF0aDpcbiAgICAgICAgICAgaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGNoaWxkLCBlbGVtZW50KSApIHx8IC8vIExhenkgdHlwZXMgc2hvdWxkIHJlY29uY2lsZSB0aGVpciByZXNvbHZlZCB0eXBlLlxuICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZG8gdGhpcyBhZnRlciB0aGUgSG90IFJlbG9hZGluZyBjaGVjayBhYm92ZSxcbiAgICAgICAgICAvLyBiZWNhdXNlIGhvdCByZWxvYWRpbmcgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgdGhhbiBwcm9kIGJlY2F1c2VcbiAgICAgICAgICAvLyBpdCBkb2Vzbid0IHJlc3VzcGVuZC4gU28gd2UgY2FuJ3QgbGV0IHRoZSBjYWxsIGJlbG93IHN1c3BlbmQuXG4gICAgICAgICAgdHlwZW9mIGVsZW1lbnRUeXBlID09PSAnb2JqZWN0JyAmJiBlbGVtZW50VHlwZSAhPT0gbnVsbCAmJiBlbGVtZW50VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFICYmIHJlc29sdmVMYXp5KGVsZW1lbnRUeXBlKSA9PT0gY2hpbGQudHlwZSkge1xuICAgICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkLnNpYmxpbmcpO1xuXG4gICAgICAgICAgICB2YXIgX2V4aXN0aW5nID0gdXNlRmliZXIoY2hpbGQsIGVsZW1lbnQucHJvcHMpO1xuXG4gICAgICAgICAgICBfZXhpc3RpbmcucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjaGlsZCwgZWxlbWVudCk7XG4gICAgICAgICAgICBfZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgX2V4aXN0aW5nLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICAgICAgICAgICAgX2V4aXN0aW5nLl9kZWJ1Z093bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfZXhpc3Rpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIERpZG4ndCBtYXRjaC5cblxuXG4gICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH1cblxuICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZWxlbWVudC5wcm9wcy5jaGlsZHJlbiwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIGVsZW1lbnQua2V5KTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9jcmVhdGVkNCA9IGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoZWxlbWVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuXG4gICAgICBfY3JlYXRlZDQucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgZWxlbWVudCk7XG4gICAgICBfY3JlYXRlZDQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gX2NyZWF0ZWQ0O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZVBvcnRhbChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIHBvcnRhbCwgbGFuZXMpIHtcbiAgICB2YXIga2V5ID0gcG9ydGFsLmtleTtcbiAgICB2YXIgY2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgLy8gVE9ETzogSWYga2V5ID09PSBudWxsIGFuZCBjaGlsZC5rZXkgPT09IG51bGwsIHRoZW4gdGhpcyBvbmx5IGFwcGxpZXMgdG9cbiAgICAgIC8vIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LlxuICAgICAgaWYgKGNoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIGlmIChjaGlsZC50YWcgPT09IEhvc3RQb3J0YWwgJiYgY2hpbGQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8gPT09IHBvcnRhbC5jb250YWluZXJJbmZvICYmIGNoaWxkLnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiA9PT0gcG9ydGFsLmltcGxlbWVudGF0aW9uKSB7XG4gICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkLnNpYmxpbmcpO1xuICAgICAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGNoaWxkLCBwb3J0YWwuY2hpbGRyZW4gfHwgW10pO1xuICAgICAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwocG9ydGFsLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfSAvLyBUaGlzIEFQSSB3aWxsIHRhZyB0aGUgY2hpbGRyZW4gd2l0aCB0aGUgc2lkZS1lZmZlY3Qgb2YgdGhlIHJlY29uY2lsaWF0aW9uXG4gIC8vIGl0c2VsZi4gVGhleSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBzaWRlLWVmZmVjdCBsaXN0IGFzIHdlIHBhc3MgdGhyb3VnaCB0aGVcbiAgLy8gY2hpbGRyZW4gYW5kIHRoZSBwYXJlbnQuXG5cblxuICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZEZpYmVycyhyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlY3Vyc2l2ZS5cbiAgICAvLyBJZiB0aGUgdG9wIGxldmVsIGl0ZW0gaXMgYW4gYXJyYXksIHdlIHRyZWF0IGl0IGFzIGEgc2V0IG9mIGNoaWxkcmVuLFxuICAgIC8vIG5vdCBhcyBhIGZyYWdtZW50LiBOZXN0ZWQgYXJyYXlzIG9uIHRoZSBvdGhlciBoYW5kIHdpbGwgYmUgdHJlYXRlZCBhc1xuICAgIC8vIGZyYWdtZW50IG5vZGVzLiBSZWN1cnNpb24gaGFwcGVucyBhdCB0aGUgbm9ybWFsIGZsb3cuXG4gICAgLy8gSGFuZGxlIHRvcCBsZXZlbCB1bmtleWVkIGZyYWdtZW50cyBhcyBpZiB0aGV5IHdlcmUgYXJyYXlzLlxuICAgIC8vIFRoaXMgbGVhZHMgdG8gYW4gYW1iaWd1aXR5IGJldHdlZW4gPD57Wy4uLl19PC8+IGFuZCA8Pi4uLjwvPi5cbiAgICAvLyBXZSB0cmVhdCB0aGUgYW1iaWd1b3VzIGNhc2VzIGFib3ZlIHRoZSBzYW1lLlxuICAgIHZhciBpc1Vua2V5ZWRUb3BMZXZlbEZyYWdtZW50ID0gdHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCAmJiBuZXdDaGlsZC50eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFICYmIG5ld0NoaWxkLmtleSA9PT0gbnVsbDtcblxuICAgIGlmIChpc1Vua2V5ZWRUb3BMZXZlbEZyYWdtZW50KSB7XG4gICAgICBuZXdDaGlsZCA9IG5ld0NoaWxkLnByb3BzLmNoaWxkcmVuO1xuICAgIH0gLy8gSGFuZGxlIG9iamVjdCB0eXBlc1xuXG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZWNvbmNpbGVTaW5nbGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSk7XG5cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZWNvbmNpbGVTaW5nbGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpKTtcblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7IC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gYmUgbm9uLXJlY3Vyc2l2ZS5cblxuICAgICAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZEZpYmVycyhyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIGluaXQocGF5bG9hZCksIGxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpKSB7XG4gICAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZHJlbkFycmF5KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBwbGFjZVNpbmdsZUNoaWxkKHJlY29uY2lsZVNpbmdsZVRleHROb2RlKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgJycgKyBuZXdDaGlsZCwgbGFuZXMpKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfSAvLyBSZW1haW5pbmcgY2FzZXMgYXJlIGFsbCB0cmVhdGVkIGFzIGVtcHR5LlxuXG5cbiAgICByZXR1cm4gZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKTtcbiAgfVxuXG4gIHJldHVybiByZWNvbmNpbGVDaGlsZEZpYmVycztcbn1cblxudmFyIHJlY29uY2lsZUNoaWxkRmliZXJzID0gQ2hpbGRSZWNvbmNpbGVyKHRydWUpO1xudmFyIG1vdW50Q2hpbGRGaWJlcnMgPSBDaGlsZFJlY29uY2lsZXIoZmFsc2UpO1xuZnVuY3Rpb24gY2xvbmVDaGlsZEZpYmVycyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzcy5jaGlsZCAhPT0gY3VycmVudC5jaGlsZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVzdW1pbmcgd29yayBub3QgeWV0IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzLmNoaWxkID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRDaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB2YXIgbmV3Q2hpbGQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIGN1cnJlbnRDaGlsZC5wZW5kaW5nUHJvcHMpO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG5ld0NoaWxkO1xuICBuZXdDaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcblxuICB3aGlsZSAoY3VycmVudENoaWxkLnNpYmxpbmcgIT09IG51bGwpIHtcbiAgICBjdXJyZW50Q2hpbGQgPSBjdXJyZW50Q2hpbGQuc2libGluZztcbiAgICBuZXdDaGlsZCA9IG5ld0NoaWxkLnNpYmxpbmcgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIGN1cnJlbnRDaGlsZC5wZW5kaW5nUHJvcHMpO1xuICAgIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB9XG5cbiAgbmV3Q2hpbGQuc2libGluZyA9IG51bGw7XG59IC8vIFJlc2V0IGEgd29ya0luUHJvZ3Jlc3MgY2hpbGQgc2V0IHRvIHByZXBhcmUgaXQgZm9yIGEgc2Vjb25kIHBhc3MuXG5cbmZ1bmN0aW9uIHJlc2V0Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGxhbmVzKSB7XG4gIHZhciBjaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgIHJlc2V0V29ya0luUHJvZ3Jlc3MoY2hpbGQsIGxhbmVzKTtcbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cbn1cblxudmFyIE5PX0NPTlRFWFQgPSB7fTtcbnZhciBjb250ZXh0U3RhY2tDdXJzb3IkMSA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcbnZhciBjb250ZXh0RmliZXJTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcbnZhciByb290SW5zdGFuY2VTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcblxuZnVuY3Rpb24gcmVxdWlyZWRDb250ZXh0KGMpIHtcbiAgaWYgKGMgPT09IE5PX0NPTlRFWFQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGhvc3QgY29udGV4dCB0byBleGlzdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnICcgKyAnaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcmV0dXJuIGM7XG59XG5cbmZ1bmN0aW9uIGdldFJvb3RIb3N0Q29udGFpbmVyKCkge1xuICB2YXIgcm9vdEluc3RhbmNlID0gcmVxdWlyZWRDb250ZXh0KHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLmN1cnJlbnQpO1xuICByZXR1cm4gcm9vdEluc3RhbmNlO1xufVxuXG5mdW5jdGlvbiBwdXNoSG9zdENvbnRhaW5lcihmaWJlciwgbmV4dFJvb3RJbnN0YW5jZSkge1xuICAvLyBQdXNoIGN1cnJlbnQgcm9vdCBpbnN0YW5jZSBvbnRvIHRoZSBzdGFjaztcbiAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gcmVzZXQgcm9vdCB3aGVuIHBvcnRhbHMgYXJlIHBvcHBlZC5cbiAgcHVzaChyb290SW5zdGFuY2VTdGFja0N1cnNvciwgbmV4dFJvb3RJbnN0YW5jZSwgZmliZXIpOyAvLyBUcmFjayB0aGUgY29udGV4dCBhbmQgdGhlIEZpYmVyIHRoYXQgcHJvdmlkZWQgaXQuXG4gIC8vIFRoaXMgZW5hYmxlcyB1cyB0byBwb3Agb25seSBGaWJlcnMgdGhhdCBwcm92aWRlIHVuaXF1ZSBjb250ZXh0cy5cblxuICBwdXNoKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlciwgZmliZXIpOyAvLyBGaW5hbGx5LCB3ZSBuZWVkIHRvIHB1c2ggdGhlIGhvc3QgY29udGV4dCB0byB0aGUgc3RhY2suXG4gIC8vIEhvd2V2ZXIsIHdlIGNhbid0IGp1c3QgY2FsbCBnZXRSb290SG9zdENvbnRleHQoKSBhbmQgcHVzaCBpdCBiZWNhdXNlXG4gIC8vIHdlJ2QgaGF2ZSBhIGRpZmZlcmVudCBudW1iZXIgb2YgZW50cmllcyBvbiB0aGUgc3RhY2sgZGVwZW5kaW5nIG9uXG4gIC8vIHdoZXRoZXIgZ2V0Um9vdEhvc3RDb250ZXh0KCkgdGhyb3dzIHNvbWV3aGVyZSBpbiByZW5kZXJlciBjb2RlIG9yIG5vdC5cbiAgLy8gU28gd2UgcHVzaCBhbiBlbXB0eSB2YWx1ZSBmaXJzdC4gVGhpcyBsZXRzIHVzIHNhZmVseSB1bndpbmQgb24gZXJyb3JzLlxuXG4gIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yJDEsIE5PX0NPTlRFWFQsIGZpYmVyKTtcbiAgdmFyIG5leHRSb290Q29udGV4dCA9IGdldFJvb3RIb3N0Q29udGV4dChuZXh0Um9vdEluc3RhbmNlKTsgLy8gTm93IHRoYXQgd2Uga25vdyB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgdGhyb3csIHJlcGxhY2UgaXQuXG5cbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7XG4gIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yJDEsIG5leHRSb290Q29udGV4dCwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwb3BIb3N0Q29udGFpbmVyKGZpYmVyKSB7XG4gIHBvcChjb250ZXh0U3RhY2tDdXJzb3IkMSwgZmliZXIpO1xuICBwb3AoY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgcG9wKHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIGdldEhvc3RDb250ZXh0KCkge1xuICB2YXIgY29udGV4dCA9IHJlcXVpcmVkQ29udGV4dChjb250ZXh0U3RhY2tDdXJzb3IkMS5jdXJyZW50KTtcbiAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Q29udGV4dChmaWJlcikge1xuICB2YXIgcm9vdEluc3RhbmNlID0gcmVxdWlyZWRDb250ZXh0KHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLmN1cnJlbnQpO1xuICB2YXIgY29udGV4dCA9IHJlcXVpcmVkQ29udGV4dChjb250ZXh0U3RhY2tDdXJzb3IkMS5jdXJyZW50KTtcbiAgdmFyIG5leHRDb250ZXh0ID0gZ2V0Q2hpbGRIb3N0Q29udGV4dChjb250ZXh0LCBmaWJlci50eXBlKTsgLy8gRG9uJ3QgcHVzaCB0aGlzIEZpYmVyJ3MgY29udGV4dCB1bmxlc3MgaXQncyB1bmlxdWUuXG5cbiAgaWYgKGNvbnRleHQgPT09IG5leHRDb250ZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIFRyYWNrIHRoZSBjb250ZXh0IGFuZCB0aGUgRmliZXIgdGhhdCBwcm92aWRlZCBpdC5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIHBvcCBvbmx5IEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuXG5cbiAgcHVzaChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIsIGZpYmVyKTtcbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgbmV4dENvbnRleHQsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gcG9wSG9zdENvbnRleHQoZmliZXIpIHtcbiAgLy8gRG8gbm90IHBvcCB1bmxlc3MgdGhpcyBGaWJlciBwcm92aWRlZCB0aGUgY3VycmVudCBjb250ZXh0LlxuICAvLyBwdXNoSG9zdENvbnRleHQoKSBvbmx5IHB1c2hlcyBGaWJlcnMgdGhhdCBwcm92aWRlIHVuaXF1ZSBjb250ZXh0cy5cbiAgaWYgKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLmN1cnJlbnQgIT09IGZpYmVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7XG4gIHBvcChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIpO1xufVxuXG52YXIgRGVmYXVsdFN1c3BlbnNlQ29udGV4dCA9IDA7IC8vIFRoZSBTdXNwZW5zZSBDb250ZXh0IGlzIHNwbGl0IGludG8gdHdvIHBhcnRzLiBUaGUgbG93ZXIgYml0cyBpc1xuLy8gaW5oZXJpdGVkIGRlZXBseSBkb3duIHRoZSBzdWJ0cmVlLiBUaGUgdXBwZXIgYml0cyBvbmx5IGFmZmVjdFxuLy8gdGhpcyBpbW1lZGlhdGUgc3VzcGVuc2UgYm91bmRhcnkgYW5kIGdldHMgcmVzZXQgZWFjaCBuZXdcbi8vIGJvdW5kYXJ5IG9yIHN1c3BlbnNlIGxpc3QuXG5cbnZhciBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzayA9IDE7IC8vIFN1YnRyZWUgRmxhZ3M6XG4vLyBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQgaW5kaWNhdGVzIHRoYXQgb25lIG9mIG91ciBwYXJlbnQgU3VzcGVuc2Vcbi8vIGJvdW5kYXJpZXMgaXMgbm90IGN1cnJlbnRseSBzaG93aW5nIHZpc2libGUgbWFpbiBjb250ZW50LlxuLy8gRWl0aGVyIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2sgb3IgaXMgbm90IG1vdW50ZWQgYXQgYWxsLlxuLy8gV2UgY2FuIHVzZSB0aGlzIHRvIGRldGVybWluZSBpZiBpdCBpcyBkZXNpcmFibGUgdG8gdHJpZ2dlciBhIGZhbGxiYWNrIGF0XG4vLyB0aGUgcGFyZW50LiBJZiBub3QsIHRoZW4gd2UgbWlnaHQgbmVlZCB0byB0cmlnZ2VyIHVuZGVzaXJhYmxlIGJvdW5kYXJpZXNcbi8vIGFuZC9vciBzdXNwZW5kIHRoZSBjb21taXQgdG8gYXZvaWQgaGlkaW5nIHRoZSBwYXJlbnQgY29udGVudC5cblxudmFyIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCA9IDE7IC8vIFNoYWxsb3cgRmxhZ3M6XG4vLyBGb3JjZVN1c3BlbnNlRmFsbGJhY2sgY2FuIGJlIHVzZWQgYnkgU3VzcGVuc2VMaXN0IHRvIGZvcmNlIG5ld2x5IGFkZGVkXG4vLyBpdGVtcyBpbnRvIHRoZWlyIGZhbGxiYWNrIHN0YXRlIGR1cmluZyBvbmUgb2YgdGhlIHJlbmRlciBwYXNzZXMuXG5cbnZhciBGb3JjZVN1c3BlbnNlRmFsbGJhY2sgPSAyO1xudmFyIHN1c3BlbnNlU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoRGVmYXVsdFN1c3BlbnNlQ29udGV4dCk7XG5mdW5jdGlvbiBoYXNTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCwgZmxhZykge1xuICByZXR1cm4gKHBhcmVudENvbnRleHQgJiBmbGFnKSAhPT0gMDtcbn1cbmZ1bmN0aW9uIHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQpIHtcbiAgcmV0dXJuIHBhcmVudENvbnRleHQgJiBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzaztcbn1cbmZ1bmN0aW9uIHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCwgc2hhbGxvd0NvbnRleHQpIHtcbiAgcmV0dXJuIHBhcmVudENvbnRleHQgJiBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzayB8IHNoYWxsb3dDb250ZXh0O1xufVxuZnVuY3Rpb24gYWRkU3VidHJlZVN1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBzdWJ0cmVlQ29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCB8IHN1YnRyZWVDb250ZXh0O1xufVxuZnVuY3Rpb24gcHVzaFN1c3BlbnNlQ29udGV4dChmaWJlciwgbmV3Q29udGV4dCkge1xuICBwdXNoKHN1c3BlbnNlU3RhY2tDdXJzb3IsIG5ld0NvbnRleHQsIGZpYmVyKTtcbn1cbmZ1bmN0aW9uIHBvcFN1c3BlbnNlQ29udGV4dChmaWJlcikge1xuICBwb3Aoc3VzcGVuc2VTdGFja0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRDYXB0dXJlU3VzcGVuc2Uod29ya0luUHJvZ3Jlc3MsIGhhc0ludmlzaWJsZVBhcmVudCkge1xuICAvLyBJZiBpdCB3YXMgdGhlIHByaW1hcnkgY2hpbGRyZW4gdGhhdCBqdXN0IHN1c3BlbmRlZCwgY2FwdHVyZSBhbmQgcmVuZGVyIHRoZVxuICAvLyBmYWxsYmFjay4gT3RoZXJ3aXNlLCBkb24ndCBjYXB0dXJlIGFuZCBidWJibGUgdG8gdGhlIG5leHQgYm91bmRhcnkuXG4gIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChuZXh0U3RhdGUgIT09IG51bGwpIHtcbiAgICBpZiAobmV4dFN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgIC8vIEEgZGVoeWRyYXRlZCBib3VuZGFyeSBhbHdheXMgY2FwdHVyZXMuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgcHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzOyAvLyBSZWd1bGFyIGJvdW5kYXJpZXMgYWx3YXlzIGNhcHR1cmUuXG5cbiAge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIElmIGl0J3MgYSBib3VuZGFyeSB3ZSBzaG91bGQgYXZvaWQsIHRoZW4gd2UgcHJlZmVyIHRvIGJ1YmJsZSB1cCB0byB0aGVcbn1cbmZ1bmN0aW9uIGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpIHtcbiAgdmFyIG5vZGUgPSByb3c7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICB2YXIgc3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgZGVoeWRyYXRlZCA9IHN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgICAgaWYgKGRlaHlkcmF0ZWQgPT09IG51bGwgfHwgaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhkZWh5ZHJhdGVkKSB8fCBpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhkZWh5ZHJhdGVkKSkge1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VMaXN0Q29tcG9uZW50ICYmIC8vIHJldmVhbE9yZGVyIHVuZGVmaW5lZCBjYW4ndCBiZSB0cnVzdGVkIGJlY2F1c2UgaXQgZG9uJ3RcbiAgICAvLyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgaXQgc3VzcGVuZGVkIG9yIG5vdC5cbiAgICBub2RlLm1lbW9pemVkUHJvcHMucmV2ZWFsT3JkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGRpZFN1c3BlbmQgPSAobm9kZS5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gICAgICBpZiAoZGlkU3VzcGVuZCkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IHJvdykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSByb3cpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgTm9GbGFncyQxID1cbi8qICAgKi9cbjA7IC8vIFJlcHJlc2VudHMgd2hldGhlciBlZmZlY3Qgc2hvdWxkIGZpcmUuXG5cbnZhciBIYXNFZmZlY3QgPVxuLyogKi9cbjE7IC8vIFJlcHJlc2VudHMgdGhlIHBoYXNlIGluIHdoaWNoIHRoZSBlZmZlY3QgKG5vdCB0aGUgY2xlYW4tdXApIGZpcmVzLlxuXG52YXIgSW5zZXJ0aW9uID1cbi8qICAqL1xuMjtcbnZhciBMYXlvdXQgPVxuLyogICAgKi9cbjQ7XG52YXIgUGFzc2l2ZSQxID1cbi8qICAgKi9cbjg7XG5cbi8vIGFuZCBzaG91bGQgYmUgcmVzZXQgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3IHJlbmRlci5cbi8vIFRoaXMgdHJhY2tzIHdoaWNoIG11dGFibGUgc291cmNlcyBuZWVkIHRvIGJlIHJlc2V0IGFmdGVyIGEgcmVuZGVyLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NTb3VyY2VzID0gW107XG5mdW5jdGlvbiByZXNldFdvcmtJblByb2dyZXNzVmVyc2lvbnMoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgd29ya0luUHJvZ3Jlc3NTb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG11dGFibGVTb3VyY2UgPSB3b3JrSW5Qcm9ncmVzc1NvdXJjZXNbaV07XG5cbiAgICB7XG4gICAgICBtdXRhYmxlU291cmNlLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzc1NvdXJjZXMubGVuZ3RoID0gMDtcbn1cbi8vIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSB2ZXJzaW9uIHVzZWQgZm9yIHNlcnZlciByZW5kZXJpbmcgbWF0Y2hlcyB0aGUgb25lXG4vLyB0aGF0IGlzIGV2ZW50dWFsbHkgcmVhZCBkdXJpbmcgaHlkcmF0aW9uLlxuLy8gSWYgdGhleSBkb24ndCBtYXRjaCB0aGVyZSdzIGEgcG90ZW50aWFsIHRlYXIgYW5kIGEgZnVsbCBkZW9wdCByZW5kZXIgaXMgcmVxdWlyZWQuXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyTXV0YWJsZVNvdXJjZUZvckh5ZHJhdGlvbihyb290LCBtdXRhYmxlU291cmNlKSB7XG4gIHZhciBnZXRWZXJzaW9uID0gbXV0YWJsZVNvdXJjZS5fZ2V0VmVyc2lvbjtcbiAgdmFyIHZlcnNpb24gPSBnZXRWZXJzaW9uKG11dGFibGVTb3VyY2UuX3NvdXJjZSk7IC8vIFRPRE8gQ2xlYXIgdGhpcyBkYXRhIG9uY2UgYWxsIHBlbmRpbmcgaHlkcmF0aW9uIHdvcmsgaXMgZmluaXNoZWQuXG4gIC8vIFJldGFpbmluZyBpdCBmb3JldmVyIG1heSBpbnRlcmZlcmUgd2l0aCBHQy5cblxuICBpZiAocm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID09IG51bGwpIHtcbiAgICByb290Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEgPSBbbXV0YWJsZVNvdXJjZSwgdmVyc2lvbl07XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhLnB1c2gobXV0YWJsZVNvdXJjZSwgdmVyc2lvbik7XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO1xudmFyIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudDtcbnZhciBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdDtcblxue1xuICBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQgPSBuZXcgU2V0KCk7XG59XG5cbi8vIFRoZXNlIGFyZSBzZXQgcmlnaHQgYmVmb3JlIGNhbGxpbmcgdGhlIGNvbXBvbmVudC5cbnZhciByZW5kZXJMYW5lcyA9IE5vTGFuZXM7IC8vIFRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLiBJJ3ZlIG5hbWVkIGl0IGRpZmZlcmVudGx5IHRvIGRpc3Rpbmd1aXNoIGl0IGZyb21cbi8vIHRoZSB3b3JrLWluLXByb2dyZXNzIGhvb2suXG5cbnZhciBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDsgLy8gSG9va3MgYXJlIHN0b3JlZCBhcyBhIGxpbmtlZCBsaXN0IG9uIHRoZSBmaWJlcidzIG1lbW9pemVkU3RhdGUgZmllbGQuIFRoZVxuLy8gY3VycmVudCBob29rIGxpc3QgaXMgdGhlIGxpc3QgdGhhdCBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IGZpYmVyLiBUaGVcbi8vIHdvcmstaW4tcHJvZ3Jlc3MgaG9vayBsaXN0IGlzIGEgbmV3IGxpc3QgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZVxuLy8gd29yay1pbi1wcm9ncmVzcyBmaWJlci5cblxudmFyIGN1cnJlbnRIb29rID0gbnVsbDtcbnZhciB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsOyAvLyBXaGV0aGVyIGFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIGF0IGFueSBwb2ludCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS4gVGhpc1xuLy8gZG9lcyBub3QgZ2V0IHJlc2V0IGlmIHdlIGRvIGFub3RoZXIgcmVuZGVyIHBhc3M7IG9ubHkgd2hlbiB3ZSdyZSBjb21wbGV0ZWx5XG4vLyBmaW5pc2hlZCBldmFsdWF0aW5nIHRoaXMgY29tcG9uZW50LiBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBzbyB3ZSBrbm93XG4vLyB3aGV0aGVyIHdlIG5lZWQgdG8gY2xlYXIgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgYWZ0ZXIgYSB0aHJvdy5cblxudmFyIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTsgLy8gV2hlcmUgYW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgb25seSBkdXJpbmcgdGhlIGN1cnJlbnQgcmVuZGVyIHBhc3MuIFRoaXNcbi8vIGdldHMgcmVzZXQgYWZ0ZXIgZWFjaCBhdHRlbXB0LlxuLy8gVE9ETzogTWF5YmUgdGhlcmUncyBzb21lIHdheSB0byBjb25zb2xpZGF0ZSB0aGlzIHdpdGhcbi8vIGBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlYC4gT3Igd2l0aCBgbnVtYmVyT2ZSZVJlbmRlcnNgLlxuXG52YXIgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZmFsc2U7IC8vIENvdW50cyB0aGUgbnVtYmVyIG9mIHVzZUlkIGhvb2tzIGluIHRoaXMgY29tcG9uZW50LlxuXG52YXIgbG9jYWxJZENvdW50ZXIgPSAwOyAvLyBVc2VkIGZvciBpZHMgdGhhdCBhcmUgZ2VuZXJhdGVkIGNvbXBsZXRlbHkgY2xpZW50LXNpZGUgKGkuZS4gbm90IGR1cmluZ1xuLy8gaHlkcmF0aW9uKS4gVGhpcyBjb3VudGVyIGlzIGdsb2JhbCwgc28gY2xpZW50IGlkcyBhcmUgbm90IHN0YWJsZSBhY3Jvc3Ncbi8vIHJlbmRlciBhdHRlbXB0cy5cblxudmFyIGdsb2JhbENsaWVudElkQ291bnRlciA9IDA7XG52YXIgUkVfUkVOREVSX0xJTUlUID0gMjU7IC8vIEluIERFViwgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBwcmltaXRpdmUgaG9va1xuXG52YXIgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBudWxsOyAvLyBJbiBERVYsIHRoaXMgbGlzdCBlbnN1cmVzIHRoYXQgaG9va3MgYXJlIGNhbGxlZCBpbiB0aGUgc2FtZSBvcmRlciBiZXR3ZWVuIHJlbmRlcnMuXG4vLyBUaGUgbGlzdCBzdG9yZXMgdGhlIG9yZGVyIG9mIGhvb2tzIHVzZWQgZHVyaW5nIHRoZSBpbml0aWFsIHJlbmRlciAobW91bnQpLlxuLy8gU3Vic2VxdWVudCByZW5kZXJzICh1cGRhdGVzKSByZWZlcmVuY2UgdGhpcyBsaXN0LlxuXG52YXIgaG9va1R5cGVzRGV2ID0gbnVsbDtcbnZhciBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xOyAvLyBJbiBERVYsIHRoaXMgdHJhY2tzIHdoZXRoZXIgY3VycmVudGx5IHJlbmRlcmluZyBjb21wb25lbnQgbmVlZHMgdG8gaWdub3JlXG4vLyB0aGUgZGVwZW5kZW5jaWVzIGZvciBIb29rcyB0aGF0IG5lZWQgdGhlbSAoZS5nLiB1c2VFZmZlY3Qgb3IgdXNlTWVtbykuXG4vLyBXaGVuIHRydWUsIHN1Y2ggSG9va3Mgd2lsbCBhbHdheXMgYmUgXCJyZW1vdW50ZWRcIi4gT25seSB1c2VkIGR1cmluZyBob3QgcmVsb2FkLlxuXG52YXIgaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMgPSBmYWxzZTtcblxuZnVuY3Rpb24gbW91bnRIb29rVHlwZXNEZXYoKSB7XG4gIHtcbiAgICB2YXIgaG9va05hbWUgPSBjdXJyZW50SG9va05hbWVJbkRldjtcblxuICAgIGlmIChob29rVHlwZXNEZXYgPT09IG51bGwpIHtcbiAgICAgIGhvb2tUeXBlc0RldiA9IFtob29rTmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGhvb2tUeXBlc0Rldi5wdXNoKGhvb2tOYW1lKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9va1R5cGVzRGV2KCkge1xuICB7XG4gICAgdmFyIGhvb2tOYW1lID0gY3VycmVudEhvb2tOYW1lSW5EZXY7XG5cbiAgICBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICBob29rVHlwZXNVcGRhdGVJbmRleERldisrO1xuXG4gICAgICBpZiAoaG9va1R5cGVzRGV2W2hvb2tUeXBlc1VwZGF0ZUluZGV4RGV2XSAhPT0gaG9va05hbWUpIHtcbiAgICAgICAgd2Fybk9uSG9va01pc21hdGNoSW5EZXYoaG9va05hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKSB7XG4gIHtcbiAgICBpZiAoZGVwcyAhPT0gdW5kZWZpbmVkICYmIGRlcHMgIT09IG51bGwgJiYgIWlzQXJyYXkoZGVwcykpIHtcbiAgICAgIC8vIFZlcmlmeSBkZXBzLCBidXQgb25seSBvbiBtb3VudCB0byBhdm9pZCBleHRyYSBjaGVja3MuXG4gICAgICAvLyBJdCdzIHVubGlrZWx5IHRoZWlyIHR5cGUgd291bGQgY2hhbmdlIGFzIHVzdWFsbHkgeW91IGRlZmluZSB0aGVtIGlubGluZS5cbiAgICAgIGVycm9yKCclcyByZWNlaXZlZCBhIGZpbmFsIGFyZ3VtZW50IHRoYXQgaXMgbm90IGFuIGFycmF5IChpbnN0ZWFkLCByZWNlaXZlZCBgJXNgKS4gV2hlbiAnICsgJ3NwZWNpZmllZCwgdGhlIGZpbmFsIGFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXkuJywgY3VycmVudEhvb2tOYW1lSW5EZXYsIHR5cGVvZiBkZXBzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd2Fybk9uSG9va01pc21hdGNoSW5EZXYoY3VycmVudEhvb2tOYW1lKSB7XG4gIHtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSk7XG5cbiAgICBpZiAoIWRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHRhYmxlID0gJyc7XG4gICAgICAgIHZhciBzZWNvbmRDb2x1bW5TdGFydCA9IDMwO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2OyBpKyspIHtcbiAgICAgICAgICB2YXIgb2xkSG9va05hbWUgPSBob29rVHlwZXNEZXZbaV07XG4gICAgICAgICAgdmFyIG5ld0hvb2tOYW1lID0gaSA9PT0gaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPyBjdXJyZW50SG9va05hbWUgOiBvbGRIb29rTmFtZTtcbiAgICAgICAgICB2YXIgcm93ID0gaSArIDEgKyBcIi4gXCIgKyBvbGRIb29rTmFtZTsgLy8gRXh0cmEgc3BhY2Ugc28gc2Vjb25kIGNvbHVtbiBsaW5lcyB1cFxuICAgICAgICAgIC8vIGxvbCBAIElFIG5vdCBzdXBwb3J0aW5nIFN0cmluZyNyZXBlYXRcblxuICAgICAgICAgIHdoaWxlIChyb3cubGVuZ3RoIDwgc2Vjb25kQ29sdW1uU3RhcnQpIHtcbiAgICAgICAgICAgIHJvdyArPSAnICc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcm93ICs9IG5ld0hvb2tOYW1lICsgJ1xcbic7XG4gICAgICAgICAgdGFibGUgKz0gcm93O1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3IoJ1JlYWN0IGhhcyBkZXRlY3RlZCBhIGNoYW5nZSBpbiB0aGUgb3JkZXIgb2YgSG9va3MgY2FsbGVkIGJ5ICVzLiAnICsgJ1RoaXMgd2lsbCBsZWFkIHRvIGJ1Z3MgYW5kIGVycm9ycyBpZiBub3QgZml4ZWQuICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlYWQgdGhlIFJ1bGVzIG9mIEhvb2tzOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcnVsZXMtb2YtaG9va3NcXG5cXG4nICsgJyAgIFByZXZpb3VzIHJlbmRlciAgICAgICAgICAgIE5leHQgcmVuZGVyXFxuJyArICcgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4nICsgJyVzJyArICcgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cXG4nLCBjb21wb25lbnROYW1lLCB0YWJsZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRocm93SW52YWxpZEhvb2tFcnJvcigpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yJyArICcgb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4nICsgJzEuIFlvdSBtaWdodCBoYXZlIG1pc21hdGNoaW5nIHZlcnNpb25zIG9mIFJlYWN0IGFuZCB0aGUgcmVuZGVyZXIgKHN1Y2ggYXMgUmVhY3QgRE9NKVxcbicgKyAnMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbicgKyAnMy4gWW91IG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0IGluIHRoZSBzYW1lIGFwcFxcbicgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uJyk7XG59XG5cbmZ1bmN0aW9uIGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpIHtcbiAge1xuICAgIGlmIChpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcykge1xuICAgICAgLy8gT25seSB0cnVlIHdoZW4gdGhpcyBjb21wb25lbnQgaXMgYmVpbmcgaG90IHJlbG9hZGVkLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcmV2RGVwcyA9PT0gbnVsbCkge1xuICAgIHtcbiAgICAgIGVycm9yKCclcyByZWNlaXZlZCBhIGZpbmFsIGFyZ3VtZW50IGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IG5vdCBkdXJpbmcgJyArICd0aGUgcHJldmlvdXMgcmVuZGVyLiBFdmVuIHRob3VnaCB0aGUgZmluYWwgYXJndW1lbnQgaXMgb3B0aW9uYWwsICcgKyAnaXRzIHR5cGUgY2Fubm90IGNoYW5nZSBiZXR3ZWVuIHJlbmRlcnMuJywgY3VycmVudEhvb2tOYW1lSW5EZXYpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHtcbiAgICAvLyBEb24ndCBib3RoZXIgY29tcGFyaW5nIGxlbmd0aHMgaW4gcHJvZCBiZWNhdXNlIHRoZXNlIGFycmF5cyBzaG91bGQgYmVcbiAgICAvLyBwYXNzZWQgaW5saW5lLlxuICAgIGlmIChuZXh0RGVwcy5sZW5ndGggIT09IHByZXZEZXBzLmxlbmd0aCkge1xuICAgICAgZXJyb3IoJ1RoZSBmaW5hbCBhcmd1bWVudCBwYXNzZWQgdG8gJXMgY2hhbmdlZCBzaXplIGJldHdlZW4gcmVuZGVycy4gVGhlICcgKyAnb3JkZXIgYW5kIHNpemUgb2YgdGhpcyBhcnJheSBtdXN0IHJlbWFpbiBjb25zdGFudC5cXG5cXG4nICsgJ1ByZXZpb3VzOiAlc1xcbicgKyAnSW5jb21pbmc6ICVzJywgY3VycmVudEhvb2tOYW1lSW5EZXYsIFwiW1wiICsgcHJldkRlcHMuam9pbignLCAnKSArIFwiXVwiLCBcIltcIiArIG5leHREZXBzLmpvaW4oJywgJykgKyBcIl1cIik7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmV2RGVwcy5sZW5ndGggJiYgaSA8IG5leHREZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG9iamVjdElzKG5leHREZXBzW2ldLCBwcmV2RGVwc1tpXSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHNlY29uZEFyZywgbmV4dFJlbmRlckxhbmVzKSB7XG4gIHJlbmRlckxhbmVzID0gbmV4dFJlbmRlckxhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gd29ya0luUHJvZ3Jlc3M7XG5cbiAge1xuICAgIGhvb2tUeXBlc0RldiA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Ll9kZWJ1Z0hvb2tUeXBlcyA6IG51bGw7XG4gICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTsgLy8gVXNlZCBmb3IgaG90IHJlbG9hZGluZzpcblxuICAgIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnR5cGUgIT09IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7IC8vIFRoZSBmb2xsb3dpbmcgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHJlc2V0XG4gIC8vIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgLy8gd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgLy8gZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlO1xuICAvLyBsb2NhbElkQ291bnRlciA9IDA7XG4gIC8vIFRPRE8gV2FybiBpZiBubyBob29rcyBhcmUgdXNlZCBhdCBhbGwgZHVyaW5nIG1vdW50LCB0aGVuIHNvbWUgYXJlIHVzZWQgZHVyaW5nIHVwZGF0ZS5cbiAgLy8gQ3VycmVudGx5IHdlIHdpbGwgaWRlbnRpZnkgdGhlIHVwZGF0ZSByZW5kZXIgYXMgYSBtb3VudCBiZWNhdXNlIG1lbW9pemVkU3RhdGUgPT09IG51bGwuXG4gIC8vIFRoaXMgaXMgdHJpY2t5IGJlY2F1c2UgaXQncyB2YWxpZCBmb3IgY2VydGFpbiB0eXBlcyBvZiBjb21wb25lbnRzIChlLmcuIFJlYWN0LmxhenkpXG4gIC8vIFVzaW5nIG1lbW9pemVkU3RhdGUgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG1vdW50L3VwZGF0ZSBvbmx5IHdvcmtzIGlmIGF0IGxlYXN0IG9uZSBzdGF0ZWZ1bCBob29rIGlzIHVzZWQuXG4gIC8vIE5vbi1zdGF0ZWZ1bCBob29rcyAoZS5nLiBjb250ZXh0KSBkb24ndCBnZXQgYWRkZWQgdG8gbWVtb2l6ZWRTdGF0ZSxcbiAgLy8gc28gbWVtb2l6ZWRTdGF0ZSB3b3VsZCBiZSBudWxsIGR1cmluZyB1cGRhdGVzIGFuZCBtb3VudHMuXG5cbiAge1xuICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuICAgIH0gZWxzZSBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGRpc3BhdGNoZXIgaGFuZGxlcyBhbiBlZGdlIGNhc2Ugd2hlcmUgYSBjb21wb25lbnQgaXMgdXBkYXRpbmcsXG4gICAgICAvLyBidXQgbm8gc3RhdGVmdWwgaG9va3MgaGF2ZSBiZWVuIHVzZWQuXG4gICAgICAvLyBXZSB3YW50IHRvIG1hdGNoIHRoZSBwcm9kdWN0aW9uIGNvZGUgYmVoYXZpb3IgKHdoaWNoIHdpbGwgdXNlIEhvb2tzRGlzcGF0Y2hlck9uTW91bnQpLFxuICAgICAgLy8gYnV0IHdpdGggdGhlIGV4dHJhIERFViB2YWxpZGF0aW9uIHRvIGVuc3VyZSBob29rcyBvcmRlcmluZyBoYXNuJ3QgY2hhbmdlZC5cbiAgICAgIC8vIFRoaXMgZGlzcGF0Y2hlciBkb2VzIHRoYXQuXG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEhvb2tzRGlzcGF0Y2hlck9uTW91bnRXaXRoSG9va1R5cGVzSW5ERVY7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjaGlsZHJlbiA9IENvbXBvbmVudChwcm9wcywgc2Vjb25kQXJnKTsgLy8gQ2hlY2sgaWYgdGhlcmUgd2FzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZVxuXG4gIGlmIChkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MpIHtcbiAgICAvLyBLZWVwIHJlbmRlcmluZyBpbiBhIGxvb3AgZm9yIGFzIGxvbmcgYXMgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgY29udGludWUgdG9cbiAgICAvLyBiZSBzY2hlZHVsZWQuIFVzZSBhIGNvdW50ZXIgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wcy5cbiAgICB2YXIgbnVtYmVyT2ZSZVJlbmRlcnMgPSAwO1xuXG4gICAgZG8ge1xuICAgICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZmFsc2U7XG4gICAgICBsb2NhbElkQ291bnRlciA9IDA7XG5cbiAgICAgIGlmIChudW1iZXJPZlJlUmVuZGVycyA+PSBSRV9SRU5ERVJfTElNSVQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb28gbWFueSByZS1yZW5kZXJzLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiByZW5kZXJzIHRvIHByZXZlbnQgJyArICdhbiBpbmZpbml0ZSBsb29wLicpO1xuICAgICAgfVxuXG4gICAgICBudW1iZXJPZlJlUmVuZGVycyArPSAxO1xuXG4gICAgICB7XG4gICAgICAgIC8vIEV2ZW4gd2hlbiBob3QgcmVsb2FkaW5nLCBhbGxvdyBkZXBlbmRlbmNpZXMgdG8gc3RhYmlsaXplXG4gICAgICAgIC8vIGFmdGVyIGZpcnN0IHJlbmRlciB0byBwcmV2ZW50IGluZmluaXRlIHJlbmRlciBwaGFzZSB1cGRhdGVzLlxuICAgICAgICBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGZhbHNlO1xuICAgICAgfSAvLyBTdGFydCBvdmVyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdFxuXG5cbiAgICAgIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7XG5cbiAgICAgIHtcbiAgICAgICAgLy8gQWxzbyB2YWxpZGF0ZSBob29rIG9yZGVyIGZvciBjYXNjYWRpbmcgdXBkYXRlcy5cbiAgICAgICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTtcbiAgICAgIH1cblxuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSAgSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWIDtcbiAgICAgIGNoaWxkcmVuID0gQ29tcG9uZW50KHByb3BzLCBzZWNvbmRBcmcpO1xuICAgIH0gd2hpbGUgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyk7XG4gIH0gLy8gV2UgY2FuIGFzc3VtZSB0aGUgcHJldmlvdXMgZGlzcGF0Y2hlciBpcyBhbHdheXMgdGhpcyBvbmUsIHNpbmNlIHdlIHNldCBpdFxuICAvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZW5kZXIgcGhhc2UgYW5kIHRoZXJlJ3Mgbm8gcmUtZW50cmFuY2UuXG5cblxuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSG9va1R5cGVzID0gaG9va1R5cGVzRGV2O1xuICB9IC8vIFRoaXMgY2hlY2sgdXNlcyBjdXJyZW50SG9vayBzbyB0aGF0IGl0IHdvcmtzIHRoZSBzYW1lIGluIERFViBhbmQgcHJvZCBidW5kbGVzLlxuICAvLyBob29rVHlwZXNEZXYgY291bGQgY2F0Y2ggbW9yZSBjYXNlcyAoZS5nLiBjb250ZXh0KSBidXQgb25seSBpbiBERVYgYnVuZGxlcy5cblxuXG4gIHZhciBkaWRSZW5kZXJUb29GZXdIb29rcyA9IGN1cnJlbnRIb29rICE9PSBudWxsICYmIGN1cnJlbnRIb29rLm5leHQgIT09IG51bGw7XG4gIHJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IG51bGw7XG4gIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcblxuICB7XG4gICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBudWxsO1xuICAgIGhvb2tUeXBlc0RldiA9IG51bGw7XG4gICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTsgLy8gQ29uZmlybSB0aGF0IGEgc3RhdGljIGZsYWcgd2FzIG5vdCBhZGRlZCBvciByZW1vdmVkIHNpbmNlIHRoZSBsYXN0XG4gICAgLy8gcmVuZGVyLiBJZiB0aGlzIGZpcmVzLCBpdCBzdWdnZXN0cyB0aGF0IHdlIGluY29ycmVjdGx5IHJlc2V0IHRoZSBzdGF0aWNcbiAgICAvLyBmbGFncyBpbiBzb21lIG90aGVyIHBhcnQgb2YgdGhlIGNvZGViYXNlLiBUaGlzIGhhcyBoYXBwZW5lZCBiZWZvcmUsIGZvclxuICAgIC8vIGV4YW1wbGUsIGluIHRoZSBTdXNwZW5zZUxpc3QgaW1wbGVtZW50YXRpb24uXG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAoY3VycmVudC5mbGFncyAmIFN0YXRpY01hc2spICE9PSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBTdGF0aWNNYXNrKSAmJiAvLyBEaXNhYmxlIHRoaXMgd2FybmluZyBpbiBsZWdhY3kgbW9kZSwgYmVjYXVzZSBsZWdhY3kgU3VzcGVuc2UgaXMgd2VpcmRcbiAgICAvLyBhbmQgY3JlYXRlcyBmYWxzZSBwb3NpdGl2ZXMuIFRvIG1ha2UgdGhpcyB3b3JrIGluIGxlZ2FjeSBtb2RlLCB3ZSdkXG4gICAgLy8gbmVlZCB0byBtYXJrIGZpYmVycyB0aGF0IGNvbW1pdCBpbiBhbiBpbmNvbXBsZXRlIHN0YXRlLCBzb21laG93LiBGb3JcbiAgICAvLyBub3cgSSdsbCBkaXNhYmxlIHRoZSB3YXJuaW5nIHRoYXQgbW9zdCBvZiB0aGUgYnVncyB0aGF0IHdvdWxkIHRyaWdnZXJcbiAgICAvLyBpdCBhcmUgZWl0aGVyIGV4Y2x1c2l2ZSB0byBjb25jdXJyZW50IG1vZGUgb3IgZXhpc3QgaW4gYm90aC5cbiAgICAoY3VycmVudC5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgIGVycm9yKCdJbnRlcm5hbCBSZWFjdCBlcnJvcjogRXhwZWN0ZWQgc3RhdGljIGZsYWcgd2FzIG1pc3NpbmcuIFBsZWFzZSAnICsgJ25vdGlmeSB0aGUgUmVhY3QgdGVhbS4nKTtcbiAgICB9XG4gIH1cblxuICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7IC8vIFRoaXMgaXMgcmVzZXQgYnkgY2hlY2tEaWRSZW5kZXJJZEhvb2tcbiAgLy8gbG9jYWxJZENvdW50ZXIgPSAwO1xuXG4gIGlmIChkaWRSZW5kZXJUb29GZXdIb29rcykge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVuZGVyZWQgZmV3ZXIgaG9va3MgdGhhbiBleHBlY3RlZC4gVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IGFuIGFjY2lkZW50YWwgJyArICdlYXJseSByZXR1cm4gc3RhdGVtZW50LicpO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuZnVuY3Rpb24gY2hlY2tEaWRSZW5kZXJJZEhvb2soKSB7XG4gIC8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBldmVyeSByZW5kZXJXaXRoSG9va3MgY2FsbC5cbiAgLy8gQ29uY2VwdHVhbGx5LCBpdCdzIHBhcnQgb2YgdGhlIHJldHVybiB2YWx1ZSBvZiByZW5kZXJXaXRoSG9va3M7IGl0J3Mgb25seSBhXG4gIC8vIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGF2b2lkIHVzaW5nIGFuIGFycmF5IHR1cGxlLlxuICB2YXIgZGlkUmVuZGVySWRIb29rID0gbG9jYWxJZENvdW50ZXIgIT09IDA7XG4gIGxvY2FsSWRDb3VudGVyID0gMDtcbiAgcmV0dXJuIGRpZFJlbmRlcklkSG9vaztcbn1cbmZ1bmN0aW9uIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbGFuZXMpIHtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlOyAvLyBUT0RPOiBEb24ndCBuZWVkIHRvIHJlc2V0IHRoZSBmbGFncyBoZXJlLCBiZWNhdXNlIHRoZXkncmUgcmVzZXQgaW4gdGhlXG4gIC8vIGNvbXBsZXRlIHBoYXNlIChidWJibGVQcm9wZXJ0aWVzKS5cblxuICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+KE1vdW50UGFzc2l2ZURldiB8IE1vdW50TGF5b3V0RGV2IHwgUGFzc2l2ZSB8IFVwZGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gfihQYXNzaXZlIHwgVXBkYXRlKTtcbiAgfVxuXG4gIGN1cnJlbnQubGFuZXMgPSByZW1vdmVMYW5lcyhjdXJyZW50LmxhbmVzLCBsYW5lcyk7XG59XG5mdW5jdGlvbiByZXNldEhvb2tzQWZ0ZXJUaHJvdygpIHtcbiAgLy8gV2UgY2FuIGFzc3VtZSB0aGUgcHJldmlvdXMgZGlzcGF0Y2hlciBpcyBhbHdheXMgdGhpcyBvbmUsIHNpbmNlIHdlIHNldCBpdFxuICAvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZW5kZXIgcGhhc2UgYW5kIHRoZXJlJ3Mgbm8gcmUtZW50cmFuY2UuXG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIGlmIChkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlKSB7XG4gICAgLy8gVGhlcmUgd2VyZSByZW5kZXIgcGhhc2UgdXBkYXRlcy4gVGhlc2UgYXJlIG9ubHkgdmFsaWQgZm9yIHRoaXMgcmVuZGVyXG4gICAgLy8gcGhhc2UsIHdoaWNoIHdlIGFyZSBub3cgYWJvcnRpbmcuIFJlbW92ZSB0aGUgdXBkYXRlcyBmcm9tIHRoZSBxdWV1ZXMgc29cbiAgICAvLyB0aGV5IGRvIG5vdCBwZXJzaXN0IHRvIHRoZSBuZXh0IHJlbmRlci4gRG8gbm90IHJlbW92ZSB1cGRhdGVzIGZyb20gaG9va3NcbiAgICAvLyB0aGF0IHdlcmVuJ3QgcHJvY2Vzc2VkLlxuICAgIC8vXG4gICAgLy8gT25seSByZXNldCB0aGUgdXBkYXRlcyBmcm9tIHRoZSBxdWV1ZSBpZiBpdCBoYXMgYSBjbG9uZS4gSWYgaXQgZG9lc1xuICAgIC8vIG5vdCBoYXZlIGEgY2xvbmUsIHRoYXQgbWVhbnMgaXQgd2Fzbid0IHByb2Nlc3NlZCwgYW5kIHRoZSB1cGRhdGVzIHdlcmVcbiAgICAvLyBzY2hlZHVsZWQgYmVmb3JlIHdlIGVudGVyZWQgdGhlIHJlbmRlciBwaGFzZS5cbiAgICB2YXIgaG9vayA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZTtcblxuICAgIHdoaWxlIChob29rICE9PSBudWxsKSB7XG4gICAgICB2YXIgcXVldWUgPSBob29rLnF1ZXVlO1xuXG4gICAgICBpZiAocXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgcXVldWUucGVuZGluZyA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGhvb2sgPSBob29rLm5leHQ7XG4gICAgfVxuXG4gICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlO1xuICB9XG5cbiAgcmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcbiAgY3VycmVudEhvb2sgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuXG4gIHtcbiAgICBob29rVHlwZXNEZXYgPSBudWxsO1xuICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7XG4gICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBudWxsO1xuICAgIGlzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2UgPSBmYWxzZTtcbiAgfVxuXG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGZhbHNlO1xuICBsb2NhbElkQ291bnRlciA9IDA7XG59XG5cbmZ1bmN0aW9uIG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCkge1xuICB2YXIgaG9vayA9IHtcbiAgICBtZW1vaXplZFN0YXRlOiBudWxsLFxuICAgIGJhc2VTdGF0ZTogbnVsbCxcbiAgICBiYXNlUXVldWU6IG51bGwsXG4gICAgcXVldWU6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBob29rIGluIHRoZSBsaXN0XG4gICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlID0gd29ya0luUHJvZ3Jlc3NIb29rID0gaG9vaztcbiAgfSBlbHNlIHtcbiAgICAvLyBBcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdFxuICAgIHdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0ID0gaG9vaztcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc0hvb2s7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpIHtcbiAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJvdGggZm9yIHVwZGF0ZXMgYW5kIGZvciByZS1yZW5kZXJzIHRyaWdnZXJlZCBieSBhXG4gIC8vIHJlbmRlciBwaGFzZSB1cGRhdGUuIEl0IGFzc3VtZXMgdGhlcmUgaXMgZWl0aGVyIGEgY3VycmVudCBob29rIHdlIGNhblxuICAvLyBjbG9uZSwgb3IgYSB3b3JrLWluLXByb2dyZXNzIGhvb2sgZnJvbSBhIHByZXZpb3VzIHJlbmRlciBwYXNzIHRoYXQgd2UgY2FuXG4gIC8vIHVzZSBhcyBhIGJhc2UuIFdoZW4gd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgYmFzZSBsaXN0LCB3ZSBtdXN0IHN3aXRjaCB0b1xuICAvLyB0aGUgZGlzcGF0Y2hlciB1c2VkIGZvciBtb3VudHMuXG4gIHZhciBuZXh0Q3VycmVudEhvb2s7XG5cbiAgaWYgKGN1cnJlbnRIb29rID09PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICBuZXh0Q3VycmVudEhvb2sgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRDdXJyZW50SG9vayA9IG51bGw7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5leHRDdXJyZW50SG9vayA9IGN1cnJlbnRIb29rLm5leHQ7XG4gIH1cblxuICB2YXIgbmV4dFdvcmtJblByb2dyZXNzSG9vaztcblxuICBpZiAod29ya0luUHJvZ3Jlc3NIb29rID09PSBudWxsKSB7XG4gICAgbmV4dFdvcmtJblByb2dyZXNzSG9vayA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQ7XG4gIH1cblxuICBpZiAobmV4dFdvcmtJblByb2dyZXNzSG9vayAhPT0gbnVsbCkge1xuICAgIC8vIFRoZXJlJ3MgYWxyZWFkeSBhIHdvcmstaW4tcHJvZ3Jlc3MuIFJldXNlIGl0LlxuICAgIHdvcmtJblByb2dyZXNzSG9vayA9IG5leHRXb3JrSW5Qcm9ncmVzc0hvb2s7XG4gICAgbmV4dFdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0O1xuICAgIGN1cnJlbnRIb29rID0gbmV4dEN1cnJlbnRIb29rO1xuICB9IGVsc2Uge1xuICAgIC8vIENsb25lIGZyb20gdGhlIGN1cnJlbnQgaG9vay5cbiAgICBpZiAobmV4dEN1cnJlbnRIb29rID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbmRlcmVkIG1vcmUgaG9va3MgdGhhbiBkdXJpbmcgdGhlIHByZXZpb3VzIHJlbmRlci4nKTtcbiAgICB9XG5cbiAgICBjdXJyZW50SG9vayA9IG5leHRDdXJyZW50SG9vaztcbiAgICB2YXIgbmV3SG9vayA9IHtcbiAgICAgIG1lbW9pemVkU3RhdGU6IGN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGUsXG4gICAgICBiYXNlU3RhdGU6IGN1cnJlbnRIb29rLmJhc2VTdGF0ZSxcbiAgICAgIGJhc2VRdWV1ZTogY3VycmVudEhvb2suYmFzZVF1ZXVlLFxuICAgICAgcXVldWU6IGN1cnJlbnRIb29rLnF1ZXVlLFxuICAgICAgbmV4dDogbnVsbFxuICAgIH07XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3NIb29rID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBob29rIGluIHRoZSBsaXN0LlxuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlID0gd29ya0luUHJvZ3Jlc3NIb29rID0gbmV3SG9vaztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuXG4gICAgICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dCA9IG5ld0hvb2s7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzSG9vaztcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpIHtcbiAgcmV0dXJuIHtcbiAgICBsYXN0RWZmZWN0OiBudWxsLFxuICAgIHN0b3JlczogbnVsbFxuICB9O1xufVxuXG5mdW5jdGlvbiBiYXNpY1N0YXRlUmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gIC8vICRGbG93Rml4TWU6IEZsb3cgZG9lc24ndCBsaWtlIG1peGVkIHR5cGVzXG4gIHJldHVybiB0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nID8gYWN0aW9uKHN0YXRlKSA6IGFjdGlvbjtcbn1cblxuZnVuY3Rpb24gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgaW5pdGlhbFN0YXRlO1xuXG4gIGlmIChpbml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpbml0aWFsU3RhdGUgPSBpbml0KGluaXRpYWxBcmcpO1xuICB9IGVsc2Uge1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxBcmc7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBob29rLmJhc2VTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgdmFyIHF1ZXVlID0ge1xuICAgIHBlbmRpbmc6IG51bGwsXG4gICAgaW50ZXJsZWF2ZWQ6IG51bGwsXG4gICAgbGFuZXM6IE5vTGFuZXMsXG4gICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogcmVkdWNlcixcbiAgICBsYXN0UmVuZGVyZWRTdGF0ZTogaW5pdGlhbFN0YXRlXG4gIH07XG4gIGhvb2sucXVldWUgPSBxdWV1ZTtcbiAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2ggPSBkaXNwYXRjaFJlZHVjZXJBY3Rpb24uYmluZChudWxsLCBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBxdWV1ZSk7XG4gIHJldHVybiBbaG9vay5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcXVldWUgPSBob29rLnF1ZXVlO1xuXG4gIGlmIChxdWV1ZSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIGhhdmUgYSBxdWV1ZS4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlciA9IHJlZHVjZXI7XG4gIHZhciBjdXJyZW50ID0gY3VycmVudEhvb2s7IC8vIFRoZSBsYXN0IHJlYmFzZSB1cGRhdGUgdGhhdCBpcyBOT1QgcGFydCBvZiB0aGUgYmFzZSBzdGF0ZS5cblxuICB2YXIgYmFzZVF1ZXVlID0gY3VycmVudC5iYXNlUXVldWU7IC8vIFRoZSBsYXN0IHBlbmRpbmcgdXBkYXRlIHRoYXQgaGFzbid0IGJlZW4gcHJvY2Vzc2VkIHlldC5cblxuICB2YXIgcGVuZGluZ1F1ZXVlID0gcXVldWUucGVuZGluZztcblxuICBpZiAocGVuZGluZ1F1ZXVlICE9PSBudWxsKSB7XG4gICAgLy8gV2UgaGF2ZSBuZXcgdXBkYXRlcyB0aGF0IGhhdmVuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LlxuICAgIC8vIFdlJ2xsIGFkZCB0aGVtIHRvIHRoZSBiYXNlIHF1ZXVlLlxuICAgIGlmIChiYXNlUXVldWUgIT09IG51bGwpIHtcbiAgICAgIC8vIE1lcmdlIHRoZSBwZW5kaW5nIHF1ZXVlIGFuZCB0aGUgYmFzZSBxdWV1ZS5cbiAgICAgIHZhciBiYXNlRmlyc3QgPSBiYXNlUXVldWUubmV4dDtcbiAgICAgIHZhciBwZW5kaW5nRmlyc3QgPSBwZW5kaW5nUXVldWUubmV4dDtcbiAgICAgIGJhc2VRdWV1ZS5uZXh0ID0gcGVuZGluZ0ZpcnN0O1xuICAgICAgcGVuZGluZ1F1ZXVlLm5leHQgPSBiYXNlRmlyc3Q7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGN1cnJlbnQuYmFzZVF1ZXVlICE9PSBiYXNlUXVldWUpIHtcbiAgICAgICAgLy8gSW50ZXJuYWwgaW52YXJpYW50IHRoYXQgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IGZlYXNpYmx5IGNvdWxkIGluXG4gICAgICAgIC8vIHRoZSBmdXR1cmUgaWYgd2UgaW1wbGVtZW50IHJlc3VtaW5nLCBvciBzb21lIGZvcm0gb2YgdGhhdC5cbiAgICAgICAgZXJyb3IoJ0ludGVybmFsIGVycm9yOiBFeHBlY3RlZCB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIHRvIGJlIGEgY2xvbmUuICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjdXJyZW50LmJhc2VRdWV1ZSA9IGJhc2VRdWV1ZSA9IHBlbmRpbmdRdWV1ZTtcbiAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChiYXNlUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBXZSBoYXZlIGEgcXVldWUgdG8gcHJvY2Vzcy5cbiAgICB2YXIgZmlyc3QgPSBiYXNlUXVldWUubmV4dDtcbiAgICB2YXIgbmV3U3RhdGUgPSBjdXJyZW50LmJhc2VTdGF0ZTtcbiAgICB2YXIgbmV3QmFzZVN0YXRlID0gbnVsbDtcbiAgICB2YXIgbmV3QmFzZVF1ZXVlRmlyc3QgPSBudWxsO1xuICAgIHZhciBuZXdCYXNlUXVldWVMYXN0ID0gbnVsbDtcbiAgICB2YXIgdXBkYXRlID0gZmlyc3Q7XG5cbiAgICBkbyB7XG4gICAgICB2YXIgdXBkYXRlTGFuZSA9IHVwZGF0ZS5sYW5lO1xuXG4gICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhyZW5kZXJMYW5lcywgdXBkYXRlTGFuZSkpIHtcbiAgICAgICAgLy8gUHJpb3JpdHkgaXMgaW5zdWZmaWNpZW50LiBTa2lwIHRoaXMgdXBkYXRlLiBJZiB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAvLyBza2lwcGVkIHVwZGF0ZSwgdGhlIHByZXZpb3VzIHVwZGF0ZS9zdGF0ZSBpcyB0aGUgbmV3IGJhc2VcbiAgICAgICAgLy8gdXBkYXRlL3N0YXRlLlxuICAgICAgICB2YXIgY2xvbmUgPSB7XG4gICAgICAgICAgbGFuZTogdXBkYXRlTGFuZSxcbiAgICAgICAgICBhY3Rpb246IHVwZGF0ZS5hY3Rpb24sXG4gICAgICAgICAgaGFzRWFnZXJTdGF0ZTogdXBkYXRlLmhhc0VhZ2VyU3RhdGUsXG4gICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsXG4gICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlRmlyc3QgPSBuZXdCYXNlUXVldWVMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlTGFzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IGNsb25lO1xuICAgICAgICB9IC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIHByaW9yaXR5IGluIHRoZSBxdWV1ZS5cbiAgICAgICAgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byBhY2N1bXVsYXRlIHRoaXMuIEluc3RlYWQsIHdlIGNhbiByZW1vdmVcbiAgICAgICAgLy8gcmVuZGVyTGFuZXMgZnJvbSB0aGUgb3JpZ2luYWwgbGFuZXMuXG5cblxuICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCB1cGRhdGVMYW5lKTtcbiAgICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyh1cGRhdGVMYW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgdXBkYXRlIGRvZXMgaGF2ZSBzdWZmaWNpZW50IHByaW9yaXR5LlxuICAgICAgICBpZiAobmV3QmFzZVF1ZXVlTGFzdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfY2xvbmUgPSB7XG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZSBpcyBnb2luZyB0byBiZSBjb21taXR0ZWQgc28gd2UgbmV2ZXIgd2FudCB1bmNvbW1pdFxuICAgICAgICAgICAgLy8gaXQuIFVzaW5nIE5vTGFuZSB3b3JrcyBiZWNhdXNlIDAgaXMgYSBzdWJzZXQgb2YgYWxsIGJpdG1hc2tzLCBzb1xuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5ldmVyIGJlIHNraXBwZWQgYnkgdGhlIGNoZWNrIGFib3ZlLlxuICAgICAgICAgICAgbGFuZTogTm9MYW5lLFxuICAgICAgICAgICAgYWN0aW9uOiB1cGRhdGUuYWN0aW9uLFxuICAgICAgICAgICAgaGFzRWFnZXJTdGF0ZTogdXBkYXRlLmhhc0VhZ2VyU3RhdGUsXG4gICAgICAgICAgICBlYWdlclN0YXRlOiB1cGRhdGUuZWFnZXJTdGF0ZSxcbiAgICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgICB9O1xuICAgICAgICAgIG5ld0Jhc2VRdWV1ZUxhc3QgPSBuZXdCYXNlUXVldWVMYXN0Lm5leHQgPSBfY2xvbmU7XG4gICAgICAgIH0gLy8gUHJvY2VzcyB0aGlzIHVwZGF0ZS5cblxuXG4gICAgICAgIGlmICh1cGRhdGUuaGFzRWFnZXJTdGF0ZSkge1xuICAgICAgICAgIC8vIElmIHRoaXMgdXBkYXRlIGlzIGEgc3RhdGUgdXBkYXRlIChub3QgYSByZWR1Y2VyKSBhbmQgd2FzIHByb2Nlc3NlZCBlYWdlcmx5LFxuICAgICAgICAgIC8vIHdlIGNhbiB1c2UgdGhlIGVhZ2VybHkgY29tcHV0ZWQgc3RhdGVcbiAgICAgICAgICBuZXdTdGF0ZSA9IHVwZGF0ZS5lYWdlclN0YXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBhY3Rpb24gPSB1cGRhdGUuYWN0aW9uO1xuICAgICAgICAgIG5ld1N0YXRlID0gcmVkdWNlcihuZXdTdGF0ZSwgYWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcbiAgICB9IHdoaWxlICh1cGRhdGUgIT09IG51bGwgJiYgdXBkYXRlICE9PSBmaXJzdCk7XG5cbiAgICBpZiAobmV3QmFzZVF1ZXVlTGFzdCA9PT0gbnVsbCkge1xuICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IG5ld0Jhc2VRdWV1ZUZpcnN0O1xuICAgIH0gLy8gTWFyayB0aGF0IHRoZSBmaWJlciBwZXJmb3JtZWQgd29yaywgYnV0IG9ubHkgaWYgdGhlIG5ldyBzdGF0ZSBpc1xuICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHN0YXRlLlxuXG5cbiAgICBpZiAoIW9iamVjdElzKG5ld1N0YXRlLCBob29rLm1lbW9pemVkU3RhdGUpKSB7XG4gICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIGhvb2suYmFzZVN0YXRlID0gbmV3QmFzZVN0YXRlO1xuICAgIGhvb2suYmFzZVF1ZXVlID0gbmV3QmFzZVF1ZXVlTGFzdDtcbiAgICBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIEludGVybGVhdmVkIHVwZGF0ZXMgYXJlIHN0b3JlZCBvbiBhIHNlcGFyYXRlIHF1ZXVlLiBXZSBhcmVuJ3QgZ29pbmcgdG9cbiAgLy8gcHJvY2VzcyB0aGVtIGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IHdlIGRvIG5lZWQgdG8gdHJhY2sgd2hpY2ggbGFuZXNcbiAgLy8gYXJlIHJlbWFpbmluZy5cblxuXG4gIHZhciBsYXN0SW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICBpZiAobGFzdEludGVybGVhdmVkICE9PSBudWxsKSB7XG4gICAgdmFyIGludGVybGVhdmVkID0gbGFzdEludGVybGVhdmVkO1xuXG4gICAgZG8ge1xuICAgICAgdmFyIGludGVybGVhdmVkTGFuZSA9IGludGVybGVhdmVkLmxhbmU7XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCBpbnRlcmxlYXZlZExhbmUpO1xuICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyhpbnRlcmxlYXZlZExhbmUpO1xuICAgICAgaW50ZXJsZWF2ZWQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgIH0gd2hpbGUgKGludGVybGVhdmVkICE9PSBsYXN0SW50ZXJsZWF2ZWQpO1xuICB9IGVsc2UgaWYgKGJhc2VRdWV1ZSA9PT0gbnVsbCkge1xuICAgIC8vIGBxdWV1ZS5sYW5lc2AgaXMgdXNlZCBmb3IgZW50YW5nbGluZyB0cmFuc2l0aW9ucy4gV2UgY2FuIHNldCBpdCBiYWNrIHRvXG4gICAgLy8gemVybyBvbmNlIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICBxdWV1ZS5sYW5lcyA9IE5vTGFuZXM7XG4gIH1cblxuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaDtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICBpZiAocXVldWUgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBoYXZlIGEgcXVldWUuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHF1ZXVlLmxhc3RSZW5kZXJlZFJlZHVjZXIgPSByZWR1Y2VyOyAvLyBUaGlzIGlzIGEgcmUtcmVuZGVyLiBBcHBseSB0aGUgbmV3IHJlbmRlciBwaGFzZSB1cGRhdGVzIHRvIHRoZSBwcmV2aW91c1xuICAvLyB3b3JrLWluLXByb2dyZXNzIGhvb2suXG5cbiAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2g7XG4gIHZhciBsYXN0UmVuZGVyUGhhc2VVcGRhdGUgPSBxdWV1ZS5wZW5kaW5nO1xuICB2YXIgbmV3U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKGxhc3RSZW5kZXJQaGFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgIC8vIFRoZSBxdWV1ZSBkb2Vzbid0IHBlcnNpc3QgcGFzdCB0aGlzIHJlbmRlciBwYXNzLlxuICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICAgIHZhciBmaXJzdFJlbmRlclBoYXNlVXBkYXRlID0gbGFzdFJlbmRlclBoYXNlVXBkYXRlLm5leHQ7XG4gICAgdmFyIHVwZGF0ZSA9IGZpcnN0UmVuZGVyUGhhc2VVcGRhdGU7XG5cbiAgICBkbyB7XG4gICAgICAvLyBQcm9jZXNzIHRoaXMgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gV2UgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGVcbiAgICAgIC8vIHByaW9yaXR5IGJlY2F1c2UgaXQgd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnRcbiAgICAgIC8vIHJlbmRlcidzLlxuICAgICAgdmFyIGFjdGlvbiA9IHVwZGF0ZS5hY3Rpb247XG4gICAgICBuZXdTdGF0ZSA9IHJlZHVjZXIobmV3U3RhdGUsIGFjdGlvbik7XG4gICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcbiAgICB9IHdoaWxlICh1cGRhdGUgIT09IGZpcnN0UmVuZGVyUGhhc2VVcGRhdGUpOyAvLyBNYXJrIHRoYXQgdGhlIGZpYmVyIHBlcmZvcm1lZCB3b3JrLCBidXQgb25seSBpZiB0aGUgbmV3IHN0YXRlIGlzXG4gICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgc3RhdGUuXG5cblxuICAgIGlmICghb2JqZWN0SXMobmV3U3RhdGUsIGhvb2subWVtb2l6ZWRTdGF0ZSkpIHtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7IC8vIERvbid0IHBlcnNpc3QgdGhlIHN0YXRlIGFjY3VtdWxhdGVkIGZyb20gdGhlIHJlbmRlciBwaGFzZSB1cGRhdGVzIHRvXG4gICAgLy8gdGhlIGJhc2Ugc3RhdGUgdW5sZXNzIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICAvLyBUT0RPOiBOb3Qgc3VyZSBpZiB0aGlzIGlzIHRoZSBkZXNpcmVkIHNlbWFudGljcywgYnV0IGl0J3Mgd2hhdCB3ZVxuICAgIC8vIGRvIGZvciBnRFNGUC4gSSBjYW4ndCByZW1lbWJlciB3aHkuXG5cbiAgICBpZiAoaG9vay5iYXNlUXVldWUgPT09IG51bGwpIHtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgfVxuXG4gICAgcXVldWUubGFzdFJlbmRlcmVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfVxuXG4gIHJldHVybiBbbmV3U3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gbW91bnRNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gIHZhciBmaWJlciA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDE7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHRTbmFwc2hvdDtcbiAgdmFyIGlzSHlkcmF0aW5nID0gZ2V0SXNIeWRyYXRpbmcoKTtcblxuICBpZiAoaXNIeWRyYXRpbmcpIHtcbiAgICBpZiAoZ2V0U2VydmVyU25hcHNob3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGdldFNlcnZlclNuYXBzaG90LCB3aGljaCBpcyByZXF1aXJlZCBmb3IgJyArICdzZXJ2ZXItcmVuZGVyZWQgY29udGVudC4gV2lsbCByZXZlcnQgdG8gY2xpZW50IHJlbmRlcmluZy4nKTtcbiAgICB9XG5cbiAgICBuZXh0U25hcHNob3QgPSBnZXRTZXJ2ZXJTbmFwc2hvdCgpO1xuXG4gICAge1xuICAgICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgICBpZiAobmV4dFNuYXBzaG90ICE9PSBnZXRTZXJ2ZXJTbmFwc2hvdCgpKSB7XG4gICAgICAgICAgZXJyb3IoJ1RoZSByZXN1bHQgb2YgZ2V0U2VydmVyU25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wJyk7XG5cbiAgICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV4dFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICAgIHtcbiAgICAgIGlmICghZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QpIHtcbiAgICAgICAgdmFyIGNhY2hlZFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICAgICAgICBpZiAoIW9iamVjdElzKG5leHRTbmFwc2hvdCwgY2FjaGVkU25hcHNob3QpKSB7XG4gICAgICAgICAgZXJyb3IoJ1RoZSByZXN1bHQgb2YgZ2V0U25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wJyk7XG5cbiAgICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIFVubGVzcyB3ZSdyZSByZW5kZXJpbmcgYSBibG9ja2luZyBsYW5lLCBzY2hlZHVsZSBhIGNvbnNpc3RlbmN5IGNoZWNrLlxuICAgIC8vIFJpZ2h0IGJlZm9yZSBjb21taXR0aW5nLCB3ZSB3aWxsIHdhbGsgdGhlIHRyZWUgYW5kIGNoZWNrIGlmIGFueSBvZiB0aGVcbiAgICAvLyBzdG9yZXMgd2VyZSBtdXRhdGVkLlxuICAgIC8vXG4gICAgLy8gV2Ugd29uJ3QgZG8gdGhpcyBpZiB3ZSdyZSBoeWRyYXRpbmcgc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQsIGJlY2F1c2UgaWZcbiAgICAvLyB0aGUgY29udGVudCBpcyBzdGFsZSwgaXQncyBhbHJlYWR5IHZpc2libGUgYW55d2F5LiBJbnN0ZWFkIHdlJ2xsIHBhdGNoXG4gICAgLy8gaXQgdXAgaW4gYSBwYXNzaXZlIGVmZmVjdC5cblxuXG4gICAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTtcblxuICAgIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIHJlbmRlckxhbmVzKSkge1xuICAgICAgcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIG5leHRTbmFwc2hvdCk7XG4gICAgfVxuICB9IC8vIFJlYWQgdGhlIGN1cnJlbnQgc25hcHNob3QgZnJvbSB0aGUgc3RvcmUgb24gZXZlcnkgcmVuZGVyLiBUaGlzIGJyZWFrcyB0aGVcbiAgLy8gbm9ybWFsIHJ1bGVzIG9mIFJlYWN0LCBhbmQgb25seSB3b3JrcyBiZWNhdXNlIHN0b3JlIHVwZGF0ZXMgYXJlXG4gIC8vIGFsd2F5cyBzeW5jaHJvbm91cy5cblxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5leHRTbmFwc2hvdDtcbiAgdmFyIGluc3QgPSB7XG4gICAgdmFsdWU6IG5leHRTbmFwc2hvdCxcbiAgICBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3RcbiAgfTtcbiAgaG9vay5xdWV1ZSA9IGluc3Q7IC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlLlxuXG4gIG1vdW50RWZmZWN0KHN1YnNjcmliZVRvU3RvcmUuYmluZChudWxsLCBmaWJlciwgaW5zdCwgc3Vic2NyaWJlKSwgW3N1YnNjcmliZV0pOyAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gdXBkYXRlIHRoZSBtdXRhYmxlIGluc3RhbmNlIGZpZWxkcy4gV2Ugd2lsbCB1cGRhdGVcbiAgLy8gdGhpcyB3aGVuZXZlciBzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBvciB2YWx1ZSBjaGFuZ2VzLiBCZWNhdXNlIHRoZXJlJ3Mgbm9cbiAgLy8gY2xlYW4tdXAgZnVuY3Rpb24sIGFuZCB3ZSB0cmFjayB0aGUgZGVwcyBjb3JyZWN0bHksIHdlIGNhbiBjYWxsIHB1c2hFZmZlY3RcbiAgLy8gZGlyZWN0bHksIHdpdGhvdXQgc3RvcmluZyBhbnkgYWRkaXRpb25hbCBzdGF0ZS4gRm9yIHRoZSBzYW1lIHJlYXNvbiwgd2VcbiAgLy8gZG9uJ3QgbmVlZCB0byBzZXQgYSBzdGF0aWMgZmxhZywgZWl0aGVyLlxuICAvLyBUT0RPOiBXZSBjYW4gbW92ZSB0aGlzIHRvIHRoZSBwYXNzaXZlIHBoYXNlIG9uY2Ugd2UgYWRkIGEgcHJlLWNvbW1pdFxuICAvLyBjb25zaXN0ZW5jeSBjaGVjay4gU2VlIHRoZSBuZXh0IGNvbW1lbnQuXG5cbiAgZmliZXIuZmxhZ3MgfD0gUGFzc2l2ZTtcbiAgcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBQYXNzaXZlJDEsIHVwZGF0ZVN0b3JlSW5zdGFuY2UuYmluZChudWxsLCBmaWJlciwgaW5zdCwgbmV4dFNuYXBzaG90LCBnZXRTbmFwc2hvdCksIHVuZGVmaW5lZCwgbnVsbCk7XG4gIHJldHVybiBuZXh0U25hcHNob3Q7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gIHZhciBmaWJlciA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDE7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7IC8vIFJlYWQgdGhlIGN1cnJlbnQgc25hcHNob3QgZnJvbSB0aGUgc3RvcmUgb24gZXZlcnkgcmVuZGVyLiBUaGlzIGJyZWFrcyB0aGVcbiAgLy8gbm9ybWFsIHJ1bGVzIG9mIFJlYWN0LCBhbmQgb25seSB3b3JrcyBiZWNhdXNlIHN0b3JlIHVwZGF0ZXMgYXJlXG4gIC8vIGFsd2F5cyBzeW5jaHJvbm91cy5cblxuICB2YXIgbmV4dFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICB7XG4gICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgdmFyIGNhY2hlZFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcblxuICAgICAgaWYgKCFvYmplY3RJcyhuZXh0U25hcHNob3QsIGNhY2hlZFNuYXBzaG90KSkge1xuICAgICAgICBlcnJvcignVGhlIHJlc3VsdCBvZiBnZXRTbmFwc2hvdCBzaG91bGQgYmUgY2FjaGVkIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AnKTtcblxuICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHByZXZTbmFwc2hvdCA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHNuYXBzaG90Q2hhbmdlZCA9ICFvYmplY3RJcyhwcmV2U25hcHNob3QsIG5leHRTbmFwc2hvdCk7XG5cbiAgaWYgKHNuYXBzaG90Q2hhbmdlZCkge1xuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5leHRTbmFwc2hvdDtcbiAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICB9XG5cbiAgdmFyIGluc3QgPSBob29rLnF1ZXVlO1xuICB1cGRhdGVFZmZlY3Qoc3Vic2NyaWJlVG9TdG9yZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBzdWJzY3JpYmUpLCBbc3Vic2NyaWJlXSk7IC8vIFdoZW5ldmVyIGdldFNuYXBzaG90IG9yIHN1YnNjcmliZSBjaGFuZ2VzLCB3ZSBuZWVkIHRvIGNoZWNrIGluIHRoZVxuICAvLyBjb21taXQgcGhhc2UgaWYgdGhlcmUgd2FzIGFuIGludGVybGVhdmVkIG11dGF0aW9uLiBJbiBjb25jdXJyZW50IG1vZGVcbiAgLy8gdGhpcyBjYW4gaGFwcGVuIGFsbCB0aGUgdGltZSwgYnV0IGV2ZW4gaW4gc3luY2hyb25vdXMgbW9kZSwgYW4gZWFybGllclxuICAvLyBlZmZlY3QgbWF5IGhhdmUgbXV0YXRlZCB0aGUgc3RvcmUuXG5cbiAgaWYgKGluc3QuZ2V0U25hcHNob3QgIT09IGdldFNuYXBzaG90IHx8IHNuYXBzaG90Q2hhbmdlZCB8fCAvLyBDaGVjayBpZiB0aGUgc3VzYmNyaWJlIGZ1bmN0aW9uIGNoYW5nZWQuIFdlIGNhbiBzYXZlIHNvbWUgbWVtb3J5IGJ5XG4gIC8vIGNoZWNraW5nIHdoZXRoZXIgd2Ugc2NoZWR1bGVkIGEgc3Vic2NyaXB0aW9uIGVmZmVjdCBhYm92ZS5cbiAgd29ya0luUHJvZ3Jlc3NIb29rICE9PSBudWxsICYmIHdvcmtJblByb2dyZXNzSG9vay5tZW1vaXplZFN0YXRlLnRhZyAmIEhhc0VmZmVjdCkge1xuICAgIGZpYmVyLmZsYWdzIHw9IFBhc3NpdmU7XG4gICAgcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBQYXNzaXZlJDEsIHVwZGF0ZVN0b3JlSW5zdGFuY2UuYmluZChudWxsLCBmaWJlciwgaW5zdCwgbmV4dFNuYXBzaG90LCBnZXRTbmFwc2hvdCksIHVuZGVmaW5lZCwgbnVsbCk7IC8vIFVubGVzcyB3ZSdyZSByZW5kZXJpbmcgYSBibG9ja2luZyBsYW5lLCBzY2hlZHVsZSBhIGNvbnNpc3RlbmN5IGNoZWNrLlxuICAgIC8vIFJpZ2h0IGJlZm9yZSBjb21taXR0aW5nLCB3ZSB3aWxsIHdhbGsgdGhlIHRyZWUgYW5kIGNoZWNrIGlmIGFueSBvZiB0aGVcbiAgICAvLyBzdG9yZXMgd2VyZSBtdXRhdGVkLlxuXG4gICAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTtcblxuICAgIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIHJlbmRlckxhbmVzKSkge1xuICAgICAgcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIG5leHRTbmFwc2hvdCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5leHRTbmFwc2hvdDtcbn1cblxuZnVuY3Rpb24gcHVzaFN0b3JlQ29uc2lzdGVuY3lDaGVjayhmaWJlciwgZ2V0U25hcHNob3QsIHJlbmRlcmVkU25hcHNob3QpIHtcbiAgZmliZXIuZmxhZ3MgfD0gU3RvcmVDb25zaXN0ZW5jeTtcbiAgdmFyIGNoZWNrID0ge1xuICAgIGdldFNuYXBzaG90OiBnZXRTbmFwc2hvdCxcbiAgICB2YWx1ZTogcmVuZGVyZWRTbmFwc2hvdFxuICB9O1xuICB2YXIgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmIChjb21wb25lbnRVcGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpO1xuICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWUgPSBjb21wb25lbnRVcGRhdGVRdWV1ZTtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5zdG9yZXMgPSBbY2hlY2tdO1xuICB9IGVsc2Uge1xuICAgIHZhciBzdG9yZXMgPSBjb21wb25lbnRVcGRhdGVRdWV1ZS5zdG9yZXM7XG5cbiAgICBpZiAoc3RvcmVzID09PSBudWxsKSB7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5zdG9yZXMgPSBbY2hlY2tdO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG9yZXMucHVzaChjaGVjayk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN0b3JlSW5zdGFuY2UoZmliZXIsIGluc3QsIG5leHRTbmFwc2hvdCwgZ2V0U25hcHNob3QpIHtcbiAgLy8gVGhlc2UgYXJlIHVwZGF0ZWQgaW4gdGhlIHBhc3NpdmUgcGhhc2VcbiAgaW5zdC52YWx1ZSA9IG5leHRTbmFwc2hvdDtcbiAgaW5zdC5nZXRTbmFwc2hvdCA9IGdldFNuYXBzaG90OyAvLyBTb21ldGhpbmcgbWF5IGhhdmUgYmVlbiBtdXRhdGVkIGluIGJldHdlZW4gcmVuZGVyIGFuZCBjb21taXQuIFRoaXMgY291bGRcbiAgLy8gaGF2ZSBiZWVuIGluIGFuIGV2ZW50IHRoYXQgZmlyZWQgYmVmb3JlIHRoZSBwYXNzaXZlIGVmZmVjdHMsIG9yIGl0IGNvdWxkXG4gIC8vIGhhdmUgYmVlbiBpbiBhIGxheW91dCBlZmZlY3QuIEluIHRoYXQgY2FzZSwgd2Ugd291bGQgaGF2ZSB1c2VkIHRoZSBvbGRcbiAgLy8gc25hcHNobyBhbmQgZ2V0U25hcHNob3QgdmFsdWVzIHRvIGJhaWwgb3V0LiBXZSBuZWVkIHRvIGNoZWNrIG9uZSBtb3JlIHRpbWUuXG5cbiAgaWYgKGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkpIHtcbiAgICAvLyBGb3JjZSBhIHJlLXJlbmRlci5cbiAgICBmb3JjZVN0b3JlUmVyZW5kZXIoZmliZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN1YnNjcmliZVRvU3RvcmUoZmliZXIsIGluc3QsIHN1YnNjcmliZSkge1xuICB2YXIgaGFuZGxlU3RvcmVDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gVGhlIHN0b3JlIGNoYW5nZWQuIENoZWNrIGlmIHRoZSBzbmFwc2hvdCBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2VcbiAgICAvLyByZWFkIGZyb20gdGhlIHN0b3JlLlxuICAgIGlmIChjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpKSB7XG4gICAgICAvLyBGb3JjZSBhIHJlLXJlbmRlci5cbiAgICAgIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcik7XG4gICAgfVxuICB9OyAvLyBTdWJzY3JpYmUgdG8gdGhlIHN0b3JlIGFuZCByZXR1cm4gYSBjbGVhbi11cCBmdW5jdGlvbi5cblxuXG4gIHJldHVybiBzdWJzY3JpYmUoaGFuZGxlU3RvcmVDaGFuZ2UpO1xufVxuXG5mdW5jdGlvbiBjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpIHtcbiAgdmFyIGxhdGVzdEdldFNuYXBzaG90ID0gaW5zdC5nZXRTbmFwc2hvdDtcbiAgdmFyIHByZXZWYWx1ZSA9IGluc3QudmFsdWU7XG5cbiAgdHJ5IHtcbiAgICB2YXIgbmV4dFZhbHVlID0gbGF0ZXN0R2V0U25hcHNob3QoKTtcbiAgICByZXR1cm4gIW9iamVjdElzKHByZXZWYWx1ZSwgbmV4dFZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JjZVN0b3JlUmVyZW5kZXIoZmliZXIpIHtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG5cbiAgaWYgKHR5cGVvZiBpbml0aWFsU3RhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyAkRmxvd0ZpeE1lOiBGbG93IGRvZXNuJ3QgbGlrZSBtaXhlZCB0eXBlc1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxTdGF0ZSgpO1xuICB9XG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gaG9vay5iYXNlU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gIHZhciBxdWV1ZSA9IHtcbiAgICBwZW5kaW5nOiBudWxsLFxuICAgIGludGVybGVhdmVkOiBudWxsLFxuICAgIGxhbmVzOiBOb0xhbmVzLFxuICAgIGRpc3BhdGNoOiBudWxsLFxuICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IGJhc2ljU3RhdGVSZWR1Y2VyLFxuICAgIGxhc3RSZW5kZXJlZFN0YXRlOiBpbml0aWFsU3RhdGVcbiAgfTtcbiAgaG9vay5xdWV1ZSA9IHF1ZXVlO1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoU2V0U3RhdGUuYmluZChudWxsLCBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBxdWV1ZSk7XG4gIHJldHVybiBbaG9vay5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICByZXR1cm4gdXBkYXRlUmVkdWNlcihiYXNpY1N0YXRlUmVkdWNlcik7XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHJldHVybiByZXJlbmRlclJlZHVjZXIoYmFzaWNTdGF0ZVJlZHVjZXIpO1xufVxuXG5mdW5jdGlvbiBwdXNoRWZmZWN0KHRhZywgY3JlYXRlLCBkZXN0cm95LCBkZXBzKSB7XG4gIHZhciBlZmZlY3QgPSB7XG4gICAgdGFnOiB0YWcsXG4gICAgY3JlYXRlOiBjcmVhdGUsXG4gICAgZGVzdHJveTogZGVzdHJveSxcbiAgICBkZXBzOiBkZXBzLFxuICAgIC8vIENpcmN1bGFyXG4gICAgbmV4dDogbnVsbFxuICB9O1xuICB2YXIgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmIChjb21wb25lbnRVcGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpO1xuICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWUgPSBjb21wb25lbnRVcGRhdGVRdWV1ZTtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0Lm5leHQgPSBlZmZlY3Q7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxhc3RFZmZlY3QgPSBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0O1xuXG4gICAgaWYgKGxhc3RFZmZlY3QgPT09IG51bGwpIHtcbiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgPSBlZmZlY3QubmV4dCA9IGVmZmVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgICAgbGFzdEVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICAgICAgZWZmZWN0Lm5leHQgPSBmaXJzdEVmZmVjdDtcbiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgPSBlZmZlY3Q7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVmZmVjdDtcbn1cblxuZnVuY3Rpb24gbW91bnRSZWYoaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcblxuICB7XG4gICAgdmFyIF9yZWYyID0ge1xuICAgICAgY3VycmVudDogaW5pdGlhbFZhbHVlXG4gICAgfTtcbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSBfcmVmMjtcbiAgICByZXR1cm4gX3JlZjI7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlUmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICByZXR1cm4gaG9vay5tZW1vaXplZFN0YXRlO1xufVxuXG5mdW5jdGlvbiBtb3VudEVmZmVjdEltcGwoZmliZXJGbGFncywgaG9va0ZsYWdzLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5mbGFncyB8PSBmaWJlckZsYWdzO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IGhvb2tGbGFncywgY3JlYXRlLCB1bmRlZmluZWQsIG5leHREZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRWZmZWN0SW1wbChmaWJlckZsYWdzLCBob29rRmxhZ3MsIGNyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIGRlc3Ryb3kgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKGN1cnJlbnRIb29rICE9PSBudWxsKSB7XG4gICAgdmFyIHByZXZFZmZlY3QgPSBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlO1xuICAgIGRlc3Ryb3kgPSBwcmV2RWZmZWN0LmRlc3Ryb3k7XG5cbiAgICBpZiAobmV4dERlcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2RGVwcyA9IHByZXZFZmZlY3QuZGVwcztcblxuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHB1c2hFZmZlY3QoaG9va0ZsYWdzLCBjcmVhdGUsIGRlc3Ryb3ksIG5leHREZXBzKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBob29rRmxhZ3MsIGNyZWF0ZSwgZGVzdHJveSwgbmV4dERlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgaWYgKCAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKE1vdW50UGFzc2l2ZURldiB8IFBhc3NpdmUgfCBQYXNzaXZlU3RhdGljLCBQYXNzaXZlJDEsIGNyZWF0ZSwgZGVwcyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChQYXNzaXZlIHwgUGFzc2l2ZVN0YXRpYywgUGFzc2l2ZSQxLCBjcmVhdGUsIGRlcHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoUGFzc2l2ZSwgUGFzc2l2ZSQxLCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChVcGRhdGUsIEluc2VydGlvbiwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChVcGRhdGUsIEluc2VydGlvbiwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBmaWJlckZsYWdzID0gVXBkYXRlO1xuXG4gIHtcbiAgICBmaWJlckZsYWdzIHw9IExheW91dFN0YXRpYztcbiAgfVxuXG4gIGlmICggKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgfVxuXG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoZmliZXJGbGFncywgTGF5b3V0LCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSwgTGF5b3V0LCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0KGNyZWF0ZSwgcmVmKSB7XG4gIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIHJlZkNhbGxiYWNrID0gcmVmO1xuXG4gICAgdmFyIF9pbnN0ID0gY3JlYXRlKCk7XG5cbiAgICByZWZDYWxsYmFjayhfaW5zdCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlZkNhbGxiYWNrKG51bGwpO1xuICAgIH07XG4gIH0gZWxzZSBpZiAocmVmICE9PSBudWxsICYmIHJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIHJlZk9iamVjdCA9IHJlZjtcblxuICAgIHtcbiAgICAgIGlmICghcmVmT2JqZWN0Lmhhc093blByb3BlcnR5KCdjdXJyZW50JykpIHtcbiAgICAgICAgZXJyb3IoJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBmaXJzdCBhcmd1bWVudCB0byBlaXRoZXIgYmUgYSAnICsgJ3JlZiBjYWxsYmFjayBvciBSZWFjdC5jcmVhdGVSZWYoKSBvYmplY3QuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsICdhbiBvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMocmVmT2JqZWN0KS5qb2luKCcsICcpICsgJ30nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgX2luc3QyID0gY3JlYXRlKCk7XG5cbiAgICByZWZPYmplY3QuY3VycmVudCA9IF9pbnN0MjtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVmT2JqZWN0LmN1cnJlbnQgPSBudWxsO1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNyZWF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSBmdW5jdGlvbiAnICsgJ3RoYXQgY3JlYXRlcyBhIGhhbmRsZS4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY3JlYXRlICE9PSBudWxsID8gdHlwZW9mIGNyZWF0ZSA6ICdudWxsJyk7XG4gICAgfVxuICB9IC8vIFRPRE86IElmIGRlcHMgYXJlIHByb3ZpZGVkLCBzaG91bGQgd2Ugc2tpcCBjb21wYXJpbmcgdGhlIHJlZiBpdHNlbGY/XG5cblxuICB2YXIgZWZmZWN0RGVwcyA9IGRlcHMgIT09IG51bGwgJiYgZGVwcyAhPT0gdW5kZWZpbmVkID8gZGVwcy5jb25jYXQoW3JlZl0pIDogbnVsbDtcbiAgdmFyIGZpYmVyRmxhZ3MgPSBVcGRhdGU7XG5cbiAge1xuICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICB9XG5cbiAgaWYgKCAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICBmaWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICB9XG5cbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChmaWJlckZsYWdzLCBMYXlvdXQsIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QuYmluZChudWxsLCBjcmVhdGUsIHJlZiksIGVmZmVjdERlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNyZWF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSBmdW5jdGlvbiAnICsgJ3RoYXQgY3JlYXRlcyBhIGhhbmRsZS4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY3JlYXRlICE9PSBudWxsID8gdHlwZW9mIGNyZWF0ZSA6ICdudWxsJyk7XG4gICAgfVxuICB9IC8vIFRPRE86IElmIGRlcHMgYXJlIHByb3ZpZGVkLCBzaG91bGQgd2Ugc2tpcCBjb21wYXJpbmcgdGhlIHJlZiBpdHNlbGY/XG5cblxuICB2YXIgZWZmZWN0RGVwcyA9IGRlcHMgIT09IG51bGwgJiYgZGVwcyAhPT0gdW5kZWZpbmVkID8gZGVwcy5jb25jYXQoW3JlZl0pIDogbnVsbDtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoVXBkYXRlLCBMYXlvdXQsIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QuYmluZChudWxsLCBjcmVhdGUsIHJlZiksIGVmZmVjdERlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudERlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKSB7Ly8gVGhpcyBob29rIGlzIG5vcm1hbGx5IGEgbm8tb3AuXG4gIC8vIFRoZSByZWFjdC1kZWJ1Zy1ob29rcyBwYWNrYWdlIGluamVjdHMgaXRzIG93biBpbXBsZW1lbnRhdGlvblxuICAvLyBzbyB0aGF0IGUuZy4gRGV2VG9vbHMgY2FuIGRpc3BsYXkgY3VzdG9tIGhvb2sgdmFsdWVzLlxufVxuXG52YXIgdXBkYXRlRGVidWdWYWx1ZSA9IG1vdW50RGVidWdWYWx1ZTtcblxuZnVuY3Rpb24gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBbY2FsbGJhY2ssIG5leHREZXBzXTtcbiAgcmV0dXJuIGNhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIHByZXZTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgaWYgKG5leHREZXBzICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldkRlcHMgPSBwcmV2U3RhdGVbMV07XG5cbiAgICAgIGlmIChhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSkge1xuICAgICAgICByZXR1cm4gcHJldlN0YXRlWzBdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtjYWxsYmFjaywgbmV4dERlcHNdO1xuICByZXR1cm4gY2FsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIG1vdW50TWVtbyhuZXh0Q3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBuZXh0VmFsdWUgPSBuZXh0Q3JlYXRlKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtuZXh0VmFsdWUsIG5leHREZXBzXTtcbiAgcmV0dXJuIG5leHRWYWx1ZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTWVtbyhuZXh0Q3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgcHJldlN0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAvLyBBc3N1bWUgdGhlc2UgYXJlIGRlZmluZWQuIElmIHRoZXkncmUgbm90LCBhcmVIb29rSW5wdXRzRXF1YWwgd2lsbCB3YXJuLlxuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldlN0YXRlWzFdO1xuXG4gICAgICBpZiAoYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykpIHtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZVswXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgbmV4dFZhbHVlID0gbmV4dENyZWF0ZSgpO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBbbmV4dFZhbHVlLCBuZXh0RGVwc107XG4gIHJldHVybiBuZXh0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHZhbHVlO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHJlc29sdmVkQ3VycmVudEhvb2sgPSBjdXJyZW50SG9vaztcbiAgdmFyIHByZXZWYWx1ZSA9IHJlc29sdmVkQ3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHByZXZWYWx1ZSwgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcblxuICBpZiAoY3VycmVudEhvb2sgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVyZW5kZXIgZHVyaW5nIGEgbW91bnQuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYSByZXJlbmRlciBkdXJpbmcgYW4gdXBkYXRlLlxuICAgIHZhciBwcmV2VmFsdWUgPSBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlO1xuICAgIHJldHVybiB1cGRhdGVEZWZlcnJlZFZhbHVlSW1wbChob29rLCBwcmV2VmFsdWUsIHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVEZWZlcnJlZFZhbHVlSW1wbChob29rLCBwcmV2VmFsdWUsIHZhbHVlKSB7XG4gIHZhciBzaG91bGREZWZlclZhbHVlID0gIWluY2x1ZGVzT25seU5vblVyZ2VudExhbmVzKHJlbmRlckxhbmVzKTtcblxuICBpZiAoc2hvdWxkRGVmZXJWYWx1ZSkge1xuICAgIC8vIFRoaXMgaXMgYW4gdXJnZW50IHVwZGF0ZS4gSWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkLCBrZWVwIHVzaW5nIHRoZVxuICAgIC8vIHByZXZpb3VzIHZhbHVlIGFuZCBzcGF3biBhIGRlZmVycmVkIHJlbmRlciB0byB1cGRhdGUgaXQgbGF0ZXIuXG4gICAgaWYgKCFvYmplY3RJcyh2YWx1ZSwgcHJldlZhbHVlKSkge1xuICAgICAgLy8gU2NoZWR1bGUgYSBkZWZlcnJlZCByZW5kZXJcbiAgICAgIHZhciBkZWZlcnJlZExhbmUgPSBjbGFpbU5leHRUcmFuc2l0aW9uTGFuZSgpO1xuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcyA9IG1lcmdlTGFuZXMoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcywgZGVmZXJyZWRMYW5lKTtcbiAgICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMoZGVmZXJyZWRMYW5lKTsgLy8gU2V0IHRoaXMgdG8gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSByZW5kZXJlZCB2YWx1ZSBpcyBpbmNvbnNpc3RlbnRcbiAgICAgIC8vIGZyb20gdGhlIGxhdGVzdCB2YWx1ZS4gVGhlIG5hbWUgXCJiYXNlU3RhdGVcIiBkb2Vzbid0IHJlYWxseSBtYXRjaCBob3cgd2VcbiAgICAgIC8vIHVzZSBpdCBiZWNhdXNlIHdlJ3JlIHJldXNpbmcgYSBzdGF0ZSBob29rIGZpZWxkIGluc3RlYWQgb2YgY3JlYXRpbmcgYVxuICAgICAgLy8gbmV3IG9uZS5cblxuICAgICAgaG9vay5iYXNlU3RhdGUgPSB0cnVlO1xuICAgIH0gLy8gUmV1c2UgdGhlIHByZXZpb3VzIHZhbHVlXG5cblxuICAgIHJldHVybiBwcmV2VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBub3QgYW4gdXJnZW50IHVwZGF0ZSwgc28gd2UgY2FuIHVzZSB0aGUgbGF0ZXN0IHZhbHVlIHJlZ2FyZGxlc3NcbiAgICAvLyBvZiB3aGF0IGl0IGlzLiBObyBuZWVkIHRvIGRlZmVyIGl0LlxuICAgIC8vIEhvd2V2ZXIsIGlmIHdlJ3JlIGN1cnJlbnRseSBpbnNpZGUgYSBzcGF3bmVkIHJlbmRlciwgdGhlbiB3ZSBuZWVkIHRvIG1hcmtcbiAgICAvLyB0aGlzIGFzIGFuIHVwZGF0ZSB0byBwcmV2ZW50IHRoZSBmaWJlciBmcm9tIGJhaWxpbmcgb3V0LlxuICAgIC8vXG4gICAgLy8gYGJhc2VTdGF0ZWAgaXMgdHJ1ZSB3aGVuIHRoZSBjdXJyZW50IHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSByZW5kZXJlZFxuICAgIC8vIHZhbHVlLiBUaGUgbmFtZSBkb2Vzbid0IHJlYWxseSBtYXRjaCBob3cgd2UgdXNlIGl0IGJlY2F1c2Ugd2UncmUgcmV1c2luZ1xuICAgIC8vIGEgc3RhdGUgaG9vayBmaWVsZCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS5cbiAgICBpZiAoaG9vay5iYXNlU3RhdGUpIHtcbiAgICAgIC8vIEZsaXAgdGhpcyBiYWNrIHRvIGZhbHNlLlxuICAgICAgaG9vay5iYXNlU3RhdGUgPSBmYWxzZTtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0VHJhbnNpdGlvbihzZXRQZW5kaW5nLCBjYWxsYmFjaywgb3B0aW9ucykge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoaGlnaGVyRXZlbnRQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5LCBDb250aW51b3VzRXZlbnRQcmlvcml0eSkpO1xuICBzZXRQZW5kaW5nKHRydWUpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbiA9IHt9O1xuICB2YXIgY3VycmVudFRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb247XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgc2V0UGVuZGluZyhmYWxzZSk7XG4gICAgY2FsbGJhY2soKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG5cbiAgICB7XG4gICAgICBpZiAocHJldlRyYW5zaXRpb24gPT09IG51bGwgJiYgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMpIHtcbiAgICAgICAgdmFyIHVwZGF0ZWRGaWJlcnNDb3VudCA9IGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLnNpemU7XG5cbiAgICAgICAgaWYgKHVwZGF0ZWRGaWJlcnNDb3VudCA+IDEwKSB7XG4gICAgICAgICAgd2FybignRGV0ZWN0ZWQgYSBsYXJnZSBudW1iZXIgb2YgdXBkYXRlcyBpbnNpZGUgc3RhcnRUcmFuc2l0aW9uLiAnICsgJ0lmIHRoaXMgaXMgZHVlIHRvIGEgc3Vic2NyaXB0aW9uIHBsZWFzZSByZS13cml0ZSBpdCB0byB1c2UgUmVhY3QgcHJvdmlkZWQgaG9va3MuICcgKyAnT3RoZXJ3aXNlIGNvbmN1cnJlbnQgbW9kZSBndWFyYW50ZWVzIGFyZSBvZmYgdGhlIHRhYmxlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRUcmFuc2l0aW9uKCkge1xuICB2YXIgX21vdW50U3RhdGUgPSBtb3VudFN0YXRlKGZhbHNlKSxcbiAgICAgIGlzUGVuZGluZyA9IF9tb3VudFN0YXRlWzBdLFxuICAgICAgc2V0UGVuZGluZyA9IF9tb3VudFN0YXRlWzFdOyAvLyBUaGUgYHN0YXJ0YCBtZXRob2QgbmV2ZXIgY2hhbmdlcy5cblxuXG4gIHZhciBzdGFydCA9IHN0YXJ0VHJhbnNpdGlvbi5iaW5kKG51bGwsIHNldFBlbmRpbmcpO1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHN0YXJ0O1xuICByZXR1cm4gW2lzUGVuZGluZywgc3RhcnRdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVUcmFuc2l0aW9uKCkge1xuICB2YXIgX3VwZGF0ZVN0YXRlID0gdXBkYXRlU3RhdGUoKSxcbiAgICAgIGlzUGVuZGluZyA9IF91cGRhdGVTdGF0ZVswXTtcblxuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgc3RhcnQgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBbaXNQZW5kaW5nLCBzdGFydF07XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyVHJhbnNpdGlvbigpIHtcbiAgdmFyIF9yZXJlbmRlclN0YXRlID0gcmVyZW5kZXJTdGF0ZSgpLFxuICAgICAgaXNQZW5kaW5nID0gX3JlcmVuZGVyU3RhdGVbMF07XG5cbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHN0YXJ0ID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gW2lzUGVuZGluZywgc3RhcnRdO1xufVxuXG52YXIgaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZSA9IGZhbHNlO1xuZnVuY3Rpb24gZ2V0SXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZUluREVWKCkge1xuICB7XG4gICAgcmV0dXJuIGlzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRJZCgpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpOyAvLyBUT0RPOiBJbiBGaXp6LCBpZCBnZW5lcmF0aW9uIGlzIHNwZWNpZmljIHRvIGVhY2ggc2VydmVyIGNvbmZpZy4gTWF5YmUgd2VcbiAgLy8gc2hvdWxkIGRvIHRoaXMgaW4gRmliZXIsIHRvbz8gRGVmZXJyaW5nIHRoaXMgZGVjaXNpb24gZm9yIG5vdyBiZWNhdXNlXG4gIC8vIHRoZXJlJ3Mgbm8gb3RoZXIgcGxhY2UgdG8gc3RvcmUgdGhlIHByZWZpeCBleGNlcHQgZm9yIGFuIGludGVybmFsIGZpZWxkIG9uXG4gIC8vIHRoZSBwdWJsaWMgY3JlYXRlUm9vdCBvYmplY3QsIHdoaWNoIHRoZSBmaWJlciB0cmVlIGRvZXMgbm90IGN1cnJlbnRseSBoYXZlXG4gIC8vIGEgcmVmZXJlbmNlIHRvLlxuXG4gIHZhciBpZGVudGlmaWVyUHJlZml4ID0gcm9vdC5pZGVudGlmaWVyUHJlZml4O1xuICB2YXIgaWQ7XG5cbiAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICB2YXIgdHJlZUlkID0gZ2V0VHJlZUlkKCk7IC8vIFVzZSBhIGNhcHRpYWwgUiBwcmVmaXggZm9yIHNlcnZlci1nZW5lcmF0ZWQgaWRzLlxuXG4gICAgaWQgPSAnOicgKyBpZGVudGlmaWVyUHJlZml4ICsgJ1InICsgdHJlZUlkOyAvLyBVbmxlc3MgdGhpcyBpcyB0aGUgZmlyc3QgaWQgYXQgdGhpcyBsZXZlbCwgYXBwZW5kIGEgbnVtYmVyIGF0IHRoZSBlbmRcbiAgICAvLyB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uIG9mIHRoaXMgdXNlSWQgaG9vayBhbW9uZyBhbGwgdGhlIHVzZUlkXG4gICAgLy8gaG9va3MgZm9yIHRoaXMgZmliZXIuXG5cbiAgICB2YXIgbG9jYWxJZCA9IGxvY2FsSWRDb3VudGVyKys7XG5cbiAgICBpZiAobG9jYWxJZCA+IDApIHtcbiAgICAgIGlkICs9ICdIJyArIGxvY2FsSWQudG9TdHJpbmcoMzIpO1xuICAgIH1cblxuICAgIGlkICs9ICc6JztcbiAgfSBlbHNlIHtcbiAgICAvLyBVc2UgYSBsb3dlcmNhc2UgciBwcmVmaXggZm9yIGNsaWVudC1nZW5lcmF0ZWQgaWRzLlxuICAgIHZhciBnbG9iYWxDbGllbnRJZCA9IGdsb2JhbENsaWVudElkQ291bnRlcisrO1xuICAgIGlkID0gJzonICsgaWRlbnRpZmllclByZWZpeCArICdyJyArIGdsb2JhbENsaWVudElkLnRvU3RyaW5nKDMyKSArICc6JztcbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGlkO1xuICByZXR1cm4gaWQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUlkKCkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgaWQgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBpZDtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hSZWR1Y2VyQWN0aW9uKGZpYmVyLCBxdWV1ZSwgYWN0aW9uKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoXCJTdGF0ZSB1cGRhdGVzIGZyb20gdGhlIHVzZVN0YXRlKCkgYW5kIHVzZVJlZHVjZXIoKSBIb29rcyBkb24ndCBzdXBwb3J0IHRoZSBcIiArICdzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuIFRvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciAnICsgJ3JlbmRlcmluZywgZGVjbGFyZSBpdCBpbiB0aGUgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICBsYW5lOiBsYW5lLFxuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIGhhc0VhZ2VyU3RhdGU6IGZhbHNlLFxuICAgIGVhZ2VyU3RhdGU6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmIChpc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSkge1xuICAgIGVucXVldWVSZW5kZXJQaGFzZVVwZGF0ZShxdWV1ZSwgdXBkYXRlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvblVwZGF0ZShyb290LCBxdWV1ZSwgbGFuZSk7XG4gICAgfVxuICB9XG5cbiAgbWFya1VwZGF0ZUluRGV2VG9vbHMoZmliZXIsIGxhbmUpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaFNldFN0YXRlKGZpYmVyLCBxdWV1ZSwgYWN0aW9uKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1szXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoXCJTdGF0ZSB1cGRhdGVzIGZyb20gdGhlIHVzZVN0YXRlKCkgYW5kIHVzZVJlZHVjZXIoKSBIb29rcyBkb24ndCBzdXBwb3J0IHRoZSBcIiArICdzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuIFRvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciAnICsgJ3JlbmRlcmluZywgZGVjbGFyZSBpdCBpbiB0aGUgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICBsYW5lOiBsYW5lLFxuICAgIGFjdGlvbjogYWN0aW9uLFxuICAgIGhhc0VhZ2VyU3RhdGU6IGZhbHNlLFxuICAgIGVhZ2VyU3RhdGU6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuXG4gIGlmIChpc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSkge1xuICAgIGVucXVldWVSZW5kZXJQaGFzZVVwZGF0ZShxdWV1ZSwgdXBkYXRlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGZpYmVyLmxhbmVzID09PSBOb0xhbmVzICYmIChhbHRlcm5hdGUgPT09IG51bGwgfHwgYWx0ZXJuYXRlLmxhbmVzID09PSBOb0xhbmVzKSkge1xuICAgICAgLy8gVGhlIHF1ZXVlIGlzIGN1cnJlbnRseSBlbXB0eSwgd2hpY2ggbWVhbnMgd2UgY2FuIGVhZ2VybHkgY29tcHV0ZSB0aGVcbiAgICAgIC8vIG5leHQgc3RhdGUgYmVmb3JlIGVudGVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIElmIHRoZSBuZXcgc3RhdGUgaXMgdGhlXG4gICAgICAvLyBzYW1lIGFzIHRoZSBjdXJyZW50IHN0YXRlLCB3ZSBtYXkgYmUgYWJsZSB0byBiYWlsIG91dCBlbnRpcmVseS5cbiAgICAgIHZhciBsYXN0UmVuZGVyZWRSZWR1Y2VyID0gcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlcjtcblxuICAgICAgaWYgKGxhc3RSZW5kZXJlZFJlZHVjZXIgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgZWFnZXJTdGF0ZSA9IGxhc3RSZW5kZXJlZFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pOyAvLyBTdGFzaCB0aGUgZWFnZXJseSBjb21wdXRlZCBzdGF0ZSwgYW5kIHRoZSByZWR1Y2VyIHVzZWQgdG8gY29tcHV0ZVxuICAgICAgICAgIC8vIGl0LCBvbiB0aGUgdXBkYXRlIG9iamVjdC4gSWYgdGhlIHJlZHVjZXIgaGFzbid0IGNoYW5nZWQgYnkgdGhlXG4gICAgICAgICAgLy8gdGltZSB3ZSBlbnRlciB0aGUgcmVuZGVyIHBoYXNlLCB0aGVuIHRoZSBlYWdlciBzdGF0ZSBjYW4gYmUgdXNlZFxuICAgICAgICAgIC8vIHdpdGhvdXQgY2FsbGluZyB0aGUgcmVkdWNlciBhZ2Fpbi5cblxuICAgICAgICAgIHVwZGF0ZS5oYXNFYWdlclN0YXRlID0gdHJ1ZTtcbiAgICAgICAgICB1cGRhdGUuZWFnZXJTdGF0ZSA9IGVhZ2VyU3RhdGU7XG5cbiAgICAgICAgICBpZiAob2JqZWN0SXMoZWFnZXJTdGF0ZSwgY3VycmVudFN0YXRlKSkge1xuICAgICAgICAgICAgLy8gRmFzdCBwYXRoLiBXZSBjYW4gYmFpbCBvdXQgd2l0aG91dCBzY2hlZHVsaW5nIFJlYWN0IHRvIHJlLXJlbmRlci5cbiAgICAgICAgICAgIC8vIEl0J3Mgc3RpbGwgcG9zc2libGUgdGhhdCB3ZSdsbCBuZWVkIHRvIHJlYmFzZSB0aGlzIHVwZGF0ZSBsYXRlcixcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjb21wb25lbnQgcmUtcmVuZGVycyBmb3IgYSBkaWZmZXJlbnQgcmVhc29uIGFuZCBieSB0aGF0XG4gICAgICAgICAgICAvLyB0aW1lIHRoZSByZWR1Y2VyIGhhcyBjaGFuZ2VkLlxuICAgICAgICAgICAgLy8gVE9ETzogRG8gd2Ugc3RpbGwgbmVlZCB0byBlbnRhbmdsZSB0cmFuc2l0aW9ucyBpbiB0aGlzIGNhc2U/XG4gICAgICAgICAgICBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGVBbmRFYWdlcmx5QmFpbG91dChmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikgey8vIFN1cHByZXNzIHRoZSBlcnJvci4gSXQgd2lsbCB0aHJvdyBhZ2FpbiBpbiB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25VcGRhdGUocm9vdCwgcXVldWUsIGxhbmUpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtVcGRhdGVJbkRldlRvb2xzKGZpYmVyLCBsYW5lKTtcbn1cblxuZnVuY3Rpb24gaXNSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikge1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuICByZXR1cm4gZmliZXIgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZSA9PT0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTtcbn1cblxuZnVuY3Rpb24gZW5xdWV1ZVJlbmRlclBoYXNlVXBkYXRlKHF1ZXVlLCB1cGRhdGUpIHtcbiAgLy8gVGhpcyBpcyBhIHJlbmRlciBwaGFzZSB1cGRhdGUuIFN0YXNoIGl0IGluIGEgbGF6aWx5LWNyZWF0ZWQgbWFwIG9mXG4gIC8vIHF1ZXVlIC0+IGxpbmtlZCBsaXN0IG9mIHVwZGF0ZXMuIEFmdGVyIHRoaXMgcmVuZGVyIHBhc3MsIHdlJ2xsIHJlc3RhcnRcbiAgLy8gYW5kIGFwcGx5IHRoZSBzdGFzaGVkIHVwZGF0ZXMgb24gdG9wIG9mIHRoZSB3b3JrLWluLXByb2dyZXNzIGhvb2suXG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSB0cnVlO1xuICB2YXIgcGVuZGluZyA9IHF1ZXVlLnBlbmRpbmc7XG5cbiAgaWYgKHBlbmRpbmcgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlLm5leHQgPSBwZW5kaW5nLm5leHQ7XG4gICAgcGVuZGluZy5uZXh0ID0gdXBkYXRlO1xuICB9XG5cbiAgcXVldWUucGVuZGluZyA9IHVwZGF0ZTtcbn0gLy8gVE9ETzogTW92ZSB0byBSZWFjdEZpYmVyQ29uY3VycmVudFVwZGF0ZXM/XG5cblxuZnVuY3Rpb24gZW50YW5nbGVUcmFuc2l0aW9uVXBkYXRlKHJvb3QsIHF1ZXVlLCBsYW5lKSB7XG4gIGlmIChpc1RyYW5zaXRpb25MYW5lKGxhbmUpKSB7XG4gICAgdmFyIHF1ZXVlTGFuZXMgPSBxdWV1ZS5sYW5lczsgLy8gSWYgYW55IGVudGFuZ2xlZCBsYW5lcyBhcmUgbm8gbG9uZ2VyIHBlbmRpbmcgb24gdGhlIHJvb3QsIHRoZW4gdGhleVxuICAgIC8vIG11c3QgaGF2ZSBmaW5pc2hlZC4gV2UgY2FuIHJlbW92ZSB0aGVtIGZyb20gdGhlIHNoYXJlZCBxdWV1ZSwgd2hpY2hcbiAgICAvLyByZXByZXNlbnRzIGEgc3VwZXJzZXQgb2YgdGhlIGFjdHVhbGx5IHBlbmRpbmcgbGFuZXMuIEluIHNvbWUgY2FzZXMgd2VcbiAgICAvLyBtYXkgZW50YW5nbGUgbW9yZSB0aGFuIHdlIG5lZWQgdG8sIGJ1dCB0aGF0J3MgT0suIEluIGZhY3QgaXQncyB3b3JzZSBpZlxuICAgIC8vIHdlICpkb24ndCogZW50YW5nbGUgd2hlbiB3ZSBzaG91bGQuXG5cbiAgICBxdWV1ZUxhbmVzID0gaW50ZXJzZWN0TGFuZXMocXVldWVMYW5lcywgcm9vdC5wZW5kaW5nTGFuZXMpOyAvLyBFbnRhbmdsZSB0aGUgbmV3IHRyYW5zaXRpb24gbGFuZSB3aXRoIHRoZSBvdGhlciB0cmFuc2l0aW9uIGxhbmVzLlxuXG4gICAgdmFyIG5ld1F1ZXVlTGFuZXMgPSBtZXJnZUxhbmVzKHF1ZXVlTGFuZXMsIGxhbmUpO1xuICAgIHF1ZXVlLmxhbmVzID0gbmV3UXVldWVMYW5lczsgLy8gRXZlbiBpZiBxdWV1ZS5sYW5lcyBhbHJlYWR5IGluY2x1ZGUgbGFuZSwgd2UgZG9uJ3Qga25vdyBmb3IgY2VydGFpbiBpZlxuICAgIC8vIHRoZSBsYW5lIGZpbmlzaGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UgZW50YW5nbGVkIGl0LiBTbyB3ZSBuZWVkIHRvXG4gICAgLy8gZW50YW5nbGUgaXQgYWdhaW4sIGp1c3QgdG8gYmUgc3VyZS5cblxuICAgIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIG5ld1F1ZXVlTGFuZXMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGVJbkRldlRvb2xzKGZpYmVyLCBsYW5lLCBhY3Rpb24pIHtcblxuICB7XG4gICAgbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgfVxufVxuXG52YXIgQ29udGV4dE9ubHlEaXNwYXRjaGVyID0ge1xuICByZWFkQ29udGV4dDogcmVhZENvbnRleHQsXG4gIHVzZUNhbGxiYWNrOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUNvbnRleHQ6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUltcGVyYXRpdmVIYW5kbGU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlSW5zZXJ0aW9uRWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUxheW91dEVmZmVjdDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VNZW1vOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVJlZHVjZXI6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlUmVmOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVN0YXRlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZURlYnVnVmFsdWU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRGVmZXJyZWRWYWx1ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VUcmFuc2l0aW9uOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZU11dGFibGVTb3VyY2U6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlU3luY0V4dGVybmFsU3RvcmU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlSWQ6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG59O1xuXG52YXIgSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0gbnVsbDtcbnZhciBIb29rc0Rpc3BhdGNoZXJPbk1vdW50V2l0aEhvb2tUeXBlc0luREVWID0gbnVsbDtcbnZhciBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0gbnVsbDtcbnZhciBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0gbnVsbDtcbnZhciBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0gbnVsbDtcblxue1xuICB2YXIgd2FybkludmFsaWRDb250ZXh0QWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgfTtcblxuICB2YXIgd2FybkludmFsaWRIb29rQWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGVycm9yKCdEbyBub3QgY2FsbCBIb29rcyBpbnNpZGUgdXNlRWZmZWN0KC4uLiksIHVzZU1lbW8oLi4uKSwgb3Igb3RoZXIgYnVpbHQtaW4gSG9va3MuICcgKyAnWW91IGNhbiBvbmx5IGNhbGwgSG9va3MgYXQgdGhlIHRvcCBsZXZlbCBvZiB5b3VyIFJlYWN0IGZ1bmN0aW9uLiAnICsgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcnVsZXMtb2YtaG9va3MnKTtcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50TWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50UmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50TWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50UmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudElkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlVHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcbn1cblxudmFyIG5vdyQxID0gU2NoZWR1bGVyLnVuc3RhYmxlX25vdztcbnZhciBjb21taXRUaW1lID0gMDtcbnZhciBsYXlvdXRFZmZlY3RTdGFydFRpbWUgPSAtMTtcbnZhciBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xudmFyIHBhc3NpdmVFZmZlY3RTdGFydFRpbWUgPSAtMTtcbi8qKlxuICogVHJhY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdXBkYXRlIHdhcyBhIG5lc3RlZC9jYXNjYWRpbmcgdXBkYXRlIChzY2hlZHVsZWQgZnJvbSBhIGxheW91dCBlZmZlY3QpLlxuICpcbiAqIFRoZSBvdmVyYWxsIHNlcXVlbmNlIGlzOlxuICogICAxLiByZW5kZXJcbiAqICAgMi4gY29tbWl0IChhbmQgY2FsbCBgb25SZW5kZXJgLCBgb25Db21taXRgKVxuICogICAzLiBjaGVjayBmb3IgbmVzdGVkIHVwZGF0ZXNcbiAqICAgNC4gZmx1c2ggcGFzc2l2ZSBlZmZlY3RzIChhbmQgY2FsbCBgb25Qb3N0Q29tbWl0YClcbiAqXG4gKiBOZXN0ZWQgdXBkYXRlcyBhcmUgaWRlbnRpZmllZCBpbiBzdGVwIDMgYWJvdmUsXG4gKiBidXQgc3RlcCA0IHN0aWxsIGFwcGxpZXMgdG8gdGhlIHdvcmsgdGhhdCB3YXMganVzdCBjb21taXR0ZWQuXG4gKiBXZSB1c2UgdHdvIGZsYWdzIHRvIHRyYWNrIG5lc3RlZCB1cGRhdGVzIHRoZW46XG4gKiBvbmUgdHJhY2tzIHdoZXRoZXIgdGhlIHVwY29taW5nIHVwZGF0ZSBpcyBhIG5lc3RlZCB1cGRhdGUsXG4gKiBhbmQgdGhlIG90aGVyIHRyYWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVwZGF0ZSB3YXMgYSBuZXN0ZWQgdXBkYXRlLlxuICogVGhlIGZpcnN0IHZhbHVlIGdldHMgc3luY2VkIHRvIHRoZSBzZWNvbmQgYXQgdGhlIHN0YXJ0IG9mIHRoZSByZW5kZXIgcGhhc2UuXG4gKi9cblxudmFyIGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9IGZhbHNlO1xudmFyIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBpc0N1cnJlbnRVcGRhdGVOZXN0ZWQoKSB7XG4gIHJldHVybiBjdXJyZW50VXBkYXRlSXNOZXN0ZWQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtOZXN0ZWRVcGRhdGVTY2hlZHVsZWQoKSB7XG4gIHtcbiAgICBuZXN0ZWRVcGRhdGVTY2hlZHVsZWQgPSB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0TmVzdGVkVXBkYXRlRmxhZygpIHtcbiAge1xuICAgIGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9IGZhbHNlO1xuICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN5bmNOZXN0ZWRVcGRhdGVGbGFnKCkge1xuICB7XG4gICAgY3VycmVudFVwZGF0ZUlzTmVzdGVkID0gbmVzdGVkVXBkYXRlU2NoZWR1bGVkO1xuICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldENvbW1pdFRpbWUoKSB7XG4gIHJldHVybiBjb21taXRUaW1lO1xufVxuXG5mdW5jdGlvbiByZWNvcmRDb21taXRUaW1lKCkge1xuXG4gIGNvbW1pdFRpbWUgPSBub3ckMSgpO1xufVxuXG5mdW5jdGlvbiBzdGFydFByb2ZpbGVyVGltZXIoZmliZXIpIHtcblxuICBwcm9maWxlclN0YXJ0VGltZSA9IG5vdyQxKCk7XG5cbiAgaWYgKGZpYmVyLmFjdHVhbFN0YXJ0VGltZSA8IDApIHtcbiAgICBmaWJlci5hY3R1YWxTdGFydFRpbWUgPSBub3ckMSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nKGZpYmVyKSB7XG5cbiAgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcbn1cblxuZnVuY3Rpb24gc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShmaWJlciwgb3ZlcnJpZGVCYXNlVGltZSkge1xuXG4gIGlmIChwcm9maWxlclN0YXJ0VGltZSA+PSAwKSB7XG4gICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIHByb2ZpbGVyU3RhcnRUaW1lO1xuICAgIGZpYmVyLmFjdHVhbER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuXG4gICAgaWYgKG92ZXJyaWRlQmFzZVRpbWUpIHtcbiAgICAgIGZpYmVyLnNlbGZCYXNlRHVyYXRpb24gPSBlbGFwc2VkVGltZTtcbiAgICB9XG5cbiAgICBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpYmVyKSB7XG5cbiAgaWYgKGxheW91dEVmZmVjdFN0YXJ0VGltZSA+PSAwKSB7XG4gICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIGxheW91dEVmZmVjdFN0YXJ0VGltZTtcbiAgICBsYXlvdXRFZmZlY3RTdGFydFRpbWUgPSAtMTsgLy8gU3RvcmUgZHVyYXRpb24gb24gdGhlIG5leHQgbmVhcmVzdCBQcm9maWxlciBhbmNlc3RvclxuICAgIC8vIE9yIHRoZSByb290IChmb3IgdGhlIERldlRvb2xzIFByb2ZpbGVyIHRvIHJlYWQpXG5cbiAgICB2YXIgcGFyZW50RmliZXIgPSBmaWJlci5yZXR1cm47XG5cbiAgICB3aGlsZSAocGFyZW50RmliZXIgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgdmFyIHJvb3QgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgcm9vdC5lZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oZmliZXIpIHtcblxuICBpZiAocGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA+PSAwKSB7XG4gICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIHBhc3NpdmVFZmZlY3RTdGFydFRpbWU7XG4gICAgcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA9IC0xOyAvLyBTdG9yZSBkdXJhdGlvbiBvbiB0aGUgbmV4dCBuZWFyZXN0IFByb2ZpbGVyIGFuY2VzdG9yXG4gICAgLy8gT3IgdGhlIHJvb3QgKGZvciB0aGUgRGV2VG9vbHMgUHJvZmlsZXIgdG8gcmVhZClcblxuICAgIHZhciBwYXJlbnRGaWJlciA9IGZpYmVyLnJldHVybjtcblxuICAgIHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByb290LnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHBhcmVudFN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gRGV0YWNoZWQgZmliZXJzIGhhdmUgdGhlaXIgc3RhdGUgbm9kZSBjbGVhcmVkIG91dC5cbiAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIHJldHVybiBwb2ludGVyIGlzIGFsc28gY2xlYXJlZCBvdXQsXG4gICAgICAgICAgICAvLyBzbyB3ZSB3b24ndCBiZSBhYmxlIHRvIHJlcG9ydCB0aGUgdGltZSBzcGVudCBpbiB0aGlzIFByb2ZpbGVyJ3Mgc3VidHJlZS5cbiAgICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz0gZWxhcHNlZFRpbWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpIHtcblxuICBsYXlvdXRFZmZlY3RTdGFydFRpbWUgPSBub3ckMSgpO1xufVxuXG5mdW5jdGlvbiBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpIHtcblxuICBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID0gbm93JDEoKTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmZXJBY3R1YWxEdXJhdGlvbihmaWJlcikge1xuICAvLyBUcmFuc2ZlciB0aW1lIHNwZW50IHJlbmRlcmluZyB0aGVzZSBjaGlsZHJlbiBzbyB3ZSBkb24ndCBsb3NlIGl0XG4gIC8vIGFmdGVyIHdlIHJlcmVuZGVyLiBUaGlzIGlzIHVzZWQgYXMgYSBoZWxwZXIgaW4gc3BlY2lhbCBjYXNlc1xuICAvLyB3aGVyZSB3ZSBzaG91bGQgY291bnQgdGhlIHdvcmsgb2YgbXVsdGlwbGUgcGFzc2VzLlxuICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQpIHtcbiAgICBmaWJlci5hY3R1YWxEdXJhdGlvbiArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbjtcbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIodmFsdWUsIHNvdXJjZSkge1xuICAvLyBJZiB0aGUgdmFsdWUgaXMgYW4gZXJyb3IsIGNhbGwgdGhpcyBmdW5jdGlvbiBpbW1lZGlhdGVseSBhZnRlciBpdCBpcyB0aHJvd25cbiAgLy8gc28gdGhlIHN0YWNrIGlzIGFjY3VyYXRlLlxuICByZXR1cm4ge1xuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICBzdGFjazogZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHNvdXJjZSksXG4gICAgZGlnZXN0OiBudWxsXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDYXB0dXJlZFZhbHVlKHZhbHVlLCBkaWdlc3QsIHN0YWNrKSB7XG4gIHJldHVybiB7XG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIHNvdXJjZTogbnVsbCxcbiAgICBzdGFjazogc3RhY2sgIT0gbnVsbCA/IHN0YWNrIDogbnVsbCxcbiAgICBkaWdlc3Q6IGRpZ2VzdCAhPSBudWxsID8gZGlnZXN0IDogbnVsbFxuICB9O1xufVxuXG4vLyBUaGlzIG1vZHVsZSBpcyBmb3JrZWQgaW4gZGlmZmVyZW50IGVudmlyb25tZW50cy5cbi8vIEJ5IGRlZmF1bHQsIHJldHVybiBgdHJ1ZWAgdG8gbG9nIGVycm9ycyB0byB0aGUgY29uc29sZS5cbi8vIEZvcmtzIGNhbiByZXR1cm4gYGZhbHNlYCBpZiB0aGlzIGlzbid0IGRlc2lyYWJsZS5cbmZ1bmN0aW9uIHNob3dFcnJvckRpYWxvZyhib3VuZGFyeSwgZXJyb3JJbmZvKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBsb2dDYXB0dXJlZEVycm9yKGJvdW5kYXJ5LCBlcnJvckluZm8pIHtcbiAgdHJ5IHtcbiAgICB2YXIgbG9nRXJyb3IgPSBzaG93RXJyb3JEaWFsb2coYm91bmRhcnksIGVycm9ySW5mbyk7IC8vIEFsbG93IGluamVjdGVkIHNob3dFcnJvckRpYWxvZygpIHRvIHByZXZlbnQgZGVmYXVsdCBjb25zb2xlLmVycm9yIGxvZ2dpbmcuXG4gICAgLy8gVGhpcyBlbmFibGVzIHJlbmRlcmVycyBsaWtlIFJlYWN0TmF0aXZlIHRvIGJldHRlciBtYW5hZ2UgcmVkYm94IGJlaGF2aW9yLlxuXG4gICAgaWYgKGxvZ0Vycm9yID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBlcnJvciA9IGVycm9ySW5mby52YWx1ZTtcblxuICAgIGlmICh0cnVlKSB7XG4gICAgICB2YXIgc291cmNlID0gZXJyb3JJbmZvLnNvdXJjZTtcbiAgICAgIHZhciBzdGFjayA9IGVycm9ySW5mby5zdGFjaztcbiAgICAgIHZhciBjb21wb25lbnRTdGFjayA9IHN0YWNrICE9PSBudWxsID8gc3RhY2sgOiAnJzsgLy8gQnJvd3NlcnMgc3VwcG9ydCBzaWxlbmNpbmcgdW5jYXVnaHQgZXJyb3JzIGJ5IGNhbGxpbmdcbiAgICAgIC8vIGBwcmV2ZW50RGVmYXVsdCgpYCBpbiB3aW5kb3cgYGVycm9yYCBoYW5kbGVyLlxuICAgICAgLy8gV2UgcmVjb3JkIHRoaXMgaW5mb3JtYXRpb24gYXMgYW4gZXhwYW5kbyBvbiB0aGUgZXJyb3IuXG5cbiAgICAgIGlmIChlcnJvciAhPSBudWxsICYmIGVycm9yLl9zdXBwcmVzc0xvZ2dpbmcpIHtcbiAgICAgICAgaWYgKGJvdW5kYXJ5LnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAvLyBUaGUgZXJyb3IgaXMgcmVjb3ZlcmFibGUgYW5kIHdhcyBzaWxlbmNlZC5cbiAgICAgICAgICAvLyBJZ25vcmUgaXQgYW5kIGRvbid0IHByaW50IHRoZSBzdGFjayBhZGRlbmR1bS5cbiAgICAgICAgICAvLyBUaGlzIGlzIGhhbmR5IGZvciB0ZXN0aW5nIGVycm9yIGJvdW5kYXJpZXMgd2l0aG91dCBub2lzZS5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gLy8gVGhlIGVycm9yIGlzIGZhdGFsLiBTaW5jZSB0aGUgc2lsZW5jaW5nIG1pZ2h0IGhhdmVcbiAgICAgICAgLy8gYmVlbiBhY2NpZGVudGFsLCB3ZSdsbCBzdXJmYWNlIGl0IGFueXdheS5cbiAgICAgICAgLy8gSG93ZXZlciwgdGhlIGJyb3dzZXIgd291bGQgaGF2ZSBzaWxlbmNlZCB0aGUgb3JpZ2luYWwgZXJyb3JcbiAgICAgICAgLy8gc28gd2UnbGwgcHJpbnQgaXQgZmlyc3QsIGFuZCB0aGVuIHByaW50IHRoZSBzdGFjayBhZGRlbmR1bS5cblxuXG4gICAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oZXJyb3IpOyAvLyBEb24ndCB0cmFuc2Zvcm0gdG8gb3VyIHdyYXBwZXJcbiAgICAgICAgLy8gRm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGlzIGJsb2NrLCBzZWU6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzEzMzg0XG4gICAgICB9XG5cbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gc291cmNlID8gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihzb3VyY2UpIDogbnVsbDtcbiAgICAgIHZhciBjb21wb25lbnROYW1lTWVzc2FnZSA9IGNvbXBvbmVudE5hbWUgPyBcIlRoZSBhYm92ZSBlcnJvciBvY2N1cnJlZCBpbiB0aGUgPFwiICsgY29tcG9uZW50TmFtZSArIFwiPiBjb21wb25lbnQ6XCIgOiAnVGhlIGFib3ZlIGVycm9yIG9jY3VycmVkIGluIG9uZSBvZiB5b3VyIFJlYWN0IGNvbXBvbmVudHM6JztcbiAgICAgIHZhciBlcnJvckJvdW5kYXJ5TWVzc2FnZTtcblxuICAgICAgaWYgKGJvdW5kYXJ5LnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgICAgZXJyb3JCb3VuZGFyeU1lc3NhZ2UgPSAnQ29uc2lkZXIgYWRkaW5nIGFuIGVycm9yIGJvdW5kYXJ5IHRvIHlvdXIgdHJlZSB0byBjdXN0b21pemUgZXJyb3IgaGFuZGxpbmcgYmVoYXZpb3IuXFxuJyArICdWaXNpdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZXJyb3ItYm91bmRhcmllcyB0byBsZWFybiBtb3JlIGFib3V0IGVycm9yIGJvdW5kYXJpZXMuJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBlcnJvckJvdW5kYXJ5TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoYm91bmRhcnkpIHx8ICdBbm9ueW1vdXMnO1xuICAgICAgICBlcnJvckJvdW5kYXJ5TWVzc2FnZSA9IFwiUmVhY3Qgd2lsbCB0cnkgdG8gcmVjcmVhdGUgdGhpcyBjb21wb25lbnQgdHJlZSBmcm9tIHNjcmF0Y2ggXCIgKyAoXCJ1c2luZyB0aGUgZXJyb3IgYm91bmRhcnkgeW91IHByb3ZpZGVkLCBcIiArIGVycm9yQm91bmRhcnlOYW1lICsgXCIuXCIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29tYmluZWRNZXNzYWdlID0gY29tcG9uZW50TmFtZU1lc3NhZ2UgKyBcIlxcblwiICsgY29tcG9uZW50U3RhY2sgKyBcIlxcblxcblwiICsgKFwiXCIgKyBlcnJvckJvdW5kYXJ5TWVzc2FnZSk7IC8vIEluIGRldmVsb3BtZW50LCB3ZSBwcm92aWRlIG91ciBvd24gbWVzc2FnZSB3aXRoIGp1c3QgdGhlIGNvbXBvbmVudCBzdGFjay5cbiAgICAgIC8vIFdlIGRvbid0IGluY2x1ZGUgdGhlIG9yaWdpbmFsIGVycm9yIG1lc3NhZ2UgYW5kIEpTIHN0YWNrIGJlY2F1c2UgdGhlIGJyb3dzZXJcbiAgICAgIC8vIGhhcyBhbHJlYWR5IHByaW50ZWQgaXQuIEV2ZW4gaWYgdGhlIGFwcGxpY2F0aW9uIHN3YWxsb3dzIHRoZSBlcnJvciwgaXQgaXMgc3RpbGxcbiAgICAgIC8vIGRpc3BsYXllZCBieSB0aGUgYnJvd3NlciB0aGFua3MgdG8gdGhlIERFVi1vbmx5IGZha2UgZXZlbnQgdHJpY2sgaW4gUmVhY3RFcnJvclV0aWxzLlxuXG4gICAgICBjb25zb2xlWydlcnJvciddKGNvbWJpbmVkTWVzc2FnZSk7IC8vIERvbid0IHRyYW5zZm9ybSB0byBvdXIgd3JhcHBlclxuICAgIH0gZWxzZSB7fVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3csIG9yIFJlYWN0IGludGVybmFsIHN0YXRlIHdpbGwgZ2V0IG1lc3NlZCB1cC5cbiAgICAvLyBJZiBjb25zb2xlLmVycm9yIGlzIG92ZXJyaWRkZW4sIG9yIGxvZ0NhcHR1cmVkRXJyb3IoKSBzaG93cyBhIGRpYWxvZyB0aGF0IHRocm93cyxcbiAgICAvLyB3ZSB3YW50IHRvIHJlcG9ydCB0aGlzIGVycm9yIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBzdGFjayBhcyBhIGxhc3QgcmVzb3J0LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTMxODhcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG4gIH1cbn1cblxudmFyIFBvc3NpYmx5V2Vha01hcCQxID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwO1xuXG5mdW5jdGlvbiBjcmVhdGVSb290RXJyb3JVcGRhdGUoZmliZXIsIGVycm9ySW5mbywgbGFuZSkge1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBsYW5lKTsgLy8gVW5tb3VudCB0aGUgcm9vdCBieSByZW5kZXJpbmcgbnVsbC5cblxuICB1cGRhdGUudGFnID0gQ2FwdHVyZVVwZGF0ZTsgLy8gQ2F1dGlvbjogUmVhY3QgRGV2VG9vbHMgY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcm9wZXJ0eVxuICAvLyBiZWluZyBjYWxsZWQgXCJlbGVtZW50XCIuXG5cbiAgdXBkYXRlLnBheWxvYWQgPSB7XG4gICAgZWxlbWVudDogbnVsbFxuICB9O1xuICB2YXIgZXJyb3IgPSBlcnJvckluZm8udmFsdWU7XG5cbiAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgIG9uVW5jYXVnaHRFcnJvcihlcnJvcik7XG4gICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcbiAgfTtcblxuICByZXR1cm4gdXBkYXRlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShOb1RpbWVzdGFtcCwgbGFuZSk7XG4gIHVwZGF0ZS50YWcgPSBDYXB0dXJlVXBkYXRlO1xuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID0gZmliZXIudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I7XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZXJyb3IkMSA9IGVycm9ySW5mby52YWx1ZTtcblxuICAgIHVwZGF0ZS5wYXlsb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvciQxKTtcbiAgICB9O1xuXG4gICAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAge1xuICAgICAgICBtYXJrRmFpbGVkRXJyb3JCb3VuZGFyeUZvckhvdFJlbG9hZGluZyhmaWJlcik7XG4gICAgICB9XG5cbiAgICAgIGxvZ0NhcHR1cmVkRXJyb3IoZmliZXIsIGVycm9ySW5mbyk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBpbnN0ID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gIGlmIChpbnN0ICE9PSBudWxsICYmIHR5cGVvZiBpbnN0LmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgICB7XG4gICAgICAgIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKTtcbiAgICAgIH1cblxuICAgICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcblxuICAgICAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVG8gcHJlc2VydmUgdGhlIHByZWV4aXN0aW5nIHJldHJ5IGJlaGF2aW9yIG9mIGVycm9yIGJvdW5kYXJpZXMsXG4gICAgICAgIC8vIHdlIGtlZXAgdHJhY2sgb2Ygd2hpY2ggb25lcyBhbHJlYWR5IGZhaWxlZCBkdXJpbmcgdGhpcyBiYXRjaC5cbiAgICAgICAgLy8gVGhpcyBnZXRzIHJlc2V0IGJlZm9yZSB3ZSB5aWVsZCBiYWNrIHRvIHRoZSBicm93c2VyLlxuICAgICAgICAvLyBUT0RPOiBXYXJuIGluIHN0cmljdCBtb2RlIGlmIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciBpc1xuICAgICAgICAvLyBub3QgZGVmaW5lZC5cbiAgICAgICAgbWFya0xlZ2FjeUVycm9yQm91bmRhcnlBc0ZhaWxlZCh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGVycm9yJDEgPSBlcnJvckluZm8udmFsdWU7XG4gICAgICB2YXIgc3RhY2sgPSBlcnJvckluZm8uc3RhY2s7XG4gICAgICB0aGlzLmNvbXBvbmVudERpZENhdGNoKGVycm9yJDEsIHtcbiAgICAgICAgY29tcG9uZW50U3RhY2s6IHN0YWNrICE9PSBudWxsID8gc3RhY2sgOiAnJ1xuICAgICAgfSk7XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBJZiBjb21wb25lbnREaWRDYXRjaCBpcyB0aGUgb25seSBlcnJvciBib3VuZGFyeSBtZXRob2QgZGVmaW5lZCxcbiAgICAgICAgICAvLyB0aGVuIGl0IG5lZWRzIHRvIGNhbGwgc2V0U3RhdGUgdG8gcmVjb3ZlciBmcm9tIGVycm9ycy5cbiAgICAgICAgICAvLyBJZiBubyBzdGF0ZSB1cGRhdGUgaXMgc2NoZWR1bGVkIHRoZW4gdGhlIGJvdW5kYXJ5IHdpbGwgc3dhbGxvdyB0aGUgZXJyb3IuXG4gICAgICAgICAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKGZpYmVyLmxhbmVzLCBTeW5jTGFuZSkpIHtcbiAgICAgICAgICAgIGVycm9yKCclczogRXJyb3IgYm91bmRhcmllcyBzaG91bGQgaW1wbGVtZW50IGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcigpLiAnICsgJ0luIHRoYXQgbWV0aG9kLCByZXR1cm4gYSBzdGF0ZSB1cGRhdGUgdG8gZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIG9yIGZhbGxiYWNrIFVJLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGU7XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB3YWtlYWJsZSwgbGFuZXMpIHtcbiAgLy8gQXR0YWNoIGEgcGluZyBsaXN0ZW5lclxuICAvL1xuICAvLyBUaGUgZGF0YSBtaWdodCByZXNvbHZlIGJlZm9yZSB3ZSBoYXZlIGEgY2hhbmNlIHRvIGNvbW1pdCB0aGUgZmFsbGJhY2suIE9yLFxuICAvLyBpbiB0aGUgY2FzZSBvZiBhIHJlZnJlc2gsIHdlJ2xsIG5ldmVyIGNvbW1pdCBhIGZhbGxiYWNrLiBTbyB3ZSBuZWVkIHRvXG4gIC8vIGF0dGFjaCBhIGxpc3RlbmVyIG5vdy4gV2hlbiBpdCByZXNvbHZlcyAoXCJwaW5nc1wiKSwgd2UgY2FuIGRlY2lkZSB3aGV0aGVyIHRvXG4gIC8vIHRyeSByZW5kZXJpbmcgdGhlIHRyZWUgYWdhaW4uXG4gIC8vXG4gIC8vIE9ubHkgYXR0YWNoIGEgbGlzdGVuZXIgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgZm9yIHRoZSBsYW5lc1xuICAvLyB3ZSdyZSBjdXJyZW50bHkgcmVuZGVyaW5nICh3aGljaCBhY3RzIGxpa2UgYSBcInRocmVhZCBJRFwiIGhlcmUpLlxuICAvL1xuICAvLyBXZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBpbiBjb25jdXJyZW50IG1vZGUuIExlZ2FjeSBTdXNwZW5zZSBhbHdheXNcbiAgLy8gY29tbWl0cyBmYWxsYmFja3Mgc3luY2hyb25vdXNseSwgc28gdGhlcmUgYXJlIG5vIHBpbmdzLlxuICB2YXIgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGU7XG4gIHZhciB0aHJlYWRJRHM7XG5cbiAgaWYgKHBpbmdDYWNoZSA9PT0gbnVsbCkge1xuICAgIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlID0gbmV3IFBvc3NpYmx5V2Vha01hcCQxKCk7XG4gICAgdGhyZWFkSURzID0gbmV3IFNldCgpO1xuICAgIHBpbmdDYWNoZS5zZXQod2FrZWFibGUsIHRocmVhZElEcyk7XG4gIH0gZWxzZSB7XG4gICAgdGhyZWFkSURzID0gcGluZ0NhY2hlLmdldCh3YWtlYWJsZSk7XG5cbiAgICBpZiAodGhyZWFkSURzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocmVhZElEcyA9IG5ldyBTZXQoKTtcbiAgICAgIHBpbmdDYWNoZS5zZXQod2FrZWFibGUsIHRocmVhZElEcyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCF0aHJlYWRJRHMuaGFzKGxhbmVzKSkge1xuICAgIC8vIE1lbW9pemUgdXNpbmcgdGhlIHRocmVhZCBJRCB0byBwcmV2ZW50IHJlZHVuZGFudCBsaXN0ZW5lcnMuXG4gICAgdGhyZWFkSURzLmFkZChsYW5lcyk7XG4gICAgdmFyIHBpbmcgPSBwaW5nU3VzcGVuZGVkUm9vdC5iaW5kKG51bGwsIHJvb3QsIHdha2VhYmxlLCBsYW5lcyk7XG5cbiAgICB7XG4gICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHdvcmsgc3RpbGwsIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHVwZGF0ZXJzXG4gICAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgbGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdha2VhYmxlLnRoZW4ocGluZywgcGluZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXR0YWNoUmV0cnlMaXN0ZW5lcihzdXNwZW5zZUJvdW5kYXJ5LCByb290LCB3YWtlYWJsZSwgbGFuZXMpIHtcbiAgLy8gUmV0cnkgbGlzdGVuZXJcbiAgLy9cbiAgLy8gSWYgdGhlIGZhbGxiYWNrIGRvZXMgY29tbWl0LCB3ZSBuZWVkIHRvIGF0dGFjaCBhIGRpZmZlcmVudCB0eXBlIG9mXG4gIC8vIGxpc3RlbmVyLiBUaGlzIG9uZSBzY2hlZHVsZXMgYW4gdXBkYXRlIG9uIHRoZSBTdXNwZW5zZSBib3VuZGFyeSB0byB0dXJuXG4gIC8vIHRoZSBmYWxsYmFjayBzdGF0ZSBvZmYuXG4gIC8vXG4gIC8vIFN0YXNoIHRoZSB3YWtlYWJsZSBvbiB0aGUgYm91bmRhcnkgZmliZXIgc28gd2UgY2FuIGFjY2VzcyBpdCBpbiB0aGVcbiAgLy8gY29tbWl0IHBoYXNlLlxuICAvL1xuICAvLyBXaGVuIHRoZSB3YWtlYWJsZSByZXNvbHZlcywgd2UnbGwgYXR0ZW1wdCB0byByZW5kZXIgdGhlIGJvdW5kYXJ5XG4gIC8vIGFnYWluIChcInJldHJ5XCIpLlxuICB2YXIgd2FrZWFibGVzID0gc3VzcGVuc2VCb3VuZGFyeS51cGRhdGVRdWV1ZTtcblxuICBpZiAod2FrZWFibGVzID09PSBudWxsKSB7XG4gICAgdmFyIHVwZGF0ZVF1ZXVlID0gbmV3IFNldCgpO1xuICAgIHVwZGF0ZVF1ZXVlLmFkZCh3YWtlYWJsZSk7XG4gICAgc3VzcGVuc2VCb3VuZGFyeS51cGRhdGVRdWV1ZSA9IHVwZGF0ZVF1ZXVlO1xuICB9IGVsc2Uge1xuICAgIHdha2VhYmxlcy5hZGQod2FrZWFibGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0U3VzcGVuZGVkQ29tcG9uZW50KHNvdXJjZUZpYmVyLCByb290UmVuZGVyTGFuZXMpIHtcbiAgLy8gQSBsZWdhY3kgbW9kZSBTdXNwZW5zZSBxdWlyaywgb25seSByZWxldmFudCB0byBob29rIGNvbXBvbmVudHMuXG5cblxuICB2YXIgdGFnID0gc291cmNlRmliZXIudGFnO1xuXG4gIGlmICgoc291cmNlRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmICh0YWcgPT09IEZ1bmN0aW9uQ29tcG9uZW50IHx8IHRhZyA9PT0gRm9yd2FyZFJlZiB8fCB0YWcgPT09IFNpbXBsZU1lbW9Db21wb25lbnQpKSB7XG4gICAgdmFyIGN1cnJlbnRTb3VyY2UgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudFNvdXJjZSkge1xuICAgICAgc291cmNlRmliZXIudXBkYXRlUXVldWUgPSBjdXJyZW50U291cmNlLnVwZGF0ZVF1ZXVlO1xuICAgICAgc291cmNlRmliZXIubWVtb2l6ZWRTdGF0ZSA9IGN1cnJlbnRTb3VyY2UubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIHNvdXJjZUZpYmVyLmxhbmVzID0gY3VycmVudFNvdXJjZS5sYW5lcztcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRmliZXIudXBkYXRlUXVldWUgPSBudWxsO1xuICAgICAgc291cmNlRmliZXIubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE5lYXJlc3RTdXNwZW5zZUJvdW5kYXJ5VG9DYXB0dXJlKHJldHVybkZpYmVyKSB7XG4gIHZhciBub2RlID0gcmV0dXJuRmliZXI7XG5cbiAgZG8ge1xuICAgIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQgJiYgc2hvdWxkQ2FwdHVyZVN1c3BlbnNlKG5vZGUpKSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9IC8vIFRoaXMgYm91bmRhcnkgYWxyZWFkeSBjYXB0dXJlZCBkdXJpbmcgdGhpcyByZW5kZXIuIENvbnRpbnVlIHRvIHRoZSBuZXh0XG4gICAgLy8gYm91bmRhcnkuXG5cblxuICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgfSB3aGlsZSAobm9kZSAhPT0gbnVsbCk7XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIG1hcmtTdXNwZW5zZUJvdW5kYXJ5U2hvdWxkQ2FwdHVyZShzdXNwZW5zZUJvdW5kYXJ5LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHJvb3QsIHJvb3RSZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIG1hcmtzIGEgU3VzcGVuc2UgYm91bmRhcnkgc28gdGhhdCB3aGVuIHdlJ3JlIHVud2luZGluZyB0aGUgc3RhY2ssXG4gIC8vIGl0IGNhcHR1cmVzIHRoZSBzdXNwZW5kZWQgXCJleGNlcHRpb25cIiBhbmQgZG9lcyBhIHNlY29uZCAoZmFsbGJhY2spIHBhc3MuXG4gIGlmICgoc3VzcGVuc2VCb3VuZGFyeS5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICAvLyBMZWdhY3kgTW9kZSBTdXNwZW5zZVxuICAgIC8vXG4gICAgLy8gSWYgdGhlIGJvdW5kYXJ5IGlzIGluIGxlZ2FjeSBtb2RlLCB3ZSBzaG91bGQgKm5vdCpcbiAgICAvLyBzdXNwZW5kIHRoZSBjb21taXQuIFByZXRlbmQgYXMgaWYgdGhlIHN1c3BlbmRlZCBjb21wb25lbnQgcmVuZGVyZWRcbiAgICAvLyBudWxsIGFuZCBrZWVwIHJlbmRlcmluZy4gV2hlbiB0aGUgU3VzcGVuc2UgYm91bmRhcnkgY29tcGxldGVzLFxuICAgIC8vIHdlJ2xsIGRvIGEgc2Vjb25kIHBhc3MgdG8gcmVuZGVyIHRoZSBmYWxsYmFjay5cbiAgICBpZiAoc3VzcGVuc2VCb3VuZGFyeSA9PT0gcmV0dXJuRmliZXIpIHtcbiAgICAgIC8vIFNwZWNpYWwgY2FzZSB3aGVyZSB3ZSBzdXNwZW5kZWQgd2hpbGUgcmVjb25jaWxpbmcgdGhlIGNoaWxkcmVuIG9mXG4gICAgICAvLyBhIFN1c3BlbnNlIGJvdW5kYXJ5J3MgaW5uZXIgT2Zmc2NyZWVuIHdyYXBwZXIgZmliZXIuIFRoaXMgaGFwcGVuc1xuICAgICAgLy8gd2hlbiBhIFJlYWN0LmxhenkgY29tcG9uZW50IGlzIGEgZGlyZWN0IGNoaWxkIG9mIGFcbiAgICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJ5LlxuICAgICAgLy9cbiAgICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJpZXMgYXJlIGltcGxlbWVudGVkIGFzIG11bHRpcGxlIGZpYmVycywgYnV0IHRoZXlcbiAgICAgIC8vIGFyZSBhIHNpbmdsZSBjb25jZXB0dWFsIHVuaXQuIFRoZSBsZWdhY3kgbW9kZSBiZWhhdmlvciB3aGVyZSB3ZVxuICAgICAgLy8gcHJldGVuZCB0aGUgc3VzcGVuZGVkIGZpYmVyIGNvbW1pdHRlZCBhcyBgbnVsbGAgd29uJ3Qgd29yayxcbiAgICAgIC8vIGJlY2F1c2UgaW4gdGhpcyBjYXNlIHRoZSBcInN1c3BlbmRlZFwiIGZpYmVyIGlzIHRoZSBpbm5lclxuICAgICAgLy8gT2Zmc2NyZWVuIHdyYXBwZXIuXG4gICAgICAvL1xuICAgICAgLy8gQmVjYXVzZSB0aGUgY29udGVudHMgb2YgdGhlIGJvdW5kYXJ5IGhhdmVuJ3Qgc3RhcnRlZCByZW5kZXJpbmdcbiAgICAgIC8vIHlldCAoaS5lLiBub3RoaW5nIGluIHRoZSB0cmVlIGhhcyBwYXJ0aWFsbHkgcmVuZGVyZWQpIHdlIGNhblxuICAgICAgLy8gc3dpdGNoIHRvIHRoZSByZWd1bGFyLCBjb25jdXJyZW50IG1vZGUgYmVoYXZpb3I6IG1hcmsgdGhlXG4gICAgICAvLyBib3VuZGFyeSB3aXRoIFNob3VsZENhcHR1cmUgYW5kIGVudGVyIHRoZSB1bndpbmQgcGhhc2UuXG4gICAgICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IFNob3VsZENhcHR1cmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgIHNvdXJjZUZpYmVyLmZsYWdzIHw9IEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2U7IC8vIFdlJ3JlIGdvaW5nIHRvIGNvbW1pdCB0aGlzIGZpYmVyIGV2ZW4gdGhvdWdoIGl0IGRpZG4ndCBjb21wbGV0ZS5cbiAgICAgIC8vIEJ1dCB3ZSBzaG91bGRuJ3QgY2FsbCBhbnkgbGlmZWN5Y2xlIG1ldGhvZHMgb3IgY2FsbGJhY2tzLiBSZW1vdmVcbiAgICAgIC8vIGFsbCBsaWZlY3ljbGUgZWZmZWN0IHRhZ3MuXG5cbiAgICAgIHNvdXJjZUZpYmVyLmZsYWdzICY9IH4oTGlmZWN5Y2xlRWZmZWN0TWFzayB8IEluY29tcGxldGUpO1xuXG4gICAgICBpZiAoc291cmNlRmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICB2YXIgY3VycmVudFNvdXJjZUZpYmVyID0gc291cmNlRmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgIGlmIChjdXJyZW50U291cmNlRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgbmV3IG1vdW50LiBDaGFuZ2UgdGhlIHRhZyBzbyBpdCdzIG5vdCBtaXN0YWtlbiBmb3IgYVxuICAgICAgICAgIC8vIGNvbXBsZXRlZCBjbGFzcyBjb21wb25lbnQuIEZvciBleGFtcGxlLCB3ZSBzaG91bGQgbm90IGNhbGxcbiAgICAgICAgICAvLyBjb21wb25lbnRXaWxsVW5tb3VudCBpZiBpdCBpcyBkZWxldGVkLlxuICAgICAgICAgIHNvdXJjZUZpYmVyLnRhZyA9IEluY29tcGxldGVDbGFzc0NvbXBvbmVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXaGVuIHdlIHRyeSByZW5kZXJpbmcgYWdhaW4sIHdlIHNob3VsZCBub3QgcmV1c2UgdGhlIGN1cnJlbnQgZmliZXIsXG4gICAgICAgICAgLy8gc2luY2UgaXQncyBrbm93biB0byBiZSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFVzZSBhIGZvcmNlIHVwZGF0ZSB0b1xuICAgICAgICAgIC8vIHByZXZlbnQgYSBiYWlsIG91dC5cbiAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBTeW5jTGFuZSk7XG4gICAgICAgICAgdXBkYXRlLnRhZyA9IEZvcmNlVXBkYXRlO1xuICAgICAgICAgIGVucXVldWVVcGRhdGUoc291cmNlRmliZXIsIHVwZGF0ZSwgU3luY0xhbmUpO1xuICAgICAgICB9XG4gICAgICB9IC8vIFRoZSBzb3VyY2UgZmliZXIgZGlkIG5vdCBjb21wbGV0ZS4gTWFyayBpdCB3aXRoIFN5bmMgcHJpb3JpdHkgdG9cbiAgICAgIC8vIGluZGljYXRlIHRoYXQgaXQgc3RpbGwgaGFzIHBlbmRpbmcgd29yay5cblxuXG4gICAgICBzb3VyY2VGaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoc291cmNlRmliZXIubGFuZXMsIFN5bmNMYW5lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VzcGVuc2VCb3VuZGFyeTtcbiAgfSAvLyBDb25maXJtZWQgdGhhdCB0aGUgYm91bmRhcnkgaXMgaW4gYSBjb25jdXJyZW50IG1vZGUgdHJlZS4gQ29udGludWVcbiAgLy8gd2l0aCB0aGUgbm9ybWFsIHN1c3BlbmQgcGF0aC5cbiAgLy9cbiAgLy8gQWZ0ZXIgdGhpcyB3ZSdsbCB1c2UgYSBzZXQgb2YgaGV1cmlzdGljcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzXG4gIC8vIHJlbmRlciBwYXNzIHdpbGwgcnVuIHRvIGNvbXBsZXRpb24gb3IgcmVzdGFydCBvciBcInN1c3BlbmRcIiB0aGUgY29tbWl0LlxuICAvLyBUaGUgYWN0dWFsIGxvZ2ljIGZvciB0aGlzIGlzIHNwcmVhZCBvdXQgaW4gZGlmZmVyZW50IHBsYWNlcy5cbiAgLy9cbiAgLy8gVGhpcyBmaXJzdCBwcmluY2lwbGUgaXMgdGhhdCBpZiB3ZSdyZSBnb2luZyB0byBzdXNwZW5kIHdoZW4gd2UgY29tcGxldGVcbiAgLy8gYSByb290LCB0aGVuIHdlIHNob3VsZCBhbHNvIHJlc3RhcnQgaWYgd2UgZ2V0IGFuIHVwZGF0ZSBvciBwaW5nIHRoYXRcbiAgLy8gbWlnaHQgdW5zdXNwZW5kIGl0LCBhbmQgdmljZSB2ZXJzYS4gVGhlIG9ubHkgcmVhc29uIHRvIHN1c3BlbmQgaXNcbiAgLy8gYmVjYXVzZSB5b3UgdGhpbmsgeW91IG1pZ2h0IHdhbnQgdG8gcmVzdGFydCBiZWZvcmUgY29tbWl0dGluZy4gSG93ZXZlcixcbiAgLy8gaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIHJlc3RhcnQgb25seSB3aGlsZSBpbiB0aGUgcGVyaW9kIHdlJ3JlIHN1c3BlbmRlZC5cbiAgLy9cbiAgLy8gUmVzdGFydGluZyB0b28gYWdncmVzc2l2ZWx5IGlzIGFsc28gbm90IGdvb2QgYmVjYXVzZSBpdCBzdGFydmVzIG91dCBhbnlcbiAgLy8gaW50ZXJtZWRpYXRlIGxvYWRpbmcgc3RhdGUuIFNvIHdlIHVzZSBoZXVyaXN0aWNzIHRvIGRldGVybWluZSB3aGVuLlxuICAvLyBTdXNwZW5zZSBIZXVyaXN0aWNzXG4gIC8vXG4gIC8vIElmIG5vdGhpbmcgdGhyZXcgYSBQcm9taXNlIG9yIGFsbCB0aGUgc2FtZSBmYWxsYmFja3MgYXJlIGFscmVhZHkgc2hvd2luZyxcbiAgLy8gdGhlbiBkb24ndCBzdXNwZW5kL3Jlc3RhcnQuXG4gIC8vXG4gIC8vIElmIHRoaXMgaXMgYW4gaW5pdGlhbCByZW5kZXIgb2YgYSBuZXcgdHJlZSBvZiBTdXNwZW5zZSBib3VuZGFyaWVzIGFuZFxuICAvLyB0aG9zZSB0cmlnZ2VyIGEgZmFsbGJhY2ssIHRoZW4gZG9uJ3Qgc3VzcGVuZC9yZXN0YXJ0LiBXZSB3YW50IHRvIGVuc3VyZVxuICAvLyB0aGF0IHdlIGNhbiBzaG93IHRoZSBpbml0aWFsIGxvYWRpbmcgc3RhdGUgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS5cbiAgLy9cbiAgLy8gSWYgd2UgaGl0IGEgXCJEZWxheWVkXCIgY2FzZSwgc3VjaCBhcyB3aGVuIHdlJ2Qgc3dpdGNoIGZyb20gY29udGVudCBiYWNrIGludG9cbiAgLy8gYSBmYWxsYmFjaywgdGhlbiB3ZSBzaG91bGQgYWx3YXlzIHN1c3BlbmQvcmVzdGFydC4gVHJhbnNpdGlvbnMgYXBwbHlcbiAgLy8gdG8gdGhpcyBjYXNlLiBJZiBub25lIGlzIGRlZmluZWQsIEpORCBpcyB1c2VkIGluc3RlYWQuXG4gIC8vXG4gIC8vIElmIHdlJ3JlIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrIGFuZCBpdCBnZXRzIFwicmV0cmllZFwiLCBhbGxvd2luZyB1cyB0byBzaG93XG4gIC8vIGFub3RoZXIgbGV2ZWwsIGJ1dCB0aGVyZSdzIHN0aWxsIGFuIGlubmVyIGJvdW5kYXJ5IHRoYXQgd291bGQgc2hvdyBhIGZhbGxiYWNrLFxuICAvLyB0aGVuIHdlIHN1c3BlbmQvcmVzdGFydCBmb3IgNTAwbXMgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBzaG93ZWQgYSBmYWxsYmFja1xuICAvLyBhbnl3aGVyZSBpbiB0aGUgdHJlZS4gVGhpcyBlZmZlY3RpdmVseSB0aHJvdHRsZXMgcHJvZ3Jlc3NpdmUgbG9hZGluZyBpbnRvIGFcbiAgLy8gY29uc2lzdGVudCB0cmFpbiBvZiBjb21taXRzLiBUaGlzIGFsc28gZ2l2ZXMgdXMgYW4gb3Bwb3J0dW5pdHkgdG8gcmVzdGFydCB0b1xuICAvLyBnZXQgdG8gdGhlIGNvbXBsZXRlZCBzdGF0ZSBzbGlnaHRseSBlYXJsaWVyLlxuICAvL1xuICAvLyBJZiB0aGVyZSdzIGFtYmlndWl0eSBkdWUgdG8gYmF0Y2hpbmcgaXQncyByZXNvbHZlZCBpbiBwcmVmZXJlbmNlIG9mOlxuICAvLyAxKSBcImRlbGF5ZWRcIiwgMikgXCJpbml0aWFsIHJlbmRlclwiLCAzKSBcInJldHJ5XCIuXG4gIC8vXG4gIC8vIFdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgYSBcImJ1c3lcIiBzdGF0ZSBkb2Vzbid0IGdldCBmb3JjZSBjb21taXR0ZWQuIFdlIHdhbnQgdG9cbiAgLy8gZW5zdXJlIHRoYXQgbmV3IGluaXRpYWwgbG9hZGluZyBzdGF0ZXMgY2FuIGNvbW1pdCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuXG5cbiAgc3VzcGVuc2VCb3VuZGFyeS5mbGFncyB8PSBTaG91bGRDYXB0dXJlOyAvLyBUT0RPOiBJIHRoaW5rIHdlIGNhbiByZW1vdmUgdGhpcywgc2luY2Ugd2Ugbm93IHVzZSBgRGlkQ2FwdHVyZWAgaW5cbiAgLy8gdGhlIGJlZ2luIHBoYXNlIHRvIHByZXZlbnQgYW4gZWFybHkgYmFpbG91dC5cblxuICBzdXNwZW5zZUJvdW5kYXJ5LmxhbmVzID0gcm9vdFJlbmRlckxhbmVzO1xuICByZXR1cm4gc3VzcGVuc2VCb3VuZGFyeTtcbn1cblxuZnVuY3Rpb24gdGhyb3dFeGNlcHRpb24ocm9vdCwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCB2YWx1ZSwgcm9vdFJlbmRlckxhbmVzKSB7XG4gIC8vIFRoZSBzb3VyY2UgZmliZXIgZGlkIG5vdCBjb21wbGV0ZS5cbiAgc291cmNlRmliZXIuZmxhZ3MgfD0gSW5jb21wbGV0ZTtcblxuICB7XG4gICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgd29yayBzdGlsbCwgcmVzdG9yZSB0aGUgb3JpZ2luYWwgdXBkYXRlcnNcbiAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgcm9vdFJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH1cblxuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIFRoaXMgaXMgYSB3YWtlYWJsZS4gVGhlIGNvbXBvbmVudCBzdXNwZW5kZWQuXG4gICAgdmFyIHdha2VhYmxlID0gdmFsdWU7XG4gICAgcmVzZXRTdXNwZW5kZWRDb21wb25lbnQoc291cmNlRmliZXIpO1xuXG4gICAge1xuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgc291cmNlRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICAgIG1hcmtEaWRUaHJvd1doaWxlSHlkcmF0aW5nREVWKCk7XG4gICAgICB9XG4gICAgfVxuXG5cbiAgICB2YXIgc3VzcGVuc2VCb3VuZGFyeSA9IGdldE5lYXJlc3RTdXNwZW5zZUJvdW5kYXJ5VG9DYXB0dXJlKHJldHVybkZpYmVyKTtcblxuICAgIGlmIChzdXNwZW5zZUJvdW5kYXJ5ICE9PSBudWxsKSB7XG4gICAgICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzICY9IH5Gb3JjZUNsaWVudFJlbmRlcjtcbiAgICAgIG1hcmtTdXNwZW5zZUJvdW5kYXJ5U2hvdWxkQ2FwdHVyZShzdXNwZW5zZUJvdW5kYXJ5LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHJvb3QsIHJvb3RSZW5kZXJMYW5lcyk7IC8vIFdlIG9ubHkgYXR0YWNoIHBpbmcgbGlzdGVuZXJzIGluIGNvbmN1cnJlbnQgbW9kZS4gTGVnYWN5IFN1c3BlbnNlIGFsd2F5c1xuICAgICAgLy8gY29tbWl0cyBmYWxsYmFja3Mgc3luY2hyb25vdXNseSwgc28gdGhlcmUgYXJlIG5vIHBpbmdzLlxuXG4gICAgICBpZiAoc3VzcGVuc2VCb3VuZGFyeS5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgICAgYXR0YWNoUGluZ0xpc3RlbmVyKHJvb3QsIHdha2VhYmxlLCByb290UmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBhdHRhY2hSZXRyeUxpc3RlbmVyKHN1c3BlbnNlQm91bmRhcnksIHJvb3QsIHdha2VhYmxlKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gYm91bmRhcnkgd2FzIGZvdW5kLiBVbmxlc3MgdGhpcyBpcyBhIHN5bmMgdXBkYXRlLCB0aGlzIGlzIE9LLlxuICAgICAgLy8gV2UgY2FuIHN1c3BlbmQgYW5kIHdhaXQgZm9yIG1vcmUgZGF0YSB0byBhcnJpdmUuXG4gICAgICBpZiAoIWluY2x1ZGVzU3luY0xhbmUocm9vdFJlbmRlckxhbmVzKSkge1xuICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIHN5bmMgdXBkYXRlLiBTdXNwZW5kLiBTaW5jZSB3ZSdyZSBub3QgYWN0aXZhdGluZyBhXG4gICAgICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJ5LCB0aGlzIHdpbGwgdW53aW5kIGFsbCB0aGUgd2F5IHRvIHRoZSByb290IHdpdGhvdXRcbiAgICAgICAgLy8gcGVyZm9ybWluZyBhIHNlY29uZCBwYXNzIHRvIHJlbmRlciBhIGZhbGxiYWNrLiAoVGhpcyBpcyBhcmd1YWJseSBob3dcbiAgICAgICAgLy8gcmVmcmVzaCB0cmFuc2l0aW9ucyBzaG91bGQgd29yaywgdG9vLCBzaW5jZSB3ZSdyZSBub3QgZ29pbmcgdG8gY29tbWl0XG4gICAgICAgIC8vIHRoZSBmYWxsYmFja3MgYW55d2F5LilcbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhpcyBjYXNlIGFsc28gYXBwbGllcyB0byBpbml0aWFsIGh5ZHJhdGlvbi5cbiAgICAgICAgYXR0YWNoUGluZ0xpc3RlbmVyKHJvb3QsIHdha2VhYmxlLCByb290UmVuZGVyTGFuZXMpO1xuICAgICAgICByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gVGhpcyBpcyBhIHN5bmMvZGlzY3JldGUgdXBkYXRlLiBXZSB0cmVhdCB0aGlzIGNhc2UgbGlrZSBhbiBlcnJvclxuICAgICAgLy8gYmVjYXVzZSBkaXNjcmV0ZSByZW5kZXJzIGFyZSBleHBlY3RlZCB0byBwcm9kdWNlIGEgY29tcGxldGUgdHJlZVxuICAgICAgLy8gc3luY2hyb25vdXNseSB0byBtYWludGFpbiBjb25zaXN0ZW5jeSB3aXRoIGV4dGVybmFsIHN0YXRlLlxuXG5cbiAgICAgIHZhciB1bmNhdWdodFN1c3BlbnNlRXJyb3IgPSBuZXcgRXJyb3IoJ0EgY29tcG9uZW50IHN1c3BlbmRlZCB3aGlsZSByZXNwb25kaW5nIHRvIHN5bmNocm9ub3VzIGlucHV0LiBUaGlzICcgKyAnd2lsbCBjYXVzZSB0aGUgVUkgdG8gYmUgcmVwbGFjZWQgd2l0aCBhIGxvYWRpbmcgaW5kaWNhdG9yLiBUbyAnICsgJ2ZpeCwgdXBkYXRlcyB0aGF0IHN1c3BlbmQgc2hvdWxkIGJlIHdyYXBwZWQgJyArICd3aXRoIHN0YXJ0VHJhbnNpdGlvbi4nKTsgLy8gSWYgd2UncmUgb3V0c2lkZSBhIHRyYW5zaXRpb24sIGZhbGwgdGhyb3VnaCB0byB0aGUgcmVndWxhciBlcnJvciBwYXRoLlxuICAgICAgLy8gVGhlIGVycm9yIHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZSBuZWFyZXN0IHN1c3BlbnNlIGJvdW5kYXJ5LlxuXG4gICAgICB2YWx1ZSA9IHVuY2F1Z2h0U3VzcGVuc2VFcnJvcjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhIHJlZ3VsYXIgZXJyb3IsIG5vdCBhIFN1c3BlbnNlIHdha2VhYmxlLlxuICAgIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIHNvdXJjZUZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgbWFya0RpZFRocm93V2hpbGVIeWRyYXRpbmdERVYoKTtcblxuICAgICAgdmFyIF9zdXNwZW5zZUJvdW5kYXJ5ID0gZ2V0TmVhcmVzdFN1c3BlbnNlQm91bmRhcnlUb0NhcHR1cmUocmV0dXJuRmliZXIpOyAvLyBJZiB0aGUgZXJyb3Igd2FzIHRocm93biBkdXJpbmcgaHlkcmF0aW9uLCB3ZSBtYXkgYmUgYWJsZSB0byByZWNvdmVyIGJ5XG4gICAgICAvLyBkaXNjYXJkaW5nIHRoZSBkZWh5ZHJhdGVkIGNvbnRlbnQgYW5kIHN3aXRjaGluZyB0byBhIGNsaWVudCByZW5kZXIuXG4gICAgICAvLyBJbnN0ZWFkIG9mIHN1cmZhY2luZyB0aGUgZXJyb3IsIGZpbmQgdGhlIG5lYXJlc3QgU3VzcGVuc2UgYm91bmRhcnlcbiAgICAgIC8vIGFuZCByZW5kZXIgaXQgYWdhaW4gd2l0aG91dCBoeWRyYXRpb24uXG5cblxuICAgICAgaWYgKF9zdXNwZW5zZUJvdW5kYXJ5ICE9PSBudWxsKSB7XG4gICAgICAgIGlmICgoX3N1c3BlbnNlQm91bmRhcnkuZmxhZ3MgJiBTaG91bGRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAgIC8vIFNldCBhIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSBzaG91bGQgdHJ5IHJlbmRlcmluZyB0aGUgbm9ybWFsXG4gICAgICAgICAgLy8gY2hpbGRyZW4gYWdhaW4sIG5vdCB0aGUgZmFsbGJhY2suXG4gICAgICAgICAgX3N1c3BlbnNlQm91bmRhcnkuZmxhZ3MgfD0gRm9yY2VDbGllbnRSZW5kZXI7XG4gICAgICAgIH1cblxuICAgICAgICBtYXJrU3VzcGVuc2VCb3VuZGFyeVNob3VsZENhcHR1cmUoX3N1c3BlbnNlQm91bmRhcnksIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgcm9vdCwgcm9vdFJlbmRlckxhbmVzKTsgLy8gRXZlbiB0aG91Z2ggdGhlIHVzZXIgbWF5IG5vdCBiZSBhZmZlY3RlZCBieSB0aGlzIGVycm9yLCB3ZSBzaG91bGRcbiAgICAgICAgLy8gc3RpbGwgbG9nIGl0IHNvIGl0IGNhbiBiZSBmaXhlZC5cblxuICAgICAgICBxdWV1ZUh5ZHJhdGlvbkVycm9yKGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKHZhbHVlLCBzb3VyY2VGaWJlcikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFsdWUgPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcih2YWx1ZSwgc291cmNlRmliZXIpO1xuICByZW5kZXJEaWRFcnJvcih2YWx1ZSk7IC8vIFdlIGRpZG4ndCBmaW5kIGEgYm91bmRhcnkgdGhhdCBjb3VsZCBoYW5kbGUgdGhpcyB0eXBlIG9mIGV4Y2VwdGlvbi4gU3RhcnRcbiAgLy8gb3ZlciBhbmQgdHJhdmVyc2UgcGFyZW50IHBhdGggYWdhaW4sIHRoaXMgdGltZSB0cmVhdGluZyB0aGUgZXhjZXB0aW9uXG4gIC8vIGFzIGFuIGVycm9yLlxuXG4gIHZhciB3b3JrSW5Qcm9ncmVzcyA9IHJldHVybkZpYmVyO1xuXG4gIGRvIHtcbiAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfZXJyb3JJbmZvID0gdmFsdWU7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTtcbiAgICAgICAgICB2YXIgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBsYW5lKTtcbiAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlUm9vdEVycm9yVXBkYXRlKHdvcmtJblByb2dyZXNzLCBfZXJyb3JJbmZvLCBsYW5lKTtcbiAgICAgICAgICBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIHVwZGF0ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIC8vIENhcHR1cmUgYW5kIHJldHJ5XG4gICAgICAgIHZhciBlcnJvckluZm8gPSB2YWx1ZTtcbiAgICAgICAgdmFyIGN0b3IgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzICYmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicgfHwgaW5zdGFuY2UgIT09IG51bGwgJiYgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTaG91bGRDYXB0dXJlO1xuXG4gICAgICAgICAgdmFyIF9sYW5lID0gcGlja0FyYml0cmFyeUxhbmUocm9vdFJlbmRlckxhbmVzKTtcblxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcywgX2xhbmUpOyAvLyBTY2hlZHVsZSB0aGUgZXJyb3IgYm91bmRhcnkgdG8gcmUtcmVuZGVyIHVzaW5nIHVwZGF0ZWQgc3RhdGVcblxuICAgICAgICAgIHZhciBfdXBkYXRlID0gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgZXJyb3JJbmZvLCBfbGFuZSk7XG5cbiAgICAgICAgICBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIF91cGRhdGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzID0gd29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuICB9IHdoaWxlICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCk7XG59XG5cbmZ1bmN0aW9uIGdldFN1c3BlbmRlZENhY2hlKCkge1xuICB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIFN1c3BlbnNlIGJvdW5kYXJ5IHN1c3BlbmRzLiBJdCByZXR1cm5zIHRoZVxufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xudmFyIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbnZhciBkaWRXYXJuQWJvdXRCYWRDbGFzcztcbnZhciBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmcztcbnZhciBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzO1xudmFyIGRpZFdhcm5BYm91dFJldmVhbE9yZGVyO1xudmFyIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zO1xuXG57XG4gIGRpZFdhcm5BYm91dEJhZENsYXNzID0ge307XG4gIGRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnQgPSB7fTtcbiAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnQgPSB7fTtcbiAgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzID0ge307XG4gIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXIgPSB7fTtcbiAgZGlkV2FybkFib3V0VGFpbE9wdGlvbnMgPSB7fTtcbn1cblxuZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJZiB0aGlzIGlzIGEgZnJlc2ggbmV3IGNvbXBvbmVudCB0aGF0IGhhc24ndCBiZWVuIHJlbmRlcmVkIHlldCwgd2VcbiAgICAvLyB3b24ndCB1cGRhdGUgaXRzIGNoaWxkIHNldCBieSBhcHBseWluZyBtaW5pbWFsIHNpZGUtZWZmZWN0cy4gSW5zdGVhZCxcbiAgICAvLyB3ZSB3aWxsIGFkZCB0aGVtIGFsbCB0byB0aGUgY2hpbGQgYmVmb3JlIGl0IGdldHMgcmVuZGVyZWQuIFRoYXQgbWVhbnNcbiAgICAvLyB3ZSBjYW4gb3B0aW1pemUgdGhpcyByZWNvbmNpbGlhdGlvbiBwYXNzIGJ5IG5vdCB0cmFja2luZyBzaWRlLWVmZmVjdHMuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBtb3VudENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiB0aGUgY3VycmVudCBjaGlsZCBpcyB0aGUgc2FtZSBhcyB0aGUgd29yayBpbiBwcm9ncmVzcywgaXQgbWVhbnMgdGhhdFxuICAgIC8vIHdlIGhhdmVuJ3QgeWV0IHN0YXJ0ZWQgYW55IHdvcmsgb24gdGhlc2UgY2hpbGRyZW4uIFRoZXJlZm9yZSwgd2UgdXNlXG4gICAgLy8gdGhlIGNsb25lIGFsZ29yaXRobSB0byBjcmVhdGUgYSBjb3B5IG9mIGFsbCB0aGUgY3VycmVudCBjaGlsZHJlbi5cbiAgICAvLyBJZiB3ZSBoYWQgYW55IHByb2dyZXNzZWQgd29yayBhbHJlYWR5LCB0aGF0IGlzIGludmFsaWQgYXQgdGhpcyBwb2ludCBzb1xuICAgIC8vIGxldCdzIHRocm93IGl0IG91dC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JjZVVubW91bnRDdXJyZW50QW5kUmVjb25jaWxlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgZm9yayBvZiByZWNvbmNpbGVDaGlsZHJlbi4gSXQncyB1c2VkIGluIGNhc2VzIHdoZXJlIHdlXG4gIC8vIHdhbnQgdG8gcmVjb25jaWxlIHdpdGhvdXQgbWF0Y2hpbmcgYWdhaW5zdCB0aGUgZXhpc3Rpbmcgc2V0LiBUaGlzIGhhcyB0aGVcbiAgLy8gZWZmZWN0IG9mIGFsbCBjdXJyZW50IGNoaWxkcmVuIGJlaW5nIHVubW91bnRlZDsgZXZlbiBpZiB0aGUgdHlwZSBhbmQga2V5XG4gIC8vIGFyZSB0aGUgc2FtZSwgdGhlIG9sZCBjaGlsZCBpcyB1bm1vdW50ZWQgYW5kIGEgbmV3IGNoaWxkIGlzIGNyZWF0ZWQuXG4gIC8vXG4gIC8vIFRvIGRvIHRoaXMsIHdlJ3JlIGdvaW5nIHRvIGdvIHRocm91Z2ggdGhlIHJlY29uY2lsZSBhbGdvcml0aG0gdHdpY2UuIEluXG4gIC8vIHRoZSBmaXJzdCBwYXNzLCB3ZSBzY2hlZHVsZSBhIGRlbGV0aW9uIGZvciBhbGwgdGhlIGN1cnJlbnQgY2hpbGRyZW4gYnlcbiAgLy8gcGFzc2luZyBudWxsLlxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7IC8vIEluIHRoZSBzZWNvbmQgcGFzcywgd2UgbW91bnQgdGhlIG5ldyBjaGlsZHJlbi4gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZVxuICAvLyBwYXNzIG51bGwgaW4gcGxhY2Ugb2Ygd2hlcmUgd2UgdXN1YWxseSBwYXNzIHRoZSBjdXJyZW50IGNoaWxkIHNldC4gVGhpcyBoYXNcbiAgLy8gdGhlIGVmZmVjdCBvZiByZW1vdW50aW5nIGFsbCBjaGlsZHJlbiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlaXJcbiAgLy8gaWRlbnRpdGllcyBtYXRjaC5cblxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IGN1cnJlbnQgY2FuIGJlIG5vbi1udWxsIGhlcmUgZXZlbiBpZiB0aGUgY29tcG9uZW50XG4gIC8vIGhhc24ndCB5ZXQgbW91bnRlZC4gVGhpcyBoYXBwZW5zIGFmdGVyIHRoZSBmaXJzdCByZW5kZXIgc3VzcGVuZHMuXG4gIC8vIFdlJ2xsIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIGlzIGZpbmUgb3IgY2FuIGNhdXNlIGlzc3Vlcy5cbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgcmVuZGVyID0gQ29tcG9uZW50LnJlbmRlcjtcbiAgdmFyIHJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjsgLy8gVGhlIHJlc3QgaXMgYSBmb3JrIG9mIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50XG5cbiAgdmFyIG5leHRDaGlsZHJlbjtcbiAgdmFyIGhhc0lkO1xuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXIsIG5leHRQcm9wcywgcmVmLCByZW5kZXJMYW5lcyk7XG4gICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyLCBuZXh0UHJvcHMsIHJlZiwgcmVuZGVyTGFuZXMpO1xuICAgICAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICB9XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBoYXNJZCkge1xuICAgIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpO1xuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB2YXIgdHlwZSA9IENvbXBvbmVudC50eXBlO1xuXG4gICAgaWYgKGlzU2ltcGxlRnVuY3Rpb25Db21wb25lbnQodHlwZSkgJiYgQ29tcG9uZW50LmNvbXBhcmUgPT09IG51bGwgJiYgLy8gU2ltcGxlTWVtb0NvbXBvbmVudCBjb2RlcGF0aCBkb2Vzbid0IHJlc29sdmUgb3V0ZXIgcHJvcHMgZWl0aGVyLlxuICAgIENvbXBvbmVudC5kZWZhdWx0UHJvcHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJlc29sdmVkVHlwZSA9IHR5cGU7XG5cbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpO1xuICAgICAgfSAvLyBJZiB0aGlzIGlzIGEgcGxhaW4gZnVuY3Rpb24gY29tcG9uZW50IHdpdGhvdXQgZGVmYXVsdCBwcm9wcyxcbiAgICAgIC8vIGFuZCB3aXRoIG9ubHkgdGhlIGRlZmF1bHQgc2hhbGxvdyBjb21wYXJpc29uLCB3ZSB1cGdyYWRlIGl0XG4gICAgICAvLyB0byBhIFNpbXBsZU1lbW9Db21wb25lbnQgdG8gYWxsb3cgZmFzdCBwYXRoIHVwZGF0ZXMuXG5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MudGFnID0gU2ltcGxlTWVtb0NvbXBvbmVudDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlZFR5cGU7XG5cbiAgICAgIHtcbiAgICAgICAgdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCB0eXBlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlc29sdmVkVHlwZSwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAge1xuICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICAvLyBJbm5lciBtZW1vIGNvbXBvbmVudCBwcm9wcyBhcmVuJ3QgY3VycmVudGx5IHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50LlxuICAgICAgICAvLyBXZSBjb3VsZCBtb3ZlIGl0IHRoZXJlLCBidXQgd2UnZCBzdGlsbCBuZWVkIHRoaXMgZm9yIGxhenkgY29kZSBwYXRoLlxuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkID0gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKENvbXBvbmVudC50eXBlLCBudWxsLCBuZXh0UHJvcHMsIHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy5tb2RlLCByZW5kZXJMYW5lcyk7XG4gICAgY2hpbGQucmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuICAgIGNoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY2hpbGQ7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAge1xuICAgIHZhciBfdHlwZSA9IENvbXBvbmVudC50eXBlO1xuICAgIHZhciBfaW5uZXJQcm9wVHlwZXMgPSBfdHlwZS5wcm9wVHlwZXM7XG5cbiAgICBpZiAoX2lubmVyUHJvcFR5cGVzKSB7XG4gICAgICAvLyBJbm5lciBtZW1vIGNvbXBvbmVudCBwcm9wcyBhcmVuJ3QgY3VycmVudGx5IHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50LlxuICAgICAgLy8gV2UgY291bGQgbW92ZSBpdCB0aGVyZSwgYnV0IHdlJ2Qgc3RpbGwgbmVlZCB0aGlzIGZvciBsYXp5IGNvZGUgcGF0aC5cbiAgICAgIGNoZWNrUHJvcFR5cGVzKF9pbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoX3R5cGUpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgY3VycmVudENoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gVGhpcyBpcyBhbHdheXMgZXhhY3RseSBvbmUgY2hpbGRcblxuICB2YXIgaGFzU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0ID0gY2hlY2tTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQoY3VycmVudCwgcmVuZGVyTGFuZXMpO1xuXG4gIGlmICghaGFzU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KSB7XG4gICAgLy8gVGhpcyB3aWxsIGJlIHRoZSBwcm9wcyB3aXRoIHJlc29sdmVkIGRlZmF1bHRQcm9wcyxcbiAgICAvLyB1bmxpa2UgY3VycmVudC5tZW1vaXplZFByb3BzIHdoaWNoIHdpbGwgYmUgdGhlIHVucmVzb2x2ZWQgb25lcy5cbiAgICB2YXIgcHJldlByb3BzID0gY3VycmVudENoaWxkLm1lbW9pemVkUHJvcHM7IC8vIERlZmF1bHQgdG8gc2hhbGxvdyBjb21wYXJpc29uXG5cbiAgICB2YXIgY29tcGFyZSA9IENvbXBvbmVudC5jb21wYXJlO1xuICAgIGNvbXBhcmUgPSBjb21wYXJlICE9PSBudWxsID8gY29tcGFyZSA6IHNoYWxsb3dFcXVhbDtcblxuICAgIGlmIChjb21wYXJlKHByZXZQcm9wcywgbmV4dFByb3BzKSAmJiBjdXJyZW50LnJlZiA9PT0gd29ya0luUHJvZ3Jlc3MucmVmKSB7XG4gICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICB2YXIgbmV3Q2hpbGQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIG5leHRQcm9wcyk7XG4gIG5ld0NoaWxkLnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgbmV3Q2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV3Q2hpbGQ7XG4gIHJldHVybiBuZXdDaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IGN1cnJlbnQgY2FuIGJlIG5vbi1udWxsIGhlcmUgZXZlbiBpZiB0aGUgY29tcG9uZW50XG4gIC8vIGhhc24ndCB5ZXQgbW91bnRlZC4gVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGlubmVyIHJlbmRlciBzdXNwZW5kcy5cbiAgLy8gV2UnbGwgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHRoaXMgaXMgZmluZSBvciBjYW4gY2F1c2UgaXNzdWVzLlxuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIG91dGVyTWVtb1R5cGUgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZTtcblxuICAgICAgaWYgKG91dGVyTWVtb1R5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgICAvLyBXZSB3YXJuIHdoZW4geW91IGRlZmluZSBwcm9wVHlwZXMgb24gbGF6eSgpXG4gICAgICAgIC8vIHNvIGxldCdzIGp1c3Qgc2tpcCBvdmVyIGl0IHRvIGZpbmQgbWVtbygpIG91dGVyIHdyYXBwZXIuXG4gICAgICAgIC8vIElubmVyIHByb3BzIGZvciBtZW1vIGFyZSB2YWxpZGF0ZWQgbGF0ZXIuXG4gICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gb3V0ZXJNZW1vVHlwZTtcbiAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvdXRlck1lbW9UeXBlID0gaW5pdChwYXlsb2FkKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIG91dGVyTWVtb1R5cGUgPSBudWxsO1xuICAgICAgICB9IC8vIElubmVyIHByb3BUeXBlcyB3aWxsIGJlIHZhbGlkYXRlZCBpbiB0aGUgZnVuY3Rpb24gY29tcG9uZW50IHBhdGguXG5cblxuICAgICAgICB2YXIgb3V0ZXJQcm9wVHlwZXMgPSBvdXRlck1lbW9UeXBlICYmIG91dGVyTWVtb1R5cGUucHJvcFR5cGVzO1xuXG4gICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgIGNoZWNrUHJvcFR5cGVzKG91dGVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIChTaW1wbGVNZW1vQ29tcG9uZW50IGhhcyBubyBkZWZhdWx0UHJvcHMpXG4gICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUob3V0ZXJNZW1vVHlwZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgcHJldlByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuXG4gICAgaWYgKHNoYWxsb3dFcXVhbChwcmV2UHJvcHMsIG5leHRQcm9wcykgJiYgY3VycmVudC5yZWYgPT09IHdvcmtJblByb2dyZXNzLnJlZiAmJiAoIC8vIFByZXZlbnQgYmFpbG91dCBpZiB0aGUgaW1wbGVtZW50YXRpb24gY2hhbmdlZCBkdWUgdG8gaG90IHJlbG9hZC5cbiAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9PT0gY3VycmVudC50eXBlICkpIHtcbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTsgLy8gVGhlIHByb3BzIGFyZSBzaGFsbG93bHkgZXF1YWwuIFJldXNlIHRoZSBwcmV2aW91cyBwcm9wcyBvYmplY3QsIGxpa2Ugd2VcbiAgICAgIC8vIHdvdWxkIGR1cmluZyBhIG5vcm1hbCBmaWJlciBiYWlsb3V0LlxuICAgICAgLy9cbiAgICAgIC8vIFdlIGRvbid0IGhhdmUgc3Ryb25nIGd1YXJhbnRlZXMgdGhhdCB0aGUgcHJvcHMgb2JqZWN0IGlzIHJlZmVyZW50aWFsbHlcbiAgICAgIC8vIGVxdWFsIGR1cmluZyB1cGRhdGVzIHdoZXJlIHdlIGNhbid0IGJhaWwgb3V0IGFueXdheSDigJQgbGlrZSBpZiB0aGUgcHJvcHNcbiAgICAgIC8vIGFyZSBzaGFsbG93bHkgZXF1YWwsIGJ1dCB0aGVyZSdzIGEgbG9jYWwgc3RhdGUgb3IgY29udGV4dCB1cGRhdGUgaW4gdGhlXG4gICAgICAvLyBzYW1lIGJhdGNoLlxuICAgICAgLy9cbiAgICAgIC8vIEhvd2V2ZXIsIGFzIGEgcHJpbmNpcGxlLCB3ZSBzaG91bGQgYWltIHRvIG1ha2UgdGhlIGJlaGF2aW9yIGNvbnNpc3RlbnRcbiAgICAgIC8vIGFjcm9zcyBkaWZmZXJlbnQgd2F5cyBvZiBtZW1vaXppbmcgYSBjb21wb25lbnQuIEZvciBleGFtcGxlLCBSZWFjdC5tZW1vXG4gICAgICAvLyBoYXMgYSBkaWZmZXJlbnQgaW50ZXJuYWwgRmliZXIgbGF5b3V0IGlmIHlvdSBwYXNzIGEgbm9ybWFsIGZ1bmN0aW9uXG4gICAgICAvLyBjb21wb25lbnQgKFNpbXBsZU1lbW9Db21wb25lbnQpIHZlcnN1cyBpZiB5b3UgcGFzcyBhIGRpZmZlcmVudCB0eXBlXG4gICAgICAvLyBsaWtlIGZvcndhcmRSZWYgKE1lbW9Db21wb25lbnQpLiBCdXQgdGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuXG4gICAgICAvLyBXcmFwcGluZyBhIGNvbXBvbmVudCBpbiBmb3J3YXJkUmVmIChvciBSZWFjdC5sYXp5LCBldGMpIHNob3VsZG4ndFxuICAgICAgLy8gYWZmZWN0IHdoZXRoZXIgdGhlIHByb3BzIG9iamVjdCBpcyByZXVzZWQgZHVyaW5nIGEgYmFpbG91dC5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzID0gbmV4dFByb3BzID0gcHJldlByb3BzO1xuXG4gICAgICBpZiAoIWNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKSkge1xuICAgICAgICAvLyBUaGUgcGVuZGluZyBsYW5lcyB3ZXJlIGNsZWFyZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBiZWdpbldvcmsuIFdlJ3JlXG4gICAgICAgIC8vIGFib3V0IHRvIGJhaWwgb3V0LCBidXQgdGhlcmUgbWlnaHQgYmUgb3RoZXIgbGFuZXMgdGhhdCB3ZXJlbid0XG4gICAgICAgIC8vIGluY2x1ZGVkIGluIHRoZSBjdXJyZW50IHJlbmRlci4gVXN1YWxseSwgdGhlIHByaW9yaXR5IGxldmVsIG9mIHRoZVxuICAgICAgICAvLyByZW1haW5pbmcgdXBkYXRlcyBpcyBhY2N1bXVsYXRlZCBkdXJpbmcgdGhlIGV2YWx1YXRpb24gb2YgdGhlXG4gICAgICAgIC8vIGNvbXBvbmVudCAoaS5lLiB3aGVuIHByb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZSkuIEJ1dCBzaW5jZSBzaW5jZVxuICAgICAgICAvLyB3ZSdyZSBiYWlsaW5nIG91dCBlYXJseSAqd2l0aG91dCogZXZhbHVhdGluZyB0aGUgY29tcG9uZW50LCB3ZSBuZWVkXG4gICAgICAgIC8vIHRvIGFjY291bnQgZm9yIGl0IGhlcmUsIHRvby4gUmVzZXQgdG8gdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGZpYmVyLlxuICAgICAgICAvLyBOT1RFOiBUaGlzIG9ubHkgYXBwbGllcyB0byBTaW1wbGVNZW1vQ29tcG9uZW50LCBub3QgTWVtb0NvbXBvbmVudCxcbiAgICAgICAgLy8gYmVjYXVzZSBhIE1lbW9Db21wb25lbnQgZmliZXIgZG9lcyBub3QgaGF2ZSBob29rcyBvciBhbiB1cGRhdGUgcXVldWU7XG4gICAgICAgIC8vIHJhdGhlciwgaXQgd3JhcHMgYXJvdW5kIGFuIGlubmVyIGNvbXBvbmVudCwgd2hpY2ggbWF5IG9yIG1heSBub3RcbiAgICAgICAgLy8gY29udGFpbnMgaG9va3MuXG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhlIHJlc2V0IGF0IGluIGJlZ2luV29yayBvdXQgb2YgdGhlIGNvbW1vbiBwYXRoIHNvIHRoYXRcbiAgICAgICAgLy8gdGhpcyBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGN1cnJlbnQubGFuZXM7XG4gICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IGVsc2UgaWYgKChjdXJyZW50LmZsYWdzICYgRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSB0aGF0IG9ubHkgZXhpc3RzIGZvciBsZWdhY3kgbW9kZS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzE5MjE2LlxuICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkU3RhdGUgOiBudWxsO1xuXG4gIGlmIChuZXh0UHJvcHMubW9kZSA9PT0gJ2hpZGRlbicgfHwgZW5hYmxlTGVnYWN5SGlkZGVuICkge1xuICAgIC8vIFJlbmRlcmluZyBhIGhpZGRlbiB0cmVlLlxuICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICAvLyBJbiBsZWdhY3kgc3luYyBtb2RlLCBkb24ndCBkZWZlciB0aGUgc3VidHJlZS4gUmVuZGVyIGl0IG5vdy5cbiAgICAgIC8vIFRPRE86IENvbnNpZGVyIGhvdyBPZmZzY3JlZW4gc2hvdWxkIHdvcmsgd2l0aCB0cmFuc2l0aW9ucyBpbiB0aGUgZnV0dXJlXG4gICAgICB2YXIgbmV4dFN0YXRlID0ge1xuICAgICAgICBiYXNlTGFuZXM6IE5vTGFuZXMsXG4gICAgICAgIGNhY2hlUG9vbDogbnVsbCxcbiAgICAgICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV4dFN0YXRlO1xuXG4gICAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICB9IGVsc2UgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCBPZmZzY3JlZW5MYW5lKSkge1xuICAgICAgdmFyIHNwYXduZWRDYWNoZVBvb2wgPSBudWxsOyAvLyBXZSdyZSBoaWRkZW4sIGFuZCB3ZSdyZSBub3QgcmVuZGVyaW5nIGF0IE9mZnNjcmVlbi4gV2Ugd2lsbCBiYWlsIG91dFxuICAgICAgLy8gYW5kIHJlc3VtZSB0aGlzIHRyZWUgbGF0ZXIuXG5cbiAgICAgIHZhciBuZXh0QmFzZUxhbmVzO1xuXG4gICAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBwcmV2QmFzZUxhbmVzID0gcHJldlN0YXRlLmJhc2VMYW5lcztcbiAgICAgICAgbmV4dEJhc2VMYW5lcyA9IG1lcmdlTGFuZXMocHJldkJhc2VMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dEJhc2VMYW5lcyA9IHJlbmRlckxhbmVzO1xuICAgICAgfSAvLyBTY2hlZHVsZSB0aGlzIGZpYmVyIHRvIHJlLXJlbmRlciBhdCBvZmZzY3JlZW4gcHJpb3JpdHkuIFRoZW4gYmFpbG91dC5cblxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBsYW5lVG9MYW5lcyhPZmZzY3JlZW5MYW5lKTtcbiAgICAgIHZhciBfbmV4dFN0YXRlID0ge1xuICAgICAgICBiYXNlTGFuZXM6IG5leHRCYXNlTGFuZXMsXG4gICAgICAgIGNhY2hlUG9vbDogc3Bhd25lZENhY2hlUG9vbCxcbiAgICAgICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gX25leHRTdGF0ZTtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICAgIC8vIHRvIGF2b2lkIGEgcHVzaC9wb3AgbWlzYWxpZ25tZW50LlxuXG5cbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgbmV4dEJhc2VMYW5lcyk7XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBzZWNvbmQgcmVuZGVyLiBUaGUgc3Vycm91bmRpbmcgdmlzaWJsZSBjb250ZW50IGhhcyBhbHJlYWR5XG4gICAgICAvLyBjb21taXR0ZWQuIE5vdyB3ZSByZXN1bWUgcmVuZGVyaW5nIHRoZSBoaWRkZW4gdHJlZS5cbiAgICAgIC8vIFJlbmRlcmluZyBhdCBvZmZzY3JlZW4sIHNvIHdlIGNhbiBjbGVhciB0aGUgYmFzZSBsYW5lcy5cbiAgICAgIHZhciBfbmV4dFN0YXRlMiA9IHtcbiAgICAgICAgYmFzZUxhbmVzOiBOb0xhbmVzLFxuICAgICAgICBjYWNoZVBvb2w6IG51bGwsXG4gICAgICAgIHRyYW5zaXRpb25zOiBudWxsXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IF9uZXh0U3RhdGUyOyAvLyBQdXNoIHRoZSBsYW5lcyB0aGF0IHdlcmUgc2tpcHBlZCB3aGVuIHdlIGJhaWxlZCBvdXQuXG5cbiAgICAgIHZhciBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBwcmV2U3RhdGUgIT09IG51bGwgPyBwcmV2U3RhdGUuYmFzZUxhbmVzIDogcmVuZGVyTGFuZXM7XG5cbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVuZGVyaW5nIGEgdmlzaWJsZSB0cmVlLlxuICAgIHZhciBfc3VidHJlZVJlbmRlckxhbmVzO1xuXG4gICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgZ29pbmcgZnJvbSBoaWRkZW4gLT4gdmlzaWJsZS5cbiAgICAgIF9zdWJ0cmVlUmVuZGVyTGFuZXMgPSBtZXJnZUxhbmVzKHByZXZTdGF0ZS5iYXNlTGFuZXMsIHJlbmRlckxhbmVzKTtcblxuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIHdlcmVuJ3QgcHJldmlvdXNseSBoaWRkZW4sIGFuZCB3ZSBzdGlsbCBhcmVuJ3QsIHNvIHRoZXJlJ3Mgbm90aGluZ1xuICAgICAgLy8gc3BlY2lhbCB0byBkby4gTmVlZCB0byBwdXNoIHRvIHRoZSBzdGFjayByZWdhcmRsZXNzLCB0aG91Z2gsIHRvIGF2b2lkXG4gICAgICAvLyBhIHB1c2gvcG9wIG1pc2FsaWdubWVudC5cbiAgICAgIF9zdWJ0cmVlUmVuZGVyTGFuZXMgPSByZW5kZXJMYW5lcztcbiAgICB9XG5cbiAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIF9zdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59IC8vIE5vdGU6IFRoZXNlIGhhcHBlbiB0byBoYXZlIGlkZW50aWNhbCBiZWdpbiBwaGFzZXMsIGZvciBub3cuIFdlIHNob3VsZG4ndCBob2xkXG5cbmZ1bmN0aW9uIHVwZGF0ZUZyYWdtZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVByb2ZpbGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuXG4gICAge1xuICAgICAgLy8gUmVzZXQgZWZmZWN0IGR1cmF0aW9ucyBmb3IgdGhlIG5leHQgZXZlbnR1YWwgZWZmZWN0IHBoYXNlLlxuICAgICAgLy8gVGhlc2UgYXJlIHJlc2V0IGR1cmluZyByZW5kZXIgdG8gYWxsb3cgdGhlIERldlRvb2xzIGNvbW1pdCBob29rIGEgY2hhbmNlIHRvIHJlYWQgdGhlbSxcbiAgICAgIHZhciBzdGF0ZU5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgfVxuICB9XG5cbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgdmFyIHJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCAmJiByZWYgIT09IG51bGwgfHwgY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnJlZiAhPT0gcmVmKSB7XG4gICAgLy8gU2NoZWR1bGUgYSBSZWYgZWZmZWN0XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmO1xuXG4gICAge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmU3RhdGljO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSk7XG4gICAgY29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgbmV4dENoaWxkcmVuO1xuICB2YXIgaGFzSWQ7XG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgIWRpZFJlY2VpdmVVcGRhdGUpIHtcbiAgICBiYWlsb3V0SG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgaGFzSWQpIHtcbiAgICBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgLy8gVGhpcyBpcyB1c2VkIGJ5IERldlRvb2xzIHRvIGZvcmNlIGEgYm91bmRhcnkgdG8gZXJyb3IuXG4gICAgc3dpdGNoIChzaG91bGRFcnJvcih3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgIGNhc2UgZmFsc2U6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX2luc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICAgIHZhciBjdG9yID0gd29ya0luUHJvZ3Jlc3MudHlwZTsgLy8gVE9ETyBUaGlzIHdheSBvZiByZXNldHRpbmcgdGhlIGVycm9yIGJvdW5kYXJ5IHN0YXRlIGlzIGEgaGFjay5cbiAgICAgICAgICAvLyBJcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcz9cblxuICAgICAgICAgIHZhciB0ZW1wSW5zdGFuY2UgPSBuZXcgY3Rvcih3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLCBfaW5zdGFuY2UuY29udGV4dCk7XG4gICAgICAgICAgdmFyIHN0YXRlID0gdGVtcEluc3RhbmNlLnN0YXRlO1xuXG4gICAgICAgICAgX2luc3RhbmNlLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKF9pbnN0YW5jZSwgc3RhdGUsIG51bGwpO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSB0cnVlOlxuICAgICAgICB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTaG91bGRDYXB0dXJlOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuXG4gICAgICAgICAgdmFyIGVycm9yJDEgPSBuZXcgRXJyb3IoJ1NpbXVsYXRlZCBlcnJvciBjb21pbmcgZnJvbSBEZXZUb29scycpO1xuICAgICAgICAgIHZhciBsYW5lID0gcGlja0FyYml0cmFyeUxhbmUocmVuZGVyTGFuZXMpO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcywgbGFuZSk7IC8vIFNjaGVkdWxlIHRoZSBlcnJvciBib3VuZGFyeSB0byByZS1yZW5kZXIgdXNpbmcgdXBkYXRlZCBzdGF0ZVxuXG4gICAgICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKGVycm9yJDEsIHdvcmtJblByb2dyZXNzKSwgbGFuZSk7XG4gICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCB1cGRhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlcztcblxuICAgICAgaWYgKGlubmVyUHJvcFR5cGVzKSB7XG4gICAgICAgIGNoZWNrUHJvcFR5cGVzKGlubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBQdXNoIGNvbnRleHQgcHJvdmlkZXJzIGVhcmx5IHRvIHByZXZlbnQgY29udGV4dCBzdGFjayBtaXNtYXRjaGVzLlxuICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gIC8vIFdlIHdpbGwgaW52YWxpZGF0ZSB0aGUgY2hpbGQgY29udGV4dCBpbiBmaW5pc2hDbGFzc0NvbXBvbmVudCgpIHJpZ2h0IGFmdGVyIHJlbmRlcmluZy5cblxuXG4gIHZhciBoYXNDb250ZXh0O1xuXG4gIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgaGFzQ29udGV4dCA9IHRydWU7XG4gICAgcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gZWxzZSB7XG4gICAgaGFzQ29udGV4dCA9IGZhbHNlO1xuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICB2YXIgc2hvdWxkVXBkYXRlO1xuXG4gIGlmIChpbnN0YW5jZSA9PT0gbnVsbCkge1xuICAgIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpOyAvLyBJbiB0aGUgaW5pdGlhbCBwYXNzIHdlIG1pZ2h0IG5lZWQgdG8gY29uc3RydWN0IHRoZSBpbnN0YW5jZS5cblxuICAgIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgc2hvdWxkVXBkYXRlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gSW4gYSByZXN1bWUsIHdlJ2xsIGFscmVhZHkgaGF2ZSBhbiBpbnN0YW5jZSB3ZSBjYW4gcmV1c2UuXG4gICAgc2hvdWxkVXBkYXRlID0gcmVzdW1lTW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIHNob3VsZFVwZGF0ZSA9IHVwZGF0ZUNsYXNzSW5zdGFuY2UoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgbmV4dFVuaXRPZldvcmsgPSBmaW5pc2hDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBzaG91bGRVcGRhdGUsIGhhc0NvbnRleHQsIHJlbmRlckxhbmVzKTtcblxuICB7XG4gICAgdmFyIGluc3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoc2hvdWxkVXBkYXRlICYmIGluc3QucHJvcHMgIT09IG5leHRQcm9wcykge1xuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgIGVycm9yKCdJdCBsb29rcyBsaWtlICVzIGlzIHJlYXNzaWduaW5nIGl0cyBvd24gYHRoaXMucHJvcHNgIHdoaWxlIHJlbmRlcmluZy4gJyArICdUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGNhbiBsZWFkIHRvIGNvbmZ1c2luZyBidWdzLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdhIGNvbXBvbmVudCcpO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dFVuaXRPZldvcms7XG59XG5cbmZ1bmN0aW9uIGZpbmlzaENsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHNob3VsZFVwZGF0ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gUmVmcyBzaG91bGQgdXBkYXRlIGV2ZW4gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2VcbiAgbWFya1JlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBkaWRDYXB0dXJlRXJyb3IgPSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICBpZiAoIXNob3VsZFVwZGF0ZSAmJiAhZGlkQ2FwdHVyZUVycm9yKSB7XG4gICAgLy8gQ29udGV4dCBwcm92aWRlcnMgc2hvdWxkIGRlZmVyIHRvIHNDVSBmb3IgcmVuZGVyaW5nXG4gICAgaWYgKGhhc0NvbnRleHQpIHtcbiAgICAgIGludmFsaWRhdGVDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7IC8vIFJlcmVuZGVyXG5cbiAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gIHZhciBuZXh0Q2hpbGRyZW47XG5cbiAgaWYgKGRpZENhcHR1cmVFcnJvciAmJiB0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIElmIHdlIGNhcHR1cmVkIGFuIGVycm9yLCBidXQgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIGlzIG5vdCBkZWZpbmVkLFxuICAgIC8vIHVubW91bnQgYWxsIHRoZSBjaGlsZHJlbi4gY29tcG9uZW50RGlkQ2F0Y2ggd2lsbCBzY2hlZHVsZSBhbiB1cGRhdGUgdG9cbiAgICAvLyByZS1yZW5kZXIgYSBmYWxsYmFjay4gVGhpcyBpcyB0ZW1wb3JhcnkgdW50aWwgd2UgbWlncmF0ZSBldmVyeW9uZSB0b1xuICAgIC8vIHRoZSBuZXcgQVBJLlxuICAgIC8vIFRPRE86IFdhcm4gaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAgICBuZXh0Q2hpbGRyZW4gPSBudWxsO1xuXG4gICAge1xuICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgICAgbmV4dENoaWxkcmVuID0gaW5zdGFuY2UucmVuZGVyKCk7XG5cbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpbnN0YW5jZS5yZW5kZXIoKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gICAgfVxuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgZGlkQ2FwdHVyZUVycm9yKSB7XG4gICAgLy8gSWYgd2UncmUgcmVjb3ZlcmluZyBmcm9tIGFuIGVycm9yLCByZWNvbmNpbGUgd2l0aG91dCByZXVzaW5nIGFueSBvZlxuICAgIC8vIHRoZSBleGlzdGluZyBjaGlsZHJlbi4gQ29uY2VwdHVhbGx5LCB0aGUgbm9ybWFsIGNoaWxkcmVuIGFuZCB0aGUgY2hpbGRyZW5cbiAgICAvLyB0aGF0IGFyZSBzaG93biBvbiBlcnJvciBhcmUgdHdvIGRpZmZlcmVudCBzZXRzLCBzbyB3ZSBzaG91bGRuJ3QgcmV1c2VcbiAgICAvLyBub3JtYWwgY2hpbGRyZW4gZXZlbiBpZiB0aGVpciBpZGVudGl0aWVzIG1hdGNoLlxuICAgIGZvcmNlVW5tb3VudEN1cnJlbnRBbmRSZWNvbmNpbGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSAvLyBNZW1vaXplIHN0YXRlIHVzaW5nIHRoZSB2YWx1ZXMgd2UganVzdCB1c2VkIHRvIHJlbmRlci5cbiAgLy8gVE9ETzogUmVzdHJ1Y3R1cmUgc28gd2UgbmV2ZXIgcmVhZCB2YWx1ZXMgZnJvbSB0aGUgaW5zdGFuY2UuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGU7IC8vIFRoZSBjb250ZXh0IG1pZ2h0IGhhdmUgY2hhbmdlZCBzbyB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIGl0LlxuXG4gIGlmIChoYXNDb250ZXh0KSB7XG4gICAgaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcykge1xuICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICBpZiAocm9vdC5wZW5kaW5nQ29udGV4dCkge1xuICAgIHB1c2hUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MsIHJvb3QucGVuZGluZ0NvbnRleHQsIHJvb3QucGVuZGluZ0NvbnRleHQgIT09IHJvb3QuY29udGV4dCk7XG4gIH0gZWxzZSBpZiAocm9vdC5jb250ZXh0KSB7XG4gICAgLy8gU2hvdWxkIGFsd2F5cyBiZSBzZXRcbiAgICBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzLCByb290LmNvbnRleHQsIGZhbHNlKTtcbiAgfVxuXG4gIHB1c2hIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzLCByb290LmNvbnRhaW5lckluZm8pO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVIb3N0Um9vdChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBoYXZlIGEgY3VycmVudCBmaWJlci4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgfVxuXG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmV2U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgcHJldkNoaWxkcmVuID0gcHJldlN0YXRlLmVsZW1lbnQ7XG4gIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5leHRQcm9wcywgbnVsbCwgcmVuZGVyTGFuZXMpO1xuICB2YXIgbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIC8vIGJlaW5nIGNhbGxlZCBcImVsZW1lbnRcIi5cblxuXG4gIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0U3RhdGUuZWxlbWVudDtcblxuICBpZiAoIHByZXZTdGF0ZS5pc0RlaHlkcmF0ZWQpIHtcbiAgICAvLyBUaGlzIGlzIGEgaHlkcmF0aW9uIHJvb3Qgd2hvc2Ugc2hlbGwgaGFzIG5vdCB5ZXQgaHlkcmF0ZWQuIFdlIHNob3VsZFxuICAgIC8vIGF0dGVtcHQgdG8gaHlkcmF0ZS5cbiAgICAvLyBGbGlwIGlzRGVoeWRyYXRlZCB0byBmYWxzZSB0byBpbmRpY2F0ZSB0aGF0IHdoZW4gdGhpcyByZW5kZXJcbiAgICAvLyBmaW5pc2hlcywgdGhlIHJvb3Qgd2lsbCBubyBsb25nZXIgYmUgZGVoeWRyYXRlZC5cbiAgICB2YXIgb3ZlcnJpZGVTdGF0ZSA9IHtcbiAgICAgIGVsZW1lbnQ6IG5leHRDaGlsZHJlbixcbiAgICAgIGlzRGVoeWRyYXRlZDogZmFsc2UsXG4gICAgICBjYWNoZTogbmV4dFN0YXRlLmNhY2hlLFxuICAgICAgcGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczogbmV4dFN0YXRlLnBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXMsXG4gICAgICB0cmFuc2l0aW9uczogbmV4dFN0YXRlLnRyYW5zaXRpb25zXG4gICAgfTtcbiAgICB2YXIgdXBkYXRlUXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTsgLy8gYGJhc2VTdGF0ZWAgY2FuIGFsd2F5cyBiZSB0aGUgbGFzdCBzdGF0ZSBiZWNhdXNlIHRoZSByb290IGRvZXNuJ3RcbiAgICAvLyBoYXZlIHJlZHVjZXIgZnVuY3Rpb25zIHNvIGl0IGRvZXNuJ3QgbmVlZCByZWJhc2luZy5cblxuICAgIHVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IG92ZXJyaWRlU3RhdGU7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG92ZXJyaWRlU3RhdGU7XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JjZUNsaWVudFJlbmRlcikge1xuICAgICAgLy8gU29tZXRoaW5nIGVycm9yZWQgZHVyaW5nIGEgcHJldmlvdXMgYXR0ZW1wdCB0byBoeWRyYXRlIHRoZSBzaGVsbCwgc28gd2VcbiAgICAgIC8vIGZvcmNlZCBhIGNsaWVudCByZW5kZXIuXG4gICAgICB2YXIgcmVjb3ZlcmFibGVFcnJvciA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKG5ldyBFcnJvcignVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGh5ZHJhdGluZy4gQmVjYXVzZSB0aGUgZXJyb3IgaGFwcGVuZWQgb3V0c2lkZSAnICsgJ29mIGEgU3VzcGVuc2UgYm91bmRhcnksIHRoZSBlbnRpcmUgcm9vdCB3aWxsIHN3aXRjaCB0byAnICsgJ2NsaWVudCByZW5kZXJpbmcuJyksIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBtb3VudEhvc3RSb290V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcik7XG4gICAgfSBlbHNlIGlmIChuZXh0Q2hpbGRyZW4gIT09IHByZXZDaGlsZHJlbikge1xuICAgICAgdmFyIF9yZWNvdmVyYWJsZUVycm9yID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIobmV3IEVycm9yKCdUaGlzIHJvb3QgcmVjZWl2ZWQgYW4gZWFybHkgdXBkYXRlLCBiZWZvcmUgYW55dGhpbmcgd2FzIGFibGUgJyArICdoeWRyYXRlLiBTd2l0Y2hlZCB0aGUgZW50aXJlIHJvb3QgdG8gY2xpZW50IHJlbmRlcmluZy4nKSwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICByZXR1cm4gbW91bnRIb3N0Um9vdFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMsIF9yZWNvdmVyYWJsZUVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIG91dGVybW9zdCBzaGVsbCBoYXMgbm90IGh5ZHJhdGVkIHlldC4gU3RhcnQgaHlkcmF0aW5nLlxuICAgICAgZW50ZXJIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIHZhciBjaGlsZCA9IG1vdW50Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjaGlsZDtcbiAgICAgIHZhciBub2RlID0gY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIC8vIE1hcmsgZWFjaCBjaGlsZCBhcyBoeWRyYXRpbmcuIFRoaXMgaXMgYSBmYXN0IHBhdGggdG8ga25vdyB3aGV0aGVyIHRoaXNcbiAgICAgICAgLy8gdHJlZSBpcyBwYXJ0IG9mIGEgaHlkcmF0aW5nIHRyZWUuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBjaGlsZFxuICAgICAgICAvLyBub2RlIGhhcyBmdWxseSBtb3VudGVkIHlldCwgYW5kIGZvciBzY2hlZHVsaW5nIGV2ZW50IHJlcGxheWluZy5cbiAgICAgICAgLy8gQ29uY2VwdHVhbGx5IHRoaXMgaXMgc2ltaWxhciB0byBQbGFjZW1lbnQgaW4gdGhhdCBhIG5ldyBzdWJ0cmVlIGlzXG4gICAgICAgIC8vIGluc2VydGVkIGludG8gdGhlIFJlYWN0IHRyZWUgaGVyZS4gSXQganVzdCBoYXBwZW5zIHRvIG5vdCBuZWVkIERPTVxuICAgICAgICAvLyBtdXRhdGlvbnMgYmVjYXVzZSBpdCBhbHJlYWR5IGV4aXN0cy5cbiAgICAgICAgbm9kZS5mbGFncyA9IG5vZGUuZmxhZ3MgJiB+UGxhY2VtZW50IHwgSHlkcmF0aW5nO1xuICAgICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBSb290IGlzIG5vdCBkZWh5ZHJhdGVkLiBFaXRoZXIgdGhpcyBpcyBhIGNsaWVudC1vbmx5IHJvb3QsIG9yIGl0XG4gICAgLy8gYWxyZWFkeSBoeWRyYXRlZC5cbiAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG5cbiAgICBpZiAobmV4dENoaWxkcmVuID09PSBwcmV2Q2hpbGRyZW4pIHtcbiAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBtb3VudEhvc3RSb290V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcikge1xuICAvLyBSZXZlcnQgdG8gY2xpZW50IHJlbmRlcmluZy5cbiAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICBxdWV1ZUh5ZHJhdGlvbkVycm9yKHJlY292ZXJhYmxlRXJyb3IpO1xuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlcjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHB1c2hIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbnVsbDtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIGlzRGlyZWN0VGV4dENoaWxkID0gc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgbmV4dFByb3BzKTtcblxuICBpZiAoaXNEaXJlY3RUZXh0Q2hpbGQpIHtcbiAgICAvLyBXZSBzcGVjaWFsIGNhc2UgYSBkaXJlY3QgdGV4dCBjaGlsZCBvZiBhIGhvc3Qgbm9kZS4gVGhpcyBpcyBhIGNvbW1vblxuICAgIC8vIGNhc2UuIFdlIHdvbid0IGhhbmRsZSBpdCBhcyBhIHJlaWZpZWQgY2hpbGQuIFdlIHdpbGwgaW5zdGVhZCBoYW5kbGVcbiAgICAvLyB0aGlzIGluIHRoZSBob3N0IGVudmlyb25tZW50IHRoYXQgYWxzbyBoYXMgYWNjZXNzIHRvIHRoaXMgcHJvcC4gVGhhdFxuICAgIC8vIGF2b2lkcyBhbGxvY2F0aW5nIGFub3RoZXIgSG9zdFRleHQgZmliZXIgYW5kIHRyYXZlcnNpbmcgaXQuXG4gICAgbmV4dENoaWxkcmVuID0gbnVsbDtcbiAgfSBlbHNlIGlmIChwcmV2UHJvcHMgIT09IG51bGwgJiYgc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgcHJldlByb3BzKSkge1xuICAgIC8vIElmIHdlJ3JlIHN3aXRjaGluZyBmcm9tIGEgZGlyZWN0IHRleHQgY2hpbGQgdG8gYSBub3JtYWwgY2hpbGQsIG9yIHRvXG4gICAgLy8gZW1wdHksIHdlIG5lZWQgdG8gc2NoZWR1bGUgdGhlIHRleHQgY29udGVudCB0byBiZSByZXNldC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDb250ZW50UmVzZXQ7XG4gIH1cblxuICBtYXJrUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvc3RUZXh0KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpO1xuICB9IC8vIE5vdGhpbmcgdG8gZG8gaGVyZS4gVGhpcyBpcyB0ZXJtaW5hbC4gV2UnbGwgZG8gdGhlIGNvbXBsZXRpb24gc3RlcFxuICAvLyBpbW1lZGlhdGVseSBhZnRlci5cblxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBtb3VudExhenlDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBlbGVtZW50VHlwZSwgcmVuZGVyTGFuZXMpIHtcbiAgcmVzZXRTdXNwZW5kZWRDdXJyZW50T25Nb3VudEluTGVnYWN5TW9kZShfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgcHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBsYXp5Q29tcG9uZW50ID0gZWxlbWVudFR5cGU7XG4gIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuICB2YXIgQ29tcG9uZW50ID0gaW5pdChwYXlsb2FkKTsgLy8gU3RvcmUgdGhlIHVud3JhcHBlZCBjb21wb25lbnQgaW4gdGhlIHR5cGUuXG5cbiAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudDtcbiAgdmFyIHJlc29sdmVkVGFnID0gd29ya0luUHJvZ3Jlc3MudGFnID0gcmVzb2x2ZUxhenlDb21wb25lbnRUYWcoQ29tcG9uZW50KTtcbiAgdmFyIHJlc29sdmVkUHJvcHMgPSByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudCwgcHJvcHMpO1xuICB2YXIgY2hpbGQ7XG5cbiAgc3dpdGNoIChyZXNvbHZlZFRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50ID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUNsYXNzQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUZvcndhcmRSZWYobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG5cbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgcmVzb2x2ZWRQcm9wcywgLy8gUmVzb2x2ZWQgZm9yIG91dGVyIG9ubHlcbiAgICAgICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVNZW1vQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LnR5cGUsIHJlc29sdmVkUHJvcHMpLCAvLyBUaGUgaW5uZXIgdHlwZSBjYW4gaGF2ZSBkZWZhdWx0cyB0b29cbiAgICAgICAgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG4gIH1cblxuICB2YXIgaGludCA9ICcnO1xuXG4gIHtcbiAgICBpZiAoQ29tcG9uZW50ICE9PSBudWxsICYmIHR5cGVvZiBDb21wb25lbnQgPT09ICdvYmplY3QnICYmIENvbXBvbmVudC4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICBoaW50ID0gJyBEaWQgeW91IHdyYXAgYSBjb21wb25lbnQgaW4gUmVhY3QubGF6eSgpIG1vcmUgdGhhbiBvbmNlPyc7XG4gICAgfVxuICB9IC8vIFRoaXMgbWVzc2FnZSBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgbWVudGlvbiBGb3J3YXJkUmVmIG9yIE1lbW9Db21wb25lbnRcbiAgLy8gYmVjYXVzZSB0aGUgZmFjdCB0aGF0IGl0J3MgYSBzZXBhcmF0ZSB0eXBlIG9mIHdvcmsgaXMgYW5cbiAgLy8gaW1wbGVtZW50YXRpb24gZGV0YWlsLlxuXG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiRWxlbWVudCB0eXBlIGlzIGludmFsaWQuIFJlY2VpdmVkIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvOiBcIiArIENvbXBvbmVudCArIFwiLiBcIiArIChcIkxhenkgZWxlbWVudCB0eXBlIG11c3QgcmVzb2x2ZSB0byBhIGNsYXNzIG9yIGZ1bmN0aW9uLlwiICsgaGludCkpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluY29tcGxldGVDbGFzc0NvbXBvbmVudChfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7IC8vIFByb21vdGUgdGhlIGZpYmVyIHRvIGEgY2xhc3MgYW5kIHRyeSByZW5kZXJpbmcgYWdhaW4uXG5cbiAgd29ya0luUHJvZ3Jlc3MudGFnID0gQ2xhc3NDb21wb25lbnQ7IC8vIFRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gaXMgYSBmb3JrIG9mIGB1cGRhdGVDbGFzc0NvbXBvbmVudGBcbiAgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgLy8gRHVyaW5nIG1vdW50aW5nIHdlIGRvbid0IGtub3cgdGhlIGNoaWxkIGNvbnRleHQgeWV0IGFzIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGV4aXN0LlxuICAvLyBXZSB3aWxsIGludmFsaWRhdGUgdGhlIGNoaWxkIGNvbnRleHQgaW4gZmluaXNoQ2xhc3NDb21wb25lbnQoKSByaWdodCBhZnRlciByZW5kZXJpbmcuXG5cbiAgdmFyIGhhc0NvbnRleHQ7XG5cbiAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgfSBlbHNlIHtcbiAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICBjb25zdHJ1Y3RDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcyk7XG4gIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIGZpbmlzaENsYXNzQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHRydWUsIGhhc0NvbnRleHQsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRJbmRldGVybWluYXRlQ29tcG9uZW50KF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZW5kZXJMYW5lcykge1xuICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIGNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIHZhbHVlO1xuICB2YXIgaGFzSWQ7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAoQ29tcG9uZW50LnByb3RvdHlwZSAmJiB0eXBlb2YgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEJhZENsYXNzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKFwiVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBoYXZlIGEgcmVuZGVyIG1ldGhvZCwgYnV0IGRvZXNuJ3QgZXh0ZW5kIFJlYWN0LkNvbXBvbmVudC4gXCIgKyAnVGhpcyBpcyBsaWtlbHkgdG8gY2F1c2UgZXJyb3JzLiBDaGFuZ2UgJXMgdG8gZXh0ZW5kIFJlYWN0LkNvbXBvbmVudCBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dEJhZENsYXNzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nKHdvcmtJblByb2dyZXNzLCBudWxsKTtcbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICB2YWx1ZSA9IHJlbmRlcldpdGhIb29rcyhudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuXG4gIHtcbiAgICAvLyBTdXBwb3J0IGZvciBtb2R1bGUgY29tcG9uZW50cyBpcyBkZXByZWNhdGVkIGFuZCBpcyByZW1vdmVkIGJlaGluZCBhIGZsYWcuXG4gICAgLy8gV2hldGhlciBvciBub3QgaXQgd291bGQgY3Jhc2ggbGF0ZXIsIHdlIHdhbnQgdG8gc2hvdyBhIGdvb2QgbWVzc2FnZSBpbiBERVYgZmlyc3QuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJyAmJiB2YWx1ZS4kJHR5cGVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ1RoZSA8JXMgLz4gY29tcG9uZW50IGFwcGVhcnMgdG8gYmUgYSBmdW5jdGlvbiBjb21wb25lbnQgdGhhdCByZXR1cm5zIGEgY2xhc3MgaW5zdGFuY2UuICcgKyAnQ2hhbmdlICVzIHRvIGEgY2xhc3MgdGhhdCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCBpbnN0ZWFkLiAnICsgXCJJZiB5b3UgY2FuJ3QgdXNlIGEgY2xhc3MgdHJ5IGFzc2lnbmluZyB0aGUgcHJvdG90eXBlIG9uIHRoZSBmdW5jdGlvbiBhcyBhIHdvcmthcm91bmQuIFwiICsgXCJgJXMucHJvdG90eXBlID0gUmVhY3QuQ29tcG9uZW50LnByb3RvdHlwZWAuIERvbid0IHVzZSBhbiBhcnJvdyBmdW5jdGlvbiBzaW5jZSBpdCBcIiArICdjYW5ub3QgYmUgY2FsbGVkIHdpdGggYG5ld2AgYnkgUmVhY3QuJywgX2NvbXBvbmVudE5hbWUsIF9jb21wb25lbnROYW1lLCBfY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICggLy8gUnVuIHRoZXNlIGNoZWNrcyBpbiBwcm9kdWN0aW9uIG9ubHkgaWYgdGhlIGZsYWcgaXMgb2ZmLlxuICAvLyBFdmVudHVhbGx5IHdlJ2xsIGRlbGV0ZSB0aGlzIGJyYW5jaCBhbHRvZ2V0aGVyLlxuICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUucmVuZGVyID09PSAnZnVuY3Rpb24nICYmIHZhbHVlLiQkdHlwZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUyID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnRbX2NvbXBvbmVudE5hbWUyXSkge1xuICAgICAgICBlcnJvcignVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBiZSBhIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IHJldHVybnMgYSBjbGFzcyBpbnN0YW5jZS4gJyArICdDaGFuZ2UgJXMgdG8gYSBjbGFzcyB0aGF0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuICcgKyBcIklmIHlvdSBjYW4ndCB1c2UgYSBjbGFzcyB0cnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgb24gdGhlIGZ1bmN0aW9uIGFzIGEgd29ya2Fyb3VuZC4gXCIgKyBcImAlcy5wcm90b3R5cGUgPSBSZWFjdC5Db21wb25lbnQucHJvdG90eXBlYC4gRG9uJ3QgdXNlIGFuIGFycm93IGZ1bmN0aW9uIHNpbmNlIGl0IFwiICsgJ2Nhbm5vdCBiZSBjYWxsZWQgd2l0aCBgbmV3YCBieSBSZWFjdC4nLCBfY29tcG9uZW50TmFtZTIsIF9jb21wb25lbnROYW1lMiwgX2NvbXBvbmVudE5hbWUyKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lMl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gLy8gUHJvY2VlZCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYSBjbGFzcyBpbnN0YW5jZVxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhyb3cgb3V0IGFueSBob29rcyB0aGF0IHdlcmUgdXNlZC5cblxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDsgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gICAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG4gICAgdmFyIGhhc0NvbnRleHQgPSBmYWxzZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHZhbHVlLnN0YXRlICE9PSBudWxsICYmIHZhbHVlLnN0YXRlICE9PSB1bmRlZmluZWQgPyB2YWx1ZS5zdGF0ZSA6IG51bGw7XG4gICAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzKTtcbiAgICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHZhbHVlKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIC8vIFByb2NlZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzIGEgZnVuY3Rpb24gY29tcG9uZW50XG4gICAgd29ya0luUHJvZ3Jlc3MudGFnID0gRnVuY3Rpb25Db21wb25lbnQ7XG5cbiAgICB7XG5cbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YWx1ZSA9IHJlbmRlcldpdGhIb29rcyhudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBoYXNJZCkge1xuICAgICAgcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuXG4gICAgcmVjb25jaWxlQ2hpbGRyZW4obnVsbCwgd29ya0luUHJvZ3Jlc3MsIHZhbHVlLCByZW5kZXJMYW5lcyk7XG5cbiAgICB7XG4gICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KSB7XG4gIHtcbiAgICBpZiAoQ29tcG9uZW50KSB7XG4gICAgICBpZiAoQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzKSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBjaGlsZENvbnRleHRUeXBlcyBjYW5ub3QgYmUgZGVmaW5lZCBvbiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4nLCBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5yZWYgIT09IG51bGwpIHtcbiAgICAgIHZhciBpbmZvID0gJyc7XG4gICAgICB2YXIgb3duZXJOYW1lID0gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKTtcblxuICAgICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgICBpbmZvICs9ICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gICAgICB9XG5cbiAgICAgIHZhciB3YXJuaW5nS2V5ID0gb3duZXJOYW1lIHx8ICcnO1xuICAgICAgdmFyIGRlYnVnU291cmNlID0gd29ya0luUHJvZ3Jlc3MuX2RlYnVnU291cmNlO1xuXG4gICAgICBpZiAoZGVidWdTb3VyY2UpIHtcbiAgICAgICAgd2FybmluZ0tleSA9IGRlYnVnU291cmNlLmZpbGVOYW1lICsgJzonICsgZGVidWdTb3VyY2UubGluZU51bWJlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnNbd2FybmluZ0tleV0pIHtcbiAgICAgICAgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzW3dhcm5pbmdLZXldID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgYmUgZ2l2ZW4gcmVmcy4gJyArICdBdHRlbXB0cyB0byBhY2Nlc3MgdGhpcyByZWYgd2lsbCBmYWlsLiAnICsgJ0RpZCB5b3UgbWVhbiB0byB1c2UgUmVhY3QuZm9yd2FyZFJlZigpPyVzJywgaW5mbyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUzID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWUzXSkge1xuICAgICAgICBlcnJvcignJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLicsIF9jb21wb25lbnROYW1lMyk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTNdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIENvbXBvbmVudC5jb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LmNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWU0ID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTRdKSB7XG4gICAgICAgIGVycm9yKCclczogRnVuY3Rpb24gY29tcG9uZW50cyBkbyBub3Qgc3VwcG9ydCBjb250ZXh0VHlwZS4nLCBfY29tcG9uZW50TmFtZTQpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTRdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIFNVU1BFTkRFRF9NQVJLRVIgPSB7XG4gIGRlaHlkcmF0ZWQ6IG51bGwsXG4gIHRyZWVDb250ZXh0OiBudWxsLFxuICByZXRyeUxhbmU6IE5vTGFuZVxufTtcblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKSB7XG4gIHJldHVybiB7XG4gICAgYmFzZUxhbmVzOiByZW5kZXJMYW5lcyxcbiAgICBjYWNoZVBvb2w6IGdldFN1c3BlbmRlZENhY2hlKCksXG4gICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShwcmV2T2Zmc2NyZWVuU3RhdGUsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBjYWNoZVBvb2wgPSBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgYmFzZUxhbmVzOiBtZXJnZUxhbmVzKHByZXZPZmZzY3JlZW5TdGF0ZS5iYXNlTGFuZXMsIHJlbmRlckxhbmVzKSxcbiAgICBjYWNoZVBvb2w6IGNhY2hlUG9vbCxcbiAgICB0cmFuc2l0aW9uczogcHJldk9mZnNjcmVlblN0YXRlLnRyYW5zaXRpb25zXG4gIH07XG59IC8vIFRPRE86IFByb2JhYmx5IHNob3VsZCBpbmxpbmUgdGhpcyBiYWNrXG5cblxuZnVuY3Rpb24gc2hvdWxkUmVtYWluT25GYWxsYmFjayhzdXNwZW5zZUNvbnRleHQsIGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBJZiB3ZSdyZSBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjaywgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHdlIG5lZWQgdG9cbiAgLy8gcmVtYWluIG9uIHRoYXQgZmFsbGJhY2sgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjb250ZW50IGhhcyByZXNvbHZlZC5cbiAgLy8gRm9yIGV4YW1wbGUsIFN1c3BlbnNlTGlzdCBjb29yZGluYXRlcyB3aGVuIG5lc3RlZCBjb250ZW50IGFwcGVhcnMuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gQ3VycmVudGx5IHNob3dpbmcgY29udGVudC4gRG9uJ3QgaGlkZSBpdCwgZXZlbiBpZiBGb3JjZVN1c3BlbnNlRmFsbGJhY2tcbiAgICAgIC8vIGlzIHRydWUuIE1vcmUgcHJlY2lzZSBuYW1lIG1pZ2h0IGJlIFwiRm9yY2VSZW1haW5TdXNwZW5zZUZhbGxiYWNrXCIuXG4gICAgICAvLyBOb3RlOiBUaGlzIGlzIGEgZmFjdG9yaW5nIHNtZWxsLiBDYW4ndCByZW1haW4gb24gYSBmYWxsYmFjayBpZiB0aGVyZSdzXG4gICAgICAvLyBubyBmYWxsYmFjayB0byByZW1haW4gb24uXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IC8vIE5vdCBjdXJyZW50bHkgc2hvd2luZyBjb250ZW50LiBDb25zdWx0IHRoZSBTdXNwZW5zZSBjb250ZXh0LlxuXG5cbiAgcmV0dXJuIGhhc1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIGdldFJlbWFpbmluZ1dvcmtJblByaW1hcnlUcmVlKGN1cnJlbnQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IFNob3VsZCBub3QgcmVtb3ZlIHJlbmRlciBsYW5lcyB0aGF0IHdlcmUgcGluZ2VkIGR1cmluZyB0aGlzIHJlbmRlclxuICByZXR1cm4gcmVtb3ZlTGFuZXMoY3VycmVudC5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOyAvLyBUaGlzIGlzIHVzZWQgYnkgRGV2VG9vbHMgdG8gZm9yY2UgYSBib3VuZGFyeSB0byBzdXNwZW5kLlxuXG4gIHtcbiAgICBpZiAoc2hvdWxkU3VzcGVuZCh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgfVxuICB9XG5cbiAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgdmFyIHNob3dGYWxsYmFjayA9IGZhbHNlO1xuICB2YXIgZGlkU3VzcGVuZCA9ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gIGlmIChkaWRTdXNwZW5kIHx8IHNob3VsZFJlbWFpbk9uRmFsbGJhY2soc3VzcGVuc2VDb250ZXh0LCBjdXJyZW50KSkge1xuICAgIC8vIFNvbWV0aGluZyBpbiB0aGlzIGJvdW5kYXJ5J3Mgc3VidHJlZSBhbHJlYWR5IHN1c3BlbmRlZC4gU3dpdGNoIHRvXG4gICAgLy8gcmVuZGVyaW5nIHRoZSBmYWxsYmFjayBjaGlsZHJlbi5cbiAgICBzaG93RmFsbGJhY2sgPSB0cnVlO1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IH5EaWRDYXB0dXJlO1xuICB9IGVsc2Uge1xuICAgIC8vIEF0dGVtcHRpbmcgdGhlIG1haW4gY29udGVudFxuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyBhIG5ldyBtb3VudCBvciB0aGlzIGJvdW5kYXJ5IGlzIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrIHN0YXRlLlxuICAgICAgLy8gTWFyayB0aGlzIHN1YnRyZWUgY29udGV4dCBhcyBoYXZpbmcgYXQgbGVhc3Qgb25lIGludmlzaWJsZSBwYXJlbnQgdGhhdCBjb3VsZFxuICAgICAgLy8gaGFuZGxlIHRoZSBmYWxsYmFjayBzdGF0ZS5cbiAgICAgIC8vIEF2b2lkZWQgYm91bmRhcmllcyBhcmUgbm90IGNvbnNpZGVyZWQgc2luY2UgdGhleSBjYW5ub3QgaGFuZGxlIHByZWZlcnJlZCBmYWxsYmFjayBzdGF0ZXMuXG4gICAgICB7XG4gICAgICAgIHN1c3BlbnNlQ29udGV4dCA9IGFkZFN1YnRyZWVTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN1c3BlbnNlQ29udGV4dCA9IHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCk7XG4gIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlQ29udGV4dCk7IC8vIE9LLCB0aGUgbmV4dCBwYXJ0IGlzIGNvbmZ1c2luZy4gV2UncmUgYWJvdXQgdG8gcmVjb25jaWxlIHRoZSBTdXNwZW5zZVxuICAvLyBib3VuZGFyeSdzIGNoaWxkcmVuLiBUaGlzIGludm9sdmVzIHNvbWUgY3VzdG9tIHJlY29uY2lsaWF0aW9uIGxvZ2ljLiBUd29cbiAgLy8gbWFpbiByZWFzb25zIHRoaXMgaXMgc28gY29tcGxpY2F0ZWQuXG4gIC8vXG4gIC8vIEZpcnN0LCBMZWdhY3kgTW9kZSBoYXMgZGlmZmVyZW50IHNlbWFudGljcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFRoZVxuICAvLyBwcmltYXJ5IHRyZWUgd2lsbCBjb21taXQgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLCBzbyB3aGVuIHdlIGRvIHRoZVxuICAvLyBzZWNvbmQgcGFzcyB0byByZW5kZXIgdGhlIGZhbGxiYWNrLCB3ZSBkbyBzb21lIGV4Y2VlZGluZ2x5LCB1aCwgY2xldmVyXG4gIC8vIGhhY2tzIHRvIG1ha2UgdGhhdCBub3QgdG90YWxseSBicmVhay4gTGlrZSB0cmFuc2ZlcnJpbmcgZWZmZWN0cyBhbmRcbiAgLy8gZGVsZXRpb25zIGZyb20gaGlkZGVuIHRyZWUuIEluIENvbmN1cnJlbnQgTW9kZSwgaXQncyBtdWNoIHNpbXBsZXIsXG4gIC8vIGJlY2F1c2Ugd2UgYmFpbG91dCBvbiB0aGUgcHJpbWFyeSB0cmVlIGNvbXBsZXRlbHkgYW5kIGxlYXZlIGl0IGluIGl0cyBvbGRcbiAgLy8gc3RhdGUsIG5vIGVmZmVjdHMuIFNhbWUgYXMgd2hhdCB3ZSBkbyBmb3IgT2Zmc2NyZWVuIChleGNlcHQgdGhhdFxuICAvLyBPZmZzY3JlZW4gZG9lc24ndCBoYXZlIHRoZSBmaXJzdCByZW5kZXIgcGFzcykuXG4gIC8vXG4gIC8vIFNlY29uZCBpcyBoeWRyYXRpb24uIER1cmluZyBoeWRyYXRpb24sIHRoZSBTdXNwZW5zZSBmaWJlciBoYXMgYSBzbGlnaHRseVxuICAvLyBkaWZmZXJlbnQgbGF5b3V0LCB3aGVyZSB0aGUgY2hpbGQgcG9pbnRzIHRvIGEgZGVoeWRyYXRlZCBmcmFnbWVudCwgd2hpY2hcbiAgLy8gY29udGFpbnMgdGhlIERPTSByZW5kZXJlZCBieSB0aGUgc2VydmVyLlxuICAvL1xuICAvLyBUaGlyZCwgZXZlbiBpZiB5b3Ugc2V0IGFsbCB0aGF0IGFzaWRlLCBTdXNwZW5zZSBpcyBsaWtlIGVycm9yIGJvdW5kYXJpZXMgaW5cbiAgLy8gdGhhdCB3ZSBmaXJzdCB3ZSB0cnkgdG8gcmVuZGVyIG9uZSB0cmVlLCBhbmQgaWYgdGhhdCBmYWlscywgd2UgcmVuZGVyIGFnYWluXG4gIC8vIGFuZCBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgdHJlZS4gTGlrZSBhIHRyeS9jYXRjaCBibG9jay4gU28gd2UgaGF2ZSB0byB0cmFja1xuICAvLyB3aGljaCBicmFuY2ggd2UncmUgY3VycmVudGx5IHJlbmRlcmluZy4gSWRlYWxseSB3ZSB3b3VsZCBtb2RlbCB0aGlzIHVzaW5nXG4gIC8vIGEgc3RhY2suXG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJbml0aWFsIG1vdW50XG4gICAgLy8gU3BlY2lhbCBwYXRoIGZvciBoeWRyYXRpb25cbiAgICAvLyBJZiB3ZSdyZSBjdXJyZW50bHkgaHlkcmF0aW5nLCB0cnkgdG8gaHlkcmF0ZSB0aGlzIGJvdW5kYXJ5LlxuICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTsgLy8gVGhpcyBjb3VsZCd2ZSBiZWVuIGEgZGVoeWRyYXRlZCBzdXNwZW5zZSBjb21wb25lbnQuXG5cbiAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGRlaHlkcmF0ZWQgPSBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgIGlmIChkZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBtb3VudERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudCh3b3JrSW5Qcm9ncmVzcywgZGVoeWRyYXRlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG5leHRQcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gICAgdmFyIG5leHRGYWxsYmFja0NoaWxkcmVuID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuXG4gICAgaWYgKHNob3dGYWxsYmFjaykge1xuICAgICAgdmFyIGZhbGxiYWNrRnJhZ21lbnQgPSBtb3VudFN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgbmV4dFByaW1hcnlDaGlsZHJlbiwgbmV4dEZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQubWVtb2l6ZWRTdGF0ZSA9IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjtcblxuICAgICAgcmV0dXJuIGZhbGxiYWNrRnJhZ21lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBuZXh0UHJpbWFyeUNoaWxkcmVuKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhbiB1cGRhdGUuXG4gICAgLy8gU3BlY2lhbCBwYXRoIGZvciBoeWRyYXRpb25cbiAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIF9kZWh5ZHJhdGVkID0gcHJldlN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgIGlmIChfZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdXBkYXRlRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBkaWRTdXNwZW5kLCBuZXh0UHJvcHMsIF9kZWh5ZHJhdGVkLCBwcmV2U3RhdGUsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvd0ZhbGxiYWNrKSB7XG4gICAgICB2YXIgX25leHRGYWxsYmFja0NoaWxkcmVuID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuICAgICAgdmFyIF9uZXh0UHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IHVwZGF0ZVN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX25leHRQcmltYXJ5Q2hpbGRyZW4sIF9uZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3RhdGUgPSBjdXJyZW50LmNoaWxkLm1lbW9pemVkU3RhdGU7XG4gICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyLm1lbW9pemVkU3RhdGUgPSBwcmV2T2Zmc2NyZWVuU3RhdGUgPT09IG51bGwgPyBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpIDogdXBkYXRlU3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShwcmV2T2Zmc2NyZWVuU3RhdGUsIHJlbmRlckxhbmVzKTtcblxuICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50Mi5jaGlsZExhbmVzID0gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoY3VycmVudCwgcmVuZGVyTGFuZXMpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG4gICAgICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW4yID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuXG4gICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50MyA9IHVwZGF0ZVN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfbmV4dFByaW1hcnlDaGlsZHJlbjIsIHJlbmRlckxhbmVzKTtcblxuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gX3ByaW1hcnlDaGlsZEZyYWdtZW50MztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAndmlzaWJsZScsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIocHJpbWFyeUNoaWxkUHJvcHMsIG1vZGUpO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIHByaW1hcnlDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiBtb3VudFN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCBmYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAnaGlkZGVuJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcblxuICBpZiAoKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSAmJiBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgLy8gSW4gbGVnYWN5IG1vZGUsIHdlIGNvbW1pdCB0aGUgcHJpbWFyeSB0cmVlIGFzIGlmIGl0IHN1Y2Nlc3NmdWxseVxuICAgIC8vIGNvbXBsZXRlZCwgZXZlbiB0aG91Z2ggaXQncyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuXG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50O1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnBlbmRpbmdQcm9wcyA9IHByaW1hcnlDaGlsZFByb3BzO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgIC8vIFJlc2V0IHRoZSBkdXJhdGlvbnMgZnJvbSB0aGUgZmlyc3QgcGFzcyBzbyB0aGV5IGFyZW4ndCBpbmNsdWRlZCBpbiB0aGVcbiAgICAgIC8vIGZpbmFsIGFtb3VudHMuIFRoaXMgc2VlbXMgY291bnRlcmludHVpdGl2ZSwgc2luY2Ugd2UncmUgaW50ZW50aW9uYWxseVxuICAgICAgLy8gbm90IG1lYXN1cmluZyBwYXJ0IG9mIHRoZSByZW5kZXIgcGhhc2UsIGJ1dCB0aGlzIG1ha2VzIGl0IG1hdGNoIHdoYXQgd2VcbiAgICAgIC8vIGRvIGluIENvbmN1cnJlbnQgTW9kZS5cbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgICB9XG5cbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7XG4gIH0gZWxzZSB7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIocHJpbWFyeUNoaWxkUHJvcHMsIG1vZGUpO1xuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTtcbiAgfVxuXG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBmYWxsYmFja0NoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihvZmZzY3JlZW5Qcm9wcywgbW9kZSwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhlIHByb3BzIGFyZ3VtZW50IHRvIGBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW5gIGlzIGBhbnlgIHR5cGVkLCBzbyB3ZSB1c2VcbiAgLy8gdGhpcyB3cmFwcGVyIGZ1bmN0aW9uIHRvIGNvbnN0cmFpbiBpdC5cbiAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihvZmZzY3JlZW5Qcm9wcywgbW9kZSwgTm9MYW5lcywgbnVsbCk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIoY3VycmVudCwgb2Zmc2NyZWVuUHJvcHMpIHtcbiAgLy8gVGhlIHByb3BzIGFyZ3VtZW50IHRvIGBjcmVhdGVXb3JrSW5Qcm9ncmVzc2AgaXMgYGFueWAgdHlwZWQsIHNvIHdlIHVzZSB0aGlzXG4gIC8vIHdyYXBwZXIgZnVuY3Rpb24gdG8gY29uc3RyYWluIGl0LlxuICByZXR1cm4gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudCwgb2Zmc2NyZWVuUHJvcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZVByaW1hcnlDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50ID0gY3VycmVudC5jaGlsZDtcbiAgdmFyIGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZztcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQsIHtcbiAgICBtb2RlOiAndmlzaWJsZScsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9KTtcblxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmxhbmVzID0gcmVuZGVyTGFuZXM7XG4gIH1cblxuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IG51bGw7XG5cbiAgaWYgKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAvLyBEZWxldGUgdGhlIGZhbGxiYWNrIGNoaWxkIGZyYWdtZW50XG4gICAgdmFyIGRlbGV0aW9ucyA9IHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucztcblxuICAgIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IFtjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50XTtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IENoaWxkRGVsZXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0aW9ucy5wdXNoKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBtb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gIHZhciBjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmc7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAnaGlkZGVuJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcblxuICBpZiAoIC8vIEluIGxlZ2FjeSBtb2RlLCB3ZSBjb21taXQgdGhlIHByaW1hcnkgdHJlZSBhcyBpZiBpdCBzdWNjZXNzZnVsbHlcbiAgLy8gY29tcGxldGVkLCBldmVuIHRob3VnaCBpdCdzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS5cbiAgKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSAmJiAvLyBNYWtlIHN1cmUgd2UncmUgb24gdGhlIHNlY29uZCBwYXNzLCBpLmUuIHRoZSBwcmltYXJ5IGNoaWxkIGZyYWdtZW50IHdhc1xuICAvLyBhbHJlYWR5IGNsb25lZC4gSW4gbGVnYWN5IG1vZGUsIHRoZSBvbmx5IGNhc2Ugd2hlcmUgdGhpcyBpc24ndCB0cnVlIGlzXG4gIC8vIHdoZW4gRGV2VG9vbHMgZm9yY2VzIHVzIHRvIGRpc3BsYXkgYSBmYWxsYmFjazsgd2Ugc2tpcCB0aGUgZmlyc3QgcmVuZGVyXG4gIC8vIHBhc3MgZW50aXJlbHkgYW5kIGdvIHN0cmFpZ2h0IHRvIHJlbmRlcmluZyB0aGUgZmFsbGJhY2suIChJbiBDb25jdXJyZW50XG4gIC8vIE1vZGUsIFN1c3BlbnNlTGlzdCBjYW4gYWxzbyB0cmlnZ2VyIHRoaXMgc2NlbmFyaW8sIGJ1dCB0aGlzIGlzIGEgbGVnYWN5LVxuICAvLyBvbmx5IGNvZGVwYXRoLilcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgIT09IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCkge1xuICAgIHZhciBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50O1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnBlbmRpbmdQcm9wcyA9IHByaW1hcnlDaGlsZFByb3BzO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgIC8vIFJlc2V0IHRoZSBkdXJhdGlvbnMgZnJvbSB0aGUgZmlyc3QgcGFzcyBzbyB0aGV5IGFyZW4ndCBpbmNsdWRlZCBpbiB0aGVcbiAgICAgIC8vIGZpbmFsIGFtb3VudHMuIFRoaXMgc2VlbXMgY291bnRlcmludHVpdGl2ZSwgc2luY2Ugd2UncmUgaW50ZW50aW9uYWxseVxuICAgICAgLy8gbm90IG1lYXN1cmluZyBwYXJ0IG9mIHRoZSByZW5kZXIgcGhhc2UsIGJ1dCB0aGlzIG1ha2VzIGl0IG1hdGNoIHdoYXQgd2VcbiAgICAgIC8vIGRvIGluIENvbmN1cnJlbnQgTW9kZS5cbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbiA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgIH0gLy8gVGhlIGZhbGxiYWNrIGZpYmVyIHdhcyBhZGRlZCBhcyBhIGRlbGV0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGFzcy5cbiAgICAvLyBIb3dldmVyLCBzaW5jZSB3ZSdyZSBnb2luZyB0byByZW1haW4gb24gdGhlIGZhbGxiYWNrLCB3ZSBubyBsb25nZXIgd2FudFxuICAgIC8vIHRvIGRlbGV0ZSBpdC5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHVwZGF0ZVdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIoY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LCBwcmltYXJ5Q2hpbGRQcm9wcyk7IC8vIFNpbmNlIHdlJ3JlIHJldXNpbmcgYSBjdXJyZW50IHRyZWUsIHdlIG5lZWQgdG8gcmV1c2UgdGhlIGZsYWdzLCB0b28uXG4gICAgLy8gKFdlIGRvbid0IGRvIHRoaXMgaW4gbGVnYWN5IG1vZGUsIGJlY2F1c2UgaW4gbGVnYWN5IG1vZGUgd2UgZG9uJ3QgcmUtdXNlXG4gICAgLy8gdGhlIGN1cnJlbnQgdHJlZTsgc2VlIHByZXZpb3VzIGJyYW5jaC4pXG5cbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zdWJ0cmVlRmxhZ3MgPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc3VidHJlZUZsYWdzICYgU3RhdGljTWFzaztcbiAgfVxuXG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50LCBmYWxsYmFja0NoaWxkcmVuKTtcbiAgfSBlbHNlIHtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZSBib3VuZGFyeSkgYWxyZWFkeVxuICAgIC8vIG1vdW50ZWQgYnV0IHRoaXMgaXMgYSBuZXcgZmliZXIuXG5cbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICB9XG5cbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCByZWNvdmVyYWJsZUVycm9yKSB7XG4gIC8vIEZhbGxpbmcgYmFjayB0byBjbGllbnQgcmVuZGVyaW5nLiBCZWNhdXNlIHRoaXMgaGFzIHBlcmZvcm1hbmNlXG4gIC8vIGltcGxpY2F0aW9ucywgaXQncyBjb25zaWRlcmVkIGEgcmVjb3ZlcmFibGUgZXJyb3IsIGV2ZW4gdGhvdWdoIHRoZSB1c2VyXG4gIC8vIGxpa2VseSB3b24ndCBvYnNlcnZlIGFueXRoaW5nIHdyb25nIHdpdGggdGhlIFVJLlxuICAvL1xuICAvLyBUaGUgZXJyb3IgaXMgcGFzc2VkIGluIGFzIGFuIGFyZ3VtZW50IHRvIGVuZm9yY2UgdGhhdCBldmVyeSBjYWxsZXIgcHJvdmlkZVxuICAvLyBhIGN1c3RvbSBtZXNzYWdlLCBvciBleHBsaWNpdGx5IG9wdCBvdXQgKGN1cnJlbnRseSB0aGUgb25seSBwYXRoIHRoYXQgb3B0c1xuICAvLyBvdXQgaXMgbGVnYWN5IG1vZGU7IGV2ZXJ5IGNvbmN1cnJlbnQgcGF0aCBwcm92aWRlcyBhbiBlcnJvcikuXG4gIGlmIChyZWNvdmVyYWJsZUVycm9yICE9PSBudWxsKSB7XG4gICAgcXVldWVIeWRyYXRpb25FcnJvcihyZWNvdmVyYWJsZUVycm9yKTtcbiAgfSAvLyBUaGlzIHdpbGwgYWRkIHRoZSBvbGQgZmliZXIgdG8gdGhlIGRlbGV0aW9uIGxpc3RcblxuXG4gIHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7IC8vIFdlJ3JlIG5vdyBub3Qgc3VzcGVuZGVkIG5vciBkZWh5ZHJhdGVkLlxuXG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbik7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZSBib3VuZGFyeSkgYWxyZWFkeVxuICAvLyBtb3VudGVkIGJ1dCB0aGlzIGlzIGEgbmV3IGZpYmVyLlxuXG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZUZhbGxiYWNrQWZ0ZXJSZXRyeVdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgZmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGZpYmVyTW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAndmlzaWJsZScsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIocHJpbWFyeUNoaWxkUHJvcHMsIGZpYmVyTW9kZSk7XG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBmaWJlck1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTsgLy8gTmVlZHMgYSBwbGFjZW1lbnQgZWZmZWN0IGJlY2F1c2UgdGhlIHBhcmVudCAodGhlIFN1c3BlbnNlXG4gIC8vIGJvdW5kYXJ5KSBhbHJlYWR5IG1vdW50ZWQgYnV0IHRoaXMgaXMgYSBuZXcgZmliZXIuXG5cbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcblxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgIC8vIFdlIHdpbGwgaGF2ZSBkcm9wcGVkIHRoZSBlZmZlY3QgbGlzdCB3aGljaCBjb250YWlucyB0aGVcbiAgICAvLyBkZWxldGlvbi4gV2UgbmVlZCB0byByZWNvbmNpbGUgdG8gZGVsZXRlIHRoZSBjdXJyZW50IGNoaWxkLlxuICAgIHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiBtb3VudERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VJbnN0YW5jZSwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gRHVyaW5nIHRoZSBmaXJzdCBwYXNzLCB3ZSdsbCBiYWlsIG91dCBhbmQgbm90IGRyaWxsIGludG8gdGhlIGNoaWxkcmVuLlxuICAvLyBJbnN0ZWFkLCB3ZSdsbCBsZWF2ZSB0aGUgY29udGVudCBpbiBwbGFjZSBhbmQgdHJ5IHRvIGh5ZHJhdGUgaXQgbGF0ZXIuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAge1xuICAgICAgZXJyb3IoJ0Nhbm5vdCBoeWRyYXRlIFN1c3BlbnNlIGluIGxlZ2FjeSBtb2RlLiBTd2l0Y2ggZnJvbSAnICsgJ1JlYWN0RE9NLmh5ZHJhdGUoZWxlbWVudCwgY29udGFpbmVyKSB0byAnICsgJ1JlYWN0RE9NQ2xpZW50Lmh5ZHJhdGVSb290KGNvbnRhaW5lciwgPEFwcCAvPiknICsgJy5yZW5kZXIoZWxlbWVudCkgb3IgcmVtb3ZlIHRoZSBTdXNwZW5zZSBjb21wb25lbnRzIGZyb20gJyArICd0aGUgc2VydmVyIHJlbmRlcmVkIGNvbXBvbmVudHMuJyk7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBsYW5lVG9MYW5lcyhTeW5jTGFuZSk7XG4gIH0gZWxzZSBpZiAoaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soc3VzcGVuc2VJbnN0YW5jZSkpIHtcbiAgICAvLyBUaGlzIGlzIGEgY2xpZW50LW9ubHkgYm91bmRhcnkuIFNpbmNlIHdlIHdvbid0IGdldCBhbnkgY29udGVudCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAvLyBmb3IgdGhpcywgd2UgbmVlZCB0byBzY2hlZHVsZSB0aGF0IGF0IGEgaGlnaGVyIHByaW9yaXR5IGJhc2VkIG9uIHdoZW4gaXQgd291bGRcbiAgICAvLyBoYXZlIHRpbWVkIG91dC4gSW4gdGhlb3J5IHdlIGNvdWxkIHJlbmRlciBpdCBpbiB0aGlzIHBhc3MgYnV0IGl0IHdvdWxkIGhhdmUgdGhlXG4gICAgLy8gd3JvbmcgcHJpb3JpdHkgYXNzb2NpYXRlZCB3aXRoIGl0IGFuZCB3aWxsIHByZXZlbnQgaHlkcmF0aW9uIG9mIHBhcmVudCBwYXRoLlxuICAgIC8vIEluc3RlYWQsIHdlJ2xsIGxlYXZlIHdvcmsgbGVmdCBvbiBpdCB0byByZW5kZXIgaXQgaW4gYSBzZXBhcmF0ZSBjb21taXQuXG4gICAgLy8gVE9ETyBUaGlzIHRpbWUgc2hvdWxkIGJlIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBzZXJ2ZXIgcmVuZGVyZWQgcmVzcG9uc2UgdGhhdCBpc1xuICAgIC8vIGEgcGFyZW50IHRvIHRoaXMgYm91bmRhcnkgd2FzIGRpc3BsYXllZC4gSG93ZXZlciwgc2luY2Ugd2UgY3VycmVudGx5IGRvbid0IGhhdmVcbiAgICAvLyBhIHByb3RvY29sIHRvIHRyYW5zZmVyIHRoYXQgdGltZSwgd2UnbGwganVzdCBlc3RpbWF0ZSBpdCBieSB1c2luZyB0aGUgY3VycmVudFxuICAgIC8vIHRpbWUuIFRoaXMgd2lsbCBtZWFuIHRoYXQgU3VzcGVuc2UgdGltZW91dHMgYXJlIHNsaWdodGx5IHNoaWZ0ZWQgdG8gbGF0ZXIgdGhhblxuICAgIC8vIHRoZXkgc2hvdWxkIGJlLlxuICAgIC8vIFNjaGVkdWxlIGEgbm9ybWFsIHByaSB1cGRhdGUgdG8gcmVuZGVyIHRoaXMgY29udGVudC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGxhbmVUb0xhbmVzKERlZmF1bHRIeWRyYXRpb25MYW5lKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBXZSdsbCBjb250aW51ZSBoeWRyYXRpbmcgdGhlIHJlc3QgYXQgb2Zmc2NyZWVuIHByaW9yaXR5IHNpbmNlIHdlJ2xsIGFscmVhZHlcbiAgICAvLyBiZSBzaG93aW5nIHRoZSByaWdodCBjb250ZW50IGNvbWluZyBmcm9tIHRoZSBzZXJ2ZXIsIGl0IGlzIG5vIHJ1c2guXG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBsYW5lVG9MYW5lcyhPZmZzY3JlZW5MYW5lKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVEZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGRpZFN1c3BlbmQsIG5leHRQcm9wcywgc3VzcGVuc2VJbnN0YW5jZSwgc3VzcGVuc2VTdGF0ZSwgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKCFkaWRTdXNwZW5kKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgcmVuZGVyIHBhc3MuIEF0dGVtcHQgdG8gaHlkcmF0ZS5cbiAgICAvLyBXZSBzaG91bGQgbmV2ZXIgYmUgaHlkcmF0aW5nIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSBpdCBpcyB0aGUgZmlyc3QgcGFzcyxcbiAgICAvLyBidXQgYWZ0ZXIgd2UndmUgYWxyZWFkeSBjb21taXR0ZWQgb25jZS5cbiAgICB3YXJuSWZIeWRyYXRpbmcoKTtcblxuICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCAvLyBUT0RPOiBXaGVuIHdlIGRlbGV0ZSBsZWdhY3kgbW9kZSwgd2Ugc2hvdWxkIG1ha2UgdGhpcyBlcnJvciBhcmd1bWVudFxuICAgICAgLy8gcmVxdWlyZWQg4oCUIGV2ZXJ5IGNvbmN1cnJlbnQgbW9kZSBwYXRoIHRoYXQgY2F1c2VzIGh5ZHJhdGlvbiB0b1xuICAgICAgLy8gZGUtb3B0IHRvIGNsaWVudCByZW5kZXJpbmcgc2hvdWxkIGhhdmUgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICAgIG51bGwpO1xuICAgIH1cblxuICAgIGlmIChpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhzdXNwZW5zZUluc3RhbmNlKSkge1xuICAgICAgLy8gVGhpcyBib3VuZGFyeSBpcyBpbiBhIHBlcm1hbmVudCBmYWxsYmFjayBzdGF0ZS4gSW4gdGhpcyBjYXNlLCB3ZSdsbCBuZXZlclxuICAgICAgLy8gZ2V0IGFuIHVwZGF0ZSBhbmQgd2UnbGwgbmV2ZXIgYmUgYWJsZSB0byBoeWRyYXRlIHRoZSBmaW5hbCBjb250ZW50LiBMZXQncyBqdXN0IHRyeSB0aGVcbiAgICAgIC8vIGNsaWVudCBzaWRlIHJlbmRlciBpbnN0ZWFkLlxuICAgICAgdmFyIGRpZ2VzdCwgbWVzc2FnZSwgc3RhY2s7XG5cbiAgICAgIHtcbiAgICAgICAgdmFyIF9nZXRTdXNwZW5zZUluc3RhbmNlRiA9IGdldFN1c3BlbnNlSW5zdGFuY2VGYWxsYmFja0Vycm9yRGV0YWlscyhzdXNwZW5zZUluc3RhbmNlKTtcblxuICAgICAgICBkaWdlc3QgPSBfZ2V0U3VzcGVuc2VJbnN0YW5jZUYuZGlnZXN0O1xuICAgICAgICBtZXNzYWdlID0gX2dldFN1c3BlbnNlSW5zdGFuY2VGLm1lc3NhZ2U7XG4gICAgICAgIHN0YWNrID0gX2dldFN1c3BlbnNlSW5zdGFuY2VGLnN0YWNrO1xuICAgICAgfVxuXG4gICAgICB2YXIgZXJyb3I7XG5cbiAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ1RoZSBzZXJ2ZXIgY291bGQgbm90IGZpbmlzaCB0aGlzIFN1c3BlbnNlIGJvdW5kYXJ5LCBsaWtlbHkgJyArICdkdWUgdG8gYW4gZXJyb3IgZHVyaW5nIHNlcnZlciByZW5kZXJpbmcuIFN3aXRjaGVkIHRvICcgKyAnY2xpZW50IHJlbmRlcmluZy4nKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNhcHR1cmVkVmFsdWUgPSBjcmVhdGVDYXB0dXJlZFZhbHVlKGVycm9yLCBkaWdlc3QsIHN0YWNrKTtcbiAgICAgIHJldHVybiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMsIGNhcHR1cmVkVmFsdWUpO1xuICAgIH1cbiAgICAvLyBhbnkgY29udGV4dCBoYXMgY2hhbmdlZCwgd2UgbmVlZCB0byB0cmVhdCBpcyBhcyBpZiB0aGUgaW5wdXQgbWlnaHQgaGF2ZSBjaGFuZ2VkLlxuXG5cbiAgICB2YXIgaGFzQ29udGV4dENoYW5nZWQgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCBjdXJyZW50LmNoaWxkTGFuZXMpO1xuXG4gICAgaWYgKGRpZFJlY2VpdmVVcGRhdGUgfHwgaGFzQ29udGV4dENoYW5nZWQpIHtcbiAgICAgIC8vIFRoaXMgYm91bmRhcnkgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGZpcnN0IHJlbmRlci4gVGhpcyBtZWFucyB0aGF0IHdlIGFyZSBub3cgdW5hYmxlIHRvXG4gICAgICAvLyBoeWRyYXRlIGl0LiBXZSBtaWdodCBzdGlsbCBiZSBhYmxlIHRvIGh5ZHJhdGUgaXQgdXNpbmcgYSBoaWdoZXIgcHJpb3JpdHkgbGFuZS5cbiAgICAgIHZhciByb290ID0gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCk7XG5cbiAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lID0gZ2V0QnVtcGVkTGFuZUZvckh5ZHJhdGlvbihyb290LCByZW5kZXJMYW5lcyk7XG5cbiAgICAgICAgaWYgKGF0dGVtcHRIeWRyYXRpb25BdExhbmUgIT09IE5vTGFuZSAmJiBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lICE9PSBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSkge1xuICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgbXV0YXRpbmcgc2luY2UgdGhpcyByZW5kZXIgd2lsbCBnZXQgaW50ZXJydXB0ZWQuIFRoaXNcbiAgICAgICAgICAvLyBpcyBvbmUgb2YgdGhlIHZlcnkgcmFyZSB0aW1lcyB3aGVyZSB3ZSBtdXRhdGUgdGhlIGN1cnJlbnQgdHJlZVxuICAgICAgICAgIC8vIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgICAgIHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lID0gYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZTsgLy8gVE9ETzogSWRlYWxseSB0aGlzIHdvdWxkIGluaGVyaXQgdGhlIGV2ZW50IHRpbWUgb2YgdGhlIGN1cnJlbnQgcmVuZGVyXG5cbiAgICAgICAgICB2YXIgZXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG4gICAgICAgICAgZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGN1cnJlbnQsIGF0dGVtcHRIeWRyYXRpb25BdExhbmUpO1xuICAgICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBjdXJyZW50LCBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lLCBldmVudFRpbWUpO1xuICAgICAgICB9XG4gICAgICB9IC8vIElmIHdlIGhhdmUgc2NoZWR1bGVkIGhpZ2hlciBwcmkgd29yayBhYm92ZSwgdGhpcyB3aWxsIHByb2JhYmx5IGp1c3QgYWJvcnQgdGhlIHJlbmRlclxuICAgICAgLy8gc2luY2Ugd2Ugbm93IGhhdmUgaGlnaGVyIHByaW9yaXR5IHdvcmssIGJ1dCBpbiBjYXNlIGl0IGRvZXNuJ3QsIHdlIG5lZWQgdG8gcHJlcGFyZSB0b1xuICAgICAgLy8gcmVuZGVyIHNvbWV0aGluZywgaWYgd2UgdGltZSBvdXQuIEV2ZW4gaWYgdGhhdCByZXF1aXJlcyB1cyB0byBkZWxldGUgZXZlcnl0aGluZyBhbmRcbiAgICAgIC8vIHNraXAgaHlkcmF0aW9uLlxuICAgICAgLy8gRGVsYXkgaGF2aW5nIHRvIGRvIHRoaXMgYXMgbG9uZyBhcyB0aGUgc3VzcGVuc2UgdGltZW91dCBhbGxvd3MgdXMuXG5cblxuICAgICAgcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpO1xuXG4gICAgICB2YXIgX2NhcHR1cmVkVmFsdWUgPSBjcmVhdGVDYXB0dXJlZFZhbHVlKG5ldyBFcnJvcignVGhpcyBTdXNwZW5zZSBib3VuZGFyeSByZWNlaXZlZCBhbiB1cGRhdGUgYmVmb3JlIGl0IGZpbmlzaGVkICcgKyAnaHlkcmF0aW5nLiBUaGlzIGNhdXNlZCB0aGUgYm91bmRhcnkgdG8gc3dpdGNoIHRvIGNsaWVudCByZW5kZXJpbmcuICcgKyAnVGhlIHVzdWFsIHdheSB0byBmaXggdGhpcyBpcyB0byB3cmFwIHRoZSBvcmlnaW5hbCB1cGRhdGUgJyArICdpbiBzdGFydFRyYW5zaXRpb24uJykpO1xuXG4gICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCBfY2FwdHVyZWRWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKHN1c3BlbnNlSW5zdGFuY2UpKSB7XG4gICAgICAvLyBUaGlzIGNvbXBvbmVudCBpcyBzdGlsbCBwZW5kaW5nIG1vcmUgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIsIHNvIHdlIGNhbid0IGh5ZHJhdGUgaXRzXG4gICAgICAvLyBjb250ZW50LiBXZSB0cmVhdCBpdCBhcyBpZiB0aGlzIGNvbXBvbmVudCBzdXNwZW5kZWQgaXRzZWxmLiBJdCBtaWdodCBzZWVtIGFzIGlmXG4gICAgICAvLyB3ZSBjb3VsZCBqdXN0IHRyeSB0byByZW5kZXIgaXQgY2xpZW50LXNpZGUgaW5zdGVhZC4gSG93ZXZlciwgdGhpcyB3aWxsIHBlcmZvcm0gYVxuICAgICAgLy8gbG90IG9mIHVubmVjZXNzYXJ5IHdvcmsgYW5kIGlzIHVubGlrZWx5IHRvIGNvbXBsZXRlIHNpbmNlIGl0IG9mdGVuIHdpbGwgc3VzcGVuZFxuICAgICAgLy8gb24gbWlzc2luZyBkYXRhIGFueXdheS4gQWRkaXRpb25hbGx5LCB0aGUgc2VydmVyIG1pZ2h0IGJlIGFibGUgdG8gcmVuZGVyIG1vcmVcbiAgICAgIC8vIHRoYW4gd2UgY2FuIG9uIHRoZSBjbGllbnQgeWV0LiBJbiB0aGF0IGNhc2Ugd2UnZCBlbmQgdXAgd2l0aCBtb3JlIGZhbGxiYWNrIHN0YXRlc1xuICAgICAgLy8gb24gdGhlIGNsaWVudCB0aGFuIGlmIHdlIGp1c3QgbGVhdmUgaXQgYWxvbmUuIElmIHRoZSBzZXJ2ZXIgdGltZXMgb3V0IG9yIGVycm9yc1xuICAgICAgLy8gdGhlc2Ugc2hvdWxkIHVwZGF0ZSB0aGlzIGJvdW5kYXJ5IHRvIHRoZSBwZXJtYW5lbnQgRmFsbGJhY2sgc3RhdGUgaW5zdGVhZC5cbiAgICAgIC8vIE1hcmsgaXQgYXMgaGF2aW5nIGNhcHR1cmVkIChpLmUuIHN1c3BlbmRlZCkuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlOyAvLyBMZWF2ZSB0aGUgY2hpbGQgaW4gcGxhY2UuIEkuZS4gdGhlIGRlaHlkcmF0ZWQgZnJhZ21lbnQuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gUmVnaXN0ZXIgYSBjYWxsYmFjayB0byByZXRyeSB0aGlzIGJvdW5kYXJ5IG9uY2UgdGhlIHNlcnZlciBoYXMgc2VudCB0aGUgcmVzdWx0LlxuXG4gICAgICB2YXIgcmV0cnkgPSByZXRyeURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5LmJpbmQobnVsbCwgY3VycmVudCk7XG4gICAgICByZWdpc3RlclN1c3BlbnNlSW5zdGFuY2VSZXRyeShzdXNwZW5zZUluc3RhbmNlLCByZXRyeSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgYXR0ZW1wdC5cbiAgICAgIHJlZW50ZXJIeWRyYXRpb25TdGF0ZUZyb21EZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VJbnN0YW5jZSwgc3VzcGVuc2VTdGF0ZS50cmVlQ29udGV4dCk7XG4gICAgICB2YXIgcHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuKTsgLy8gTWFyayB0aGUgY2hpbGRyZW4gYXMgaHlkcmF0aW5nLiBUaGlzIGlzIGEgZmFzdCBwYXRoIHRvIGtub3cgd2hldGhlciB0aGlzXG4gICAgICAvLyB0cmVlIGlzIHBhcnQgb2YgYSBoeWRyYXRpbmcgdHJlZS4gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBhIGNoaWxkXG4gICAgICAvLyBub2RlIGhhcyBmdWxseSBtb3VudGVkIHlldCwgYW5kIGZvciBzY2hlZHVsaW5nIGV2ZW50IHJlcGxheWluZy5cbiAgICAgIC8vIENvbmNlcHR1YWxseSB0aGlzIGlzIHNpbWlsYXIgdG8gUGxhY2VtZW50IGluIHRoYXQgYSBuZXcgc3VidHJlZSBpc1xuICAgICAgLy8gaW5zZXJ0ZWQgaW50byB0aGUgUmVhY3QgdHJlZSBoZXJlLiBJdCBqdXN0IGhhcHBlbnMgdG8gbm90IG5lZWQgRE9NXG4gICAgICAvLyBtdXRhdGlvbnMgYmVjYXVzZSBpdCBhbHJlYWR5IGV4aXN0cy5cblxuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gSHlkcmF0aW5nO1xuICAgICAgcmV0dXJuIHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBzZWNvbmQgcmVuZGVyIHBhc3MuIFdlIGFscmVhZHkgYXR0ZW1wdGVkIHRvIGh5ZHJhdGVkLCBidXRcbiAgICAvLyBzb21ldGhpbmcgZWl0aGVyIHN1c3BlbmRlZCBvciBlcnJvcmVkLlxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmNlQ2xpZW50UmVuZGVyKSB7XG4gICAgICAvLyBTb21ldGhpbmcgZXJyb3JlZCBkdXJpbmcgaHlkcmF0aW9uLiBUcnkgYWdhaW4gd2l0aG91dCBoeWRyYXRpbmcuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+Rm9yY2VDbGllbnRSZW5kZXI7XG5cbiAgICAgIHZhciBfY2FwdHVyZWRWYWx1ZTIgPSBjcmVhdGVDYXB0dXJlZFZhbHVlKG5ldyBFcnJvcignVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGh5ZHJhdGluZyB0aGlzIFN1c3BlbnNlIGJvdW5kYXJ5LiAnICsgJ1N3aXRjaGVkIHRvIGNsaWVudCByZW5kZXJpbmcuJykpO1xuXG4gICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCBfY2FwdHVyZWRWYWx1ZTIpO1xuICAgIH0gZWxzZSBpZiAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gU29tZXRoaW5nIHN1c3BlbmRlZCBhbmQgd2Ugc2hvdWxkIHN0aWxsIGJlIGluIGRlaHlkcmF0ZWQgbW9kZS5cbiAgICAgIC8vIExlYXZlIHRoZSBleGlzdGluZyBjaGlsZCBpbiBwbGFjZS5cbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gVGhlIGRlaHlkcmF0ZWQgY29tcGxldGlvbiBwYXNzIGV4cGVjdHMgdGhpcyBmbGFnIHRvIGJlIHRoZXJlXG4gICAgICAvLyBidXQgdGhlIG5vcm1hbCBzdXNwZW5zZSBwYXNzIGRvZXNuJ3QuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3VzcGVuZGVkIGJ1dCB3ZSBzaG91bGQgbm8gbG9uZ2VyIGJlIGluIGRlaHlkcmF0ZWQgbW9kZS5cbiAgICAgIC8vIFRoZXJlZm9yZSB3ZSBub3cgaGF2ZSB0byByZW5kZXIgdGhlIGZhbGxiYWNrLlxuICAgICAgdmFyIG5leHRQcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgbmV4dEZhbGxiYWNrQ2hpbGRyZW4gPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gbW91bnRTdXNwZW5zZUZhbGxiYWNrQWZ0ZXJSZXRyeVdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRQcmltYXJ5Q2hpbGRyZW4sIG5leHRGYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50NCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50NC5tZW1vaXplZFN0YXRlID0gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBTVVNQRU5ERURfTUFSS0VSO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKGZpYmVyLCByZW5kZXJMYW5lcywgcHJvcGFnYXRpb25Sb290KSB7XG4gIGZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhmaWJlci5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICBhbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChmaWJlci5yZXR1cm4sIHJlbmRlckxhbmVzLCBwcm9wYWdhdGlvblJvb3QpO1xufVxuXG5mdW5jdGlvbiBwcm9wYWdhdGVTdXNwZW5zZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIGZpcnN0Q2hpbGQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIE1hcmsgYW55IFN1c3BlbnNlIGJvdW5kYXJpZXMgd2l0aCBmYWxsYmFja3MgYXMgaGF2aW5nIHdvcmsgdG8gZG8uXG4gIC8vIElmIHRoZXkgd2VyZSBwcmV2aW91c2x5IGZvcmNlZCBpbnRvIGZhbGxiYWNrcywgdGhleSBtYXkgbm93IGJlIGFibGVcbiAgLy8gdG8gdW5ibG9jay5cbiAgdmFyIG5vZGUgPSBmaXJzdENoaWxkO1xuXG4gIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgdmFyIHN0YXRlID0gbm9kZS5tZW1vaXplZFN0YXRlO1xuXG4gICAgICBpZiAoc3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKG5vZGUsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VMaXN0Q29tcG9uZW50KSB7XG4gICAgICAvLyBJZiB0aGUgdGFpbCBpcyBoaWRkZW4gdGhlcmUgbWlnaHQgbm90IGJlIGFuIFN1c3BlbnNlIGJvdW5kYXJpZXNcbiAgICAgIC8vIHRvIHNjaGVkdWxlIHdvcmsgb24uIEluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHNjaGVkdWxlIGl0IG9uIHRoZVxuICAgICAgLy8gbGlzdCBpdHNlbGYuXG4gICAgICAvLyBXZSBkb24ndCBoYXZlIHRvIHRyYXZlcnNlIHRvIHRoZSBjaGlsZHJlbiBvZiB0aGUgbGlzdCBzaW5jZVxuICAgICAgLy8gdGhlIGxpc3Qgd2lsbCBwcm9wYWdhdGUgdGhlIGNoYW5nZSB3aGVuIGl0IHJlcmVuZGVycy5cbiAgICAgIHNjaGVkdWxlU3VzcGVuc2VXb3JrT25GaWJlcihub2RlLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRMYXN0Q29udGVudFJvdyhmaXJzdENoaWxkKSB7XG4gIC8vIFRoaXMgaXMgZ29pbmcgdG8gZmluZCB0aGUgbGFzdCByb3cgYW1vbmcgdGhlc2UgY2hpbGRyZW4gdGhhdCBpcyBhbHJlYWR5XG4gIC8vIHNob3dpbmcgY29udGVudCBvbiB0aGUgc2NyZWVuLCBhcyBvcHBvc2VkIHRvIGJlaW5nIGluIGZhbGxiYWNrIHN0YXRlIG9yXG4gIC8vIG5ldy4gSWYgYSByb3cgaGFzIG11bHRpcGxlIFN1c3BlbnNlIGJvdW5kYXJpZXMsIGFueSBvZiB0aGVtIGJlaW5nIGluIHRoZVxuICAvLyBmYWxsYmFjayBzdGF0ZSwgY291bnRzIGFzIHRoZSB3aG9sZSByb3cgYmVpbmcgaW4gYSBmYWxsYmFjayBzdGF0ZS5cbiAgLy8gTm90ZSB0aGF0IHRoZSBcInJvd3NcIiB3aWxsIGJlIHdvcmtJblByb2dyZXNzLCBidXQgYW55IG5lc3RlZCBjaGlsZHJlblxuICAvLyB3aWxsIHN0aWxsIGJlIGN1cnJlbnQgc2luY2Ugd2UgaGF2ZW4ndCByZW5kZXJlZCB0aGVtIHlldC4gVGhlIG1vdW50ZWRcbiAgLy8gb3JkZXIgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgbmV3IG9yZGVyLiBXZSB1c2UgdGhlIG5ldyBvcmRlci5cbiAgdmFyIHJvdyA9IGZpcnN0Q2hpbGQ7XG4gIHZhciBsYXN0Q29udGVudFJvdyA9IG51bGw7XG5cbiAgd2hpbGUgKHJvdyAhPT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50Um93ID0gcm93LmFsdGVybmF0ZTsgLy8gTmV3IHJvd3MgY2FuJ3QgYmUgY29udGVudCByb3dzLlxuXG4gICAgaWYgKGN1cnJlbnRSb3cgIT09IG51bGwgJiYgZmluZEZpcnN0U3VzcGVuZGVkKGN1cnJlbnRSb3cpID09PSBudWxsKSB7XG4gICAgICBsYXN0Q29udGVudFJvdyA9IHJvdztcbiAgICB9XG5cbiAgICByb3cgPSByb3cuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBsYXN0Q29udGVudFJvdztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVSZXZlYWxPcmRlcihyZXZlYWxPcmRlcikge1xuICB7XG4gICAgaWYgKHJldmVhbE9yZGVyICE9PSB1bmRlZmluZWQgJiYgcmV2ZWFsT3JkZXIgIT09ICdmb3J3YXJkcycgJiYgcmV2ZWFsT3JkZXIgIT09ICdiYWNrd2FyZHMnICYmIHJldmVhbE9yZGVyICE9PSAndG9nZXRoZXInICYmICFkaWRXYXJuQWJvdXRSZXZlYWxPcmRlcltyZXZlYWxPcmRlcl0pIHtcbiAgICAgIGRpZFdhcm5BYm91dFJldmVhbE9yZGVyW3JldmVhbE9yZGVyXSA9IHRydWU7XG5cbiAgICAgIGlmICh0eXBlb2YgcmV2ZWFsT3JkZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHN3aXRjaCAocmV2ZWFsT3JkZXIudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGNhc2UgJ3RvZ2V0aGVyJzpcbiAgICAgICAgICBjYXNlICdmb3J3YXJkcyc6XG4gICAgICAgICAgY2FzZSAnYmFja3dhcmRzJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXJyb3IoJ1wiJXNcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdVc2UgbG93ZXJjYXNlIFwiJXNcIiBpbnN0ZWFkLicsIHJldmVhbE9yZGVyLCByZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgJ2ZvcndhcmQnOlxuICAgICAgICAgIGNhc2UgJ2JhY2t3YXJkJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXJyb3IoJ1wiJXNcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdSZWFjdCB1c2VzIHRoZSAtcyBzdWZmaXggaW4gdGhlIHNwZWxsaW5nLiBVc2UgXCIlc3NcIiBpbnN0ZWFkLicsIHJldmVhbE9yZGVyLCByZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHN1cHBvcnRlZCByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ0RpZCB5b3UgbWVhbiBcInRvZ2V0aGVyXCIsIFwiZm9yd2FyZHNcIiBvciBcImJhY2t3YXJkc1wiPycsIHJldmVhbE9yZGVyKTtcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCclcyBpcyBub3QgYSBzdXBwb3J0ZWQgdmFsdWUgZm9yIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwidG9nZXRoZXJcIiwgXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCI/JywgcmV2ZWFsT3JkZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVRhaWxPcHRpb25zKHRhaWxNb2RlLCByZXZlYWxPcmRlcikge1xuICB7XG4gICAgaWYgKHRhaWxNb2RlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5BYm91dFRhaWxPcHRpb25zW3RhaWxNb2RlXSkge1xuICAgICAgaWYgKHRhaWxNb2RlICE9PSAnY29sbGFwc2VkJyAmJiB0YWlsTW9kZSAhPT0gJ2hpZGRlbicpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VGFpbE9wdGlvbnNbdGFpbE1vZGVdID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHN1cHBvcnRlZCB2YWx1ZSBmb3IgdGFpbCBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ0RpZCB5b3UgbWVhbiBcImNvbGxhcHNlZFwiIG9yIFwiaGlkZGVuXCI/JywgdGFpbE1vZGUpO1xuICAgICAgfSBlbHNlIGlmIChyZXZlYWxPcmRlciAhPT0gJ2ZvcndhcmRzJyAmJiByZXZlYWxPcmRlciAhPT0gJ2JhY2t3YXJkcycpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VGFpbE9wdGlvbnNbdGFpbE1vZGVdID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignPFN1c3BlbnNlTGlzdCB0YWlsPVwiJXNcIiAvPiBpcyBvbmx5IHZhbGlkIGlmIHJldmVhbE9yZGVyIGlzICcgKyAnXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCIuICcgKyAnRGlkIHlvdSBtZWFuIHRvIHNwZWNpZnkgcmV2ZWFsT3JkZXI9XCJmb3J3YXJkc1wiPycsIHRhaWxNb2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChjaGlsZFNsb3QsIGluZGV4KSB7XG4gIHtcbiAgICB2YXIgaXNBbkFycmF5ID0gaXNBcnJheShjaGlsZFNsb3QpO1xuICAgIHZhciBpc0l0ZXJhYmxlID0gIWlzQW5BcnJheSAmJiB0eXBlb2YgZ2V0SXRlcmF0b3JGbihjaGlsZFNsb3QpID09PSAnZnVuY3Rpb24nO1xuXG4gICAgaWYgKGlzQW5BcnJheSB8fCBpc0l0ZXJhYmxlKSB7XG4gICAgICB2YXIgdHlwZSA9IGlzQW5BcnJheSA/ICdhcnJheScgOiAnaXRlcmFibGUnO1xuXG4gICAgICBlcnJvcignQSBuZXN0ZWQgJXMgd2FzIHBhc3NlZCB0byByb3cgIyVzIGluIDxTdXNwZW5zZUxpc3QgLz4uIFdyYXAgaXQgaW4gJyArICdhbiBhZGRpdGlvbmFsIFN1c3BlbnNlTGlzdCB0byBjb25maWd1cmUgaXRzIHJldmVhbE9yZGVyOiAnICsgJzxTdXNwZW5zZUxpc3QgcmV2ZWFsT3JkZXI9Li4uPiAuLi4gJyArICc8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPS4uLj57JXN9PC9TdXNwZW5zZUxpc3Q+IC4uLiAnICsgJzwvU3VzcGVuc2VMaXN0PicsIHR5cGUsIGluZGV4LCB0eXBlKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN1c3BlbnNlTGlzdENoaWxkcmVuKGNoaWxkcmVuLCByZXZlYWxPcmRlcikge1xuICB7XG4gICAgaWYgKChyZXZlYWxPcmRlciA9PT0gJ2ZvcndhcmRzJyB8fCByZXZlYWxPcmRlciA9PT0gJ2JhY2t3YXJkcycpICYmIGNoaWxkcmVuICE9PSB1bmRlZmluZWQgJiYgY2hpbGRyZW4gIT09IG51bGwgJiYgY2hpbGRyZW4gIT09IGZhbHNlKSB7XG4gICAgICBpZiAoaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChjaGlsZHJlbltpXSwgaSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFyIGNoaWxkcmVuSXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoY2hpbGRyZW4pO1xuXG4gICAgICAgICAgaWYgKGNoaWxkcmVuSXRlcmF0b3IpIHtcbiAgICAgICAgICAgIHZhciBzdGVwID0gY2hpbGRyZW5JdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICB2YXIgX2kgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgc3RlcCA9IGNoaWxkcmVuSXRlcmF0b3IubmV4dCgpKSB7XG4gICAgICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChzdGVwLnZhbHVlLCBfaSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBfaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvcignQSBzaW5nbGUgcm93IHdhcyBwYXNzZWQgdG8gYSA8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPVwiJXNcIiAvPi4gJyArICdUaGlzIGlzIG5vdCB1c2VmdWwgc2luY2UgaXQgbmVlZHMgbXVsdGlwbGUgcm93cy4gJyArICdEaWQgeW91IG1lYW4gdG8gcGFzcyBtdWx0aXBsZSBjaGlsZHJlbiBvciBhbiBhcnJheT8nLCByZXZlYWxPcmRlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBpc0JhY2t3YXJkcywgdGFpbCwgbGFzdENvbnRlbnRSb3csIHRhaWxNb2RlKSB7XG4gIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHJlbmRlclN0YXRlID09PSBudWxsKSB7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHtcbiAgICAgIGlzQmFja3dhcmRzOiBpc0JhY2t3YXJkcyxcbiAgICAgIHJlbmRlcmluZzogbnVsbCxcbiAgICAgIHJlbmRlcmluZ1N0YXJ0VGltZTogMCxcbiAgICAgIGxhc3Q6IGxhc3RDb250ZW50Um93LFxuICAgICAgdGFpbDogdGFpbCxcbiAgICAgIHRhaWxNb2RlOiB0YWlsTW9kZVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gV2UgY2FuIHJldXNlIHRoZSBleGlzdGluZyBvYmplY3QgZnJvbSBwcmV2aW91cyByZW5kZXJzLlxuICAgIHJlbmRlclN0YXRlLmlzQmFja3dhcmRzID0gaXNCYWNrd2FyZHM7XG4gICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbnVsbDtcbiAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmdTdGFydFRpbWUgPSAwO1xuICAgIHJlbmRlclN0YXRlLmxhc3QgPSBsYXN0Q29udGVudFJvdztcbiAgICByZW5kZXJTdGF0ZS50YWlsID0gdGFpbDtcbiAgICByZW5kZXJTdGF0ZS50YWlsTW9kZSA9IHRhaWxNb2RlO1xuICB9XG59IC8vIFRoaXMgY2FuIGVuZCB1cCByZW5kZXJpbmcgdGhpcyBjb21wb25lbnQgbXVsdGlwbGUgcGFzc2VzLlxuLy8gVGhlIGZpcnN0IHBhc3Mgc3BsaXRzIHRoZSBjaGlsZHJlbiBmaWJlcnMgaW50byB0d28gc2V0cy4gQSBoZWFkIGFuZCB0YWlsLlxuLy8gV2UgZmlyc3QgcmVuZGVyIHRoZSBoZWFkLiBJZiBhbnl0aGluZyBpcyBpbiBmYWxsYmFjayBzdGF0ZSwgd2UgZG8gYW5vdGhlclxuLy8gcGFzcyB0aHJvdWdoIGJlZ2luV29yayB0byByZXJlbmRlciBhbGwgY2hpbGRyZW4gKGluY2x1ZGluZyB0aGUgdGFpbCkgd2l0aFxuLy8gdGhlIGZvcmNlIHN1c3BlbmQgY29udGV4dC4gSWYgdGhlIGZpcnN0IHJlbmRlciBkaWRuJ3QgaGF2ZSBhbnl0aGluZyBpblxuLy8gaW4gZmFsbGJhY2sgc3RhdGUuIFRoZW4gd2UgcmVuZGVyIGVhY2ggcm93IGluIHRoZSB0YWlsIG9uZS1ieS1vbmUuXG4vLyBUaGF0IGhhcHBlbnMgaW4gdGhlIGNvbXBsZXRlV29yayBwaGFzZSB3aXRob3V0IGdvaW5nIGJhY2sgdG8gYmVnaW5Xb3JrLlxuXG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHJldmVhbE9yZGVyID0gbmV4dFByb3BzLnJldmVhbE9yZGVyO1xuICB2YXIgdGFpbE1vZGUgPSBuZXh0UHJvcHMudGFpbDtcbiAgdmFyIG5ld0NoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YWxpZGF0ZVJldmVhbE9yZGVyKHJldmVhbE9yZGVyKTtcbiAgdmFsaWRhdGVUYWlsT3B0aW9ucyh0YWlsTW9kZSwgcmV2ZWFsT3JkZXIpO1xuICB2YWxpZGF0ZVN1c3BlbnNlTGlzdENoaWxkcmVuKG5ld0NoaWxkcmVuLCByZXZlYWxPcmRlcik7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXdDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50O1xuICB2YXIgc2hvdWxkRm9yY2VGYWxsYmFjayA9IGhhc1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG5cbiAgaWYgKHNob3VsZEZvcmNlRmFsbGJhY2spIHtcbiAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICB9IGVsc2Uge1xuICAgIHZhciBkaWRTdXNwZW5kQmVmb3JlID0gY3VycmVudCAhPT0gbnVsbCAmJiAoY3VycmVudC5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gICAgaWYgKGRpZFN1c3BlbmRCZWZvcmUpIHtcbiAgICAgIC8vIElmIHdlIHByZXZpb3VzbHkgZm9yY2VkIGEgZmFsbGJhY2ssIHdlIG5lZWQgdG8gc2NoZWR1bGUgd29ya1xuICAgICAgLy8gb24gYW55IG5lc3RlZCBib3VuZGFyaWVzIHRvIGxldCB0aGVtIGtub3cgdG8gdHJ5IHRvIHJlbmRlclxuICAgICAgLy8gYWdhaW4uIFRoaXMgaXMgdGhlIHNhbWUgYXMgY29udGV4dCB1cGRhdGluZy5cbiAgICAgIHByb3BhZ2F0ZVN1c3BlbnNlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MuY2hpbGQsIHJlbmRlckxhbmVzKTtcbiAgICB9XG5cbiAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQpO1xuICB9XG5cbiAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VDb250ZXh0KTtcblxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIC8vIEluIGxlZ2FjeSBtb2RlLCBTdXNwZW5zZUxpc3QgZG9lc24ndCB3b3JrIHNvIHdlIGp1c3RcbiAgICAvLyB1c2UgbWFrZSBpdCBhIG5vb3AgYnkgdHJlYXRpbmcgaXQgYXMgdGhlIGRlZmF1bHQgcmV2ZWFsT3JkZXIuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoIChyZXZlYWxPcmRlcikge1xuICAgICAgY2FzZSAnZm9yd2FyZHMnOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhc3RDb250ZW50Um93ID0gZmluZExhc3RDb250ZW50Um93KHdvcmtJblByb2dyZXNzLmNoaWxkKTtcbiAgICAgICAgICB2YXIgdGFpbDtcblxuICAgICAgICAgIGlmIChsYXN0Q29udGVudFJvdyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlIHdob2xlIGxpc3QgaXMgcGFydCBvZiB0aGUgdGFpbC5cbiAgICAgICAgICAgIC8vIFRPRE86IFdlIGNvdWxkIGZhc3QgcGF0aCBieSBqdXN0IHJlbmRlcmluZyB0aGUgdGFpbCBub3cuXG4gICAgICAgICAgICB0YWlsID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIERpc2Nvbm5lY3QgdGhlIHRhaWwgcm93cyBhZnRlciB0aGUgY29udGVudCByb3cuXG4gICAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byByZW5kZXIgdGhlbSBzZXBhcmF0ZWx5IGxhdGVyLlxuICAgICAgICAgICAgdGFpbCA9IGxhc3RDb250ZW50Um93LnNpYmxpbmc7XG4gICAgICAgICAgICBsYXN0Q29udGVudFJvdy5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIGZhbHNlLCAvLyBpc0JhY2t3YXJkc1xuICAgICAgICAgIHRhaWwsIGxhc3RDb250ZW50Um93LCB0YWlsTW9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAnYmFja3dhcmRzJzpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGZpbmQgdGhlIGZpcnN0IHJvdyB0aGF0IGhhcyBleGlzdGluZyBjb250ZW50LlxuICAgICAgICAgIC8vIEF0IHRoZSBzYW1lIHRpbWUgd2UncmUgZ29pbmcgdG8gcmV2ZXJzZSB0aGUgbGlzdCBvZiBldmVyeXRoaW5nXG4gICAgICAgICAgLy8gd2UgcGFzcyBpbiB0aGUgbWVhbnRpbWUuIFRoYXQncyBnb2luZyB0byBiZSBvdXIgdGFpbCBpbiByZXZlcnNlXG4gICAgICAgICAgLy8gb3JkZXIuXG4gICAgICAgICAgdmFyIF90YWlsID0gbnVsbDtcbiAgICAgICAgICB2YXIgcm93ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsO1xuXG4gICAgICAgICAgd2hpbGUgKHJvdyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRSb3cgPSByb3cuYWx0ZXJuYXRlOyAvLyBOZXcgcm93cyBjYW4ndCBiZSBjb250ZW50IHJvd3MuXG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50Um93ICE9PSBudWxsICYmIGZpbmRGaXJzdFN1c3BlbmRlZChjdXJyZW50Um93KSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1haW4gY29udGVudC5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByb3c7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbmV4dFJvdyA9IHJvdy5zaWJsaW5nO1xuICAgICAgICAgICAgcm93LnNpYmxpbmcgPSBfdGFpbDtcbiAgICAgICAgICAgIF90YWlsID0gcm93O1xuICAgICAgICAgICAgcm93ID0gbmV4dFJvdztcbiAgICAgICAgICB9IC8vIFRPRE86IElmIHdvcmtJblByb2dyZXNzLmNoaWxkIGlzIG51bGwsIHdlIGNhbiBjb250aW51ZSBvbiB0aGUgdGFpbCBpbW1lZGlhdGVseS5cblxuXG4gICAgICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCB0cnVlLCAvLyBpc0JhY2t3YXJkc1xuICAgICAgICAgIF90YWlsLCBudWxsLCAvLyBsYXN0XG4gICAgICAgICAgdGFpbE1vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgJ3RvZ2V0aGVyJzpcbiAgICAgICAge1xuICAgICAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgZmFsc2UsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgbnVsbCwgLy8gdGFpbFxuICAgICAgICAgIG51bGwsIC8vIGxhc3RcbiAgICAgICAgICB1bmRlZmluZWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUaGUgZGVmYXVsdCByZXZlYWwgb3JkZXIgaXMgdGhlIHNhbWUgYXMgbm90IGhhdmluZ1xuICAgICAgICAgIC8vIGEgYm91bmRhcnkuXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVBvcnRhbENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIFBvcnRhbHMgYXJlIHNwZWNpYWwgYmVjYXVzZSB3ZSBkb24ndCBhcHBlbmQgdGhlIGNoaWxkcmVuIGR1cmluZyBtb3VudFxuICAgIC8vIGJ1dCBhdCBjb21taXQuIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIHRyYWNrIGluc2VydGlvbnMgd2hpY2ggdGhlIG5vcm1hbFxuICAgIC8vIGZsb3cgZG9lc24ndCBkbyBkdXJpbmcgbW91bnQuIFRoaXMgZG9lc24ndCBoYXBwZW4gYXQgdGhlIHJvb3QgYmVjYXVzZVxuICAgIC8vIHRoZSByb290IGFsd2F5cyBzdGFydHMgd2l0aCBhIFwiY3VycmVudFwiIHdpdGggYSBudWxsIGNoaWxkLlxuICAgIC8vIFRPRE86IENvbnNpZGVyIHVuaWZ5aW5nIHRoaXMgd2l0aCBob3cgdGhlIHJvb3Qgd29ya3MuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG52YXIgaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIgPSBmYWxzZTtcblxuZnVuY3Rpb24gdXBkYXRlQ29udGV4dFByb3ZpZGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgcHJvdmlkZXJUeXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgdmFyIGNvbnRleHQgPSBwcm92aWRlclR5cGUuX2NvbnRleHQ7XG4gIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcztcbiAgdmFyIG5ld1ZhbHVlID0gbmV3UHJvcHMudmFsdWU7XG5cbiAge1xuICAgIGlmICghKCd2YWx1ZScgaW4gbmV3UHJvcHMpKSB7XG4gICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdOb1ZhbHVlUHJvcE9uQ29udGV4dFByb3ZpZGVyKSB7XG4gICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdOb1ZhbHVlUHJvcE9uQ29udGV4dFByb3ZpZGVyID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignVGhlIGB2YWx1ZWAgcHJvcCBpcyByZXF1aXJlZCBmb3IgdGhlIGA8Q29udGV4dC5Qcm92aWRlcj5gLiBEaWQgeW91IG1pc3NwZWxsIGl0IG9yIGZvcmdldCB0byBwYXNzIGl0PycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcm92aWRlclByb3BUeXBlcyA9IHdvcmtJblByb2dyZXNzLnR5cGUucHJvcFR5cGVzO1xuXG4gICAgaWYgKHByb3ZpZGVyUHJvcFR5cGVzKSB7XG4gICAgICBjaGVja1Byb3BUeXBlcyhwcm92aWRlclByb3BUeXBlcywgbmV3UHJvcHMsICdwcm9wJywgJ0NvbnRleHQuUHJvdmlkZXInKTtcbiAgICB9XG4gIH1cblxuICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIG5ld1ZhbHVlKTtcblxuICB7XG4gICAgaWYgKG9sZFByb3BzICE9PSBudWxsKSB7XG4gICAgICB2YXIgb2xkVmFsdWUgPSBvbGRQcm9wcy52YWx1ZTtcblxuICAgICAgaWYgKG9iamVjdElzKG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAgICAgLy8gTm8gY2hhbmdlLiBCYWlsb3V0IGVhcmx5IGlmIGNoaWxkcmVuIGFyZSB0aGUgc2FtZS5cbiAgICAgICAgaWYgKG9sZFByb3BzLmNoaWxkcmVuID09PSBuZXdQcm9wcy5jaGlsZHJlbiAmJiAhaGFzQ29udGV4dENoYW5nZWQoKSkge1xuICAgICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZSBjb250ZXh0IHZhbHVlIGNoYW5nZWQuIFNlYXJjaCBmb3IgbWF0Y2hpbmcgY29uc3VtZXJzIGFuZCBzY2hlZHVsZVxuICAgICAgICAvLyB0aGVtIHRvIHVwZGF0ZS5cbiAgICAgICAgcHJvcGFnYXRlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBuZXdDaGlsZHJlbiA9IG5ld1Byb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG52YXIgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRleHRDb25zdW1lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlOyAvLyBUaGUgbG9naWMgYmVsb3cgZm9yIENvbnRleHQgZGlmZmVycyBkZXBlbmRpbmcgb24gUFJPRCBvciBERVYgbW9kZS4gSW5cbiAgLy8gREVWIG1vZGUsIHdlIGNyZWF0ZSBhIHNlcGFyYXRlIG9iamVjdCBmb3IgQ29udGV4dC5Db25zdW1lciB0aGF0IGFjdHNcbiAgLy8gbGlrZSBhIHByb3h5IHRvIENvbnRleHQuIFRoaXMgcHJveHkgb2JqZWN0IGFkZHMgdW5uZWNlc3NhcnkgY29kZSBpbiBQUk9EXG4gIC8vIHNvIHdlIHVzZSB0aGUgb2xkIGJlaGF2aW91ciAoQ29udGV4dC5Db25zdW1lciByZWZlcmVuY2VzIENvbnRleHQpIHRvXG4gIC8vIHJlZHVjZSBzaXplIGFuZCBvdmVyaGVhZC4gVGhlIHNlcGFyYXRlIG9iamVjdCByZWZlcmVuY2VzIGNvbnRleHQgdmlhXG4gIC8vIGEgcHJvcGVydHkgY2FsbGVkIFwiX2NvbnRleHRcIiwgd2hpY2ggYWxzbyBnaXZlcyB1cyB0aGUgYWJpbGl0eSB0byBjaGVja1xuICAvLyBpbiBERVYgbW9kZSBpZiB0aGlzIHByb3BlcnR5IGV4aXN0cyBvciBub3QgYW5kIHdhcm4gaWYgaXQgZG9lcyBub3QuXG5cbiAge1xuICAgIGlmIChjb250ZXh0Ll9jb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFRoaXMgbWF5IGJlIGJlY2F1c2UgaXQncyBhIENvbnRleHQgKHJhdGhlciB0aGFuIGEgQ29uc3VtZXIpLlxuICAgICAgLy8gT3IgaXQgbWF5IGJlIGJlY2F1c2UgaXQncyBvbGRlciBSZWFjdCB3aGVyZSB0aGV5J3JlIHRoZSBzYW1lIHRoaW5nLlxuICAgICAgLy8gV2Ugb25seSB3YW50IHRvIHdhcm4gaWYgd2UncmUgc3VyZSBpdCdzIGEgbmV3IFJlYWN0LlxuICAgICAgaWYgKGNvbnRleHQgIT09IGNvbnRleHQuQ29uc3VtZXIpIHtcbiAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIpIHtcbiAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dD4gZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Db25zdW1lcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0ID0gY29udGV4dC5fY29udGV4dDtcbiAgICB9XG4gIH1cblxuICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciByZW5kZXIgPSBuZXdQcm9wcy5jaGlsZHJlbjtcblxuICB7XG4gICAgaWYgKHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdBIGNvbnRleHQgY29uc3VtZXIgd2FzIHJlbmRlcmVkIHdpdGggbXVsdGlwbGUgY2hpbGRyZW4sIG9yIGEgY2hpbGQgJyArIFwidGhhdCBpc24ndCBhIGZ1bmN0aW9uLiBBIGNvbnRleHQgY29uc3VtZXIgZXhwZWN0cyBhIHNpbmdsZSBjaGlsZCBcIiArICd0aGF0IGlzIGEgZnVuY3Rpb24uIElmIHlvdSBkaWQgcGFzcyBhIGZ1bmN0aW9uLCBtYWtlIHN1cmUgdGhlcmUgJyArICdpcyBubyB0cmFpbGluZyBvciBsZWFkaW5nIHdoaXRlc3BhY2UgYXJvdW5kIGl0LicpO1xuICAgIH1cbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBuZXdWYWx1ZSA9IHJlYWRDb250ZXh0KGNvbnRleHQpO1xuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB2YXIgbmV3Q2hpbGRyZW47XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIG5ld0NoaWxkcmVuID0gcmVuZGVyKG5ld1ZhbHVlKTtcbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpIHtcbiAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gQSBsYXp5IGNvbXBvbmVudCBvbmx5IG1vdW50cyBpZiBpdCBzdXNwZW5kZWQgaW5zaWRlIGEgbm9uLVxuICAgICAgLy8gY29uY3VycmVudCB0cmVlLCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFdlIHdhbnQgdG8gdHJlYXQgaXQgbGlrZVxuICAgICAgLy8gYSBuZXcgbW91bnQsIGV2ZW4gdGhvdWdoIGFuIGVtcHR5IHZlcnNpb24gb2YgaXQgYWxyZWFkeSBjb21taXR0ZWQuXG4gICAgICAvLyBEaXNjb25uZWN0IHRoZSBhbHRlcm5hdGUgcG9pbnRlcnMuXG4gICAgICBjdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBTaW5jZSB0aGlzIGlzIGNvbmNlcHR1YWxseSBhIG5ldyBmaWJlciwgc2NoZWR1bGUgYSBQbGFjZW1lbnQgZWZmZWN0XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAvLyBSZXVzZSBwcmV2aW91cyBkZXBlbmRlbmNpZXNcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llcztcbiAgfVxuXG4gIHtcbiAgICAvLyBEb24ndCB1cGRhdGUgXCJiYXNlXCIgcmVuZGVyIHRpbWVzIGZvciBiYWlsb3V0cy5cbiAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZygpO1xuICB9XG5cbiAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcyk7IC8vIENoZWNrIGlmIHRoZSBjaGlsZHJlbiBoYXZlIGFueSBwZW5kaW5nIHdvcmsuXG5cbiAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKSkge1xuICAgIC8vIFRoZSBjaGlsZHJlbiBkb24ndCBoYXZlIGFueSB3b3JrIGVpdGhlci4gV2UgY2FuIHNraXAgdGhlbS5cbiAgICAvLyBUT0RPOiBPbmNlIHdlIGFkZCBiYWNrIHJlc3VtaW5nLCB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlIGNoaWxkcmVuIGFyZVxuICAgIC8vIGEgd29yay1pbi1wcm9ncmVzcyBzZXQuIElmIHNvLCB3ZSBuZWVkIHRvIHRyYW5zZmVyIHRoZWlyIGVmZmVjdHMuXG4gICAge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9IC8vIFRoaXMgZmliZXIgZG9lc24ndCBoYXZlIHdvcmssIGJ1dCBpdHMgc3VidHJlZSBkb2VzLiBDbG9uZSB0aGUgY2hpbGRcbiAgLy8gZmliZXJzIGFuZCBjb250aW51ZS5cblxuXG4gIGNsb25lQ2hpbGRGaWJlcnMoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHJlbW91bnRGaWJlcihjdXJyZW50LCBvbGRXb3JrSW5Qcm9ncmVzcywgbmV3V29ya0luUHJvZ3Jlc3MpIHtcbiAge1xuICAgIHZhciByZXR1cm5GaWJlciA9IG9sZFdvcmtJblByb2dyZXNzLnJldHVybjtcblxuICAgIGlmIChyZXR1cm5GaWJlciA9PT0gbnVsbCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHN3YXAgdGhlIHJvb3QgZmliZXIuJyk7XG4gICAgfSAvLyBEaXNjb25uZWN0IGZyb20gdGhlIG9sZCBjdXJyZW50LlxuICAgIC8vIEl0IHdpbGwgZ2V0IGRlbGV0ZWQuXG5cblxuICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICBvbGRXb3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBDb25uZWN0IHRvIHRoZSBuZXcgdHJlZS5cblxuICAgIG5ld1dvcmtJblByb2dyZXNzLmluZGV4ID0gb2xkV29ya0luUHJvZ3Jlc3MuaW5kZXg7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3Muc2libGluZyA9IG9sZFdvcmtJblByb2dyZXNzLnNpYmxpbmc7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3MucmV0dXJuID0gb2xkV29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuICAgIG5ld1dvcmtJblByb2dyZXNzLnJlZiA9IG9sZFdvcmtJblByb2dyZXNzLnJlZjsgLy8gUmVwbGFjZSB0aGUgY2hpbGQvc2libGluZyBwb2ludGVycyBhYm92ZSBpdC5cblxuICAgIGlmIChvbGRXb3JrSW5Qcm9ncmVzcyA9PT0gcmV0dXJuRmliZXIuY2hpbGQpIHtcbiAgICAgIHJldHVybkZpYmVyLmNoaWxkID0gbmV3V29ya0luUHJvZ3Jlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBwcmV2U2libGluZyA9IHJldHVybkZpYmVyLmNoaWxkO1xuXG4gICAgICBpZiAocHJldlNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBwYXJlbnQgdG8gaGF2ZSBhIGNoaWxkLicpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAocHJldlNpYmxpbmcuc2libGluZyAhPT0gb2xkV29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcHJldlNpYmxpbmcgPSBwcmV2U2libGluZy5zaWJsaW5nO1xuXG4gICAgICAgIGlmIChwcmV2U2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBmaW5kIHRoZSBwcmV2aW91cyBzaWJsaW5nLicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByZXZTaWJsaW5nLnNpYmxpbmcgPSBuZXdXb3JrSW5Qcm9ncmVzcztcbiAgICB9IC8vIERlbGV0ZSB0aGUgb2xkIGZpYmVyIGFuZCBwbGFjZSB0aGUgbmV3IG9uZS5cbiAgICAvLyBTaW5jZSB0aGUgb2xkIGZpYmVyIGlzIGRpc2Nvbm5lY3RlZCwgd2UgaGF2ZSB0byBzY2hlZHVsZSBpdCBtYW51YWxseS5cblxuXG4gICAgdmFyIGRlbGV0aW9ucyA9IHJldHVybkZpYmVyLmRlbGV0aW9ucztcblxuICAgIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjdXJyZW50XTtcbiAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IENoaWxkRGVsZXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0aW9ucy5wdXNoKGN1cnJlbnQpO1xuICAgIH1cblxuICAgIG5ld1dvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDsgLy8gUmVzdGFydCB3b3JrIGZyb20gdGhlIG5ldyBmaWJlci5cblxuICAgIHJldHVybiBuZXdXb3JrSW5Qcm9ncmVzcztcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcykge1xuICAvLyBCZWZvcmUgcGVyZm9ybWluZyBhbiBlYXJseSBiYWlsb3V0LCB3ZSBtdXN0IGNoZWNrIGlmIHRoZXJlIGFyZSBwZW5kaW5nXG4gIC8vIHVwZGF0ZXMgb3IgY29udGV4dC5cbiAgdmFyIHVwZGF0ZUxhbmVzID0gY3VycmVudC5sYW5lcztcblxuICBpZiAoaW5jbHVkZXNTb21lTGFuZSh1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm8gcGVuZGluZyB1cGRhdGUsIGJ1dCBiZWNhdXNlIGNvbnRleHQgaXMgcHJvcGFnYXRlZCBsYXppbHksIHdlIG5lZWRcblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRFYXJseUJhaWxvdXRJZk5vU2NoZWR1bGVkVXBkYXRlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIGZpYmVyIGRvZXMgbm90IGhhdmUgYW55IHBlbmRpbmcgd29yay4gQmFpbG91dCB3aXRob3V0IGVudGVyaW5nXG4gIC8vIHRoZSBiZWdpbiBwaGFzZS4gVGhlcmUncyBzdGlsbCBzb21lIGJvb2trZWVwaW5nIHdlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZVxuICAvLyBpbiB0aGlzIG9wdGltaXplZCBwYXRoLCBtb3N0bHkgcHVzaGluZyBzdHVmZiBvbnRvIHRoZSBzdGFjay5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAgcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICBwdXNoSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcy52YWx1ZTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLl9jb250ZXh0O1xuICAgICAgICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIG5ld1ZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAge1xuICAgICAgICAvLyBQcm9maWxlciBzaG91bGQgb25seSBjYWxsIG9uUmVuZGVyIHdoZW4gb25lIG9mIGl0cyBkZXNjZW5kYW50cyBhY3R1YWxseSByZW5kZXJlZC5cbiAgICAgICAgdmFyIGhhc0NoaWxkV29yayA9IGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMpO1xuXG4gICAgICAgIGlmIChoYXNDaGlsZFdvcmspIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgLy8gUmVzZXQgZWZmZWN0IGR1cmF0aW9ucyBmb3IgdGhlIG5leHQgZXZlbnR1YWwgZWZmZWN0IHBoYXNlLlxuICAgICAgICAgIC8vIFRoZXNlIGFyZSByZXNldCBkdXJpbmcgcmVuZGVyIHRvIGFsbG93IHRoZSBEZXZUb29scyBjb21taXQgaG9vayBhIGNoYW5jZSB0byByZWFkIHRoZW0sXG4gICAgICAgICAgdmFyIHN0YXRlTm9kZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgICAgIHN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAoc3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7IC8vIFdlIGtub3cgdGhhdCB0aGlzIGNvbXBvbmVudCB3aWxsIHN1c3BlbmQgYWdhaW4gYmVjYXVzZSBpZiBpdCBoYXNcbiAgICAgICAgICAgIC8vIGJlZW4gdW5zdXNwZW5kZWQgaXQgaGFzIGNvbW1pdHRlZCBhcyBhIHJlc29sdmVkIFN1c3BlbnNlIGNvbXBvbmVudC5cbiAgICAgICAgICAgIC8vIElmIGl0IG5lZWRzIHRvIGJlIHJldHJpZWQsIGl0IHNob3VsZCBoYXZlIHdvcmsgc2NoZWR1bGVkIG9uIGl0LlxuXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlOyAvLyBXZSBzaG91bGQgbmV2ZXIgcmVuZGVyIHRoZSBjaGlsZHJlbiBvZiBhIGRlaHlkcmF0ZWQgYm91bmRhcnkgdW50aWwgd2VcbiAgICAgICAgICAgIC8vIHVwZ3JhZGUgaXQuIFdlIHJldHVybiBudWxsIGluc3RlYWQgb2YgYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yay5cblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSAvLyBJZiB0aGlzIGJvdW5kYXJ5IGlzIGN1cnJlbnRseSB0aW1lZCBvdXQsIHdlIG5lZWQgdG8gZGVjaWRlXG4gICAgICAgICAgLy8gd2hldGhlciB0byByZXRyeSB0aGUgcHJpbWFyeSBjaGlsZHJlbiwgb3IgdG8gc2tpcCBvdmVyIGl0IGFuZFxuICAgICAgICAgIC8vIGdvIHN0cmFpZ2h0IHRvIHRoZSBmYWxsYmFjay4gQ2hlY2sgdGhlIHByaW9yaXR5IG9mIHRoZSBwcmltYXJ5XG4gICAgICAgICAgLy8gY2hpbGQgZnJhZ21lbnQuXG5cblxuICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRMYW5lcyA9IHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXM7XG5cbiAgICAgICAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgcHJpbWFyeUNoaWxkTGFuZXMpKSB7XG4gICAgICAgICAgICAvLyBUaGUgcHJpbWFyeSBjaGlsZHJlbiBoYXZlIHBlbmRpbmcgd29yay4gVXNlIHRoZSBub3JtYWwgcGF0aFxuICAgICAgICAgICAgLy8gdG8gYXR0ZW1wdCB0byByZW5kZXIgdGhlIHByaW1hcnkgY2hpbGRyZW4gYWdhaW4uXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhlIHByaW1hcnkgY2hpbGQgZnJhZ21lbnQgZG9lcyBub3QgaGF2ZSBwZW5kaW5nIHdvcmsgbWFya2VkXG4gICAgICAgICAgICAvLyBvbiBpdFxuICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7IC8vIFRoZSBwcmltYXJ5IGNoaWxkcmVuIGRvIG5vdCBoYXZlIHBlbmRpbmcgd29yayB3aXRoIHN1ZmZpY2llbnRcbiAgICAgICAgICAgIC8vIHByaW9yaXR5LiBCYWlsb3V0LlxuXG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgICAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBUaGUgZmFsbGJhY2sgY2hpbGRyZW4gaGF2ZSBwZW5kaW5nIHdvcmsuIFNraXAgb3ZlciB0aGVcbiAgICAgICAgICAgICAgLy8gcHJpbWFyeSBjaGlsZHJlbiBhbmQgd29yayBvbiB0aGUgZmFsbGJhY2suXG4gICAgICAgICAgICAgIHJldHVybiBjaGlsZC5zaWJsaW5nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTm90ZTogV2UgY2FuIHJldHVybiBgbnVsbGAgaGVyZSBiZWNhdXNlIHdlIGFscmVhZHkgY2hlY2tlZFxuICAgICAgICAgICAgICAvLyB3aGV0aGVyIHRoZXJlIHdlcmUgbmVzdGVkIGNvbnRleHQgY29uc3VtZXJzLCB2aWEgdGhlIGNhbGwgdG9cbiAgICAgICAgICAgICAgLy8gYGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmtgIGFib3ZlLlxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgZGlkU3VzcGVuZEJlZm9yZSA9IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgICAgICAgdmFyIF9oYXNDaGlsZFdvcmsgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKTtcblxuICAgICAgICBpZiAoZGlkU3VzcGVuZEJlZm9yZSkge1xuICAgICAgICAgIGlmIChfaGFzQ2hpbGRXb3JrKSB7XG4gICAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgd2FzIGluIGZhbGxiYWNrIHN0YXRlIGxhc3QgdGltZSwgYW5kIHdlIGhhdmUgYWxsIHRoZVxuICAgICAgICAgICAgLy8gc2FtZSBjaGlsZHJlbiB0aGVuIHdlJ3JlIHN0aWxsIGluIHByb2dyZXNzaXZlIGxvYWRpbmcgc3RhdGUuXG4gICAgICAgICAgICAvLyBTb21ldGhpbmcgbWlnaHQgZ2V0IHVuYmxvY2tlZCBieSBzdGF0ZSB1cGRhdGVzIG9yIHJldHJpZXMgaW4gdGhlXG4gICAgICAgICAgICAvLyB0cmVlIHdoaWNoIHdpbGwgYWZmZWN0IHRoZSB0YWlsLiBTbyB3ZSBuZWVkIHRvIHVzZSB0aGUgbm9ybWFsXG4gICAgICAgICAgICAvLyBwYXRoIHRvIGNvbXB1dGUgdGhlIGNvcnJlY3QgdGFpbC5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9IC8vIElmIG5vbmUgb2YgdGhlIGNoaWxkcmVuIGhhZCBhbnkgd29yaywgdGhhdCBtZWFucyB0aGF0IG5vbmUgb2ZcbiAgICAgICAgICAvLyB0aGVtIGdvdCByZXRyaWVkIHNvIHRoZXknbGwgc3RpbGwgYmUgYmxvY2tlZCBpbiB0aGUgc2FtZSB3YXlcbiAgICAgICAgICAvLyBhcyBiZWZvcmUuIFdlIGNhbiBmYXN0IGJhaWwgb3V0LlxuXG5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICB9IC8vIElmIG5vdGhpbmcgc3VzcGVuZGVkIGJlZm9yZSBhbmQgd2UncmUgcmVuZGVyaW5nIHRoZSBzYW1lIGNoaWxkcmVuLFxuICAgICAgICAvLyB0aGVuIHRoZSB0YWlsIGRvZXNuJ3QgbWF0dGVyLiBBbnl0aGluZyBuZXcgdGhhdCBzdXNwZW5kcyB3aWxsIHdvcmtcbiAgICAgICAgLy8gaW4gdGhlIFwidG9nZXRoZXJcIiBtb2RlLCBzbyB3ZSBjYW4gY29udGludWUgZnJvbSB0aGUgc3RhdGUgd2UgaGFkLlxuXG5cbiAgICAgICAgdmFyIHJlbmRlclN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAocmVuZGVyU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBSZXNldCB0byB0aGUgXCJ0b2dldGhlclwiIG1vZGUgaW4gY2FzZSB3ZSd2ZSBzdGFydGVkIGEgZGlmZmVyZW50XG4gICAgICAgICAgLy8gdXBkYXRlIGluIHRoZSBwYXN0IGJ1dCBkaWRuJ3QgY29tcGxldGUgaXQuXG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbnVsbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbnVsbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS5sYXN0RWZmZWN0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG5cbiAgICAgICAgaWYgKF9oYXNDaGlsZFdvcmspIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJZiBub25lIG9mIHRoZSBjaGlsZHJlbiBoYWQgYW55IHdvcmssIHRoYXQgbWVhbnMgdGhhdCBub25lIG9mXG4gICAgICAgICAgLy8gdGhlbSBnb3QgcmV0cmllZCBzbyB0aGV5J2xsIHN0aWxsIGJlIGJsb2NrZWQgaW4gdGhlIHNhbWUgd2F5XG4gICAgICAgICAgLy8gYXMgYmVmb3JlLiBXZSBjYW4gZmFzdCBiYWlsIG91dC5cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgaWYgdGhlIHRyZWUgc3RpbGwgbmVlZHMgdG8gYmUgZGVmZXJyZWQuIFRoaXMgaXNcbiAgICAgICAgLy8gYWxtb3N0IGlkZW50aWNhbCB0byB0aGUgbG9naWMgdXNlZCBpbiB0aGUgbm9ybWFsIHVwZGF0ZSBwYXRoLFxuICAgICAgICAvLyBzbyB3ZSdsbCBqdXN0IGVudGVyIHRoYXQuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgd2UnbGwgYmFpbCBvdXRcbiAgICAgICAgLy8gYXQgdGhlIG5leHQgbGV2ZWwgaW5zdGVhZCBvZiB0aGlzIG9uZSwgYmVjYXVzZSB0aGUgY2hpbGQgcHJvcHNcbiAgICAgICAgLy8gaGF2ZSBub3QgY2hhbmdlZC4gV2hpY2ggaXMgZmluZS5cbiAgICAgICAgLy8gVE9ETzogUHJvYmFibHkgc2hvdWxkIHJlZmFjdG9yIGBiZWdpbldvcmtgIHRvIHNwbGl0IHRoZSBiYWlsb3V0XG4gICAgICAgIC8vIHBhdGggZnJvbSB0aGUgbm9ybWFsIHBhdGguIEknbSB0ZW1wdGVkIHRvIGRvIGEgbGFiZWxlZCBicmVhayBoZXJlXG4gICAgICAgIC8vIGJ1dCBJIHdvbid0IDopXG4gICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gTm9MYW5lcztcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gYmVnaW5Xb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLl9kZWJ1Z05lZWRzUmVtb3VudCAmJiBjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIHdpbGwgcmVzdGFydCB0aGUgYmVnaW4gcGhhc2Ugd2l0aCBhIG5ldyBmaWJlci5cbiAgICAgIHJldHVybiByZW1vdW50RmliZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh3b3JrSW5Qcm9ncmVzcy50eXBlLCB3b3JrSW5Qcm9ncmVzcy5rZXksIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcywgd29ya0luUHJvZ3Jlc3MuX2RlYnVnT3duZXIgfHwgbnVsbCwgd29ya0luUHJvZ3Jlc3MubW9kZSwgd29ya0luUHJvZ3Jlc3MubGFuZXMpKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIHZhciBvbGRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzIHx8IGhhc0NvbnRleHRDaGFuZ2VkKCkgfHwgKCAvLyBGb3JjZSBhIHJlLXJlbmRlciBpZiB0aGUgaW1wbGVtZW50YXRpb24gY2hhbmdlZCBkdWUgdG8gaG90IHJlbG9hZDpcbiAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gY3VycmVudC50eXBlICkpIHtcbiAgICAgIC8vIElmIHByb3BzIG9yIGNvbnRleHQgY2hhbmdlZCwgbWFyayB0aGUgZmliZXIgYXMgaGF2aW5nIHBlcmZvcm1lZCB3b3JrLlxuICAgICAgLy8gVGhpcyBtYXkgYmUgdW5zZXQgaWYgdGhlIHByb3BzIGFyZSBkZXRlcm1pbmVkIHRvIGJlIGVxdWFsIGxhdGVyIChtZW1vKS5cbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZWl0aGVyIHByb3BzIG5vciBsZWdhY3kgY29udGV4dCBjaGFuZ2VzLiBDaGVjayBpZiB0aGVyZSdzIGEgcGVuZGluZ1xuICAgICAgLy8gdXBkYXRlIG9yIGNvbnRleHQgY2hhbmdlLlxuICAgICAgdmFyIGhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCA9IGNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKTtcblxuICAgICAgaWYgKCFoYXNTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQgJiYgLy8gSWYgdGhpcyBpcyB0aGUgc2Vjb25kIHBhc3Mgb2YgYW4gZXJyb3Igb3Igc3VzcGVuc2UgYm91bmRhcnksIHRoZXJlXG4gICAgICAvLyBtYXkgbm90IGJlIHdvcmsgc2NoZWR1bGVkIG9uIGBjdXJyZW50YCwgc28gd2UgY2hlY2sgZm9yIHRoaXMgZmxhZy5cbiAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIE5vIHBlbmRpbmcgdXBkYXRlcyBvciBjb250ZXh0LiBCYWlsIG91dCBub3cuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGF0dGVtcHRFYXJseUJhaWxvdXRJZk5vU2NoZWR1bGVkVXBkYXRlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICgoY3VycmVudC5mbGFncyAmIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBvbmx5IGV4aXN0cyBmb3IgbGVnYWN5IG1vZGUuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xOTIxNi5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBvbiB0aGlzIGZpYmVyLCBidXQgdGhlcmUgYXJlIG5vIG5ldyBwcm9wc1xuICAgICAgICAvLyBub3IgbGVnYWN5IGNvbnRleHQuIFNldCB0aGlzIHRvIGZhbHNlLiBJZiBhbiB1cGRhdGUgcXVldWUgb3IgY29udGV4dFxuICAgICAgICAvLyBjb25zdW1lciBwcm9kdWNlcyBhIGNoYW5nZWQgdmFsdWUsIGl0IHdpbGwgc2V0IHRoaXMgdG8gdHJ1ZS4gT3RoZXJ3aXNlLFxuICAgICAgICAvLyB0aGUgY29tcG9uZW50IHdpbGwgYXNzdW1lIHRoZSBjaGlsZHJlbiBoYXZlIG5vdCBjaGFuZ2VkIGFuZCBiYWlsIG91dC5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBpc0ZvcmtlZENoaWxkKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBjaGlsZCBiZWxvbmdzIHRvIGEgbGlzdCBvZiBtdWxpcGxlIGNoaWxkcmVuIGluXG4gICAgICAvLyBpdHMgcGFyZW50LlxuICAgICAgLy9cbiAgICAgIC8vIEluIGEgdHJ1ZSBtdWx0aS10aHJlYWRlZCBpbXBsZW1lbnRhdGlvbiwgd2Ugd291bGQgcmVuZGVyIGNoaWxkcmVuIG9uXG4gICAgICAvLyBwYXJhbGxlbCB0aHJlYWRzLiBUaGlzIHdvdWxkIHJlcHJlc2VudCB0aGUgYmVnaW5uaW5nIG9mIGEgbmV3IHJlbmRlclxuICAgICAgLy8gdGhyZWFkIGZvciB0aGlzIHN1YnRyZWUuXG4gICAgICAvL1xuICAgICAgLy8gV2Ugb25seSB1c2UgdGhpcyBmb3IgaWQgZ2VuZXJhdGlvbiBkdXJpbmcgaHlkcmF0aW9uLCB3aGljaCBpcyB3aHkgdGhlXG4gICAgICAvLyBsb2dpYyBpcyBsb2NhdGVkIGluIHRoaXMgc3BlY2lhbCBicmFuY2guXG4gICAgICB2YXIgc2xvdEluZGV4ID0gd29ya0luUHJvZ3Jlc3MuaW5kZXg7XG4gICAgICB2YXIgbnVtYmVyT2ZGb3JrcyA9IGdldEZvcmtzQXRMZXZlbCgpO1xuICAgICAgcHVzaFRyZWVJZCh3b3JrSW5Qcm9ncmVzcywgbnVtYmVyT2ZGb3Jrcywgc2xvdEluZGV4KTtcbiAgICB9XG4gIH0gLy8gQmVmb3JlIGVudGVyaW5nIHRoZSBiZWdpbiBwaGFzZSwgY2xlYXIgcGVuZGluZyB1cGRhdGUgcHJpb3JpdHkuXG4gIC8vIFRPRE86IFRoaXMgYXNzdW1lcyB0aGF0IHdlJ3JlIGFib3V0IHRvIGV2YWx1YXRlIHRoZSBjb21wb25lbnQgYW5kIHByb2Nlc3NcbiAgLy8gdGhlIHVwZGF0ZSBxdWV1ZS4gSG93ZXZlciwgdGhlcmUncyBhbiBleGNlcHRpb246IFNpbXBsZU1lbW9Db21wb25lbnRcbiAgLy8gc29tZXRpbWVzIGJhaWxzIG91dCBsYXRlciBpbiB0aGUgYmVnaW4gcGhhc2UuIFRoaXMgaW5kaWNhdGVzIHRoYXQgd2Ugc2hvdWxkXG4gIC8vIG1vdmUgdGhpcyBhc3NpZ25tZW50IG91dCBvZiB0aGUgY29tbW9uIHBhdGggYW5kIGludG8gZWFjaCBicmFuY2guXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7XG5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiBtb3VudEluZGV0ZXJtaW5hdGVDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnR5cGUsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGVsZW1lbnRUeXBlID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGU7XG4gICAgICAgIHJldHVybiBtb3VudExhenlDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGVsZW1lbnRUeXBlLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIHVucmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIHJlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gQ29tcG9uZW50ID8gdW5yZXNvbHZlZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIHVucmVzb2x2ZWRQcm9wcyk7XG4gICAgICAgIHJldHVybiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX0NvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSBfQ29tcG9uZW50ID8gX3VucmVzb2x2ZWRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoX0NvbXBvbmVudCwgX3VucmVzb2x2ZWRQcm9wcyk7XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50LCBfcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0Um9vdChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIHVwZGF0ZUhvc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICByZXR1cm4gdXBkYXRlSG9zdFRleHQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcmV0dXJuIHVwZGF0ZVBvcnRhbENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAge1xuICAgICAgICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzMiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMyID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IHR5cGUgPyBfdW5yZXNvbHZlZFByb3BzMiA6IHJlc29sdmVEZWZhdWx0UHJvcHModHlwZSwgX3VucmVzb2x2ZWRQcm9wczIpO1xuXG4gICAgICAgIHJldHVybiB1cGRhdGVGb3J3YXJkUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB0eXBlLCBfcmVzb2x2ZWRQcm9wczIsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgTW9kZTpcbiAgICAgIHJldHVybiB1cGRhdGVNb2RlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgcmV0dXJuIHVwZGF0ZVByb2ZpbGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHJldHVybiB1cGRhdGVDb250ZXh0UHJvdmlkZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgICAgcmV0dXJuIHVwZGF0ZUNvbnRleHRDb25zdW1lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX3R5cGUyID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIF91bnJlc29sdmVkUHJvcHMzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOyAvLyBSZXNvbHZlIG91dGVyIHByb3BzIGZpcnN0LCB0aGVuIHJlc29sdmUgaW5uZXIgcHJvcHMuXG5cbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzMyA9IHJlc29sdmVEZWZhdWx0UHJvcHMoX3R5cGUyLCBfdW5yZXNvbHZlZFByb3BzMyk7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgICAgICAgdmFyIG91dGVyUHJvcFR5cGVzID0gX3R5cGUyLnByb3BUeXBlcztcblxuICAgICAgICAgICAgaWYgKG91dGVyUHJvcFR5cGVzKSB7XG4gICAgICAgICAgICAgIGNoZWNrUHJvcFR5cGVzKG91dGVyUHJvcFR5cGVzLCBfcmVzb2x2ZWRQcm9wczMsIC8vIFJlc29sdmVkIGZvciBvdXRlciBvbmx5XG4gICAgICAgICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKF90eXBlMikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIF9yZXNvbHZlZFByb3BzMyA9IHJlc29sdmVEZWZhdWx0UHJvcHMoX3R5cGUyLnR5cGUsIF9yZXNvbHZlZFByb3BzMyk7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfdHlwZTIsIF9yZXNvbHZlZFByb3BzMywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MudHlwZSwgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9Db21wb25lbnQyID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIF91bnJlc29sdmVkUHJvcHM0ID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wczQgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gX0NvbXBvbmVudDIgPyBfdW5yZXNvbHZlZFByb3BzNCA6IHJlc29sdmVEZWZhdWx0UHJvcHMoX0NvbXBvbmVudDIsIF91bnJlc29sdmVkUHJvcHM0KTtcblxuICAgICAgICByZXR1cm4gbW91bnRJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9Db21wb25lbnQyLCBfcmVzb2x2ZWRQcm9wczQsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VMaXN0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdW5pdCBvZiB3b3JrIHRhZyAoXCIgKyB3b3JrSW5Qcm9ncmVzcy50YWcgKyBcIikuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBcIiArICdSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG59XG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpIHtcbiAgLy8gVGFnIHRoZSBmaWJlciB3aXRoIGFuIHVwZGF0ZSBlZmZlY3QuIFRoaXMgdHVybnMgYSBQbGFjZW1lbnQgaW50b1xuICAvLyBhIFBsYWNlbWVudEFuZFVwZGF0ZS5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBtYXJrUmVmJDEod29ya0luUHJvZ3Jlc3MpIHtcbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmO1xuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBSZWZTdGF0aWM7XG4gIH1cbn1cblxudmFyIGFwcGVuZEFsbENoaWxkcmVuO1xudmFyIHVwZGF0ZUhvc3RDb250YWluZXI7XG52YXIgdXBkYXRlSG9zdENvbXBvbmVudCQxO1xudmFyIHVwZGF0ZUhvc3RUZXh0JDE7XG5cbntcbiAgLy8gTXV0YXRpb24gbW9kZVxuICBhcHBlbmRBbGxDaGlsZHJlbiA9IGZ1bmN0aW9uIChwYXJlbnQsIHdvcmtJblByb2dyZXNzLCBuZWVkc1Zpc2liaWxpdHlUb2dnbGUsIGlzSGlkZGVuKSB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgY3JlYXRlZCBidXQgd2UgbmVlZCByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIHZhciBub2RlID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50LCBub2RlLnN0YXRlTm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH07XG5cbiAgdXBkYXRlSG9zdENvbnRhaW5lciA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykgey8vIE5vb3BcbiAgfTtcblxuICB1cGRhdGVIb3N0Q29tcG9uZW50JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGFuIGFsdGVybmF0ZSwgdGhhdCBtZWFucyB0aGlzIGlzIGFuIHVwZGF0ZSBhbmQgd2UgbmVlZCB0b1xuICAgIC8vIHNjaGVkdWxlIGEgc2lkZS1lZmZlY3QgdG8gZG8gdGhlIHVwZGF0ZXMuXG4gICAgdmFyIG9sZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuXG4gICAgaWYgKG9sZFByb3BzID09PSBuZXdQcm9wcykge1xuICAgICAgLy8gSW4gbXV0YXRpb24gbW9kZSwgdGhpcyBpcyBzdWZmaWNpZW50IGZvciBhIGJhaWxvdXQgYmVjYXVzZVxuICAgICAgLy8gd2Ugd29uJ3QgdG91Y2ggdGhpcyBub2RlIGV2ZW4gaWYgY2hpbGRyZW4gY2hhbmdlZC5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIElmIHdlIGdldCB1cGRhdGVkIGJlY2F1c2Ugb25lIG9mIG91ciBjaGlsZHJlbiB1cGRhdGVkLCB3ZSBkb24ndFxuICAgIC8vIGhhdmUgbmV3UHJvcHMgc28gd2UnbGwgaGF2ZSB0byByZXVzZSB0aGVtLlxuICAgIC8vIFRPRE86IFNwbGl0IHRoZSB1cGRhdGUgQVBJIGFzIHNlcGFyYXRlIGZvciB0aGUgcHJvcHMgdnMuIGNoaWxkcmVuLlxuICAgIC8vIEV2ZW4gYmV0dGVyIHdvdWxkIGJlIGlmIGNoaWxkcmVuIHdlcmVuJ3Qgc3BlY2lhbCBjYXNlZCBhdCBhbGwgdGhvLlxuXG5cbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7IC8vIFRPRE86IEV4cGVyaWVuY2luZyBhbiBlcnJvciB3aGVyZSBvbGRQcm9wcyBpcyBudWxsLiBTdWdnZXN0cyBhIGhvc3RcbiAgICAvLyBjb21wb25lbnQgaXMgaGl0dGluZyB0aGUgcmVzdW1lIHBhdGguIEZpZ3VyZSBvdXQgd2h5LiBQb3NzaWJseVxuICAgIC8vIHJlbGF0ZWQgdG8gYGhpZGRlbmAuXG5cbiAgICB2YXIgdXBkYXRlUGF5bG9hZCA9IHByZXBhcmVVcGRhdGUoaW5zdGFuY2UsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQpOyAvLyBUT0RPOiBUeXBlIHRoaXMgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGNvbXBvbmVudC5cblxuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gdXBkYXRlUGF5bG9hZDsgLy8gSWYgdGhlIHVwZGF0ZSBwYXlsb2FkIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEgY2hhbmdlIG9yIGlmIHRoZXJlXG4gICAgLy8gaXMgYSBuZXcgcmVmIHdlIG1hcmsgdGhpcyBhcyBhbiB1cGRhdGUuIEFsbCB0aGUgd29yayBpcyBkb25lIGluIGNvbW1pdFdvcmsuXG5cbiAgICBpZiAodXBkYXRlUGF5bG9hZCkge1xuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9O1xuXG4gIHVwZGF0ZUhvc3RUZXh0JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG9sZFRleHQsIG5ld1RleHQpIHtcbiAgICAvLyBJZiB0aGUgdGV4dCBkaWZmZXJzLCBtYXJrIGl0IGFzIGFuIHVwZGF0ZS4gQWxsIHRoZSB3b3JrIGluIGRvbmUgaW4gY29tbWl0V29yay5cbiAgICBpZiAob2xkVGV4dCAhPT0gbmV3VGV4dCkge1xuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGhhc1JlbmRlcmVkQVRhaWxGYWxsYmFjaykge1xuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgIC8vIElmIHdlJ3JlIGh5ZHJhdGluZywgd2Ugc2hvdWxkIGNvbnN1bWUgYXMgbWFueSBpdGVtcyBhcyB3ZSBjYW5cbiAgICAvLyBzbyB3ZSBkb24ndCBsZWF2ZSBhbnkgYmVoaW5kLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHN3aXRjaCAocmVuZGVyU3RhdGUudGFpbE1vZGUpIHtcbiAgICBjYXNlICdoaWRkZW4nOlxuICAgICAge1xuICAgICAgICAvLyBBbnkgaW5zZXJ0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSB0YWlsIGxpc3QgYWZ0ZXIgdGhpcyBwb2ludFxuICAgICAgICAvLyBzaG91bGQgYmUgaW52aXNpYmxlLiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBtb3VudGVkIGJvdW5kYXJpZXNcbiAgICAgICAgLy8gYW55dGhpbmcgYmVmb3JlIHRoZW0gYXJlIG5vdCBjb25zaWRlcmVkIGZvciBjb2xsYXBzaW5nLlxuICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSB3aG9sZSB0YWlsIHRvIGZpbmQgaWZcbiAgICAgICAgLy8gdGhlcmUgYXJlIGFueS5cbiAgICAgICAgdmFyIHRhaWxOb2RlID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgdmFyIGxhc3RUYWlsTm9kZSA9IG51bGw7XG5cbiAgICAgICAgd2hpbGUgKHRhaWxOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHRhaWxOb2RlLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGFzdFRhaWxOb2RlID0gdGFpbE5vZGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGFpbE5vZGUgPSB0YWlsTm9kZS5zaWJsaW5nO1xuICAgICAgICB9IC8vIE5leHQgd2UncmUgc2ltcGx5IGdvaW5nIHRvIGRlbGV0ZSBhbGwgaW5zZXJ0aW9ucyBhZnRlciB0aGVcbiAgICAgICAgLy8gbGFzdCByZW5kZXJlZCBpdGVtLlxuXG5cbiAgICAgICAgaWYgKGxhc3RUYWlsTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIEFsbCByZW1haW5pbmcgaXRlbXMgaW4gdGhlIHRhaWwgYXJlIGluc2VydGlvbnMuXG4gICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRGV0YWNoIHRoZSBpbnNlcnRpb24gYWZ0ZXIgdGhlIGxhc3Qgbm9kZSB0aGF0IHdhcyBhbHJlYWR5XG4gICAgICAgICAgLy8gaW5zZXJ0ZWQuXG4gICAgICAgICAgbGFzdFRhaWxOb2RlLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlICdjb2xsYXBzZWQnOlxuICAgICAge1xuICAgICAgICAvLyBBbnkgaW5zZXJ0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSB0YWlsIGxpc3QgYWZ0ZXIgdGhpcyBwb2ludFxuICAgICAgICAvLyBzaG91bGQgYmUgaW52aXNpYmxlLiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBtb3VudGVkIGJvdW5kYXJpZXNcbiAgICAgICAgLy8gYW55dGhpbmcgYmVmb3JlIHRoZW0gYXJlIG5vdCBjb25zaWRlcmVkIGZvciBjb2xsYXBzaW5nLlxuICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSB3aG9sZSB0YWlsIHRvIGZpbmQgaWZcbiAgICAgICAgLy8gdGhlcmUgYXJlIGFueS5cbiAgICAgICAgdmFyIF90YWlsTm9kZSA9IHJlbmRlclN0YXRlLnRhaWw7XG4gICAgICAgIHZhciBfbGFzdFRhaWxOb2RlID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoX3RhaWxOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKF90YWlsTm9kZS5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIF9sYXN0VGFpbE5vZGUgPSBfdGFpbE5vZGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RhaWxOb2RlID0gX3RhaWxOb2RlLnNpYmxpbmc7XG4gICAgICAgIH0gLy8gTmV4dCB3ZSdyZSBzaW1wbHkgZ29pbmcgdG8gZGVsZXRlIGFsbCBpbnNlcnRpb25zIGFmdGVyIHRoZVxuICAgICAgICAvLyBsYXN0IHJlbmRlcmVkIGl0ZW0uXG5cblxuICAgICAgICBpZiAoX2xhc3RUYWlsTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIEFsbCByZW1haW5pbmcgaXRlbXMgaW4gdGhlIHRhaWwgYXJlIGluc2VydGlvbnMuXG4gICAgICAgICAgaWYgKCFoYXNSZW5kZXJlZEFUYWlsRmFsbGJhY2sgJiYgcmVuZGVyU3RhdGUudGFpbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gV2Ugc3VzcGVuZGVkIGR1cmluZyB0aGUgaGVhZC4gV2Ugd2FudCB0byBzaG93IGF0IGxlYXN0IG9uZVxuICAgICAgICAgICAgLy8gcm93IGF0IHRoZSB0YWlsLiBTbyB3ZSdsbCBrZWVwIG9uIGFuZCBjdXQgb2ZmIHRoZSByZXN0LlxuICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbC5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERldGFjaCB0aGUgaW5zZXJ0aW9uIGFmdGVyIHRoZSBsYXN0IG5vZGUgdGhhdCB3YXMgYWxyZWFkeVxuICAgICAgICAgIC8vIGluc2VydGVkLlxuICAgICAgICAgIF9sYXN0VGFpbE5vZGUuc2libGluZyA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBidWJibGVQcm9wZXJ0aWVzKGNvbXBsZXRlZFdvcmspIHtcbiAgdmFyIGRpZEJhaWxvdXQgPSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZSAhPT0gbnVsbCAmJiBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZS5jaGlsZCA9PT0gY29tcGxldGVkV29yay5jaGlsZDtcbiAgdmFyIG5ld0NoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICB2YXIgc3VidHJlZUZsYWdzID0gTm9GbGFncztcblxuICBpZiAoIWRpZEJhaWxvdXQpIHtcbiAgICAvLyBCdWJibGUgdXAgdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZS5cbiAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgLy8gSW4gcHJvZmlsaW5nIG1vZGUsIHJlc2V0Q2hpbGRFeHBpcmF0aW9uVGltZSBpcyBhbHNvIHVzZWQgdG8gcmVzZXRcbiAgICAgIC8vIHByb2ZpbGVyIGR1cmF0aW9ucy5cbiAgICAgIHZhciBhY3R1YWxEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb247XG4gICAgICB2YXIgdHJlZUJhc2VEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHZhciBjaGlsZCA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKGNoaWxkLmxhbmVzLCBjaGlsZC5jaGlsZExhbmVzKSk7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBjaGlsZC5zdWJ0cmVlRmxhZ3M7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBjaGlsZC5mbGFnczsgLy8gV2hlbiBhIGZpYmVyIGlzIGNsb25lZCwgaXRzIGFjdHVhbER1cmF0aW9uIGlzIHJlc2V0IHRvIDAuIFRoaXMgdmFsdWUgd2lsbFxuICAgICAgICAvLyBvbmx5IGJlIHVwZGF0ZWQgaWYgd29yayBpcyBkb25lIG9uIHRoZSBmaWJlciAoaS5lLiBpdCBkb2Vzbid0IGJhaWxvdXQpLlxuICAgICAgICAvLyBXaGVuIHdvcmsgaXMgZG9uZSwgaXQgc2hvdWxkIGJ1YmJsZSB0byB0aGUgcGFyZW50J3MgYWN0dWFsRHVyYXRpb24uIElmXG4gICAgICAgIC8vIHRoZSBmaWJlciBoYXMgbm90IGJlZW4gY2xvbmVkIHRob3VnaCwgKG1lYW5pbmcgbm8gd29yayB3YXMgZG9uZSksIHRoZW5cbiAgICAgICAgLy8gdGhpcyB2YWx1ZSB3aWxsIHJlZmxlY3QgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IHdvcmtpbmcgb24gYSBwcmV2aW91c1xuICAgICAgICAvLyByZW5kZXIuIEluIHRoYXQgY2FzZSBpdCBzaG91bGQgbm90IGJ1YmJsZS4gV2UgZGV0ZXJtaW5lIHdoZXRoZXIgaXQgd2FzXG4gICAgICAgIC8vIGNsb25lZCBieSBjb21wYXJpbmcgdGhlIGNoaWxkIHBvaW50ZXIuXG5cbiAgICAgICAgYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247XG4gICAgICAgIHRyZWVCYXNlRHVyYXRpb24gKz0gY2hpbGQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uID0gYWN0dWFsRHVyYXRpb247XG4gICAgICBjb21wbGV0ZWRXb3JrLnRyZWVCYXNlRHVyYXRpb24gPSB0cmVlQmFzZUR1cmF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgd2hpbGUgKF9jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKF9jaGlsZC5sYW5lcywgX2NoaWxkLmNoaWxkTGFuZXMpKTtcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZC5zdWJ0cmVlRmxhZ3M7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQuZmxhZ3M7IC8vIFVwZGF0ZSB0aGUgcmV0dXJuIHBvaW50ZXIgc28gdGhlIHRyZWUgaXMgY29uc2lzdGVudC4gVGhpcyBpcyBhIGNvZGVcbiAgICAgICAgLy8gc21lbGwgYmVjYXVzZSBpdCBhc3N1bWVzIHRoZSBjb21taXQgcGhhc2UgaXMgbmV2ZXIgY29uY3VycmVudCB3aXRoXG4gICAgICAgIC8vIHRoZSByZW5kZXIgcGhhc2UuIFdpbGwgYWRkcmVzcyBkdXJpbmcgcmVmYWN0b3IgdG8gYWx0ZXJuYXRlIG1vZGVsLlxuXG4gICAgICAgIF9jaGlsZC5yZXR1cm4gPSBjb21wbGV0ZWRXb3JrO1xuICAgICAgICBfY2hpbGQgPSBfY2hpbGQuc2libGluZztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wbGV0ZWRXb3JrLnN1YnRyZWVGbGFncyB8PSBzdWJ0cmVlRmxhZ3M7XG4gIH0gZWxzZSB7XG4gICAgLy8gQnViYmxlIHVwIHRoZSBlYXJsaWVzdCBleHBpcmF0aW9uIHRpbWUuXG4gICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgIC8vIEluIHByb2ZpbGluZyBtb2RlLCByZXNldENoaWxkRXhwaXJhdGlvblRpbWUgaXMgYWxzbyB1c2VkIHRvIHJlc2V0XG4gICAgICAvLyBwcm9maWxlciBkdXJhdGlvbnMuXG4gICAgICB2YXIgX3RyZWVCYXNlRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLnNlbGZCYXNlRHVyYXRpb247XG4gICAgICB2YXIgX2NoaWxkMiA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChfY2hpbGQyICE9PSBudWxsKSB7XG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoX2NoaWxkMi5sYW5lcywgX2NoaWxkMi5jaGlsZExhbmVzKSk7IC8vIFwiU3RhdGljXCIgZmxhZ3Mgc2hhcmUgdGhlIGxpZmV0aW1lIG9mIHRoZSBmaWJlci9ob29rIHRoZXkgYmVsb25nIHRvLFxuICAgICAgICAvLyBzbyB3ZSBzaG91bGQgYnViYmxlIHRob3NlIHVwIGV2ZW4gZHVyaW5nIGEgYmFpbG91dC4gQWxsIHRoZSBvdGhlclxuICAgICAgICAvLyBmbGFncyBoYXZlIGEgbGlmZXRpbWUgb25seSBvZiBhIHNpbmdsZSByZW5kZXIgKyBjb21taXQsIHNvIHdlIHNob3VsZFxuICAgICAgICAvLyBpZ25vcmUgdGhlbS5cblxuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkMi5zdWJ0cmVlRmxhZ3MgJiBTdGF0aWNNYXNrO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkMi5mbGFncyAmIFN0YXRpY01hc2s7XG4gICAgICAgIF90cmVlQmFzZUR1cmF0aW9uICs9IF9jaGlsZDIudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgX2NoaWxkMiA9IF9jaGlsZDIuc2libGluZztcbiAgICAgIH1cblxuICAgICAgY29tcGxldGVkV29yay50cmVlQmFzZUR1cmF0aW9uID0gX3RyZWVCYXNlRHVyYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfY2hpbGQzID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgd2hpbGUgKF9jaGlsZDMgIT09IG51bGwpIHtcbiAgICAgICAgbmV3Q2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobmV3Q2hpbGRMYW5lcywgbWVyZ2VMYW5lcyhfY2hpbGQzLmxhbmVzLCBfY2hpbGQzLmNoaWxkTGFuZXMpKTsgLy8gXCJTdGF0aWNcIiBmbGFncyBzaGFyZSB0aGUgbGlmZXRpbWUgb2YgdGhlIGZpYmVyL2hvb2sgdGhleSBiZWxvbmcgdG8sXG4gICAgICAgIC8vIHNvIHdlIHNob3VsZCBidWJibGUgdGhvc2UgdXAgZXZlbiBkdXJpbmcgYSBiYWlsb3V0LiBBbGwgdGhlIG90aGVyXG4gICAgICAgIC8vIGZsYWdzIGhhdmUgYSBsaWZldGltZSBvbmx5IG9mIGEgc2luZ2xlIHJlbmRlciArIGNvbW1pdCwgc28gd2Ugc2hvdWxkXG4gICAgICAgIC8vIGlnbm9yZSB0aGVtLlxuXG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQzLnN1YnRyZWVGbGFncyAmIFN0YXRpY01hc2s7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQzLmZsYWdzICYgU3RhdGljTWFzazsgLy8gVXBkYXRlIHRoZSByZXR1cm4gcG9pbnRlciBzbyB0aGUgdHJlZSBpcyBjb25zaXN0ZW50LiBUaGlzIGlzIGEgY29kZVxuICAgICAgICAvLyBzbWVsbCBiZWNhdXNlIGl0IGFzc3VtZXMgdGhlIGNvbW1pdCBwaGFzZSBpcyBuZXZlciBjb25jdXJyZW50IHdpdGhcbiAgICAgICAgLy8gdGhlIHJlbmRlciBwaGFzZS4gV2lsbCBhZGRyZXNzIGR1cmluZyByZWZhY3RvciB0byBhbHRlcm5hdGUgbW9kZWwuXG5cbiAgICAgICAgX2NoaWxkMy5yZXR1cm4gPSBjb21wbGV0ZWRXb3JrO1xuICAgICAgICBfY2hpbGQzID0gX2NoaWxkMy5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBsZXRlZFdvcmsuc3VidHJlZUZsYWdzIHw9IHN1YnRyZWVGbGFncztcbiAgfVxuXG4gIGNvbXBsZXRlZFdvcmsuY2hpbGRMYW5lcyA9IG5ld0NoaWxkTGFuZXM7XG4gIHJldHVybiBkaWRCYWlsb3V0O1xufVxuXG5mdW5jdGlvbiBjb21wbGV0ZURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0U3RhdGUpIHtcbiAgaWYgKGhhc1VuaHlkcmF0ZWRUYWlsTm9kZXMoKSAmJiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlICYmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgd2FybklmVW5oeWRyYXRlZFRhaWxOb2Rlcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IEZvcmNlQ2xpZW50UmVuZGVyIHwgSW5jb21wbGV0ZSB8IFNob3VsZENhcHR1cmU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHdhc0h5ZHJhdGVkID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gIGlmIChuZXh0U3RhdGUgIT09IG51bGwgJiYgbmV4dFN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAvLyBXZSBtaWdodCBiZSBpbnNpZGUgYSBoeWRyYXRpb24gc3RhdGUgdGhlIGZpcnN0IHRpbWUgd2UncmUgcGlja2luZyB1cCB0aGlzXG4gICAgLy8gU3VzcGVuc2UgYm91bmRhcnksIGFuZCBhbHNvIGFmdGVyIHdlJ3ZlIHJlZW50ZXJlZCBpdCBmb3IgZnVydGhlciBoeWRyYXRpb24uXG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIGlmICghd2FzSHlkcmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIGRlaHlkcmF0ZWQgc3VzcGVuc2UgY29tcG9uZW50IHdhcyBjb21wbGV0ZWQgd2l0aG91dCBhIGh5ZHJhdGVkIG5vZGUuICcgKyAnVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cblxuICAgICAgcHJlcGFyZVRvSHlkcmF0ZUhvc3RTdXNwZW5zZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICB7XG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgdmFyIGlzVGltZWRPdXRTdXNwZW5zZSA9IG5leHRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIGlmIChpc1RpbWVkT3V0U3VzcGVuc2UpIHtcbiAgICAgICAgICAgIC8vIERvbid0IGNvdW50IHRpbWUgc3BlbnQgaW4gYSB0aW1lZCBvdXQgU3VzcGVuc2Ugc3VidHJlZSBhcyBwYXJ0IG9mIHRoZSBiYXNlIGR1cmF0aW9uLlxuICAgICAgICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgIGlmIChwcmltYXJ5Q2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgZG9lc24ndCBzdXBwb3J0IHR5cGUgY2FzdGluZyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSAtPSBvcGVyYXRvclxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uIC09IHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2UgbWlnaHQgaGF2ZSByZWVudGVyZWQgdGhpcyBib3VuZGFyeSB0byBoeWRyYXRlIGl0LiBJZiBzbywgd2UgbmVlZCB0byByZXNldCB0aGUgaHlkcmF0aW9uXG4gICAgICAvLyBzdGF0ZSBzaW5jZSB3ZSdyZSBub3cgZXhpdGluZyBvdXQgb2YgaXQuIHBvcEh5ZHJhdGlvblN0YXRlIGRvZXNuJ3QgZG8gdGhhdCBmb3IgdXMuXG4gICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG5cbiAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAvLyBUaGlzIGJvdW5kYXJ5IGRpZCBub3Qgc3VzcGVuZCBzbyBpdCdzIG5vdyBoeWRyYXRlZCBhbmQgdW5zdXNwZW5kZWQuXG4gICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgfSAvLyBJZiBub3RoaW5nIHN1c3BlbmRlZCwgd2UgbmVlZCB0byBzY2hlZHVsZSBhbiBlZmZlY3QgdG8gbWFyayB0aGlzIGJvdW5kYXJ5XG4gICAgICAvLyBhcyBoYXZpbmcgaHlkcmF0ZWQgc28gZXZlbnRzIGtub3cgdGhhdCB0aGV5J3JlIGZyZWUgdG8gYmUgaW52b2tlZC5cbiAgICAgIC8vIEl0J3MgYWxzbyBhIHNpZ25hbCB0byByZXBsYXkgZXZlbnRzIGFuZCB0aGUgc3VzcGVuc2UgY2FsbGJhY2suXG4gICAgICAvLyBJZiBzb21ldGhpbmcgc3VzcGVuZGVkLCBzY2hlZHVsZSBhbiBlZmZlY3QgdG8gYXR0YWNoIHJldHJ5IGxpc3RlbmVycy5cbiAgICAgIC8vIFNvIHdlIG1pZ2h0IGFzIHdlbGwgYWx3YXlzIG1hcmsgdGhpcy5cblxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAge1xuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgIHZhciBfaXNUaW1lZE91dFN1c3BlbnNlID0gbmV4dFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgaWYgKF9pc1RpbWVkT3V0U3VzcGVuc2UpIHtcbiAgICAgICAgICAgIC8vIERvbid0IGNvdW50IHRpbWUgc3BlbnQgaW4gYSB0aW1lZCBvdXQgU3VzcGVuc2Ugc3VidHJlZSBhcyBwYXJ0IG9mIHRoZSBiYXNlIGR1cmF0aW9uLlxuICAgICAgICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgICAgICAgICBpZiAoX3ByaW1hcnlDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vICRGbG93Rml4TWUgRmxvdyBkb2Vzbid0IHN1cHBvcnQgdHlwZSBjYXN0aW5nIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIC09IG9wZXJhdG9yXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gLT0gX3ByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gU3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCB0aGlzIHRyZWUuIElmIHRoaXMgd2FzIGEgZm9yY2VkIGNsaWVudCByZW5kZXIsXG4gICAgLy8gdGhlcmUgbWF5IGhhdmUgYmVlbiByZWNvdmVyYWJsZSBlcnJvcnMgZHVyaW5nIGZpcnN0IGh5ZHJhdGlvblxuICAgIC8vIGF0dGVtcHQuIElmIHNvLCBhZGQgdGhlbSB0byBhIHF1ZXVlIHNvIHdlIGNhbiBsb2cgdGhlbSBpbiB0aGVcbiAgICAvLyBjb21taXQgcGhhc2UuXG4gICAgdXBncmFkZUh5ZHJhdGlvbkVycm9yc1RvUmVjb3ZlcmFibGUoKTsgLy8gRmFsbCB0aHJvdWdoIHRvIG5vcm1hbCBTdXNwZW5zZSBwYXRoXG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wbGV0ZVdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsgLy8gTm90ZTogVGhpcyBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgY2hlY2sgaWYgd2UncmUgaHlkcmF0aW5nIGJlY2F1c2UgY29tcGFyaW5nXG4gIC8vIHRvIHRoZSBjdXJyZW50IHRyZWUgcHJvdmlkZXIgZmliZXIgaXMganVzdCBhcyBmYXN0IGFuZCBsZXNzIGVycm9yLXByb25lLlxuICAvLyBJZGVhbGx5IHdlIHdvdWxkIGhhdmUgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIHdvcmsgbG9vcCBvbmx5XG4gIC8vIGZvciBoeWRyYXRpb24uXG5cbiAgcG9wVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBGcmFnbWVudDpcbiAgICBjYXNlIE1vZGU6XG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICBjYXNlIENvbnRleHRDb25zdW1lcjpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHZhciBmaWJlclJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBwb3BUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXNldFdvcmtJblByb2dyZXNzVmVyc2lvbnMoKTtcblxuICAgICAgICBpZiAoZmliZXJSb290LnBlbmRpbmdDb250ZXh0KSB7XG4gICAgICAgICAgZmliZXJSb290LmNvbnRleHQgPSBmaWJlclJvb3QucGVuZGluZ0NvbnRleHQ7XG4gICAgICAgICAgZmliZXJSb290LnBlbmRpbmdDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQuY2hpbGQgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBJZiB3ZSBoeWRyYXRlZCwgcG9wIHNvIHRoYXQgd2UgY2FuIGRlbGV0ZSBhbnkgcmVtYWluaW5nIGNoaWxkcmVuXG4gICAgICAgICAgLy8gdGhhdCB3ZXJlbid0IGh5ZHJhdGVkLlxuICAgICAgICAgIHZhciB3YXNIeWRyYXRlZCA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgIGlmICh3YXNIeWRyYXRlZCkge1xuICAgICAgICAgICAgLy8gSWYgd2UgaHlkcmF0ZWQsIHRoZW4gd2UnbGwgbmVlZCB0byBzY2hlZHVsZSBhbiB1cGRhdGUgZm9yXG4gICAgICAgICAgICAvLyB0aGUgY29tbWl0IHNpZGUtZWZmZWN0cyBvbiB0aGUgcm9vdC5cbiAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgICAgICAgIGlmICggLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGNsaWVudCByb290XG4gICAgICAgICAgICAgICFwcmV2U3RhdGUuaXNEZWh5ZHJhdGVkIHx8IC8vIENoZWNrIGlmIHdlIHJldmVydGVkIHRvIGNsaWVudCByZW5kZXJpbmcgKGUuZy4gZHVlIHRvIGFuIGVycm9yKVxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JjZUNsaWVudFJlbmRlcikgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAgICAgICAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gY2xlYXIgdGhpcyBjb250YWluZXIgYXQgdGhlIHN0YXJ0IG9mIHRoZVxuICAgICAgICAgICAgICAgIC8vIG5leHQgY29tbWl0LiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugb2YgUmVhY3QgcmVuZGVyaW5nIGludG8gYVxuICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5lciB3aXRoIHByZXZpb3VzIGNoaWxkcmVuLiBJdCdzIGFsc28gc2FmZSB0byBkbyBmb3JcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIHRvbywgYmVjYXVzZSBjdXJyZW50LmNoaWxkIHdvdWxkIG9ubHkgYmUgbnVsbCBpZiB0aGVcbiAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyByZW5kZXIgd2FzIG51bGwgKHNvIHRoZSBjb250YWluZXIgd291bGQgYWxyZWFkeVxuICAgICAgICAgICAgICAgIC8vIGJlIGVtcHR5KS5cbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDsgLy8gSWYgdGhpcyB3YXMgYSBmb3JjZWQgY2xpZW50IHJlbmRlciwgdGhlcmUgbWF5IGhhdmUgYmVlblxuICAgICAgICAgICAgICAgIC8vIHJlY292ZXJhYmxlIGVycm9ycyBkdXJpbmcgZmlyc3QgaHlkcmF0aW9uIGF0dGVtcHQuIElmIHNvLCBhZGRcbiAgICAgICAgICAgICAgICAvLyB0aGVtIHRvIGEgcXVldWUgc28gd2UgY2FuIGxvZyB0aGVtIGluIHRoZSBjb21taXQgcGhhc2UuXG5cbiAgICAgICAgICAgICAgICB1cGdyYWRlSHlkcmF0aW9uRXJyb3JzVG9SZWNvdmVyYWJsZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdXBkYXRlSG9zdENvbnRhaW5lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciByb290Q29udGFpbmVySW5zdGFuY2UgPSBnZXRSb290SG9zdENvbnRhaW5lcigpO1xuICAgICAgICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9IG51bGwpIHtcbiAgICAgICAgICB1cGRhdGVIb3N0Q29tcG9uZW50JDEoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpO1xuXG4gICAgICAgICAgaWYgKGN1cnJlbnQucmVmICE9PSB3b3JrSW5Qcm9ncmVzcy5yZWYpIHtcbiAgICAgICAgICAgIG1hcmtSZWYkMSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghbmV3UHJvcHMpIHtcbiAgICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZSBtdXN0IGhhdmUgbmV3IHByb3BzIGZvciBuZXcgbW91bnRzLiBUaGlzIGVycm9yIGlzIGxpa2VseSAnICsgJ2NhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgICAgICB9IC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFib3J0IHdvcmsuXG5cblxuICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgY3VycmVudEhvc3RDb250ZXh0ID0gZ2V0SG9zdENvbnRleHQoKTsgLy8gVE9ETzogTW92ZSBjcmVhdGVJbnN0YW5jZSB0byBiZWdpbldvcmsgYW5kIGtlZXAgaXQgb24gYSBjb250ZXh0XG4gICAgICAgICAgLy8gXCJzdGFja1wiIGFzIHRoZSBwYXJlbnQuIFRoZW4gYXBwZW5kIGNoaWxkcmVuIGFzIHdlIGdvIGluIGJlZ2luV29ya1xuICAgICAgICAgIC8vIG9yIGNvbXBsZXRlV29yayBkZXBlbmRpbmcgb24gd2hldGhlciB3ZSB3YW50IHRvIGFkZCB0aGVtIHRvcC0+ZG93biBvclxuICAgICAgICAgIC8vIGJvdHRvbS0+dXAuIFRvcC0+ZG93biBpcyBmYXN0ZXIgaW4gSUUxMS5cblxuICAgICAgICAgIHZhciBfd2FzSHlkcmF0ZWQgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgICBpZiAoX3dhc0h5ZHJhdGVkKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgYW5kIGNyZWF0ZUluc3RhbmNlIHN0ZXAgaW50byB0aGUgYmVnaW5QaGFzZVxuICAgICAgICAgICAgLy8gdG8gY29uc29saWRhdGUuXG4gICAgICAgICAgICBpZiAocHJlcGFyZVRvSHlkcmF0ZUhvc3RJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQpKSB7XG4gICAgICAgICAgICAgIC8vIElmIGNoYW5nZXMgdG8gdGhlIGh5ZHJhdGVkIG5vZGUgbmVlZCB0byBiZSBhcHBsaWVkIGF0IHRoZVxuICAgICAgICAgICAgICAvLyBjb21taXQtcGhhc2Ugd2UgbWFyayB0aGlzIGFzIHN1Y2guXG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBjcmVhdGVJbnN0YW5jZSh0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIGFwcGVuZEFsbENoaWxkcmVuKGluc3RhbmNlLCB3b3JrSW5Qcm9ncmVzcywgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGluc3RhbmNlOyAvLyBDZXJ0YWluIHJlbmRlcmVycyByZXF1aXJlIGNvbW1pdC10aW1lIGVmZmVjdHMgZm9yIGluaXRpYWwgbW91bnQuXG4gICAgICAgICAgICAvLyAoZWcgRE9NIHJlbmRlcmVyIHN1cHBvcnRzIGF1dG8tZm9jdXMgZm9yIGNlcnRhaW4gZWxlbWVudHMpLlxuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHN1Y2ggcmVuZGVyZXJzIGdldCBzY2hlZHVsZWQgZm9yIGxhdGVyIHdvcmsuXG5cbiAgICAgICAgICAgIGlmIChmaW5hbGl6ZUluaXRpYWxDaGlsZHJlbihpbnN0YW5jZSwgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSkpIHtcbiAgICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnJlZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSByZWYgb24gYSBob3N0IG5vZGUgd2UgbmVlZCB0byBzY2hlZHVsZSBhIGNhbGxiYWNrXG4gICAgICAgICAgICBtYXJrUmVmJDEod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIHZhciBuZXdUZXh0ID0gbmV3UHJvcHM7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgJiYgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9IG51bGwpIHtcbiAgICAgICAgICB2YXIgb2xkVGV4dCA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wczsgLy8gSWYgd2UgaGF2ZSBhbiBhbHRlcm5hdGUsIHRoYXQgbWVhbnMgdGhpcyBpcyBhbiB1cGRhdGUgYW5kIHdlIG5lZWRcbiAgICAgICAgICAvLyB0byBzY2hlZHVsZSBhIHNpZGUtZWZmZWN0IHRvIGRvIHRoZSB1cGRhdGVzLlxuXG4gICAgICAgICAgdXBkYXRlSG9zdFRleHQkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgb2xkVGV4dCwgbmV3VGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXdUZXh0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlIG11c3QgaGF2ZSBuZXcgcHJvcHMgZm9yIG5ldyBtb3VudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5ICcgKyAnY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgICAgIH0gLy8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYWJvcnQgd29yay5cblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfcm9vdENvbnRhaW5lckluc3RhbmNlID0gZ2V0Um9vdEhvc3RDb250YWluZXIoKTtcblxuICAgICAgICAgIHZhciBfY3VycmVudEhvc3RDb250ZXh0ID0gZ2V0SG9zdENvbnRleHQoKTtcblxuICAgICAgICAgIHZhciBfd2FzSHlkcmF0ZWQyID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKF93YXNIeWRyYXRlZDIpIHtcbiAgICAgICAgICAgIGlmIChwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGNyZWF0ZVRleHRJbnN0YW5jZShuZXdUZXh0LCBfcm9vdENvbnRhaW5lckluc3RhbmNlLCBfY3VycmVudEhvc3RDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7IC8vIFNwZWNpYWwgcGF0aCBmb3IgZGVoeWRyYXRlZCBib3VuZGFyaWVzLiBXZSBtYXkgZXZlbnR1YWxseSBtb3ZlIHRoaXNcbiAgICAgICAgLy8gdG8gaXRzIG93biBmaWJlciB0eXBlIHNvIHRoYXQgd2UgY2FuIGFkZCBvdGhlciBraW5kcyBvZiBoeWRyYXRpb25cbiAgICAgICAgLy8gYm91bmRhcmllcyB0aGF0IGFyZW4ndCBhc3NvY2lhdGVkIHdpdGggYSBTdXNwZW5zZSB0cmVlLiBJbiBhbnRpY2lwYXRpb25cbiAgICAgICAgLy8gb2Ygc3VjaCBhIHJlZmFjdG9yLCBhbGwgdGhlIGh5ZHJhdGlvbiBsb2dpYyBpcyBjb250YWluZWQgaW5cbiAgICAgICAgLy8gdGhpcyBicmFuY2guXG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGZhbGx0aHJvdWdoVG9Ob3JtYWxTdXNwZW5zZVBhdGggPSBjb21wbGV0ZURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0U3RhdGUpO1xuXG4gICAgICAgICAgaWYgKCFmYWxsdGhyb3VnaFRvTm9ybWFsU3VzcGVuc2VQYXRoKSB7XG4gICAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBTaG91bGRDYXB0dXJlKSB7XG4gICAgICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZS4gVGhlcmUgd2VyZSByZW1haW5pbmcgdW5oeWRyYXRlZCBub2Rlcy4gV2UgdHJlYXRcbiAgICAgICAgICAgICAgLy8gdGhpcyBhcyBhIG1pc21hdGNoLiBSZXZlcnQgdG8gY2xpZW50IHJlbmRlcmluZy5cbiAgICAgICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gRGlkIG5vdCBmaW5pc2ggaHlkcmF0aW5nLCBlaXRoZXIgYmVjYXVzZSB0aGlzIGlzIHRoZSBpbml0aWFsXG4gICAgICAgICAgICAgIC8vIHJlbmRlciBvciBiZWNhdXNlIHNvbWV0aGluZyBzdXNwZW5kZWQuXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gQ29udGludWUgd2l0aCB0aGUgbm9ybWFsIFN1c3BlbnNlIHBhdGguXG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgIC8vIFNvbWV0aGluZyBzdXNwZW5kZWQuIFJlLXJlbmRlciB3aXRoIHRoZSBmYWxsYmFjayBjaGlsZHJlbi5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IHJlbmRlckxhbmVzOyAvLyBEbyBub3QgcmVzZXQgdGhlIGVmZmVjdCBsaXN0LlxuXG4gICAgICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9IC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGluIHRoaXMgY2FzZS5cblxuXG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG5leHREaWRUaW1lb3V0ID0gbmV4dFN0YXRlICE9PSBudWxsO1xuICAgICAgICB2YXIgcHJldkRpZFRpbWVvdXQgPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgLy8gYSBwYXNzaXZlIGVmZmVjdCwgd2hpY2ggaXMgd2hlbiB3ZSBwcm9jZXNzIHRoZSB0cmFuc2l0aW9uc1xuXG5cbiAgICAgICAgaWYgKG5leHREaWRUaW1lb3V0ICE9PSBwcmV2RGlkVGltZW91dCkge1xuICAgICAgICAgIC8vIGFuIGVmZmVjdCB0byB0b2dnbGUgdGhlIHN1YnRyZWUncyB2aXNpYmlsaXR5LiBXaGVuIHdlIHN3aXRjaCBmcm9tXG4gICAgICAgICAgLy8gZmFsbGJhY2sgLT4gcHJpbWFyeSwgdGhlIGlubmVyIE9mZnNjcmVlbiBmaWJlciBzY2hlZHVsZXMgdGhpcyBlZmZlY3RcbiAgICAgICAgICAvLyBhcyBwYXJ0IG9mIGl0cyBub3JtYWwgY29tcGxldGUgcGhhc2UuIEJ1dCB3aGVuIHdlIHN3aXRjaCBmcm9tXG4gICAgICAgICAgLy8gcHJpbWFyeSAtPiBmYWxsYmFjaywgdGhlIGlubmVyIE9mZnNjcmVlbiBmaWJlciBkb2VzIG5vdCBoYXZlIGEgY29tcGxldGVcbiAgICAgICAgICAvLyBwaGFzZS4gU28gd2UgbmVlZCB0byBzY2hlZHVsZSBpdHMgZWZmZWN0IGhlcmUuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBXZSBhbHNvIHVzZSB0aGlzIGZsYWcgdG8gY29ubmVjdC9kaXNjb25uZWN0IHRoZSBlZmZlY3RzLCBidXQgdGhlIHNhbWVcbiAgICAgICAgICAvLyBsb2dpYyBhcHBsaWVzOiB3aGVuIHJlLWNvbm5lY3RpbmcsIHRoZSBPZmZzY3JlZW4gZmliZXIncyBjb21wbGV0ZVxuICAgICAgICAgIC8vIHBoYXNlIHdpbGwgaGFuZGxlIHNjaGVkdWxpbmcgdGhlIGVmZmVjdC4gSXQncyBvbmx5IHdoZW4gdGhlIGZhbGxiYWNrXG4gICAgICAgICAgLy8gaXMgYWN0aXZlIHRoYXQgd2UgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLlxuXG5cbiAgICAgICAgICBpZiAobmV4dERpZFRpbWVvdXQpIHtcbiAgICAgICAgICAgIHZhciBfb2Zmc2NyZWVuRmliZXIyID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICBfb2Zmc2NyZWVuRmliZXIyLmZsYWdzIHw9IFZpc2liaWxpdHk7IC8vIFRPRE86IFRoaXMgd2lsbCBzdGlsbCBzdXNwZW5kIGEgc3luY2hyb25vdXMgdHJlZSBpZiBhbnl0aGluZ1xuICAgICAgICAgICAgLy8gaW4gdGhlIGNvbmN1cnJlbnQgdHJlZSBhbHJlYWR5IHN1c3BlbmRlZCBkdXJpbmcgdGhpcyByZW5kZXIuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEga25vd24gYnVnLlxuXG4gICAgICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgYmFjayB0byB0aHJvd0V4Y2VwdGlvbiBiZWNhdXNlIHRoaXMgaXMgdG9vIGxhdGVcbiAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGxhcmdlIHRyZWUgd2hpY2ggaXMgY29tbW9uIGZvciBpbml0aWFsIGxvYWRzLiBXZVxuICAgICAgICAgICAgICAvLyBkb24ndCBrbm93IGlmIHdlIHNob3VsZCByZXN0YXJ0IGEgcmVuZGVyIG9yIG5vdCB1bnRpbCB3ZSBnZXRcbiAgICAgICAgICAgICAgLy8gdGhpcyBtYXJrZXIsIGFuZCB0aGlzIGlzIHRvbyBsYXRlLlxuICAgICAgICAgICAgICAvLyBJZiB0aGlzIHJlbmRlciBhbHJlYWR5IGhhZCBhIHBpbmcgb3IgbG93ZXIgcHJpIHVwZGF0ZXMsXG4gICAgICAgICAgICAgIC8vIGFuZCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGtub3cgd2UncmUgZ29pbmcgdG8gc3VzcGVuZCB3ZVxuICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgYWJsZSB0byBpbW1lZGlhdGVseSByZXN0YXJ0IGZyb20gd2l0aGluIHRocm93RXhjZXB0aW9uLlxuICAgICAgICAgICAgICB2YXIgaGFzSW52aXNpYmxlQ2hpbGRDb250ZXh0ID0gY3VycmVudCA9PT0gbnVsbCAmJiAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcy51bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayAhPT0gdHJ1ZSB8fCAhZW5hYmxlU3VzcGVuc2VBdm9pZFRoaXNGYWxsYmFjayk7XG5cbiAgICAgICAgICAgICAgaWYgKGhhc0ludmlzaWJsZUNoaWxkQ29udGV4dCB8fCBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50LCBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyB3YXMgaW4gYW4gaW52aXNpYmxlIHRyZWUgb3IgYSBuZXcgcmVuZGVyLCB0aGVuIHNob3dpbmdcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGJvdW5kYXJ5IGlzIG9rLlxuICAgICAgICAgICAgICAgIHJlbmRlckRpZFN1c3BlbmQoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlJ3JlIGdvaW5nIHRvIGhhdmUgdG8gaGlkZSBjb250ZW50IHNvIHdlIHNob3VsZFxuICAgICAgICAgICAgICAgIC8vIHN1c3BlbmQgZm9yIGxvbmdlciBpZiBwb3NzaWJsZS5cbiAgICAgICAgICAgICAgICByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgd2FrZWFibGVzID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG5cbiAgICAgICAgaWYgKHdha2VhYmxlcyAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byBhdHRhY2ggYSByZXRyeSBsaXN0ZW5lciB0byB0aGUgcHJvbWlzZS5cbiAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRvIHBhc3NpdmUgcGhhc2VcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIGlmIChuZXh0RGlkVGltZW91dCkge1xuICAgICAgICAgICAgICAvLyBEb24ndCBjb3VudCB0aW1lIHNwZW50IGluIGEgdGltZWQgb3V0IFN1c3BlbnNlIHN1YnRyZWUgYXMgcGFydCBvZiB0aGUgYmFzZSBkdXJhdGlvbi5cbiAgICAgICAgICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgICAgaWYgKHByaW1hcnlDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0eXBlIGNhc3RpbmcgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgLT0gb3BlcmF0b3JcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uIC09IHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgdXBkYXRlSG9zdENvbnRhaW5lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgIHByZXBhcmVQb3J0YWxNb3VudCh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gICAgICB9XG5cbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIC8vIFBvcCBwcm92aWRlciBmaWJlclxuICAgICAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLl9jb250ZXh0O1xuICAgICAgcG9wUHJvdmlkZXIoY29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICAvLyBTYW1lIGFzIGNsYXNzIGNvbXBvbmVudCBjYXNlLiBJIHB1dCBpdCBkb3duIGhlcmUgc28gdGhhdCB0aGUgdGFncyBhcmVcbiAgICAgICAgLy8gc2VxdWVudGlhbCB0byBlbnN1cmUgdGhpcyBzd2l0Y2ggaXMgY29tcGlsZWQgdG8gYSBqdW1wIHRhYmxlLlxuICAgICAgICB2YXIgX0NvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKF9Db21wb25lbnQpKSB7XG4gICAgICAgICAgcG9wQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIHJlbmRlclN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAocmVuZGVyU3RhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSdyZSBydW5uaW5nIGluIHRoZSBkZWZhdWx0LCBcImluZGVwZW5kZW50XCIgbW9kZS5cbiAgICAgICAgICAvLyBXZSBkb24ndCBkbyBhbnl0aGluZyBpbiB0aGlzIG1vZGUuXG4gICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGlkU3VzcGVuZEFscmVhZHkgPSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcbiAgICAgICAgdmFyIHJlbmRlcmVkVGFpbCA9IHJlbmRlclN0YXRlLnJlbmRlcmluZztcblxuICAgICAgICBpZiAocmVuZGVyZWRUYWlsID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UganVzdCByZW5kZXJlZCB0aGUgaGVhZC5cbiAgICAgICAgICBpZiAoIWRpZFN1c3BlbmRBbHJlYWR5KSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBwYXNzLiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgYW55dGhpbmcgaXMgc3RpbGxcbiAgICAgICAgICAgIC8vIHN1c3BlbmRlZCBpbiB0aGUgcmVuZGVyZWQgc2V0LlxuICAgICAgICAgICAgLy8gSWYgbmV3IGNvbnRlbnQgdW5zdXNwZW5kZWQsIGJ1dCB0aGVyZSdzIHN0aWxsIHNvbWUgY29udGVudCB0aGF0XG4gICAgICAgICAgICAvLyBkaWRuJ3QuIFRoZW4gd2UgbmVlZCB0byBkbyBhIHNlY29uZCBwYXNzIHRoYXQgZm9yY2VzIGV2ZXJ5dGhpbmdcbiAgICAgICAgICAgIC8vIHRvIGtlZXAgc2hvd2luZyB0aGVpciBmYWxsYmFja3MuXG4gICAgICAgICAgICAvLyBXZSBtaWdodCBiZSBzdXNwZW5kZWQgaWYgc29tZXRoaW5nIGluIHRoaXMgcmVuZGVyIHBhc3Mgc3VzcGVuZGVkLCBvclxuICAgICAgICAgICAgLy8gc29tZXRoaW5nIGluIHRoZSBwcmV2aW91cyBjb21taXR0ZWQgcGFzcyBzdXNwZW5kZWQuIE90aGVyd2lzZSxcbiAgICAgICAgICAgIC8vIHRoZXJlJ3Mgbm8gY2hhbmNlIHNvIHdlIGNhbiBza2lwIHRoZSBleHBlbnNpdmUgY2FsbCB0b1xuICAgICAgICAgICAgLy8gZmluZEZpcnN0U3VzcGVuZGVkLlxuICAgICAgICAgICAgdmFyIGNhbm5vdEJlU3VzcGVuZGVkID0gcmVuZGVySGFzTm90U3VzcGVuZGVkWWV0KCkgJiYgKGN1cnJlbnQgPT09IG51bGwgfHwgKGN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncyk7XG5cbiAgICAgICAgICAgIGlmICghY2Fubm90QmVTdXNwZW5kZWQpIHtcbiAgICAgICAgICAgICAgdmFyIHJvdyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgICAgICAgICAgIHdoaWxlIChyb3cgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3VzcGVuZGVkID0gZmluZEZpcnN0U3VzcGVuZGVkKHJvdyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc3VzcGVuZGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICBkaWRTdXNwZW5kQWxyZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7IC8vIElmIHRoaXMgaXMgYSBuZXdseSBzdXNwZW5kZWQgdHJlZSwgaXQgbWlnaHQgbm90IGdldCBjb21taXR0ZWQgYXNcbiAgICAgICAgICAgICAgICAgIC8vIHBhcnQgb2YgdGhlIHNlY29uZCBwYXNzLiBJbiB0aGF0IGNhc2Ugbm90aGluZyB3aWxsIHN1YnNjcmliZSB0b1xuICAgICAgICAgICAgICAgICAgLy8gaXRzIHRoZW5hYmxlcy4gSW5zdGVhZCwgd2UnbGwgdHJhbnNmZXIgaXRzIHRoZW5hYmxlcyB0byB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIFN1c3BlbnNlTGlzdCBzbyB0aGF0IGl0IGNhbiByZXRyeSBpZiB0aGV5IHJlc29sdmUuXG4gICAgICAgICAgICAgICAgICAvLyBUaGVyZSBtaWdodCBiZSBtdWx0aXBsZSBvZiB0aGVzZSBpbiB0aGUgbGlzdCBidXQgc2luY2Ugd2UncmVcbiAgICAgICAgICAgICAgICAgIC8vIGdvaW5nIHRvIHdhaXQgZm9yIGFsbCBvZiB0aGVtIGFueXdheSwgaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyXG4gICAgICAgICAgICAgICAgICAvLyB3aGljaCBvbmVzIGdldHMgdG8gcGluZy4gSW4gdGhlb3J5IHdlIGNvdWxkIGdldCBjbGV2ZXIgYW5kIGtlZXBcbiAgICAgICAgICAgICAgICAgIC8vIHRyYWNrIG9mIGhvdyBtYW55IGRlcGVuZGVuY2llcyByZW1haW4gYnV0IGl0IGdldHMgdHJpY2t5IGJlY2F1c2VcbiAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBtZWFudGltZSwgd2UgY2FuIGFkZC9yZW1vdmUvY2hhbmdlIGl0ZW1zIGFuZCBkZXBlbmRlbmNpZXMuXG4gICAgICAgICAgICAgICAgICAvLyBXZSBtaWdodCBiYWlsIG91dCBvZiB0aGUgbG9vcCBiZWZvcmUgZmluZGluZyBhbnkgYnV0IHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgbWF0dGVyIHNpbmNlIHRoYXQgbWVhbnMgdGhhdCB0aGUgb3RoZXIgYm91bmRhcmllcyB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyB3ZSBkaWQgZmluZCBhbHJlYWR5IGhhcyB0aGVpciBsaXN0ZW5lcnMgYXR0YWNoZWQuXG5cbiAgICAgICAgICAgICAgICAgIHZhciBuZXdUaGVuYWJsZXMgPSBzdXNwZW5kZWQudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChuZXdUaGVuYWJsZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBuZXdUaGVuYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICAgICAgICAgIH0gLy8gUmVyZW5kZXIgdGhlIHdob2xlIGxpc3QsIGJ1dCB0aGlzIHRpbWUsIHdlJ2xsIGZvcmNlIGZhbGxiYWNrc1xuICAgICAgICAgICAgICAgICAgLy8gdG8gc3RheSBpbiBwbGFjZS5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBlZmZlY3QgZmxhZ3MgYmVmb3JlIGRvaW5nIHRoZSBzZWNvbmQgcGFzcyBzaW5jZSB0aGF0J3Mgbm93IGludmFsaWQuXG4gICAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgY2hpbGQgZmliZXJzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlLlxuXG5cbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgICAgICAgICAgICAgICByZXNldENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7IC8vIFNldCB1cCB0aGUgU3VzcGVuc2UgQ29udGV4dCB0byBmb3JjZSBzdXNwZW5zZSBhbmQgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgIC8vIHJlcmVuZGVyIHRoZSBjaGlsZHJlbi5cblxuICAgICAgICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjaykpOyAvLyBEb24ndCBidWJibGUgcHJvcGVydGllcyBpbiB0aGlzIGNhc2UuXG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByb3cgPSByb3cuc2libGluZztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVuZGVyU3RhdGUudGFpbCAhPT0gbnVsbCAmJiBub3coKSA+IGdldFJlbmRlclRhcmdldFRpbWUoKSkge1xuICAgICAgICAgICAgICAvLyBXZSBoYXZlIGFscmVhZHkgcGFzc2VkIG91ciBDUFUgZGVhZGxpbmUgYnV0IHdlIHN0aWxsIGhhdmUgcm93c1xuICAgICAgICAgICAgICAvLyBsZWZ0IGluIHRoZSB0YWlsLiBXZSdsbCBqdXN0IGdpdmUgdXAgZnVydGhlciBhdHRlbXB0cyB0byByZW5kZXJcbiAgICAgICAgICAgICAgLy8gdGhlIG1haW4gY29udGVudCBhbmQgb25seSByZW5kZXIgZmFsbGJhY2tzLlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgICAgICBkaWRTdXNwZW5kQWxyZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBTaW5jZSBub3RoaW5nIGFjdHVhbGx5IHN1c3BlbmRlZCwgdGhlcmUgd2lsbCBub3RoaW5nIHRvIHBpbmcgdGhpc1xuICAgICAgICAgICAgICAvLyB0byBnZXQgaXQgc3RhcnRlZCBiYWNrIHVwIHRvIGF0dGVtcHQgdGhlIG5leHQgaXRlbS4gV2hpbGUgaW4gdGVybXNcbiAgICAgICAgICAgICAgLy8gb2YgcHJpb3JpdHkgdGhpcyB3b3JrIGhhcyB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGlzIGN1cnJlbnQgcmVuZGVyLFxuICAgICAgICAgICAgICAvLyBpdCdzIG5vdCBwYXJ0IG9mIHRoZSBzYW1lIHRyYW5zaXRpb24gb25jZSB0aGUgdHJhbnNpdGlvbiBoYXNcbiAgICAgICAgICAgICAgLy8gY29tbWl0dGVkLiBJZiBpdCdzIHN5bmMsIHdlIHN0aWxsIHdhbnQgdG8geWllbGQgc28gdGhhdCBpdCBjYW4gYmVcbiAgICAgICAgICAgICAgLy8gcGFpbnRlZC4gQ29uY2VwdHVhbGx5LCB0aGlzIGlzIHJlYWxseSB0aGUgc2FtZSBhcyBwaW5naW5nLlxuICAgICAgICAgICAgICAvLyBXZSBjYW4gdXNlIGFueSBSZXRyeUxhbmUgZXZlbiBpZiBpdCdzIHRoZSBvbmUgY3VycmVudGx5IHJlbmRlcmluZ1xuICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSdyZSBsZWF2aW5nIGl0IGJlaGluZCBvbiB0aGlzIG5vZGUuXG5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBTb21lUmV0cnlMYW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTtcbiAgICAgICAgICB9IC8vIE5leHQgd2UncmUgZ29pbmcgdG8gcmVuZGVyIHRoZSB0YWlsLlxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQXBwZW5kIHRoZSByZW5kZXJlZCByb3cgdG8gdGhlIGNoaWxkIGxpc3QuXG4gICAgICAgICAgaWYgKCFkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgdmFyIF9zdXNwZW5kZWQgPSBmaW5kRmlyc3RTdXNwZW5kZWQocmVuZGVyZWRUYWlsKTtcblxuICAgICAgICAgICAgaWYgKF9zdXNwZW5kZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlOyAvLyBFbnN1cmUgd2UgdHJhbnNmZXIgdGhlIHVwZGF0ZSBxdWV1ZSB0byB0aGUgcGFyZW50IHNvIHRoYXQgaXQgZG9lc24ndFxuICAgICAgICAgICAgICAvLyBnZXQgbG9zdCBpZiB0aGlzIHJvdyBlbmRzIHVwIGRyb3BwZWQgZHVyaW5nIGEgc2Vjb25kIHBhc3MuXG5cbiAgICAgICAgICAgICAgdmFyIF9uZXdUaGVuYWJsZXMgPSBfc3VzcGVuZGVkLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgICAgIGlmIChfbmV3VGhlbmFibGVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBfbmV3VGhlbmFibGVzO1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgdHJ1ZSk7IC8vIFRoaXMgbWlnaHQgaGF2ZSBiZWVuIG1vZGlmaWVkLlxuXG4gICAgICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsID09PSBudWxsICYmIHJlbmRlclN0YXRlLnRhaWxNb2RlID09PSAnaGlkZGVuJyAmJiAhcmVuZGVyZWRUYWlsLmFsdGVybmF0ZSAmJiAhZ2V0SXNIeWRyYXRpbmcoKSAvLyBXZSBkb24ndCBjdXQgaXQgaWYgd2UncmUgaHlkcmF0aW5nLlxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGRvbmUuXG4gICAgICAgICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIC8vIFRoZSB0aW1lIGl0IHRvb2sgdG8gcmVuZGVyIGxhc3Qgcm93IGlzIGdyZWF0ZXIgdGhhbiB0aGUgcmVtYWluaW5nXG4gICAgICAgICAgICAvLyB0aW1lIHdlIGhhdmUgdG8gcmVuZGVyLiBTbyByZW5kZXJpbmcgb25lIG1vcmUgcm93IHdvdWxkIGxpa2VseVxuICAgICAgICAgICAgLy8gZXhjZWVkIGl0LlxuICAgICAgICAgICAgbm93KCkgKiAyIC0gcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID4gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpICYmIHJlbmRlckxhbmVzICE9PSBPZmZzY3JlZW5MYW5lKSB7XG4gICAgICAgICAgICAgIC8vIFdlIGhhdmUgbm93IHBhc3NlZCBvdXIgQ1BVIGRlYWRsaW5lIGFuZCB3ZSdsbCBqdXN0IGdpdmUgdXAgZnVydGhlclxuICAgICAgICAgICAgICAvLyBhdHRlbXB0cyB0byByZW5kZXIgdGhlIG1haW4gY29udGVudCBhbmQgb25seSByZW5kZXIgZmFsbGJhY2tzLlxuICAgICAgICAgICAgICAvLyBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoaXMgaXMgdXN1YWxseSBmYXN0ZXIuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7IC8vIFNpbmNlIG5vdGhpbmcgYWN0dWFsbHkgc3VzcGVuZGVkLCB0aGVyZSB3aWxsIG5vdGhpbmcgdG8gcGluZyB0aGlzXG4gICAgICAgICAgICAgIC8vIHRvIGdldCBpdCBzdGFydGVkIGJhY2sgdXAgdG8gYXR0ZW1wdCB0aGUgbmV4dCBpdGVtLiBXaGlsZSBpbiB0ZXJtc1xuICAgICAgICAgICAgICAvLyBvZiBwcmlvcml0eSB0aGlzIHdvcmsgaGFzIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoaXMgY3VycmVudCByZW5kZXIsXG4gICAgICAgICAgICAgIC8vIGl0J3Mgbm90IHBhcnQgb2YgdGhlIHNhbWUgdHJhbnNpdGlvbiBvbmNlIHRoZSB0cmFuc2l0aW9uIGhhc1xuICAgICAgICAgICAgICAvLyBjb21taXR0ZWQuIElmIGl0J3Mgc3luYywgd2Ugc3RpbGwgd2FudCB0byB5aWVsZCBzbyB0aGF0IGl0IGNhbiBiZVxuICAgICAgICAgICAgICAvLyBwYWludGVkLiBDb25jZXB0dWFsbHksIHRoaXMgaXMgcmVhbGx5IHRoZSBzYW1lIGFzIHBpbmdpbmcuXG4gICAgICAgICAgICAgIC8vIFdlIGNhbiB1c2UgYW55IFJldHJ5TGFuZSBldmVuIGlmIGl0J3MgdGhlIG9uZSBjdXJyZW50bHkgcmVuZGVyaW5nXG4gICAgICAgICAgICAgIC8vIHNpbmNlIHdlJ3JlIGxlYXZpbmcgaXQgYmVoaW5kIG9uIHRoaXMgbm9kZS5cblxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IFNvbWVSZXRyeUxhbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlbmRlclN0YXRlLmlzQmFja3dhcmRzKSB7XG4gICAgICAgICAgICAvLyBUaGUgZWZmZWN0IGxpc3Qgb2YgdGhlIGJhY2t3YXJkcyB0YWlsIHdpbGwgaGF2ZSBiZWVuIGFkZGVkXG4gICAgICAgICAgICAvLyB0byB0aGUgZW5kLiBUaGlzIGJyZWFrcyB0aGUgZ3VhcmFudGVlIHRoYXQgbGlmZS1jeWNsZXMgZmlyZSBpblxuICAgICAgICAgICAgLy8gc2libGluZyBvcmRlciBidXQgdGhhdCBpc24ndCBhIHN0cm9uZyBndWFyYW50ZWUgcHJvbWlzZWQgYnkgUmVhY3QuXG4gICAgICAgICAgICAvLyBFc3BlY2lhbGx5IHNpbmNlIHRoZXNlIG1pZ2h0IGFsc28ganVzdCBwb3AgaW4gZHVyaW5nIGZ1dHVyZSBjb21taXRzLlxuICAgICAgICAgICAgLy8gQXBwZW5kIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QuXG4gICAgICAgICAgICByZW5kZXJlZFRhaWwuc2libGluZyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwcmV2aW91c1NpYmxpbmcgPSByZW5kZXJTdGF0ZS5sYXN0O1xuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNTaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHByZXZpb3VzU2libGluZy5zaWJsaW5nID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlbmRlclN0YXRlLmxhc3QgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBzdGlsbCBoYXZlIHRhaWwgcm93cyB0byByZW5kZXIuXG4gICAgICAgICAgLy8gUG9wIGEgcm93LlxuICAgICAgICAgIHZhciBuZXh0ID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmcgPSBuZXh0O1xuICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwgPSBuZXh0LnNpYmxpbmc7XG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID0gbm93KCk7XG4gICAgICAgICAgbmV4dC5zaWJsaW5nID0gbnVsbDsgLy8gUmVzdG9yZSB0aGUgY29udGV4dC5cbiAgICAgICAgICAvLyBUT0RPOiBXZSBjYW4gcHJvYmFibHkganVzdCBhdm9pZCBwb3BwaW5nIGl0IGluc3RlYWQgYW5kIG9ubHlcbiAgICAgICAgICAvLyBzZXR0aW5nIGl0IHRoZSBmaXJzdCB0aW1lIHdlIGdvIGZyb20gbm90IHN1c3BlbmRlZCB0byBzdXNwZW5kZWQuXG5cbiAgICAgICAgICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50O1xuXG4gICAgICAgICAgaWYgKGRpZFN1c3BlbmRBbHJlYWR5KSB7XG4gICAgICAgICAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpOyAvLyBEbyBhIHBhc3Mgb3ZlciB0aGUgbmV4dCByb3cuXG4gICAgICAgICAgLy8gRG9uJ3QgYnViYmxlIHByb3BlcnRpZXMgaW4gdGhpcyBjYXNlLlxuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIF9uZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICB2YXIgbmV4dElzSGlkZGVuID0gX25leHRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBwcmV2SXNIaWRkZW4gPSBfcHJldlN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgaWYgKHByZXZJc0hpZGRlbiAhPT0gbmV4dElzSGlkZGVuICYmICggLy8gTGVnYWN5SGlkZGVuIGRvZXNuJ3QgZG8gYW55IGhpZGluZyDigJQgaXQgb25seSBwcmUtcmVuZGVycy5cbiAgICAgICAgICAhZW5hYmxlTGVnYWN5SGlkZGVuICkpIHtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFZpc2liaWxpdHk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZXh0SXNIaWRkZW4gfHwgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGZvciBoaWRkZW4gY2hpbGRyZW4gdW5sZXNzIHdlJ3JlIHJlbmRlcmluZ1xuICAgICAgICAgIC8vIGF0IG9mZnNjcmVlbiBwcmlvcml0eS5cbiAgICAgICAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShzdWJ0cmVlUmVuZGVyTGFuZXMsIE9mZnNjcmVlbkxhbmUpKSB7XG4gICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSB3YXMgYW4gaW5zZXJ0aW9uIG9yIHVwZGF0ZSBpbiB0aGUgaGlkZGVuIHN1YnRyZWUuXG4gICAgICAgICAgICAgIC8vIElmIHNvLCB3ZSBuZWVkIHRvIGhpZGUgdGhvc2Ugbm9kZXMgaW4gdGhlIGNvbW1pdCBwaGFzZSwgc29cbiAgICAgICAgICAgICAgLy8gc2NoZWR1bGUgYSB2aXNpYmlsaXR5IGVmZmVjdC5cbiAgICAgICAgICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgJiAoUGxhY2VtZW50IHwgVXBkYXRlKSkge1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFZpc2liaWxpdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIENhY2hlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBUcmFjaW5nTWFya2VyQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biB1bml0IG9mIHdvcmsgdGFnIChcIiArIHdvcmtJblByb2dyZXNzLnRhZyArIFwiKS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFwiICsgJ1JlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbn1cblxuZnVuY3Rpb24gdW53aW5kV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gTm90ZTogVGhpcyBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgY2hlY2sgaWYgd2UncmUgaHlkcmF0aW5nIGJlY2F1c2UgY29tcGFyaW5nXG4gIC8vIHRvIHRoZSBjdXJyZW50IHRyZWUgcHJvdmlkZXIgZmliZXIgaXMganVzdCBhcyBmYXN0IGFuZCBsZXNzIGVycm9yLXByb25lLlxuICAvLyBJZGVhbGx5IHdlIHdvdWxkIGhhdmUgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIHdvcmsgbG9vcCBvbmx5XG4gIC8vIGZvciBoeWRyYXRpb24uXG4gIHBvcFRyZWVDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAgICAgcG9wQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZmxhZ3MgPSB3b3JrSW5Qcm9ncmVzcy5mbGFncztcblxuICAgICAgICBpZiAoZmxhZ3MgJiBTaG91bGRDYXB0dXJlKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBmbGFncyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcblxuICAgICAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuICAgICAgICB2YXIgX2ZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKChfZmxhZ3MgJiBTaG91bGRDYXB0dXJlKSAhPT0gTm9GbGFncyAmJiAoX2ZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAvLyBUaGVyZSB3YXMgYW4gZXJyb3IgZHVyaW5nIHJlbmRlciB0aGF0IHdhc24ndCBjYXB0dXJlZCBieSBhIHN1c3BlbnNlXG4gICAgICAgICAgLy8gYm91bmRhcnkuIERvIGEgc2Vjb25kIHBhc3Mgb24gdGhlIHJvb3QgdG8gdW5tb3VudCB0aGUgY2hpbGRyZW4uXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBfZmxhZ3MgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9IC8vIFdlIHVud291bmQgdG8gdGhlIHJvb3Qgd2l0aG91dCBjb21wbGV0aW5nIGl0LiBFeGl0LlxuXG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIFRPRE86IHBvcEh5ZHJhdGlvblN0YXRlXG4gICAgICAgIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwgJiYgc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaHJldyBpbiBuZXdseSBtb3VudGVkIGRlaHlkcmF0ZWQgY29tcG9uZW50LiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiAnICsgJ1JlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX2ZsYWdzMiA9IHdvcmtJblByb2dyZXNzLmZsYWdzO1xuXG4gICAgICAgIGlmIChfZmxhZ3MyICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gX2ZsYWdzMiAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTsgLy8gQ2FwdHVyZWQgYSBzdXNwZW5zZSBlZmZlY3QuIFJlLXJlbmRlciB0aGUgYm91bmRhcnkuXG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7IC8vIFN1c3BlbnNlTGlzdCBkb2Vzbid0IGFjdHVhbGx5IGNhdGNoIGFueXRoaW5nLiBJdCBzaG91bGQndmUgYmVlblxuICAgICAgICAvLyBjYXVnaHQgYnkgYSBuZXN0ZWQgYm91bmRhcnkuIElmIG5vdCwgaXQgc2hvdWxkIGJ1YmJsZSB0aHJvdWdoLlxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLl9jb250ZXh0O1xuICAgICAgcG9wUHJvdmlkZXIoY29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHBvcFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDYWNoZUNvbXBvbmVudDpcblxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW53aW5kSW50ZXJydXB0ZWRXb3JrKGN1cnJlbnQsIGludGVycnVwdGVkV29yaywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gTm90ZTogVGhpcyBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgY2hlY2sgaWYgd2UncmUgaHlkcmF0aW5nIGJlY2F1c2UgY29tcGFyaW5nXG4gIC8vIHRvIHRoZSBjdXJyZW50IHRyZWUgcHJvdmlkZXIgZmliZXIgaXMganVzdCBhcyBmYXN0IGFuZCBsZXNzIGVycm9yLXByb25lLlxuICAvLyBJZGVhbGx5IHdlIHdvdWxkIGhhdmUgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIHdvcmsgbG9vcCBvbmx5XG4gIC8vIGZvciBoeWRyYXRpb24uXG4gIHBvcFRyZWVDb250ZXh0KGludGVycnVwdGVkV29yayk7XG5cbiAgc3dpdGNoIChpbnRlcnJ1cHRlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gaW50ZXJydXB0ZWRXb3JrLnR5cGUuY2hpbGRDb250ZXh0VHlwZXM7XG5cbiAgICAgICAgaWYgKGNoaWxkQ29udGV4dFR5cGVzICE9PSBudWxsICYmIGNoaWxkQ29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHZhciByb290ID0gaW50ZXJydXB0ZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcihpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICBwb3BUb3BMZXZlbENvbnRleHRPYmplY3QoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BIb3N0Q29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHBvcEhvc3RDb250YWluZXIoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHBvcFN1c3BlbnNlQ29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHBvcFN1c3BlbnNlQ29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHZhciBjb250ZXh0ID0gaW50ZXJydXB0ZWRXb3JrLnR5cGUuX2NvbnRleHQ7XG4gICAgICBwb3BQcm92aWRlcihjb250ZXh0LCBpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHBvcFJlbmRlckxhbmVzKGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG52YXIgZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGUgPSBudWxsO1xuXG57XG4gIGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlID0gbmV3IFNldCgpO1xufSAvLyBVc2VkIGR1cmluZyB0aGUgY29tbWl0IHBoYXNlIHRvIHRyYWNrIHRoZSBzdGF0ZSBvZiB0aGUgT2Zmc2NyZWVuIGNvbXBvbmVudCBzdGFjay5cbi8vIEFsbG93cyB1cyB0byBhdm9pZCB0cmF2ZXJzaW5nIHRoZSByZXR1cm4gcGF0aCB0byBmaW5kIHRoZSBuZWFyZXN0IE9mZnNjcmVlbiBhbmNlc3Rvci5cbi8vIE9ubHkgdXNlZCB3aGVuIGVuYWJsZVN1c3BlbnNlTGF5b3V0RWZmZWN0U2VtYW50aWNzIGlzIGVuYWJsZWQuXG5cblxudmFyIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IGZhbHNlO1xudmFyIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBmYWxzZTtcbnZhciBQb3NzaWJseVdlYWtTZXQgPSB0eXBlb2YgV2Vha1NldCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtTZXQgOiBTZXQ7XG52YXIgbmV4dEVmZmVjdCA9IG51bGw7IC8vIFVzZWQgZm9yIFByb2ZpbGluZyBidWlsZHMgdG8gdHJhY2sgdXBkYXRlcnMuXG5cbnZhciBpblByb2dyZXNzTGFuZXMgPSBudWxsO1xudmFyIGluUHJvZ3Jlc3NSb290ID0gbnVsbDtcbmZ1bmN0aW9uIHJlcG9ydFVuY2F1Z2h0RXJyb3JJbkRFVihlcnJvcikge1xuICAvLyBXcmFwcGluZyBlYWNoIHNtYWxsIHBhcnQgb2YgdGhlIGNvbW1pdCBwaGFzZSBpbnRvIGEgZ3VhcmRlZFxuICAvLyBjYWxsYmFjayBpcyBhIGJpdCB0b28gc2xvdyAoaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMjE2NjYpLlxuICAvLyBCdXQgd2UgcmVseSBvbiBpdCB0byBzdXJmYWNlIGVycm9ycyB0byBERVYgdG9vbHMgbGlrZSBvdmVybGF5c1xuICAvLyAoaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8yMTcxMikuXG4gIC8vIEFzIGEgY29tcHJvbWlzZSwgcmV0aHJvdyBvbmx5IGNhdWdodCBlcnJvcnMgaW4gYSBndWFyZC5cbiAge1xuICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbiAgICBjbGVhckNhdWdodEVycm9yKCk7XG4gIH1cbn1cblxudmFyIGNhbGxDb21wb25lbnRXaWxsVW5tb3VudFdpdGhUaW1lciA9IGZ1bmN0aW9uIChjdXJyZW50LCBpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5wcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKCBjdXJyZW50Lm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgIHRyeSB7XG4gICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihjdXJyZW50KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgfVxufTsgLy8gQ2FwdHVyZSBlcnJvcnMgc28gdGhleSBkb24ndCBpbnRlcnJ1cHQgbW91bnRpbmcuXG5cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbENvbW1pdEhvb2tMYXlvdXRFZmZlY3RMaXN0TW91bnQoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB0cnkge1xuICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoTGF5b3V0LCBjdXJyZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn0gLy8gQ2FwdHVyZSBlcnJvcnMgc28gdGhleSBkb24ndCBpbnRlcnJ1cHQgdW5tb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgaW5zdGFuY2UpIHtcbiAgdHJ5IHtcbiAgICBjYWxsQ29tcG9uZW50V2lsbFVubW91bnRXaXRoVGltZXIoY3VycmVudCwgaW5zdGFuY2UpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufSAvLyBDYXB0dXJlIGVycm9ycyBzbyB0aGV5IGRvbid0IGludGVycnVwdCBtb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsQ29tcG9uZW50RGlkTW91bnQoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgaW5zdGFuY2UpIHtcbiAgdHJ5IHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufSAvLyBDYXB0dXJlIGVycm9ycyBzbyB0aGV5IGRvbid0IGludGVycnVwdCBtb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlBdHRhY2hSZWYoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB0cnkge1xuICAgIGNvbW1pdEF0dGFjaFJlZihjdXJyZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgdmFyIHJlZiA9IGN1cnJlbnQucmVmO1xuXG4gIGlmIChyZWYgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHJldFZhbDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIgJiYgZW5hYmxlUHJvZmlsZXJDb21taXRIb29rcyAmJiBjdXJyZW50Lm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICByZXRWYWwgPSByZWYobnVsbCk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGN1cnJlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXRWYWwgPSByZWYobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAge1xuICAgICAgICBpZiAodHlwZW9mIHJldFZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHJldHVybiB2YWx1ZSBmcm9tIGEgY2FsbGJhY2sgcmVmIGluICVzLiAnICsgJ0EgY2FsbGJhY2sgcmVmIHNob3VsZCBub3QgcmV0dXJuIGEgZnVuY3Rpb24uJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihjdXJyZW50KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsRGVzdHJveShjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KSB7XG4gIHRyeSB7XG4gICAgZGVzdHJveSgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufVxuXG52YXIgZm9jdXNlZEluc3RhbmNlSGFuZGxlID0gbnVsbDtcbnZhciBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgPSBmYWxzZTtcbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaXJzdENoaWxkKSB7XG4gIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IHByZXBhcmVGb3JDb21taXQocm9vdC5jb250YWluZXJJbmZvKTtcbiAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19iZWdpbigpOyAvLyBXZSBubyBsb25nZXIgbmVlZCB0byB0cmFjayB0aGUgYWN0aXZlIGluc3RhbmNlIGZpYmVyXG5cbiAgdmFyIHNob3VsZEZpcmUgPSBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXI7XG4gIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IGZhbHNlO1xuICBmb2N1c2VkSW5zdGFuY2VIYW5kbGUgPSBudWxsO1xuICByZXR1cm4gc2hvdWxkRmlyZTtcbn1cblxuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2JlZ2luKCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7IC8vIFRoaXMgcGhhc2UgaXMgb25seSB1c2VkIGZvciBiZWZvcmVBY3RpdmVJbnN0YW5jZUJsdXIuXG5cbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmICgoZmliZXIuc3VidHJlZUZsYWdzICYgQmVmb3JlTXV0YXRpb25NYXNrKSAhPT0gTm9GbGFncyAmJiBjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgY2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gY2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19jb21wbGV0ZSgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNfY29tcGxldGUoKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c09uRmliZXIoZmliZXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRXb3JrKSB7XG4gIHZhciBjdXJyZW50ID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZTtcbiAgdmFyIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzO1xuXG4gIGlmICgoZmxhZ3MgJiBTbmFwc2hvdCkgIT09IE5vRmxhZ3MpIHtcbiAgICBzZXRDdXJyZW50RmliZXIoZmluaXNoZWRXb3JrKTtcblxuICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlOyAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBzbmFwc2hvdCA9IGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSA9PT0gZmluaXNoZWRXb3JrLnR5cGUgPyBwcmV2UHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKGZpbmlzaGVkV29yay50eXBlLCBwcmV2UHJvcHMpLCBwcmV2U3RhdGUpO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhciBkaWRXYXJuU2V0ID0gZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGU7XG5cbiAgICAgICAgICAgICAgaWYgKHNuYXBzaG90ID09PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5TZXQuaGFzKGZpbmlzaGVkV29yay50eXBlKSkge1xuICAgICAgICAgICAgICAgIGRpZFdhcm5TZXQuYWRkKGZpbmlzaGVkV29yay50eXBlKTtcblxuICAgICAgICAgICAgICAgIGVycm9yKCclcy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpOiBBIHNuYXBzaG90IHZhbHVlIChvciBudWxsKSAnICsgJ211c3QgYmUgcmV0dXJuZWQuIFlvdSBoYXZlIHJldHVybmVkIHVuZGVmaW5lZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlID0gc25hcHNob3Q7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciByb290ID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIGNsZWFyQ29udGFpbmVyKHJvb3QuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGZvciB0aGVzZSBjb21wb25lbnQgdHlwZXNcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgdW5pdCBvZiB3b3JrIHRhZyBzaG91bGQgbm90IGhhdmUgc2lkZS1lZmZlY3RzLiBUaGlzIGVycm9yIGlzICcgKyAnbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChmbGFncywgZmluaXNoZWRXb3JrLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZSAhPT0gbnVsbCA/IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgOiBudWxsO1xuXG4gIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgIGRvIHtcbiAgICAgIGlmICgoZWZmZWN0LnRhZyAmIGZsYWdzKSA9PT0gZmxhZ3MpIHtcbiAgICAgICAgLy8gVW5tb3VudFxuICAgICAgICB2YXIgZGVzdHJveSA9IGVmZmVjdC5kZXN0cm95O1xuICAgICAgICBlZmZlY3QuZGVzdHJveSA9IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdCh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShmaW5pc2hlZFdvcmssIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0O1xuICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoZmxhZ3MsIGZpbmlzaGVkV29yaykge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gIHZhciBsYXN0RWZmZWN0ID0gdXBkYXRlUXVldWUgIT09IG51bGwgPyB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0IDogbnVsbDtcblxuICBpZiAobGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICB2YXIgZWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoKGVmZmVjdC50YWcgJiBmbGFncykgPT09IGZsYWdzKSB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKGZsYWdzICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RhcnRlZChmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdGFydGVkKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIE1vdW50XG5cblxuICAgICAgICB2YXIgY3JlYXRlID0gZWZmZWN0LmNyZWF0ZTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKChmbGFncyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGVmZmVjdC5kZXN0cm95ID0gY3JlYXRlKCk7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICgoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdChmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGRlc3Ryb3kgPSBlZmZlY3QuZGVzdHJveTtcblxuICAgICAgICAgIGlmIChkZXN0cm95ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGRlc3Ryb3kgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBob29rTmFtZSA9IHZvaWQgMDtcblxuICAgICAgICAgICAgaWYgKChlZmZlY3QudGFnICYgTGF5b3V0KSAhPT0gTm9GbGFncykge1xuICAgICAgICAgICAgICBob29rTmFtZSA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgoZWZmZWN0LnRhZyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAgICAgaG9va05hbWUgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGhvb2tOYW1lID0gJ3VzZUVmZmVjdCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBhZGRlbmR1bSA9IHZvaWQgMDtcblxuICAgICAgICAgICAgaWYgKGRlc3Ryb3kgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgYWRkZW5kdW0gPSAnIFlvdSByZXR1cm5lZCBudWxsLiBJZiB5b3VyIGVmZmVjdCBkb2VzIG5vdCByZXF1aXJlIGNsZWFuICcgKyAndXAsIHJldHVybiB1bmRlZmluZWQgKG9yIG5vdGhpbmcpLic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZXN0cm95LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgYWRkZW5kdW0gPSAnXFxuXFxuSXQgbG9va3MgbGlrZSB5b3Ugd3JvdGUgJyArIGhvb2tOYW1lICsgJyhhc3luYyAoKSA9PiAuLi4pIG9yIHJldHVybmVkIGEgUHJvbWlzZS4gJyArICdJbnN0ZWFkLCB3cml0ZSB0aGUgYXN5bmMgZnVuY3Rpb24gaW5zaWRlIHlvdXIgZWZmZWN0ICcgKyAnYW5kIGNhbGwgaXQgaW1tZWRpYXRlbHk6XFxuXFxuJyArIGhvb2tOYW1lICsgJygoKSA9PiB7XFxuJyArICcgIGFzeW5jIGZ1bmN0aW9uIGZldGNoRGF0YSgpIHtcXG4nICsgJyAgICAvLyBZb3UgY2FuIGF3YWl0IGhlcmVcXG4nICsgJyAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IE15QVBJLmdldERhdGEoc29tZUlkKTtcXG4nICsgJyAgICAvLyAuLi5cXG4nICsgJyAgfVxcbicgKyAnICBmZXRjaERhdGEoKTtcXG4nICsgXCJ9LCBbc29tZUlkXSk7IC8vIE9yIFtdIGlmIGVmZmVjdCBkb2Vzbid0IG5lZWQgcHJvcHMgb3Igc3RhdGVcXG5cXG5cIiArICdMZWFybiBtb3JlIGFib3V0IGRhdGEgZmV0Y2hpbmcgd2l0aCBIb29rczogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2hvb2tzLWRhdGEtZmV0Y2hpbmcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYWRkZW5kdW0gPSAnIFlvdSByZXR1cm5lZDogJyArIGRlc3Ryb3k7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVycm9yKCclcyBtdXN0IG5vdCByZXR1cm4gYW55dGhpbmcgYmVzaWRlcyBhIGZ1bmN0aW9uLCAnICsgJ3doaWNoIGlzIHVzZWQgZm9yIGNsZWFuLXVwLiVzJywgaG9va05hbWUsIGFkZGVuZHVtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgfSB3aGlsZSAoZWZmZWN0ICE9PSBmaXJzdEVmZmVjdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZUVmZmVjdER1cmF0aW9ucyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yaykge1xuICB7XG4gICAgLy8gT25seSBQcm9maWxlcnMgd2l0aCB3b3JrIGluIHRoZWlyIHN1YnRyZWUgd2lsbCBoYXZlIGFuIFVwZGF0ZSBlZmZlY3Qgc2NoZWR1bGVkLlxuICAgIGlmICgoZmluaXNoZWRXb3JrLmZsYWdzICYgVXBkYXRlKSAhPT0gTm9GbGFncykge1xuICAgICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgdmFyIF9maW5pc2hlZFdvcmskbWVtb2l6ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLFxuICAgICAgICAgICAgICAgIGlkID0gX2ZpbmlzaGVkV29yayRtZW1vaXplLmlkLFxuICAgICAgICAgICAgICAgIG9uUG9zdENvbW1pdCA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZS5vblBvc3RDb21taXQ7IC8vIFRoaXMgdmFsdWUgd2lsbCBzdGlsbCByZWZsZWN0IHRoZSBwcmV2aW91cyBjb21taXQgcGhhc2UuXG4gICAgICAgICAgICAvLyBJdCBkb2VzIG5vdCBnZXQgcmVzZXQgdW50aWwgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGNvbW1pdCBwaGFzZS5cblxuICAgICAgICAgICAgdmFyIGNvbW1pdFRpbWUgPSBnZXRDb21taXRUaW1lKCk7XG4gICAgICAgICAgICB2YXIgcGhhc2UgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlID09PSBudWxsID8gJ21vdW50JyA6ICd1cGRhdGUnO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChpc0N1cnJlbnRVcGRhdGVOZXN0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHBoYXNlID0gJ25lc3RlZC11cGRhdGUnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25Qb3N0Q29tbWl0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIG9uUG9zdENvbW1pdChpZCwgcGhhc2UsIHBhc3NpdmVFZmZlY3REdXJhdGlvbiwgY29tbWl0VGltZSk7XG4gICAgICAgICAgICB9IC8vIEJ1YmJsZSB0aW1lcyB0byB0aGUgbmV4dCBuZWFyZXN0IGFuY2VzdG9yIFByb2ZpbGVyLlxuICAgICAgICAgICAgLy8gQWZ0ZXIgd2UgcHJvY2VzcyB0aGF0IFByb2ZpbGVyLCB3ZSdsbCBidWJibGUgZnVydGhlciB1cC5cblxuXG4gICAgICAgICAgICB2YXIgcGFyZW50RmliZXIgPSBmaW5pc2hlZFdvcmsucmV0dXJuO1xuXG4gICAgICAgICAgICBvdXRlcjogd2hpbGUgKHBhcmVudEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICAgICAgICAgIHZhciByb290ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgcm9vdC5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz0gcGFzc2l2ZUVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG5cbiAgICAgICAgICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudFN0YXRlTm9kZSA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz0gcGFzc2l2ZUVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRMYXlvdXRFZmZlY3RPbkZpYmVyKGZpbmlzaGVkUm9vdCwgY3VycmVudCwgZmluaXNoZWRXb3JrLCBjb21taXR0ZWRMYW5lcykge1xuICBpZiAoKGZpbmlzaGVkV29yay5mbGFncyAmIExheW91dE1hc2spICE9PSBOb0ZsYWdzKSB7XG4gICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCAhb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCBsYXlvdXQgZWZmZWN0cyBoYXZlIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQgKGR1cmluZyBtdXRhdGlvbiBwaGFzZSkuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGRvbmUgdG8gcHJldmVudCBzaWJsaW5nIGNvbXBvbmVudCBlZmZlY3RzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBlYWNoIG90aGVyLFxuICAgICAgICAgICAgLy8gZS5nLiBhIGRlc3Ryb3kgZnVuY3Rpb24gaW4gb25lIGNvbXBvbmVudCBzaG91bGQgbmV2ZXIgb3ZlcnJpZGUgYSByZWYgc2V0XG4gICAgICAgICAgICAvLyBieSBhIGNyZWF0ZSBmdW5jdGlvbiBpbiBhbm90aGVyIGNvbXBvbmVudCBkdXJpbmcgdGhlIHNhbWUgY29tbWl0LlxuICAgICAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKGZpbmlzaGVkV29yay5mbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZE1vdW50LiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdjb21wb25lbnREaWRNb3VudC4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIHByZXZQcm9wcyA9IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSA9PT0gZmluaXNoZWRXb3JrLnR5cGUgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKGZpbmlzaGVkV29yay50eXBlLCBjdXJyZW50Lm1lbW9pemVkUHJvcHMpO1xuICAgICAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7IC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5zdGF0ZWAuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSwgaW5zdGFuY2UuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUpO1xuICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlLCBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvLyBUT0RPOiBJIHRoaW5rIHRoaXMgaXMgbm93IGFsd2F5cyBub24tbnVsbCBieSB0aGUgdGltZSBpdCByZWFjaGVzIHRoZVxuICAgICAgICAgIC8vIGNvbW1pdCBwaGFzZS4gQ29uc2lkZXIgcmVtb3ZpbmcgdGhlIHR5cGUgY2hlY2suXG5cblxuICAgICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgIGlmICh1cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ3Byb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG5cblxuICAgICAgICAgICAgY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCB1cGRhdGVRdWV1ZSwgaW5zdGFuY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUT0RPOiBJIHRoaW5rIHRoaXMgaXMgbm93IGFsd2F5cyBub24tbnVsbCBieSB0aGUgdGltZSBpdCByZWFjaGVzIHRoZVxuICAgICAgICAgIC8vIGNvbW1pdCBwaGFzZS4gQ29uc2lkZXIgcmVtb3ZpbmcgdGhlIHR5cGUgY2hlY2suXG4gICAgICAgICAgdmFyIF91cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgIGlmIChfdXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBfaW5zdGFuY2UgPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLmNoaWxkLnRhZykge1xuICAgICAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAgICAgIF9pbnN0YW5jZSA9IGdldFB1YmxpY0luc3RhbmNlKGZpbmlzaGVkV29yay5jaGlsZC5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgICAgICAgICAgX2luc3RhbmNlID0gZmluaXNoZWRXb3JrLmNoaWxkLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbW1pdFVwZGF0ZVF1ZXVlKGZpbmlzaGVkV29yaywgX3VwZGF0ZVF1ZXVlLCBfaW5zdGFuY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfaW5zdGFuY2UyID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTsgLy8gUmVuZGVyZXJzIG1heSBzY2hlZHVsZSB3b3JrIHRvIGJlIGRvbmUgYWZ0ZXIgaG9zdCBjb21wb25lbnRzIGFyZSBtb3VudGVkXG4gICAgICAgICAgLy8gKGVnIERPTSByZW5kZXJlciBtYXkgc2NoZWR1bGUgYXV0by1mb2N1cyBmb3IgaW5wdXRzIGFuZCBmb3JtIGNvbnRyb2xzKS5cbiAgICAgICAgICAvLyBUaGVzZSBlZmZlY3RzIHNob3VsZCBvbmx5IGJlIGNvbW1pdHRlZCB3aGVuIGNvbXBvbmVudHMgYXJlIGZpcnN0IG1vdW50ZWQsXG4gICAgICAgICAgLy8gYWthIHdoZW4gdGhlcmUgaXMgbm8gY3VycmVudC9hbHRlcm5hdGUuXG5cbiAgICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCAmJiBmaW5pc2hlZFdvcmsuZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICAgIHZhciB0eXBlID0gZmluaXNoZWRXb3JrLnR5cGU7XG4gICAgICAgICAgICB2YXIgcHJvcHMgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgIGNvbW1pdE1vdW50KF9pbnN0YW5jZTIsIHR5cGUsIHByb3BzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gV2UgaGF2ZSBubyBsaWZlLWN5Y2xlcyBhc3NvY2lhdGVkIHdpdGggdGV4dC5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBXZSBoYXZlIG5vIGxpZmUtY3ljbGVzIGFzc29jaWF0ZWQgd2l0aCBwb3J0YWxzLlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX2ZpbmlzaGVkV29yayRtZW1vaXplMiA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLFxuICAgICAgICAgICAgICAgIG9uQ29tbWl0ID0gX2ZpbmlzaGVkV29yayRtZW1vaXplMi5vbkNvbW1pdCxcbiAgICAgICAgICAgICAgICBvblJlbmRlciA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZTIub25SZW5kZXI7XG4gICAgICAgICAgICB2YXIgZWZmZWN0RHVyYXRpb24gPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgdmFyIGNvbW1pdFRpbWUgPSBnZXRDb21taXRUaW1lKCk7XG4gICAgICAgICAgICB2YXIgcGhhc2UgPSBjdXJyZW50ID09PSBudWxsID8gJ21vdW50JyA6ICd1cGRhdGUnO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChpc0N1cnJlbnRVcGRhdGVOZXN0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHBoYXNlID0gJ25lc3RlZC11cGRhdGUnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25SZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgb25SZW5kZXIoZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMuaWQsIHBoYXNlLCBmaW5pc2hlZFdvcmsuYWN0dWFsRHVyYXRpb24sIGZpbmlzaGVkV29yay50cmVlQmFzZUR1cmF0aW9uLCBmaW5pc2hlZFdvcmsuYWN0dWFsU3RhcnRUaW1lLCBjb21taXRUaW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIG9uQ29tbWl0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgb25Db21taXQoZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMuaWQsIHBoYXNlLCBlZmZlY3REdXJhdGlvbiwgY29tbWl0VGltZSk7XG4gICAgICAgICAgICAgIH0gLy8gU2NoZWR1bGUgYSBwYXNzaXZlIGVmZmVjdCBmb3IgdGhpcyBQcm9maWxlciB0byBjYWxsIG9uUG9zdENvbW1pdCBob29rcy5cbiAgICAgICAgICAgICAgLy8gVGhpcyBlZmZlY3Qgc2hvdWxkIGJlIHNjaGVkdWxlZCBldmVuIGlmIHRoZXJlIGlzIG5vIG9uUG9zdENvbW1pdCBjYWxsYmFjayBmb3IgdGhpcyBQcm9maWxlcixcbiAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgZWZmZWN0IGlzIGFsc28gd2hlcmUgdGltZXMgYnViYmxlIHRvIHBhcmVudCBQcm9maWxlcnMuXG5cblxuICAgICAgICAgICAgICBlbnF1ZXVlUGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdChmaW5pc2hlZFdvcmspOyAvLyBQcm9wYWdhdGUgbGF5b3V0IGVmZmVjdCBkdXJhdGlvbnMgdG8gdGhlIG5leHQgbmVhcmVzdCBQcm9maWxlciBhbmNlc3Rvci5cbiAgICAgICAgICAgICAgLy8gRG8gbm90IHJlc2V0IHRoZXNlIHZhbHVlcyB1bnRpbCB0aGUgbmV4dCByZW5kZXIgc28gRGV2VG9vbHMgaGFzIGEgY2hhbmNlIHRvIHJlYWQgdGhlbSBmaXJzdC5cblxuICAgICAgICAgICAgICB2YXIgcGFyZW50RmliZXIgPSBmaW5pc2hlZFdvcmsucmV0dXJuO1xuXG4gICAgICAgICAgICAgIG91dGVyOiB3aGlsZSAocGFyZW50RmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgICAgICAgICAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJvb3QgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHJvb3QuZWZmZWN0RHVyYXRpb24gKz0gZWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRTdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gKz0gZWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1pdFN1c3BlbnNlSHlkcmF0aW9uQ2FsbGJhY2tzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICBjYXNlIFRyYWNpbmdNYXJrZXJDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgdW5pdCBvZiB3b3JrIHRhZyBzaG91bGQgbm90IGhhdmUgc2lkZS1lZmZlY3RzLiBUaGlzIGVycm9yIGlzICcgKyAnbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCAhb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgIHtcbiAgICAgIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBSZWYpIHtcbiAgICAgICAgY29tbWl0QXR0YWNoUmVmKGZpbmlzaGVkV29yayk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlYXBwZWFyTGF5b3V0RWZmZWN0c09uRmliZXIobm9kZSkge1xuICAvLyBUdXJuIG9uIGxheW91dCBlZmZlY3RzIGluIGEgdHJlZSB0aGF0IHByZXZpb3VzbHkgZGlzYXBwZWFyZWQuXG4gIC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgTGF5b3V0U3RhdGljXG4gIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggbm9kZS5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgc2FmZWx5Q2FsbENvbW1pdEhvb2tMYXlvdXRFZmZlY3RMaXN0TW91bnQobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2FmZWx5Q2FsbENvbW1pdEhvb2tMYXlvdXRFZmZlY3RMaXN0TW91bnQobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudERpZE1vdW50KG5vZGUsIG5vZGUucmV0dXJuLCBpbnN0YW5jZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzYWZlbHlBdHRhY2hSZWYobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgc2FmZWx5QXR0YWNoUmVmKG5vZGUsIG5vZGUucmV0dXJuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4oZmluaXNoZWRXb3JrLCBpc0hpZGRlbikge1xuICAvLyBPbmx5IGhpZGUgb3IgdW5oaWRlIHRoZSB0b3AtbW9zdCBob3N0IG5vZGVzLlxuICB2YXIgaG9zdFN1YnRyZWVSb290ID0gbnVsbDtcblxuICB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgaW5zZXJ0ZWQgYnV0IHdlIG5lZWQgdG8gcmVjdXJzZSBkb3duIGl0c1xuICAgIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cbiAgICB2YXIgbm9kZSA9IGZpbmlzaGVkV29yaztcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQpIHtcbiAgICAgICAgaWYgKGhvc3RTdWJ0cmVlUm9vdCA9PT0gbnVsbCkge1xuICAgICAgICAgIGhvc3RTdWJ0cmVlUm9vdCA9IG5vZGU7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgICAgICBoaWRlSW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdW5oaWRlSW5zdGFuY2Uobm9kZS5zdGF0ZU5vZGUsIG5vZGUubWVtb2l6ZWRQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgICAgaWYgKGhvc3RTdWJ0cmVlUm9vdCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgX2luc3RhbmNlMyA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgaGlkZVRleHRJbnN0YW5jZShfaW5zdGFuY2UzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHVuaGlkZVRleHRJbnN0YW5jZShfaW5zdGFuY2UzLCBub2RlLm1lbW9pemVkUHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoKG5vZGUudGFnID09PSBPZmZzY3JlZW5Db21wb25lbnQgfHwgbm9kZS50YWcgPT09IExlZ2FjeUhpZGRlbkNvbXBvbmVudCkgJiYgbm9kZS5tZW1vaXplZFN0YXRlICE9PSBudWxsICYmIG5vZGUgIT09IGZpbmlzaGVkV29yaykgOyBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGZpbmlzaGVkV29yaykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChob3N0U3VidHJlZVJvb3QgPT09IG5vZGUpIHtcbiAgICAgICAgICBob3N0U3VidHJlZVJvb3QgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBub2RlKSB7XG4gICAgICAgIGhvc3RTdWJ0cmVlUm9vdCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEF0dGFjaFJlZihmaW5pc2hlZFdvcmspIHtcbiAgdmFyIHJlZiA9IGZpbmlzaGVkV29yay5yZWY7XG5cbiAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgdmFyIGluc3RhbmNlVG9Vc2U7XG5cbiAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgaW5zdGFuY2VUb1VzZSA9IGdldFB1YmxpY0luc3RhbmNlKGluc3RhbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGluc3RhbmNlVG9Vc2UgPSBpbnN0YW5jZTtcbiAgICB9IC8vIE1vdmVkIG91dHNpZGUgdG8gZW5zdXJlIERDRSB3b3JrcyB3aXRoIHRoaXMgZmxhZ1xuXG4gICAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciByZXRWYWw7XG5cbiAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICByZXRWYWwgPSByZWYoaW5zdGFuY2VUb1VzZSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0VmFsID0gcmVmKGluc3RhbmNlVG9Vc2UpO1xuICAgICAgfVxuXG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgcmV0VmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIGZyb20gYSBjYWxsYmFjayByZWYgaW4gJXMuICcgKyAnQSBjYWxsYmFjayByZWYgc2hvdWxkIG5vdCByZXR1cm4gYSBmdW5jdGlvbi4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFyZWYuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSkge1xuICAgICAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHJlZiBvYmplY3QgcHJvdmlkZWQgZm9yICVzLiAnICsgJ1VzZSBlaXRoZXIgYSByZWYtc2V0dGVyIGZ1bmN0aW9uIG9yIFJlYWN0LmNyZWF0ZVJlZigpLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVmLmN1cnJlbnQgPSBpbnN0YW5jZVRvVXNlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZXRhY2hGaWJlck11dGF0aW9uKGZpYmVyKSB7XG4gIC8vIEN1dCBvZmYgdGhlIHJldHVybiBwb2ludGVyIHRvIGRpc2Nvbm5lY3QgaXQgZnJvbSB0aGUgdHJlZS5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIGRldGVjdCBhbmQgd2FybiBhZ2FpbnN0IHN0YXRlIHVwZGF0ZXMgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC5cbiAgLy8gSXQgYWxzbyBwcmV2ZW50cyBldmVudHMgZnJvbSBidWJibGluZyBmcm9tIHdpdGhpbiBkaXNjb25uZWN0ZWQgY29tcG9uZW50cy5cbiAgLy9cbiAgLy8gSWRlYWxseSwgd2Ugc2hvdWxkIGFsc28gY2xlYXIgdGhlIGNoaWxkIHBvaW50ZXIgb2YgdGhlIHBhcmVudCBhbHRlcm5hdGUgdG8gbGV0IHRoaXNcbiAgLy8gZ2V0IEdDOmVkIGJ1dCB3ZSBkb24ndCBrbm93IHdoaWNoIGZvciBzdXJlIHdoaWNoIHBhcmVudCBpcyB0aGUgY3VycmVudFxuICAvLyBvbmUgc28gd2UnbGwgc2V0dGxlIGZvciBHQzppbmcgdGhlIHN1YnRyZWUgb2YgdGhpcyBjaGlsZC5cbiAgLy8gVGhpcyBjaGlsZCBpdHNlbGYgd2lsbCBiZSBHQzplZCB3aGVuIHRoZSBwYXJlbnQgdXBkYXRlcyB0aGUgbmV4dCB0aW1lLlxuICAvL1xuICAvLyBOb3RlIHRoYXQgd2UgY2FuJ3QgY2xlYXIgY2hpbGQgb3Igc2libGluZyBwb2ludGVycyB5ZXQuXG4gIC8vIFRoZXkncmUgbmVlZGVkIGZvciBwYXNzaXZlIGVmZmVjdHMgYW5kIGZvciBmaW5kRE9NTm9kZS5cbiAgLy8gV2UgZGVmZXIgdGhvc2UgZmllbGRzLCBhbmQgYWxsIG90aGVyIGNsZWFudXAsIHRvIHRoZSBwYXNzaXZlIHBoYXNlIChzZWUgZGV0YWNoRmliZXJBZnRlckVmZmVjdHMpLlxuICAvL1xuICAvLyBEb24ndCByZXNldCB0aGUgYWx0ZXJuYXRlIHlldCwgZWl0aGVyLiBXZSBuZWVkIHRoYXQgc28gd2UgY2FuIGRldGFjaCB0aGVcbiAgLy8gYWx0ZXJuYXRlJ3MgZmllbGRzIGluIHRoZSBwYXNzaXZlIHBoYXNlLiBDbGVhcmluZyB0aGUgcmV0dXJuIHBvaW50ZXIgaXNcbiAgLy8gc3VmZmljaWVudCBmb3IgZmluZERPTU5vZGUgc2VtYW50aWNzLlxuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICBhbHRlcm5hdGUucmV0dXJuID0gbnVsbDtcbiAgfVxuXG4gIGZpYmVyLnJldHVybiA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGZpYmVyKSB7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGZpYmVyLmFsdGVybmF0ZSA9IG51bGw7XG4gICAgZGV0YWNoRmliZXJBZnRlckVmZmVjdHMoYWx0ZXJuYXRlKTtcbiAgfSAvLyBOb3RlOiBEZWZlbnNpdmVseSB1c2luZyBuZWdhdGlvbiBpbnN0ZWFkIG9mIDwgaW4gY2FzZVxuICAvLyBgZGVsZXRlZFRyZWVDbGVhblVwTGV2ZWxgIGlzIHVuZGVmaW5lZC5cblxuXG4gIHtcbiAgICAvLyBDbGVhciBjeWNsaWNhbCBGaWJlciBmaWVsZHMuIFRoaXMgbGV2ZWwgYWxvbmUgaXMgZGVzaWduZWQgdG8gcm91Z2hseVxuICAgIC8vIGFwcHJveGltYXRlIHRoZSBwbGFubmVkIEZpYmVyIHJlZmFjdG9yLiBJbiB0aGF0IHdvcmxkLCBgc2V0U3RhdGVgIHdpbGwgYmVcbiAgICAvLyBib3VuZCB0byBhIHNwZWNpYWwgXCJpbnN0YW5jZVwiIG9iamVjdCBpbnN0ZWFkIG9mIGEgRmliZXIuIFRoZSBJbnN0YW5jZVxuICAgIC8vIG9iamVjdCB3aWxsIG5vdCBoYXZlIGFueSBvZiB0aGVzZSBmaWVsZHMuIEl0IHdpbGwgb25seSBiZSBjb25uZWN0ZWQgdG9cbiAgICAvLyB0aGUgZmliZXIgdHJlZSB2aWEgYSBzaW5nbGUgbGluayBhdCB0aGUgcm9vdC4gU28gaWYgdGhpcyBsZXZlbCBhbG9uZSBpc1xuICAgIC8vIHN1ZmZpY2llbnQgdG8gZml4IG1lbW9yeSBpc3N1ZXMsIHRoYXQgYm9kZXMgd2VsbCBmb3Igb3VyIHBsYW5zLlxuICAgIGZpYmVyLmNoaWxkID0gbnVsbDtcbiAgICBmaWJlci5kZWxldGlvbnMgPSBudWxsO1xuICAgIGZpYmVyLnNpYmxpbmcgPSBudWxsOyAvLyBUaGUgYHN0YXRlTm9kZWAgaXMgY3ljbGljYWwgYmVjYXVzZSBvbiBob3N0IG5vZGVzIGl0IHBvaW50cyB0byB0aGUgaG9zdFxuICAgIC8vIHRyZWUsIHdoaWNoIGhhcyBpdHMgb3duIHBvaW50ZXJzIHRvIGNoaWxkcmVuLCBwYXJlbnRzLCBhbmQgc2libGluZ3MuXG4gICAgLy8gVGhlIG90aGVyIGhvc3Qgbm9kZXMgYWxzbyBwb2ludCBiYWNrIHRvIGZpYmVycywgc28gd2Ugc2hvdWxkIGRldGFjaCB0aGF0XG4gICAgLy8gb25lLCB0b28uXG5cbiAgICBpZiAoZmliZXIudGFnID09PSBIb3N0Q29tcG9uZW50KSB7XG4gICAgICB2YXIgaG9zdEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICBpZiAoaG9zdEluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgIGRldGFjaERlbGV0ZWRJbnN0YW5jZShob3N0SW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpYmVyLnN0YXRlTm9kZSA9IG51bGw7IC8vIEknbSBpbnRlbnRpb25hbGx5IG5vdCBjbGVhcmluZyB0aGUgYHJldHVybmAgZmllbGQgaW4gdGhpcyBsZXZlbC4gV2VcbiAgICAvLyBhbHJlYWR5IGRpc2Nvbm5lY3QgdGhlIGByZXR1cm5gIHBvaW50ZXIgYXQgdGhlIHJvb3Qgb2YgdGhlIGRlbGV0ZWRcbiAgICAvLyBzdWJ0cmVlIChpbiBgZGV0YWNoRmliZXJNdXRhdGlvbmApLiBCZXNpZGVzLCBgcmV0dXJuYCBieSBpdHNlbGYgaXMgbm90XG4gICAgLy8gY3ljbGljYWwg4oCUIGl0J3Mgb25seSBjeWNsaWNhbCB3aGVuIGNvbWJpbmVkIHdpdGggYGNoaWxkYCwgYHNpYmxpbmdgLCBhbmRcbiAgICAvLyBgYWx0ZXJuYXRlYC4gQnV0IHdlJ2xsIGNsZWFyIGl0IGluIHRoZSBuZXh0IGxldmVsIGFueXdheSwganVzdCBpbiBjYXNlLlxuXG4gICAge1xuICAgICAgZmliZXIuX2RlYnVnT3duZXIgPSBudWxsO1xuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIFRoZW9yZXRpY2FsbHksIG5vdGhpbmcgaW4gaGVyZSBzaG91bGQgYmUgbmVjZXNzYXJ5LCBiZWNhdXNlIHdlIGFscmVhZHlcbiAgICAgIC8vIGRpc2Nvbm5lY3RlZCB0aGUgZmliZXIgZnJvbSB0aGUgdHJlZS4gU28gZXZlbiBpZiBzb21ldGhpbmcgbGVha3MgdGhpc1xuICAgICAgLy8gcGFydGljdWxhciBmaWJlciwgaXQgd29uJ3QgbGVhayBhbnl0aGluZyBlbHNlXG4gICAgICAvL1xuICAgICAgLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBicmFuY2ggaXMgdG8gYmUgc3VwZXIgYWdncmVzc2l2ZSBzbyB3ZSBjYW4gbWVhc3VyZVxuICAgICAgLy8gaWYgdGhlcmUncyBhbnkgZGlmZmVyZW5jZSBpbiBtZW1vcnkgaW1wYWN0LiBJZiB0aGVyZSBpcywgdGhhdCBjb3VsZFxuICAgICAgLy8gaW5kaWNhdGUgYSBSZWFjdCBsZWFrIHdlIGRvbid0IGtub3cgYWJvdXQuXG4gICAgICBmaWJlci5yZXR1cm4gPSBudWxsO1xuICAgICAgZmliZXIuZGVwZW5kZW5jaWVzID0gbnVsbDtcbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICAgICAgZmliZXIubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBudWxsO1xuICAgICAgZmliZXIuc3RhdGVOb2RlID0gbnVsbDsgLy8gVE9ETzogTW92ZSB0byBgY29tbWl0UGFzc2l2ZVVubW91bnRJbnNpZGVEZWxldGVkVHJlZU9uRmliZXJgIGluc3RlYWQuXG5cbiAgICAgIGZpYmVyLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFBhcmVudEZpYmVyKGZpYmVyKSB7XG4gIHZhciBwYXJlbnQgPSBmaWJlci5yZXR1cm47XG5cbiAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgIGlmIChpc0hvc3RQYXJlbnQocGFyZW50KSkge1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG5cbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBmaW5kIGEgaG9zdCBwYXJlbnQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyAnICsgJ2luIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbn1cblxuZnVuY3Rpb24gaXNIb3N0UGFyZW50KGZpYmVyKSB7XG4gIHJldHVybiBmaWJlci50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgZmliZXIudGFnID09PSBIb3N0Um9vdCB8fCBmaWJlci50YWcgPT09IEhvc3RQb3J0YWw7XG59XG5cbmZ1bmN0aW9uIGdldEhvc3RTaWJsaW5nKGZpYmVyKSB7XG4gIC8vIFdlJ3JlIGdvaW5nIHRvIHNlYXJjaCBmb3J3YXJkIGludG8gdGhlIHRyZWUgdW50aWwgd2UgZmluZCBhIHNpYmxpbmcgaG9zdFxuICAvLyBub2RlLiBVbmZvcnR1bmF0ZWx5LCBpZiBtdWx0aXBsZSBpbnNlcnRpb25zIGFyZSBkb25lIGluIGEgcm93IHdlIGhhdmUgdG9cbiAgLy8gc2VhcmNoIHBhc3QgdGhlbS4gVGhpcyBsZWFkcyB0byBleHBvbmVudGlhbCBzZWFyY2ggZm9yIHRoZSBuZXh0IHNpYmxpbmcuXG4gIC8vIFRPRE86IEZpbmQgYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZG8gdGhpcy5cbiAgdmFyIG5vZGUgPSBmaWJlcjtcblxuICBzaWJsaW5nczogd2hpbGUgKHRydWUpIHtcbiAgICAvLyBJZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZywgbGV0J3MgdHJ5IHRoZSBuZXh0IHNpYmxpbmcuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IGlzSG9zdFBhcmVudChub2RlLnJldHVybikpIHtcbiAgICAgICAgLy8gSWYgd2UgcG9wIG91dCBvZiB0aGUgcm9vdCBvciBoaXQgdGhlIHBhcmVudCB0aGUgZmliZXIgd2UgYXJlIHRoZVxuICAgICAgICAvLyBsYXN0IHNpYmxpbmcuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG5cbiAgICB3aGlsZSAobm9kZS50YWcgIT09IEhvc3RDb21wb25lbnQgJiYgbm9kZS50YWcgIT09IEhvc3RUZXh0ICYmIG5vZGUudGFnICE9PSBEZWh5ZHJhdGVkRnJhZ21lbnQpIHtcbiAgICAgIC8vIElmIGl0IGlzIG5vdCBob3N0IG5vZGUgYW5kLCB3ZSBtaWdodCBoYXZlIGEgaG9zdCBub2RlIGluc2lkZSBpdC5cbiAgICAgIC8vIFRyeSB0byBzZWFyY2ggZG93biB1bnRpbCB3ZSBmaW5kIG9uZS5cbiAgICAgIGlmIChub2RlLmZsYWdzICYgUGxhY2VtZW50KSB7XG4gICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSBjaGlsZCwgdHJ5IHRoZSBzaWJsaW5ncyBpbnN0ZWFkLlxuICAgICAgICBjb250aW51ZSBzaWJsaW5ncztcbiAgICAgIH0gLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoaWxkLCB0cnkgdGhlIHNpYmxpbmdzIGluc3RlYWQuXG4gICAgICAvLyBXZSBhbHNvIHNraXAgcG9ydGFscyBiZWNhdXNlIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoaXMgaG9zdCB0cmVlLlxuXG5cbiAgICAgIGlmIChub2RlLmNoaWxkID09PSBudWxsIHx8IG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgIGNvbnRpbnVlIHNpYmxpbmdzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIH1cbiAgICB9IC8vIENoZWNrIGlmIHRoaXMgaG9zdCBub2RlIGlzIHN0YWJsZSBvciBhYm91dCB0byBiZSBwbGFjZWQuXG5cblxuICAgIGlmICghKG5vZGUuZmxhZ3MgJiBQbGFjZW1lbnQpKSB7XG4gICAgICAvLyBGb3VuZCBpdCFcbiAgICAgIHJldHVybiBub2RlLnN0YXRlTm9kZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGxhY2VtZW50KGZpbmlzaGVkV29yaykge1xuXG5cbiAgdmFyIHBhcmVudEZpYmVyID0gZ2V0SG9zdFBhcmVudEZpYmVyKGZpbmlzaGVkV29yayk7IC8vIE5vdGU6IHRoZXNlIHR3byB2YXJpYWJsZXMgKm11c3QqIGFsd2F5cyBiZSB1cGRhdGVkIHRvZ2V0aGVyLlxuXG4gIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgcGFyZW50ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChwYXJlbnRGaWJlci5mbGFncyAmIENvbnRlbnRSZXNldCkge1xuICAgICAgICAgIC8vIFJlc2V0IHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIHBhcmVudCBiZWZvcmUgZG9pbmcgYW55IGluc2VydGlvbnNcbiAgICAgICAgICByZXNldFRleHRDb250ZW50KHBhcmVudCk7IC8vIENsZWFyIENvbnRlbnRSZXNldCBmcm9tIHRoZSBlZmZlY3QgdGFnXG5cbiAgICAgICAgICBwYXJlbnRGaWJlci5mbGFncyAmPSB+Q29udGVudFJlc2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGJlZm9yZSA9IGdldEhvc3RTaWJsaW5nKGZpbmlzaGVkV29yayk7IC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGluc2VydGVkIGJ1dCB3ZSBuZWVkIHRvIHJlY3Vyc2UgZG93biBpdHNcbiAgICAgICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuXG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShmaW5pc2hlZFdvcmssIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wYXJlbnQgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICB2YXIgX2JlZm9yZSA9IGdldEhvc3RTaWJsaW5nKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihmaW5pc2hlZFdvcmssIF9iZWZvcmUsIF9wYXJlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUtbm8tZmFsbHRocm91Z2hcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaG9zdCBwYXJlbnQgZmliZXIuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyAnICsgJ2luIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKG5vZGUsIGJlZm9yZSwgcGFyZW50KSB7XG4gIHZhciB0YWcgPSBub2RlLnRhZztcbiAgdmFyIGlzSG9zdCA9IHRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCB0YWcgPT09IEhvc3RUZXh0O1xuXG4gIGlmIChpc0hvc3QpIHtcbiAgICB2YXIgc3RhdGVOb2RlID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoYmVmb3JlKSB7XG4gICAgICBpbnNlcnRJbkNvbnRhaW5lckJlZm9yZShwYXJlbnQsIHN0YXRlTm9kZSwgYmVmb3JlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcihwYXJlbnQsIHN0YXRlTm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFBvcnRhbCkgOyBlbHNlIHtcbiAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKGNoaWxkLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICB2YXIgc2libGluZyA9IGNoaWxkLnNpYmxpbmc7XG5cbiAgICAgIHdoaWxlIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoc2libGluZywgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgICBzaWJsaW5nID0gc2libGluZy5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUobm9kZSwgYmVmb3JlLCBwYXJlbnQpIHtcbiAgdmFyIHRhZyA9IG5vZGUudGFnO1xuICB2YXIgaXNIb3N0ID0gdGFnID09PSBIb3N0Q29tcG9uZW50IHx8IHRhZyA9PT0gSG9zdFRleHQ7XG5cbiAgaWYgKGlzSG9zdCkge1xuICAgIHZhciBzdGF0ZU5vZGUgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgIGlmIChiZWZvcmUpIHtcbiAgICAgIGluc2VydEJlZm9yZShwYXJlbnQsIHN0YXRlTm9kZSwgYmVmb3JlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kQ2hpbGQocGFyZW50LCBzdGF0ZU5vZGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RQb3J0YWwpIDsgZWxzZSB7XG4gICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKGNoaWxkLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICB2YXIgc2libGluZyA9IGNoaWxkLnNpYmxpbmc7XG5cbiAgICAgIHdoaWxlIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShzaWJsaW5nLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59IC8vIFRoZXNlIGFyZSB0cmFja2VkIG9uIHRoZSBzdGFjayBhcyB3ZSByZWN1cnNpdmVseSB0cmF2ZXJzZSBhXG4vLyBkZWxldGVkIHN1YnRyZWUuXG4vLyBUT0RPOiBVcGRhdGUgdGhlc2UgZHVyaW5nIHRoZSB3aG9sZSBtdXRhdGlvbiBwaGFzZSwgbm90IGp1c3QgZHVyaW5nXG4vLyBhIGRlbGV0aW9uLlxuXG5cbnZhciBob3N0UGFyZW50ID0gbnVsbDtcbnZhciBob3N0UGFyZW50SXNDb250YWluZXIgPSBmYWxzZTtcblxuZnVuY3Rpb24gY29tbWl0RGVsZXRpb25FZmZlY3RzKHJvb3QsIHJldHVybkZpYmVyLCBkZWxldGVkRmliZXIpIHtcbiAge1xuICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGRlbGV0ZWQgYnV0IHdlIG5lZWQgdG8gcmVjdXJzZSBkb3duIGl0c1xuICAgIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cbiAgICAvLyBSZWN1cnNpdmVseSBkZWxldGUgYWxsIGhvc3Qgbm9kZXMgZnJvbSB0aGUgcGFyZW50LCBkZXRhY2ggcmVmcywgY2xlYW5cbiAgICAvLyB1cCBtb3VudGVkIGxheW91dCBlZmZlY3RzLCBhbmQgY2FsbCBjb21wb25lbnRXaWxsVW5tb3VudC5cbiAgICAvLyBXZSBvbmx5IG5lZWQgdG8gcmVtb3ZlIHRoZSB0b3Btb3N0IGhvc3QgY2hpbGQgaW4gZWFjaCBicmFuY2guIEJ1dCB0aGVuIHdlXG4gICAgLy8gc3RpbGwgbmVlZCB0byBrZWVwIHRyYXZlcnNpbmcgdG8gdW5tb3VudCBlZmZlY3RzLCByZWZzLCBhbmQgY1dVLiBUT0RPOiBXZVxuICAgIC8vIGNvdWxkIHNwbGl0IHRoaXMgaW50byB0d28gc2VwYXJhdGUgdHJhdmVyc2FscyBmdW5jdGlvbnMsIHdoZXJlIHRoZSBzZWNvbmRcbiAgICAvLyBvbmUgZG9lc24ndCBpbmNsdWRlIGFueSByZW1vdmVDaGlsZCBsb2dpYy4gVGhpcyBpcyBtYXliZSB0aGUgc2FtZVxuICAgIC8vIGZ1bmN0aW9uIGFzIFwiZGlzYXBwZWFyTGF5b3V0RWZmZWN0c1wiIChvciB3aGF0ZXZlciB0aGF0IHR1cm5zIGludG8gYWZ0ZXJcbiAgICAvLyB0aGUgbGF5b3V0IHBoYXNlIGlzIHJlZmFjdG9yZWQgdG8gdXNlIHJlY3Vyc2lvbikuXG4gICAgLy8gQmVmb3JlIHN0YXJ0aW5nLCBmaW5kIHRoZSBuZWFyZXN0IGhvc3QgcGFyZW50IG9uIHRoZSBzdGFjayBzbyB3ZSBrbm93XG4gICAgLy8gd2hpY2ggaW5zdGFuY2UvY29udGFpbmVyIHRvIHJlbW92ZSB0aGUgY2hpbGRyZW4gZnJvbS5cbiAgICAvLyBUT0RPOiBJbnN0ZWFkIG9mIHNlYXJjaGluZyB1cCB0aGUgZmliZXIgcmV0dXJuIHBhdGggb24gZXZlcnkgZGVsZXRpb24sIHdlXG4gICAgLy8gY2FuIHRyYWNrIHRoZSBuZWFyZXN0IGhvc3QgY29tcG9uZW50IG9uIHRoZSBKUyBzdGFjayBhcyB3ZSB0cmF2ZXJzZSB0aGVcbiAgICAvLyB0cmVlIGR1cmluZyB0aGUgY29tbWl0IHBoYXNlLiBUaGlzIHdvdWxkIG1ha2UgaW5zZXJ0aW9ucyBmYXN0ZXIsIHRvby5cbiAgICB2YXIgcGFyZW50ID0gcmV0dXJuRmliZXI7XG5cbiAgICBmaW5kUGFyZW50OiB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKHBhcmVudC50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlO1xuICAgICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhayBmaW5kUGFyZW50O1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWsgZmluZFBhcmVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWsgZmluZFBhcmVudDtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGhvc3RQYXJlbnQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gZmluZCBhIGhvc3QgcGFyZW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgJyArICdhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihyb290LCByZXR1cm5GaWJlciwgZGVsZXRlZEZpYmVyKTtcbiAgICBob3N0UGFyZW50ID0gbnVsbDtcbiAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBmYWxzZTtcbiAgfVxuXG4gIGRldGFjaEZpYmVyTXV0YXRpb24oZGVsZXRlZEZpYmVyKTtcbn1cblxuZnVuY3Rpb24gcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIHBhcmVudCkge1xuICAvLyBUT0RPOiBVc2UgYSBzdGF0aWMgZmxhZyB0byBza2lwIHRyZWVzIHRoYXQgZG9uJ3QgaGF2ZSB1bm1vdW50IGVmZmVjdHNcbiAgdmFyIGNoaWxkID0gcGFyZW50LmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgIGNvbW1pdERlbGV0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBjaGlsZCk7XG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdERlbGV0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpIHtcbiAgb25Db21taXRVbm1vdW50KGRlbGV0ZWRGaWJlcik7IC8vIFRoZSBjYXNlcyBpbiB0aGlzIG91dGVyIHN3aXRjaCBtb2RpZnkgdGhlIHN0YWNrIGJlZm9yZSB0aGV5IHRyYXZlcnNlXG4gIC8vIGludG8gdGhlaXIgc3VidHJlZS4gVGhlcmUgYXJlIHNpbXBsZXIgY2FzZXMgaW4gdGhlIGlubmVyIHN3aXRjaFxuICAvLyB0aGF0IGRvbid0IG1vZGlmeSB0aGUgc3RhY2suXG5cbiAgc3dpdGNoIChkZWxldGVkRmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgICAgfSAvLyBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCB0byBuZXh0IGJyYW5jaFxuXG4gICAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lLW5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICAvLyBXZSBvbmx5IG5lZWQgdG8gcmVtb3ZlIHRoZSBuZWFyZXN0IGhvc3QgY2hpbGQuIFNldCB0aGUgaG9zdCBwYXJlbnRcbiAgICAgICAgLy8gdG8gYG51bGxgIG9uIHRoZSBzdGFjayB0byBpbmRpY2F0ZSB0aGF0IG5lc3RlZCBjaGlsZHJlbiBkb24ndFxuICAgICAgICAvLyBuZWVkIHRvIGJlIHJlbW92ZWQuXG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcHJldkhvc3RQYXJlbnQgPSBob3N0UGFyZW50O1xuICAgICAgICAgIHZhciBwcmV2SG9zdFBhcmVudElzQ29udGFpbmVyID0gaG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBudWxsO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBwcmV2SG9zdFBhcmVudDtcbiAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBwcmV2SG9zdFBhcmVudElzQ29udGFpbmVyO1xuXG4gICAgICAgICAgaWYgKGhvc3RQYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIE5vdyB0aGF0IGFsbCB0aGUgY2hpbGQgZWZmZWN0cyBoYXZlIHVubW91bnRlZCwgd2UgY2FuIHJlbW92ZSB0aGVcbiAgICAgICAgICAgIC8vIG5vZGUgZnJvbSB0aGUgdHJlZS5cbiAgICAgICAgICAgIGlmIChob3N0UGFyZW50SXNDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgcmVtb3ZlQ2hpbGRGcm9tQ29udGFpbmVyKGhvc3RQYXJlbnQsIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVtb3ZlQ2hpbGQoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBEZWh5ZHJhdGVkRnJhZ21lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIERlbGV0ZSB0aGUgZGVoeWRyYXRlZCBzdXNwZW5zZSBib3VuZGFyeSBhbmQgYWxsIG9mIGl0cyBjb250ZW50LlxuXG5cbiAgICAgICAge1xuICAgICAgICAgIGlmIChob3N0UGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoaG9zdFBhcmVudElzQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgIGNsZWFyU3VzcGVuc2VCb3VuZGFyeUZyb21Db250YWluZXIoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjbGVhclN1c3BlbnNlQm91bmRhcnkoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgLy8gV2hlbiB3ZSBnbyBpbnRvIGEgcG9ydGFsLCBpdCBiZWNvbWVzIHRoZSBwYXJlbnQgdG8gcmVtb3ZlIGZyb20uXG4gICAgICAgICAgdmFyIF9wcmV2SG9zdFBhcmVudCA9IGhvc3RQYXJlbnQ7XG4gICAgICAgICAgdmFyIF9wcmV2SG9zdFBhcmVudElzQ29udGFpbmVyID0gaG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBkZWxldGVkRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICBob3N0UGFyZW50ID0gX3ByZXZIb3N0UGFyZW50O1xuICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IF9wcmV2SG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgdmFyIHVwZGF0ZVF1ZXVlID0gZGVsZXRlZEZpYmVyLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgbGFzdEVmZmVjdCA9IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3Q7XG5cbiAgICAgICAgICAgIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICAgICAgICAgICAgdmFyIGVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuXG4gICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB2YXIgX2VmZmVjdCA9IGVmZmVjdCxcbiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSA9IF9lZmZlY3QuZGVzdHJveSxcbiAgICAgICAgICAgICAgICAgICAgdGFnID0gX2VmZmVjdC50YWc7XG5cbiAgICAgICAgICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGFnICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQoZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICggZGVsZXRlZEZpYmVyLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpO1xuICAgICAgICAgICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0O1xuICAgICAgICAgICAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZGVsZXRlZEZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGluc3RhbmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggLy8gVE9ETzogUmVtb3ZlIHRoaXMgZGVhZCBmbGFnXG4gICAgICAgICBkZWxldGVkRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBvZmZzY3JlZW4gY29tcG9uZW50IGlzIGhpZGRlbiwgd2UgYWxyZWFkeSB1bm1vdW50ZWQgaXQuIEJlZm9yZVxuICAgICAgICAgIC8vIGRlbGV0aW5nIHRoZSBjaGlsZHJlbiwgdHJhY2sgdGhhdCBpdCdzIGFscmVhZHkgdW5tb3VudGVkIHNvIHRoYXQgd2VcbiAgICAgICAgICAvLyBkb24ndCBhdHRlbXB0IHRvIHVubW91bnQgdGhlIGVmZmVjdHMgYWdhaW4uXG4gICAgICAgICAgLy8gVE9ETzogSWYgdGhlIHRyZWUgaXMgaGlkZGVuLCBpbiBtb3N0IGNhc2VzIHdlIHNob3VsZCBiZSBhYmxlIHRvIHNraXBcbiAgICAgICAgICAvLyBvdmVyIHRoZSBuZXN0ZWQgY2hpbGRyZW4gZW50aXJlbHkuIEFuIGV4Y2VwdGlvbiBpcyB3ZSBoYXZlbid0IHlldCBmb3VuZFxuICAgICAgICAgIC8vIHRoZSB0b3Btb3N0IGhvc3Qgbm9kZSB0byBkZWxldGUsIHdoaWNoIHdlIGFscmVhZHkgdHJhY2sgb24gdGhlIHN0YWNrLlxuICAgICAgICAgIC8vIEJ1dCB0aGUgb3RoZXIgY2FzZSBpcyBwb3J0YWxzLCB3aGljaCBuZWVkIHRvIGJlIGRldGFjaGVkIG5vIG1hdHRlciBob3dcbiAgICAgICAgICAvLyBkZWVwbHkgdGhleSBhcmUgbmVzdGVkLiBXZSBzaG91bGQgdXNlIGEgc3VidHJlZSBmbGFnIHRvIHRyYWNrIHdoZXRoZXIgYVxuICAgICAgICAgIC8vIHN1YnRyZWUgaW5jbHVkZXMgYSBuZXN0ZWQgcG9ydGFsLlxuICAgICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8IGRlbGV0ZWRGaWJlci5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRTdXNwZW5zZUNhbGxiYWNrKGZpbmlzaGVkV29yaykge1xuICAvLyBUT0RPOiBNb3ZlIHRoaXMgdG8gcGFzc2l2ZSBwaGFzZVxuICB2YXIgbmV3U3RhdGUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTtcbn1cblxuZnVuY3Rpb24gY29tbWl0U3VzcGVuc2VIeWRyYXRpb25DYWxsYmFja3MoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspIHtcblxuICB2YXIgbmV3U3RhdGUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAobmV3U3RhdGUgPT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IHByZXZTdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICAgIGlmIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgY29tbWl0SHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKSB7XG4gIC8vIElmIHRoaXMgYm91bmRhcnkganVzdCB0aW1lZCBvdXQsIHRoZW4gaXQgd2lsbCBoYXZlIGEgc2V0IG9mIHdha2VhYmxlcy5cbiAgLy8gRm9yIGVhY2ggd2FrZWFibGUsIGF0dGFjaCBhIGxpc3RlbmVyIHNvIHRoYXQgd2hlbiBpdCByZXNvbHZlcywgUmVhY3RcbiAgLy8gYXR0ZW1wdHMgdG8gcmUtcmVuZGVyIHRoZSBib3VuZGFyeSBpbiB0aGUgcHJpbWFyeSAocHJlLXRpbWVvdXQpIHN0YXRlLlxuICB2YXIgd2FrZWFibGVzID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh3YWtlYWJsZXMgIT09IG51bGwpIHtcbiAgICBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIHZhciByZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgIGlmIChyZXRyeUNhY2hlID09PSBudWxsKSB7XG4gICAgICByZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZSA9IG5ldyBQb3NzaWJseVdlYWtTZXQoKTtcbiAgICB9XG5cbiAgICB3YWtlYWJsZXMuZm9yRWFjaChmdW5jdGlvbiAod2FrZWFibGUpIHtcbiAgICAgIC8vIE1lbW9pemUgdXNpbmcgdGhlIGJvdW5kYXJ5IGZpYmVyIHRvIHByZXZlbnQgcmVkdW5kYW50IGxpc3RlbmVycy5cbiAgICAgIHZhciByZXRyeSA9IHJlc29sdmVSZXRyeVdha2VhYmxlLmJpbmQobnVsbCwgZmluaXNoZWRXb3JrLCB3YWtlYWJsZSk7XG5cbiAgICAgIGlmICghcmV0cnlDYWNoZS5oYXMod2FrZWFibGUpKSB7XG4gICAgICAgIHJldHJ5Q2FjaGUuYWRkKHdha2VhYmxlKTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgICAgICBpZiAoaW5Qcm9ncmVzc0xhbmVzICE9PSBudWxsICYmIGluUHJvZ3Jlc3NSb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyB3b3JrIHN0aWxsLCBhc3NvY2lhdGUgdGhlIG9yaWdpbmFsIHVwZGF0ZXJzIHdpdGggaXQuXG4gICAgICAgICAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMoaW5Qcm9ncmVzc1Jvb3QsIGluUHJvZ3Jlc3NMYW5lcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBFcnJvcignRXhwZWN0ZWQgZmluaXNoZWQgcm9vdCBhbmQgbGFuZXMgdG8gYmUgc2V0LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHdha2VhYmxlLnRoZW4ocmV0cnksIHJldHJ5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSAvLyBUaGlzIGZ1bmN0aW9uIGRldGVjdHMgd2hlbiBhIFN1c3BlbnNlIGJvdW5kYXJ5IGdvZXMgZnJvbSB2aXNpYmxlIHRvIGhpZGRlbi5cbmZ1bmN0aW9uIGNvbW1pdE11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzKSB7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IGNvbW1pdHRlZExhbmVzO1xuICBpblByb2dyZXNzUm9vdCA9IHJvb3Q7XG4gIHNldEN1cnJlbnRGaWJlcihmaW5pc2hlZFdvcmspO1xuICBjb21taXRNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkV29yaywgcm9vdCk7XG4gIHNldEN1cnJlbnRGaWJlcihmaW5pc2hlZFdvcmspO1xuICBpblByb2dyZXNzTGFuZXMgPSBudWxsO1xuICBpblByb2dyZXNzUm9vdCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgcGFyZW50RmliZXIsIGxhbmVzKSB7XG4gIC8vIERlbGV0aW9ucyBlZmZlY3RzIGNhbiBiZSBzY2hlZHVsZWQgb24gYW55IGZpYmVyIHR5cGUuIFRoZXkgbmVlZCB0byBoYXBwZW5cbiAgLy8gYmVmb3JlIHRoZSBjaGlsZHJlbiBlZmZlY3RzIGhhZSBmaXJlZC5cbiAgdmFyIGRlbGV0aW9ucyA9IHBhcmVudEZpYmVyLmRlbGV0aW9ucztcblxuICBpZiAoZGVsZXRpb25zICE9PSBudWxsKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWxldGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZFRvRGVsZXRlID0gZGVsZXRpb25zW2ldO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb21taXREZWxldGlvbkVmZmVjdHMocm9vdCwgcGFyZW50RmliZXIsIGNoaWxkVG9EZWxldGUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY2hpbGRUb0RlbGV0ZSwgcGFyZW50RmliZXIsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgcHJldkRlYnVnRmliZXIgPSBnZXRDdXJyZW50RmliZXIoKTtcblxuICBpZiAocGFyZW50RmliZXIuc3VidHJlZUZsYWdzICYgTXV0YXRpb25NYXNrKSB7XG4gICAgdmFyIGNoaWxkID0gcGFyZW50RmliZXIuY2hpbGQ7XG5cbiAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihjaGlsZCk7XG4gICAgICBjb21taXRNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGNoaWxkLCByb290KTtcbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG4gIH1cblxuICBzZXRDdXJyZW50RmliZXIocHJldkRlYnVnRmliZXIpO1xufVxuXG5mdW5jdGlvbiBjb21taXRNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkV29yaywgcm9vdCwgbGFuZXMpIHtcbiAgdmFyIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlO1xuICB2YXIgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7IC8vIFRoZSBlZmZlY3QgZmxhZyBzaG91bGQgYmUgY2hlY2tlZCAqYWZ0ZXIqIHdlIHJlZmluZSB0aGUgdHlwZSBvZiBmaWJlcixcbiAgLy8gYmVjYXVzZSB0aGUgZmliZXIgdGFnIGlzIG1vcmUgc3BlY2lmaWMuIEFuIGV4Y2VwdGlvbiBpcyBhbnkgZmxhZyByZWxhdGVkXG4gIC8vIHRvIHJlY29uY2lsYXRpb24sIGJlY2F1c2UgdGhvc2UgY2FuIGJlIHNldCBvbiBhbGwgZmliZXIgdHlwZXMuXG5cbiAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KEluc2VydGlvbiB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoSW5zZXJ0aW9uIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9IC8vIExheW91dCBlZmZlY3RzIGFyZSBkZXN0cm95ZWQgZHVyaW5nIHRoZSBtdXRhdGlvbiBwaGFzZSBzbyB0aGF0IGFsbFxuICAgICAgICAgIC8vIGRlc3Ryb3kgZnVuY3Rpb25zIGZvciBhbGwgZmliZXJzIGFyZSBjYWxsZWQgYmVmb3JlIGFueSBjcmVhdGUgZnVuY3Rpb25zLlxuICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgc2libGluZyBjb21wb25lbnQgZWZmZWN0cyBmcm9tIGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlcixcbiAgICAgICAgICAvLyBlLmcuIGEgZGVzdHJveSBmdW5jdGlvbiBpbiBvbmUgY29tcG9uZW50IHNob3VsZCBuZXZlciBvdmVycmlkZSBhIHJlZiBzZXRcbiAgICAgICAgICAvLyBieSBhIGNyZWF0ZSBmdW5jdGlvbiBpbiBhbm90aGVyIGNvbXBvbmVudCBkdXJpbmcgdGhlIHNhbWUgY29tbWl0LlxuXG5cbiAgICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBSZWYpIHtcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIGN1cnJlbnQucmV0dXJuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgUmVmKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBjdXJyZW50LnJldHVybik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIC8vIFRPRE86IENvbnRlbnRSZXNldCBnZXRzIGNsZWFyZWQgYnkgdGhlIGNoaWxkcmVuIGR1cmluZyB0aGUgY29tbWl0XG4gICAgICAgICAgLy8gcGhhc2UuIFRoaXMgaXMgYSByZWZhY3RvciBoYXphcmQgYmVjYXVzZSBpdCBtZWFucyB3ZSBtdXN0IHJlYWRcbiAgICAgICAgICAvLyBmbGFncyB0aGUgZmxhZ3MgYWZ0ZXIgYGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0c2AgaGFzIGFscmVhZHkgcnVuO1xuICAgICAgICAgIC8vIHRoZSBvcmRlciBtYXR0ZXJzLiBXZSBzaG91bGQgcmVmYWN0b3Igc28gdGhhdCBDb250ZW50UmVzZXQgZG9lcyBub3RcbiAgICAgICAgICAvLyByZWx5IG9uIG11dGF0aW5nIHRoZSBmbGFnIGR1cmluZyBjb21taXQuIExpa2UgYnkgc2V0dGluZyBhIGZsYWdcbiAgICAgICAgICAvLyBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSBpbnN0ZWFkLlxuICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBDb250ZW50UmVzZXQpIHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlc2V0VGV4dENvbnRlbnQoaW5zdGFuY2UpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgICB2YXIgX2luc3RhbmNlNCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIGlmIChfaW5zdGFuY2U0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gQ29tbWl0IHRoZSB3b3JrIHByZXBhcmVkIGVhcmxpZXIuXG4gICAgICAgICAgICAgIHZhciBuZXdQcm9wcyA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzOyAvLyBGb3IgaHlkcmF0aW9uIHdlIHJldXNlIHRoZSB1cGRhdGUgcGF0aCBidXQgd2UgdHJlYXQgdGhlIG9sZFByb3BzXG4gICAgICAgICAgICAgIC8vIGFzIHRoZSBuZXdQcm9wcy4gVGhlIHVwZGF0ZVBheWxvYWQgd2lsbCBjb250YWluIHRoZSByZWFsIGNoYW5nZSBpblxuICAgICAgICAgICAgICAvLyB0aGlzIGNhc2UuXG5cbiAgICAgICAgICAgICAgdmFyIG9sZFByb3BzID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyA6IG5ld1Byb3BzO1xuICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpbmlzaGVkV29yay50eXBlOyAvLyBUT0RPOiBUeXBlIHRoZSB1cGRhdGVRdWV1ZSB0byBiZSBzcGVjaWZpYyB0byBob3N0IGNvbXBvbmVudHMuXG5cbiAgICAgICAgICAgICAgdmFyIHVwZGF0ZVBheWxvYWQgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZVBheWxvYWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgY29tbWl0VXBkYXRlKF9pbnN0YW5jZTQsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgc2hvdWxkIGhhdmUgYSB0ZXh0IG5vZGUgaW5pdGlhbGl6ZWQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5ICcgKyAnY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHRleHRJbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgICB2YXIgbmV3VGV4dCA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzOyAvLyBGb3IgaHlkcmF0aW9uIHdlIHJldXNlIHRoZSB1cGRhdGUgcGF0aCBidXQgd2UgdHJlYXQgdGhlIG9sZFByb3BzXG4gICAgICAgICAgICAvLyBhcyB0aGUgbmV3UHJvcHMuIFRoZSB1cGRhdGVQYXlsb2FkIHdpbGwgY29udGFpbiB0aGUgcmVhbCBjaGFuZ2UgaW5cbiAgICAgICAgICAgIC8vIHRoaXMgY2FzZS5cblxuICAgICAgICAgICAgdmFyIG9sZFRleHQgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbmV3VGV4dDtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29tbWl0VGV4dFVwZGF0ZSh0ZXh0SW5zdGFuY2UsIG9sZFRleHQsIG5ld1RleHQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB2YXIgcHJldlJvb3RTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICAgICAgICBpZiAocHJldlJvb3RTdGF0ZS5pc0RlaHlkcmF0ZWQpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgY29tbWl0SHlkcmF0ZWRDb250YWluZXIocm9vdC5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgIHZhciBvZmZzY3JlZW5GaWJlciA9IGZpbmlzaGVkV29yay5jaGlsZDtcblxuICAgICAgICBpZiAob2Zmc2NyZWVuRmliZXIuZmxhZ3MgJiBWaXNpYmlsaXR5KSB7XG4gICAgICAgICAgdmFyIG9mZnNjcmVlbkluc3RhbmNlID0gb2Zmc2NyZWVuRmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgIHZhciBuZXdTdGF0ZSA9IG9mZnNjcmVlbkZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIGlzSGlkZGVuID0gbmV3U3RhdGUgIT09IG51bGw7IC8vIFRyYWNrIHRoZSBjdXJyZW50IHN0YXRlIG9uIHRoZSBPZmZzY3JlZW4gaW5zdGFuY2Ugc28gd2UgY2FuXG4gICAgICAgICAgLy8gcmVhZCBpdCBkdXJpbmcgYW4gZXZlbnRcblxuICAgICAgICAgIG9mZnNjcmVlbkluc3RhbmNlLmlzSGlkZGVuID0gaXNIaWRkZW47XG5cbiAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgIHZhciB3YXNIaWRkZW4gPSBvZmZzY3JlZW5GaWJlci5hbHRlcm5hdGUgIT09IG51bGwgJiYgb2Zmc2NyZWVuRmliZXIuYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICAgIGlmICghd2FzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIC8vIFRPRE86IE1vdmUgdG8gcGFzc2l2ZSBwaGFzZVxuICAgICAgICAgICAgICBtYXJrQ29tbWl0VGltZU9mRmFsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0U3VzcGVuc2VDYWxsYmFjayhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhdHRhY2hTdXNwZW5zZVJldHJ5TGlzdGVuZXJzKGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF93YXNIaWRkZW4gPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICBpZiAoIC8vIFRPRE86IFJlbW92ZSB0aGlzIGRlYWQgZmxhZ1xuICAgICAgICAgZmluaXNoZWRXb3JrLm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgICAgIC8vIEJlZm9yZSBjb21taXR0aW5nIHRoZSBjaGlsZHJlbiwgdHJhY2sgb24gdGhlIHN0YWNrIHdoZXRoZXIgdGhpc1xuICAgICAgICAgIC8vIG9mZnNjcmVlbiBzdWJ0cmVlIHdhcyBhbHJlYWR5IGhpZGRlbiwgc28gdGhhdCB3ZSBkb24ndCB1bm1vdW50IHRoZVxuICAgICAgICAgIC8vIGVmZmVjdHMgYWdhaW4uXG4gICAgICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gfHwgX3dhc0hpZGRlbjtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFZpc2liaWxpdHkpIHtcbiAgICAgICAgICB2YXIgX29mZnNjcmVlbkluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICB2YXIgX25ld1N0YXRlID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgICB2YXIgX2lzSGlkZGVuID0gX25ld1N0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgdmFyIG9mZnNjcmVlbkJvdW5kYXJ5ID0gZmluaXNoZWRXb3JrOyAvLyBUcmFjayB0aGUgY3VycmVudCBzdGF0ZSBvbiB0aGUgT2Zmc2NyZWVuIGluc3RhbmNlIHNvIHdlIGNhblxuICAgICAgICAgIC8vIHJlYWQgaXQgZHVyaW5nIGFuIGV2ZW50XG5cbiAgICAgICAgICBfb2Zmc2NyZWVuSW5zdGFuY2UuaXNIaWRkZW4gPSBfaXNIaWRkZW47XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoX2lzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIGlmICghX3dhc0hpZGRlbikge1xuICAgICAgICAgICAgICAgIGlmICgob2Zmc2NyZWVuQm91bmRhcnkubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICAgICAgICBuZXh0RWZmZWN0ID0gb2Zmc2NyZWVuQm91bmRhcnk7XG4gICAgICAgICAgICAgICAgICB2YXIgb2Zmc2NyZWVuQ2hpbGQgPSBvZmZzY3JlZW5Cb3VuZGFyeS5jaGlsZDtcblxuICAgICAgICAgICAgICAgICAgd2hpbGUgKG9mZnNjcmVlbkNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRFZmZlY3QgPSBvZmZzY3JlZW5DaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19iZWdpbihvZmZzY3JlZW5DaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNjcmVlbkNoaWxkID0gb2Zmc2NyZWVuQ2hpbGQuc2libGluZztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyBUT0RPOiBUaGlzIG5lZWRzIHRvIHJ1biB3aGVuZXZlciB0aGVyZSdzIGFuIGluc2VydGlvbiBvciB1cGRhdGVcbiAgICAgICAgICAgIC8vIGluc2lkZSBhIGhpZGRlbiBPZmZzY3JlZW4gdHJlZS5cbiAgICAgICAgICAgIGhpZGVPclVuaGlkZUFsbENoaWxkcmVuKG9mZnNjcmVlbkJvdW5kYXJ5LCBfaXNIaWRkZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspIHtcbiAgLy8gUGxhY2VtZW50IGVmZmVjdHMgKGluc2VydGlvbnMsIHJlb3JkZXJzKSBjYW4gYmUgc2NoZWR1bGVkIG9uIGFueSBmaWJlclxuICAvLyB0eXBlLiBUaGV5IG5lZWRzIHRvIGhhcHBlbiBhZnRlciB0aGUgY2hpbGRyZW4gZWZmZWN0cyBoYXZlIGZpcmVkLCBidXRcbiAgLy8gYmVmb3JlIHRoZSBlZmZlY3RzIG9uIHRoaXMgZmliZXIgaGF2ZSBmaXJlZC5cbiAgdmFyIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzO1xuXG4gIGlmIChmbGFncyAmIFBsYWNlbWVudCkge1xuICAgIHRyeSB7XG4gICAgICBjb21taXRQbGFjZW1lbnQoZmluaXNoZWRXb3JrKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgfSAvLyBDbGVhciB0aGUgXCJwbGFjZW1lbnRcIiBmcm9tIGVmZmVjdCB0YWcgc28gdGhhdCB3ZSBrbm93IHRoYXQgdGhpcyBpc1xuICAgIC8vIGluc2VydGVkLCBiZWZvcmUgYW55IGxpZmUtY3ljbGVzIGxpa2UgY29tcG9uZW50RGlkTW91bnQgZ2V0cyBjYWxsZWQuXG4gICAgLy8gVE9ETzogZmluZERPTU5vZGUgZG9lc24ndCByZWx5IG9uIHRoaXMgYW55IG1vcmUgYnV0IGlzTW91bnRlZCBkb2VzXG4gICAgLy8gYW5kIGlzTW91bnRlZCBpcyBkZXByZWNhdGVkIGFueXdheSBzbyB3ZSBzaG91bGQgYmUgYWJsZSB0byBraWxsIHRoaXMuXG5cblxuICAgIGZpbmlzaGVkV29yay5mbGFncyAmPSB+UGxhY2VtZW50O1xuICB9XG5cbiAgaWYgKGZsYWdzICYgSHlkcmF0aW5nKSB7XG4gICAgZmluaXNoZWRXb3JrLmZsYWdzICY9IH5IeWRyYXRpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0TGF5b3V0RWZmZWN0cyhmaW5pc2hlZFdvcmssIHJvb3QsIGNvbW1pdHRlZExhbmVzKSB7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IGNvbW1pdHRlZExhbmVzO1xuICBpblByb2dyZXNzUm9vdCA9IHJvb3Q7XG4gIG5leHRFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gIGNvbW1pdExheW91dEVmZmVjdHNfYmVnaW4oZmluaXNoZWRXb3JrLCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IG51bGw7XG4gIGluUHJvZ3Jlc3NSb290ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gY29tbWl0TGF5b3V0RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcbiAgLy8gU3VzcGVuc2UgbGF5b3V0IGVmZmVjdHMgc2VtYW50aWNzIGRvbid0IGNoYW5nZSBmb3IgbGVnYWN5IHJvb3RzLlxuICB2YXIgaXNNb2Rlcm5Sb290ID0gKHN1YnRyZWVSb290Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcblxuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmICggZmliZXIudGFnID09PSBPZmZzY3JlZW5Db21wb25lbnQgJiYgaXNNb2Rlcm5Sb290KSB7XG4gICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IE9mZnNjcmVlbiBzdGFjaydzIHN0YXRlLlxuICAgICAgdmFyIGlzSGlkZGVuID0gZmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgIHZhciBuZXdPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBpc0hpZGRlbiB8fCBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47XG5cbiAgICAgIGlmIChuZXdPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4pIHtcbiAgICAgICAgLy8gVGhlIE9mZnNjcmVlbiB0cmVlIGlzIGhpZGRlbi4gU2tpcCBvdmVyIGl0cyBsYXlvdXQgZWZmZWN0cy5cbiAgICAgICAgY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETyAoT2Zmc2NyZWVuKSBBbHNvIGNoZWNrOiBzdWJ0cmVlRmxhZ3MgJiBMYXlvdXRNYXNrXG4gICAgICAgIHZhciBjdXJyZW50ID0gZmliZXIuYWx0ZXJuYXRlO1xuICAgICAgICB2YXIgd2FzSGlkZGVuID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG4gICAgICAgIHZhciBuZXdPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gd2FzSGlkZGVuIHx8IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuOyAvLyBUcmF2ZXJzZSB0aGUgT2Zmc2NyZWVuIHN1YnRyZWUgd2l0aCB0aGUgY3VycmVudCBPZmZzY3JlZW4gYXMgdGhlIHJvb3QuXG5cbiAgICAgICAgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gbmV3T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gbmV3T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcblxuICAgICAgICBpZiAob2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiAmJiAhcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByb290IG9mIGEgcmVhcHBlYXJpbmcgYm91bmRhcnkuIFR1cm4gaXRzIGxheW91dCBlZmZlY3RzXG4gICAgICAgICAgLy8gYmFjayBvbi5cbiAgICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXI7XG4gICAgICAgICAgcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2JlZ2luKGZpYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjaGlsZCA9IGZpcnN0Q2hpbGQ7XG5cbiAgICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkO1xuICAgICAgICAgIGNvbW1pdExheW91dEVmZmVjdHNfYmVnaW4oY2hpbGQsIC8vIE5ldyByb290OyBidWJibGUgYmFjayB1cCB0byBoZXJlIGFuZCBzdG9wLlxuICAgICAgICAgIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICAgIH0gLy8gUmVzdG9yZSBPZmZzY3JlZW4gc3RhdGUgYW5kIHJlc3VtZSBpbiBvdXItcHJvZ3Jlc3MgdHJhdmVyc2FsLlxuXG5cbiAgICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyO1xuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgIGNvbW1pdExheW91dE1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGZpYmVyLnN1YnRyZWVGbGFncyAmIExheW91dE1hc2spICE9PSBOb0ZsYWdzICYmIGZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGZpcnN0Q2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dE1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuXG4gICAgaWYgKChmaWJlci5mbGFncyAmIExheW91dE1hc2spICE9PSBOb0ZsYWdzKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbW1pdExheW91dEVmZmVjdE9uRmliZXIocm9vdCwgY3VycmVudCwgZmliZXIsIGNvbW1pdHRlZExhbmVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIgPT09IHN1YnRyZWVSb290KSB7XG4gICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc2FwcGVhckxheW91dEVmZmVjdHNfYmVnaW4oc3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBmaXJzdENoaWxkID0gZmliZXIuY2hpbGQ7IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgKFJlZlN0YXRpYyB8IExheW91dFN0YXRpYylcblxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCBmaWJlci5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCwgZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaWJlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQsIGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBmbGFncyAmIFJlZlN0YXRpY1xuICAgICAgICAgIHNhZmVseURldGFjaFJlZihmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoZmliZXIsIGZpYmVyLnJldHVybiwgaW5zdGFuY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHNhZmVseURldGFjaFJlZihmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYVxuICAgICAgICAgIHZhciBpc0hpZGRlbiA9IGZpYmVyLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgIC8vIE5lc3RlZCBPZmZzY3JlZW4gdHJlZSBpcyBhbHJlYWR5IGhpZGRlbi4gRG9uJ3QgZGlzYXBwZWFyXG4gICAgICAgICAgICAvLyBpdHMgZWZmZWN0cy5cbiAgICAgICAgICAgIGRpc2FwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IHN1YnRyZWVGbGFncyAmIExheW91dFN0YXRpY1xuXG5cbiAgICBpZiAoZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG5cbiAgICBpZiAoZmliZXIgPT09IHN1YnRyZWVSb290KSB7XG4gICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmIChmaWJlci50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCkge1xuICAgICAgdmFyIGlzSGlkZGVuID0gZmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgIC8vIE5lc3RlZCBPZmZzY3JlZW4gdHJlZSBpcyBzdGlsbCBoaWRkZW4uIERvbid0IHJlLWFwcGVhciBpdHMgZWZmZWN0cy5cbiAgICAgICAgcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfSAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBzdWJ0cmVlRmxhZ3MgJiBMYXlvdXRTdGF0aWNcblxuXG4gICAgaWYgKGZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgbm9kZSBtYXkgaGF2ZSBiZWVuIHJldXNlZCBmcm9tIGEgcHJldmlvdXMgcmVuZGVyLCBzbyB3ZSBjYW4ndFxuICAgICAgLy8gYXNzdW1lIGl0cyByZXR1cm4gcG9pbnRlciBpcyBjb3JyZWN0LlxuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWFwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZWFwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0OyAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBmbGFncyAmIExheW91dFN0YXRpY1xuXG4gICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgIHRyeSB7XG4gICAgICByZWFwcGVhckxheW91dEVmZmVjdHNPbkZpYmVyKGZpYmVyKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG5cbiAgICBpZiAoZmliZXIgPT09IHN1YnRyZWVSb290KSB7XG4gICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBub2RlIG1heSBoYXZlIGJlZW4gcmV1c2VkIGZyb20gYSBwcmV2aW91cyByZW5kZXIsIHNvIHdlIGNhbid0XG4gICAgICAvLyBhc3N1bWUgaXRzIHJldHVybiBwb2ludGVyIGlzIGNvcnJlY3QuXG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucykge1xuICBuZXh0RWZmZWN0ID0gZmluaXNoZWRXb3JrO1xuICBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2JlZ2luKGZpbmlzaGVkV29yaywgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKTtcbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MgJiYgZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuXG4gICAgaWYgKChmaWJlci5mbGFncyAmIFBhc3NpdmUpICE9PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb21taXRQYXNzaXZlTW91bnRPbkZpYmVyKHJvb3QsIGZpYmVyLCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIH1cblxuICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHtcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50T25GaWJlcihmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7XG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgc3RhcnRQYXNzaXZlRWZmZWN0VGltZXIoKTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgcmVjb3JkUGFzc2l2ZUVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzKGZpcnN0Q2hpbGQpIHtcbiAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c19iZWdpbigpO1xufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfYmVnaW4oKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmICgobmV4dEVmZmVjdC5mbGFncyAmIENoaWxkRGVsZXRpb24pICE9PSBOb0ZsYWdzKSB7XG4gICAgICB2YXIgZGVsZXRpb25zID0gZmliZXIuZGVsZXRpb25zO1xuXG4gICAgICBpZiAoZGVsZXRpb25zICE9PSBudWxsKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsZXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGZpYmVyVG9EZWxldGUgPSBkZWxldGlvbnNbaV07XG4gICAgICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyVG9EZWxldGU7XG4gICAgICAgICAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9iZWdpbihmaWJlclRvRGVsZXRlLCBmaWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgLy8gQSBmaWJlciB3YXMgZGVsZXRlZCBmcm9tIHRoaXMgcGFyZW50IGZpYmVyLCBidXQgaXQncyBzdGlsbCBwYXJ0IG9mXG4gICAgICAgICAgLy8gdGhlIHByZXZpb3VzIChhbHRlcm5hdGUpIHBhcmVudCBmaWJlcidzIGxpc3Qgb2YgY2hpbGRyZW4uIEJlY2F1c2VcbiAgICAgICAgICAvLyBjaGlsZHJlbiBhcmUgYSBsaW5rZWQgbGlzdCwgYW4gZWFybGllciBzaWJsaW5nIHRoYXQncyBzdGlsbCBhbGl2ZVxuICAgICAgICAgIC8vIHdpbGwgYmUgY29ubmVjdGVkIHRvIHRoZSBkZWxldGVkIGZpYmVyIHZpYSBpdHMgYGFsdGVybmF0ZWA6XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyAgIGxpdmUgZmliZXJcbiAgICAgICAgICAvLyAgIC0tYWx0ZXJuYXRlLS0+IHByZXZpb3VzIGxpdmUgZmliZXJcbiAgICAgICAgICAvLyAgIC0tc2libGluZy0tPiBkZWxldGVkIGZpYmVyXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBXZSBjYW4ndCBkaXNjb25uZWN0IGBhbHRlcm5hdGVgIG9uIG5vZGVzIHRoYXQgaGF2ZW4ndCBiZWVuIGRlbGV0ZWRcbiAgICAgICAgICAvLyB5ZXQsIGJ1dCB3ZSBjYW4gZGlzY29ubmVjdCB0aGUgYHNpYmxpbmdgIGFuZCBgY2hpbGRgIHBvaW50ZXJzLlxuICAgICAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgICAgaWYgKHByZXZpb3VzRmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBkZXRhY2hlZENoaWxkID0gcHJldmlvdXNGaWJlci5jaGlsZDtcblxuICAgICAgICAgICAgaWYgKGRldGFjaGVkQ2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcHJldmlvdXNGaWJlci5jaGlsZCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHZhciBkZXRhY2hlZFNpYmxpbmcgPSBkZXRhY2hlZENoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICAgICAgZGV0YWNoZWRDaGlsZC5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgICBkZXRhY2hlZENoaWxkID0gZGV0YWNoZWRTaWJsaW5nO1xuICAgICAgICAgICAgICB9IHdoaWxlIChkZXRhY2hlZENoaWxkICE9PSBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MgJiYgY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGNoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfY29tcGxldGUoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzX2NvbXBsZXRlKCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG5cbiAgICBpZiAoKGZpYmVyLmZsYWdzICYgUGFzc2l2ZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgICBjb21taXRQYXNzaXZlVW5tb3VudE9uRmliZXIoZmliZXIpO1xuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50T25GaWJlcihmaW5pc2hlZFdvcmspIHtcbiAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpO1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgcmVjb3JkUGFzc2l2ZUVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfYmVnaW4oZGVsZXRlZFN1YnRyZWVSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDsgLy8gRGVsZXRpb24gZWZmZWN0cyBmaXJlIGluIHBhcmVudCAtPiBjaGlsZCBvcmRlclxuICAgIC8vIFRPRE86IENoZWNrIGlmIGZpYmVyIGhhcyBhIFBhc3NpdmVTdGF0aWMgZmxhZ1xuXG4gICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICBjb21taXRQYXNzaXZlVW5tb3VudEluc2lkZURlbGV0ZWRUcmVlT25GaWJlcihmaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDsgLy8gVE9ETzogT25seSB0cmF2ZXJzZSBzdWJ0cmVlIGlmIGl0IGhhcyBhIFBhc3NpdmVTdGF0aWMgZmxhZy4gKEJ1dCwgaWYgd2VcbiAgICAvLyBkbyB0aGlzLCBzdGlsbCBuZWVkIHRvIGhhbmRsZSBgZGVsZXRlZFRyZWVDbGVhblVwTGV2ZWxgIGNvcnJlY3RseS4pXG5cbiAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGNoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2NvbXBsZXRlKGRlbGV0ZWRTdWJ0cmVlUm9vdCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfY29tcGxldGUoZGVsZXRlZFN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG4gICAgdmFyIHJldHVybkZpYmVyID0gZmliZXIucmV0dXJuO1xuXG4gICAge1xuICAgICAgLy8gUmVjdXJzaXZlbHkgdHJhdmVyc2UgdGhlIGVudGlyZSBkZWxldGVkIHRyZWUgYW5kIGNsZWFuIHVwIGZpYmVyIGZpZWxkcy5cbiAgICAgIC8vIFRoaXMgaXMgbW9yZSBhZ2dyZXNzaXZlIHRoYW4gaWRlYWwsIGFuZCB0aGUgbG9uZyB0ZXJtIGdvYWwgaXMgdG8gb25seVxuICAgICAgLy8gaGF2ZSB0byBkZXRhY2ggdGhlIGRlbGV0ZWQgdHJlZSBhdCB0aGUgcm9vdC5cbiAgICAgIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGZpYmVyKTtcblxuICAgICAgaWYgKGZpYmVyID09PSBkZWxldGVkU3VidHJlZVJvb3QpIHtcbiAgICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSByZXR1cm5GaWJlcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEluc2lkZURlbGV0ZWRUcmVlT25GaWJlcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHN3aXRjaCAoY3VycmVudC50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggY3VycmVudC5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpO1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEsIGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgICAgICAgIHJlY29yZFBhc3NpdmVFZmZlY3REdXJhdGlvbihjdXJyZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxLCBjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59IC8vIFRPRE86IFJldXNlIHJlYXBwZWFyTGF5b3V0RWZmZWN0cyB0cmF2ZXJzYWwgaGVyZT9cblxuXG5mdW5jdGlvbiBpbnZva2VMYXlvdXRFZmZlY3RNb3VudEluREVWKGZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmliZXIpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlUGFzc2l2ZUVmZmVjdE1vdW50SW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaWJlcik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VMYXlvdXRFZmZlY3RVbm1vdW50SW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChmaWJlciwgZmliZXIucmV0dXJuLCBpbnN0YW5jZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlUGFzc2l2ZUVmZmVjdFVubW91bnRJbkRFVihmaWJlcikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIENPTVBPTkVOVF9UWVBFID0gMDtcbnZhciBIQVNfUFNFVURPX0NMQVNTX1RZUEUgPSAxO1xudmFyIFJPTEVfVFlQRSA9IDI7XG52YXIgVEVTVF9OQU1FX1RZUEUgPSAzO1xudmFyIFRFWFRfVFlQRSA9IDQ7XG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3IpIHtcbiAgdmFyIHN5bWJvbEZvciA9IFN5bWJvbC5mb3I7XG4gIENPTVBPTkVOVF9UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci5jb21wb25lbnQnKTtcbiAgSEFTX1BTRVVET19DTEFTU19UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci5oYXNfcHNldWRvX2NsYXNzJyk7XG4gIFJPTEVfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3Iucm9sZScpO1xuICBURVNUX05BTUVfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3IudGVzdF9pZCcpO1xuICBURVhUX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLnRleHQnKTtcbn1cbnZhciBjb21taXRIb29rcyA9IFtdO1xuZnVuY3Rpb24gb25Db21taXRSb290JDEoKSB7XG4gIHtcbiAgICBjb21taXRIb29rcy5mb3JFYWNoKGZ1bmN0aW9uIChjb21taXRIb29rKSB7XG4gICAgICByZXR1cm4gY29tbWl0SG9vaygpO1xuICAgIH0pO1xuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRBY3RRdWV1ZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEFjdFF1ZXVlO1xuZnVuY3Rpb24gaXNMZWdhY3lBY3RFbnZpcm9ubWVudChmaWJlcikge1xuICB7XG4gICAgLy8gTGVnYWN5IG1vZGUuIFdlIHByZXNlcnZlIHRoZSBiZWhhdmlvciBvZiBSZWFjdCAxNydzIGFjdC4gSXQgYXNzdW1lcyBhblxuICAgIC8vIGFjdCBlbnZpcm9ubWVudCB3aGVuZXZlciBgamVzdGAgaXMgZGVmaW5lZCwgYnV0IHlvdSBjYW4gc3RpbGwgdHVybiBvZmZcbiAgICAvLyBzcHVyaW91cyB3YXJuaW5ncyBieSBzZXR0aW5nIElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCBleHBsaWNpdGx5XG4gICAgLy8gdG8gZmFsc2UuXG4gICAgdmFyIGlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbCA9IC8vICRGbG93RXhwZWN0ZWRFcnJvciDigJMgRmxvdyBkb2Vzbid0IGtub3cgYWJvdXQgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIGdsb2JhbFxuICAgIHR5cGVvZiBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgIT09ICd1bmRlZmluZWQnID8gSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIDogdW5kZWZpbmVkOyAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgLSBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCBqZXN0XG5cbiAgICB2YXIgamVzdElzRGVmaW5lZCA9IHR5cGVvZiBqZXN0ICE9PSAndW5kZWZpbmVkJztcbiAgICByZXR1cm4gIGplc3RJc0RlZmluZWQgJiYgaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsICE9PSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50QWN0RW52aXJvbm1lbnQoKSB7XG4gIHtcbiAgICB2YXIgaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsID0gLy8gJEZsb3dFeHBlY3RlZEVycm9yIOKAkyBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgZ2xvYmFsXG4gICAgdHlwZW9mIElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCAhPT0gJ3VuZGVmaW5lZCcgPyBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbCAmJiBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUT0RPOiBJbmNsdWRlIGxpbmsgdG8gcmVsZXZhbnQgZG9jdW1lbnRhdGlvbiBwYWdlLlxuICAgICAgZXJyb3IoJ1RoZSBjdXJyZW50IHRlc3RpbmcgZW52aXJvbm1lbnQgaXMgbm90IGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCAnICsgJ2FjdCguLi4pJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbDtcbiAgfVxufVxuXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICAgIFJlYWN0Q3VycmVudE93bmVyJDIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcixcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsXG4gICAgUmVhY3RDdXJyZW50QWN0UXVldWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEFjdFF1ZXVlO1xudmFyIE5vQ29udGV4dCA9XG4vKiAgICAgICAgICAgICAqL1xuMDtcbnZhciBCYXRjaGVkQ29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICovXG4xO1xudmFyIFJlbmRlckNvbnRleHQgPVxuLyogICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgQ29tbWl0Q29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICAqL1xuNDtcbnZhciBSb290SW5Qcm9ncmVzcyA9IDA7XG52YXIgUm9vdEZhdGFsRXJyb3JlZCA9IDE7XG52YXIgUm9vdEVycm9yZWQgPSAyO1xudmFyIFJvb3RTdXNwZW5kZWQgPSAzO1xudmFyIFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkgPSA0O1xudmFyIFJvb3RDb21wbGV0ZWQgPSA1O1xudmFyIFJvb3REaWROb3RDb21wbGV0ZSA9IDY7IC8vIERlc2NyaWJlcyB3aGVyZSB3ZSBhcmUgaW4gdGhlIFJlYWN0IGV4ZWN1dGlvbiBzdGFja1xuXG52YXIgZXhlY3V0aW9uQ29udGV4dCA9IE5vQ29udGV4dDsgLy8gVGhlIHJvb3Qgd2UncmUgd29ya2luZyBvblxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDsgLy8gVGhlIGZpYmVyIHdlJ3JlIHdvcmtpbmcgb25cblxudmFyIHdvcmtJblByb2dyZXNzID0gbnVsbDsgLy8gVGhlIGxhbmVzIHdlJ3JlIHJlbmRlcmluZ1xuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzOyAvLyBTdGFjayB0aGF0IGFsbG93cyBjb21wb25lbnRzIHRvIGNoYW5nZSB0aGUgcmVuZGVyIGxhbmVzIGZvciBpdHMgc3VidHJlZVxuLy8gVGhpcyBpcyBhIHN1cGVyc2V0IG9mIHRoZSBsYW5lcyB3ZSBzdGFydGVkIHdvcmtpbmcgb24gYXQgdGhlIHJvb3QuIFRoZSBvbmx5XG4vLyBjYXNlIHdoZXJlIGl0J3MgZGlmZmVyZW50IGZyb20gYHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzYCBpcyB3aGVuIHdlXG4vLyBlbnRlciBhIHN1YnRyZWUgdGhhdCBpcyBoaWRkZW4gYW5kIG5lZWRzIHRvIGJlIHVuaGlkZGVuOiBTdXNwZW5zZSBhbmRcbi8vIE9mZnNjcmVlbiBjb21wb25lbnQuXG4vL1xuLy8gTW9zdCB0aGluZ3MgaW4gdGhlIHdvcmsgbG9vcCBzaG91bGQgZGVhbCB3aXRoIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzLlxuLy8gTW9zdCB0aGluZ3MgaW4gYmVnaW4vY29tcGxldGUgcGhhc2VzIHNob3VsZCBkZWFsIHdpdGggc3VidHJlZVJlbmRlckxhbmVzLlxuXG52YXIgc3VidHJlZVJlbmRlckxhbmVzID0gTm9MYW5lcztcbnZhciBzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IgPSBjcmVhdGVDdXJzb3IoTm9MYW5lcyk7IC8vIFdoZXRoZXIgdG8gcm9vdCBjb21wbGV0ZWQsIGVycm9yZWQsIHN1c3BlbmRlZCwgZXRjLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RJblByb2dyZXNzOyAvLyBBIGZhdGFsIGVycm9yLCBpZiBvbmUgaXMgdGhyb3duXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yID0gbnVsbDsgLy8gXCJJbmNsdWRlZFwiIGxhbmVzIHJlZmVyIHRvIGxhbmVzIHRoYXQgd2VyZSB3b3JrZWQgb24gZHVyaW5nIHRoaXMgcmVuZGVyLiBJdCdzXG4vLyBzbGlnaHRseSBkaWZmZXJlbnQgdGhhbiBgcmVuZGVyTGFuZXNgIGJlY2F1c2UgYHJlbmRlckxhbmVzYCBjYW4gY2hhbmdlIGFzIHlvdVxuLy8gZW50ZXIgYW5kIGV4aXQgYW4gT2Zmc2NyZWVuIHRyZWUuIFRoaXMgdmFsdWUgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGFsbCByZW5kZXJcbi8vIGxhbmVzIGZvciB0aGUgZW50aXJlIHJlbmRlciBwaGFzZS5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMgPSBOb0xhbmVzOyAvLyBUaGUgd29yayBsZWZ0IG92ZXIgYnkgY29tcG9uZW50cyB0aGF0IHdlcmUgdmlzaXRlZCBkdXJpbmcgdGhpcyByZW5kZXIuIE9ubHlcbi8vIGluY2x1ZGVzIHVucHJvY2Vzc2VkIHVwZGF0ZXMsIG5vdCB3b3JrIGluIGJhaWxlZCBvdXQgY2hpbGRyZW4uXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgPSBOb0xhbmVzOyAvLyBMYW5lcyB0aGF0IHdlcmUgdXBkYXRlZCAoaW4gYW4gaW50ZXJsZWF2ZWQgZXZlbnQpIGR1cmluZyB0aGlzIHJlbmRlci5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID0gTm9MYW5lczsgLy8gTGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UgKCpub3QqIGFuIGludGVybGVhdmVkIGV2ZW50KS5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzID0gTm9MYW5lczsgLy8gRXJyb3JzIHRoYXQgYXJlIHRocm93biBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMgPSBudWxsOyAvLyBUaGVzZSBhcmUgZXJyb3JzIHRoYXQgd2UgcmVjb3ZlcmVkIGZyb20gd2l0aG91dCBzdXJmYWNpbmcgdGhlbSB0byB0aGUgVUkuXG4vLyBXZSB3aWxsIGxvZyB0aGVtIG9uY2UgdGhlIHRyZWUgY29tbWl0cy5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gbnVsbDsgLy8gVGhlIG1vc3QgcmVjZW50IHRpbWUgd2UgY29tbWl0dGVkIGEgZmFsbGJhY2suIFRoaXMgbGV0cyB1cyBlbnN1cmUgYSB0cmFpblxuLy8gbW9kZWwgd2hlcmUgd2UgZG9uJ3QgY29tbWl0IG5ldyBsb2FkaW5nIHN0YXRlcyBpbiB0b28gcXVpY2sgc3VjY2Vzc2lvbi5cblxudmFyIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPSAwO1xudmFyIEZBTExCQUNLX1RIUk9UVExFX01TID0gNTAwOyAvLyBUaGUgYWJzb2x1dGUgdGltZSBmb3Igd2hlbiB3ZSBzaG91bGQgc3RhcnQgZ2l2aW5nIHVwIG9uIHJlbmRlcmluZ1xuLy8gbW9yZSBhbmQgcHJlZmVyIENQVSBzdXNwZW5zZSBoZXVyaXN0aWNzIGluc3RlYWQuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lID0gSW5maW5pdHk7IC8vIEhvdyBsb25nIGEgcmVuZGVyIGlzIHN1cHBvc2VkIHRvIHRha2UgYmVmb3JlIHdlIHN0YXJ0IGZvbGxvd2luZyBDUFVcbi8vIHN1c3BlbnNlIGhldXJpc3RpY3MgYW5kIG9wdCBvdXQgb2YgcmVuZGVyaW5nIG1vcmUgY29udGVudC5cblxudmFyIFJFTkRFUl9USU1FT1VUX01TID0gNTAwO1xudmFyIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMgPSBudWxsO1xuXG5mdW5jdGlvbiByZXNldFJlbmRlclRpbWVyKCkge1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lID0gbm93KCkgKyBSRU5ERVJfVElNRU9VVF9NUztcbn1cblxuZnVuY3Rpb24gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpIHtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWU7XG59XG52YXIgaGFzVW5jYXVnaHRFcnJvciA9IGZhbHNlO1xudmFyIGZpcnN0VW5jYXVnaHRFcnJvciA9IG51bGw7XG52YXIgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsOyAvLyBPbmx5IHVzZWQgd2hlbiBlbmFibGVQcm9maWxlck5lc3RlZFVwZGF0ZVNjaGVkdWxlZEhvb2sgaXMgdHJ1ZTtcbnZhciByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xudmFyIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gbnVsbDtcbnZhciBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IE5vTGFuZXM7XG52YXIgcGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdHMgPSBbXTtcbnZhciBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gbnVsbDsgLy8gVXNlIHRoZXNlIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcCBvZiBuZXN0ZWQgdXBkYXRlc1xuXG52YXIgTkVTVEVEX1VQREFURV9MSU1JVCA9IDUwO1xudmFyIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDtcbnZhciByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSBudWxsO1xudmFyIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xudmFyIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbnZhciBORVNURURfUEFTU0lWRV9VUERBVEVfTElNSVQgPSA1MDtcbnZhciBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xudmFyIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsOyAvLyBJZiB0d28gdXBkYXRlcyBhcmUgc2NoZWR1bGVkIHdpdGhpbiB0aGUgc2FtZSBldmVudCwgd2Ugc2hvdWxkIHRyZWF0IHRoZWlyXG4vLyBldmVudCB0aW1lcyBhcyBzaW11bHRhbmVvdXMsIGV2ZW4gaWYgdGhlIGFjdHVhbCBjbG9jayB0aW1lIGhhcyBhZHZhbmNlZFxuLy8gYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHNlY29uZCBjYWxsLlxuXG52YXIgY3VycmVudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xudmFyIGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lID0gTm9MYW5lcztcbnZhciBpc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QgPSBmYWxzZTtcbmZ1bmN0aW9uIGdldFdvcmtJblByb2dyZXNzUm9vdCgpIHtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdDtcbn1cbmZ1bmN0aW9uIHJlcXVlc3RFdmVudFRpbWUoKSB7XG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICAvLyBXZSdyZSBpbnNpZGUgUmVhY3QsIHNvIGl0J3MgZmluZSB0byByZWFkIHRoZSBhY3R1YWwgdGltZS5cbiAgICByZXR1cm4gbm93KCk7XG4gIH0gLy8gV2UncmUgbm90IGluc2lkZSBSZWFjdCwgc28gd2UgbWF5IGJlIGluIHRoZSBtaWRkbGUgb2YgYSBicm93c2VyIGV2ZW50LlxuXG5cbiAgaWYgKGN1cnJlbnRFdmVudFRpbWUgIT09IE5vVGltZXN0YW1wKSB7XG4gICAgLy8gVXNlIHRoZSBzYW1lIHN0YXJ0IHRpbWUgZm9yIGFsbCB1cGRhdGVzIHVudGlsIHdlIGVudGVyIFJlYWN0IGFnYWluLlxuICAgIHJldHVybiBjdXJyZW50RXZlbnRUaW1lO1xuICB9IC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZSBzaW5jZSBSZWFjdCB5aWVsZGVkLiBDb21wdXRlIGEgbmV3IHN0YXJ0IHRpbWUuXG5cblxuICBjdXJyZW50RXZlbnRUaW1lID0gbm93KCk7XG4gIHJldHVybiBjdXJyZW50RXZlbnRUaW1lO1xufVxuZnVuY3Rpb24gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpIHtcbiAgLy8gU3BlY2lhbCBjYXNlc1xuICB2YXIgbW9kZSA9IGZpYmVyLm1vZGU7XG5cbiAgaWYgKChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICByZXR1cm4gU3luY0xhbmU7XG4gIH0gZWxzZSBpZiAoIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCAmJiB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIC8vIFRoaXMgaXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlLiBUaGVzZSBhcmUgbm90IG9mZmljaWFsbHkgc3VwcG9ydGVkLiBUaGVcbiAgICAvLyBvbGQgYmVoYXZpb3IgaXMgdG8gZ2l2ZSB0aGlzIHRoZSBzYW1lIFwidGhyZWFkXCIgKGxhbmVzKSBhc1xuICAgIC8vIHdoYXRldmVyIGlzIGN1cnJlbnRseSByZW5kZXJpbmcuIFNvIGlmIHlvdSBjYWxsIGBzZXRTdGF0ZWAgb24gYSBjb21wb25lbnRcbiAgICAvLyB0aGF0IGhhcHBlbnMgbGF0ZXIgaW4gdGhlIHNhbWUgcmVuZGVyLCBpdCB3aWxsIGZsdXNoLiBJZGVhbGx5LCB3ZSB3YW50IHRvXG4gICAgLy8gcmVtb3ZlIHRoZSBzcGVjaWFsIGNhc2UgYW5kIHRyZWF0IHRoZW0gYXMgaWYgdGhleSBjYW1lIGZyb20gYW5cbiAgICAvLyBpbnRlcmxlYXZlZCBldmVudC4gUmVnYXJkbGVzcywgdGhpcyBwYXR0ZXJuIGlzIG5vdCBvZmZpY2lhbGx5IHN1cHBvcnRlZC5cbiAgICAvLyBUaGlzIGJlaGF2aW9yIGlzIG9ubHkgYSBmYWxsYmFjay4gVGhlIGZsYWcgb25seSBleGlzdHMgdW50aWwgd2UgY2FuIHJvbGxcbiAgICAvLyBvdXQgdGhlIHNldFN0YXRlIHdhcm5pbmcsIHNpbmNlIGV4aXN0aW5nIGNvZGUgbWlnaHQgYWNjaWRlbnRhbGx5IHJlbHkgb25cbiAgICAvLyB0aGUgY3VycmVudCBiZWhhdmlvci5cbiAgICByZXR1cm4gcGlja0FyYml0cmFyeUxhbmUod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgdmFyIGlzVHJhbnNpdGlvbiA9IHJlcXVlc3RDdXJyZW50VHJhbnNpdGlvbigpICE9PSBOb1RyYW5zaXRpb247XG5cbiAgaWYgKGlzVHJhbnNpdGlvbikge1xuICAgIGlmICggUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uICE9PSBudWxsKSB7XG4gICAgICB2YXIgdHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcblxuICAgICAgaWYgKCF0cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzKSB7XG4gICAgICAgIHRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMgPSBuZXcgU2V0KCk7XG4gICAgICB9XG5cbiAgICAgIHRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuYWRkKGZpYmVyKTtcbiAgICB9IC8vIFRoZSBhbGdvcml0aG0gZm9yIGFzc2lnbmluZyBhbiB1cGRhdGUgdG8gYSBsYW5lIHNob3VsZCBiZSBzdGFibGUgZm9yIGFsbFxuICAgIC8vIHVwZGF0ZXMgYXQgdGhlIHNhbWUgcHJpb3JpdHkgd2l0aGluIHRoZSBzYW1lIGV2ZW50LiBUbyBkbyB0aGlzLCB0aGVcbiAgICAvLyBpbnB1dHMgdG8gdGhlIGFsZ29yaXRobSBtdXN0IGJlIHRoZSBzYW1lLlxuICAgIC8vXG4gICAgLy8gVGhlIHRyaWNrIHdlIHVzZSBpcyB0byBjYWNoZSB0aGUgZmlyc3Qgb2YgZWFjaCBvZiB0aGVzZSBpbnB1dHMgd2l0aGluIGFuXG4gICAgLy8gZXZlbnQuIFRoZW4gcmVzZXQgdGhlIGNhY2hlZCB2YWx1ZXMgb25jZSB3ZSBjYW4gYmUgc3VyZSB0aGUgZXZlbnQgaXNcbiAgICAvLyBvdmVyLiBPdXIgaGV1cmlzdGljIGZvciB0aGF0IGlzIHdoZW5ldmVyIHdlIGVudGVyIGEgY29uY3VycmVudCB3b3JrIGxvb3AuXG5cblxuICAgIGlmIChjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgICAvLyBBbGwgdHJhbnNpdGlvbnMgd2l0aGluIHRoZSBzYW1lIGV2ZW50IGFyZSBhc3NpZ25lZCB0aGUgc2FtZSBsYW5lLlxuICAgICAgY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPSBjbGFpbU5leHRUcmFuc2l0aW9uTGFuZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZTtcbiAgfSAvLyBVcGRhdGVzIG9yaWdpbmF0aW5nIGluc2lkZSBjZXJ0YWluIFJlYWN0IG1ldGhvZHMsIGxpa2UgZmx1c2hTeW5jLCBoYXZlXG4gIC8vIHRoZWlyIHByaW9yaXR5IHNldCBieSB0cmFja2luZyBpdCB3aXRoIGEgY29udGV4dCB2YXJpYWJsZS5cbiAgLy9cbiAgLy8gVGhlIG9wYXF1ZSB0eXBlIHJldHVybmVkIGJ5IHRoZSBob3N0IGNvbmZpZyBpcyBpbnRlcm5hbGx5IGEgbGFuZSwgc28gd2UgY2FuXG4gIC8vIHVzZSB0aGF0IGRpcmVjdGx5LlxuICAvLyBUT0RPOiBNb3ZlIHRoaXMgdHlwZSBjb252ZXJzaW9uIHRvIHRoZSBldmVudCBwcmlvcml0eSBtb2R1bGUuXG5cblxuICB2YXIgdXBkYXRlTGFuZSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuXG4gIGlmICh1cGRhdGVMYW5lICE9PSBOb0xhbmUpIHtcbiAgICByZXR1cm4gdXBkYXRlTGFuZTtcbiAgfSAvLyBUaGlzIHVwZGF0ZSBvcmlnaW5hdGVkIG91dHNpZGUgUmVhY3QuIEFzayB0aGUgaG9zdCBlbnZpcm9ubWVudCBmb3IgYW5cbiAgLy8gYXBwcm9wcmlhdGUgcHJpb3JpdHksIGJhc2VkIG9uIHRoZSB0eXBlIG9mIGV2ZW50LlxuICAvL1xuICAvLyBUaGUgb3BhcXVlIHR5cGUgcmV0dXJuZWQgYnkgdGhlIGhvc3QgY29uZmlnIGlzIGludGVybmFsbHkgYSBsYW5lLCBzbyB3ZSBjYW5cbiAgLy8gdXNlIHRoYXQgZGlyZWN0bHkuXG4gIC8vIFRPRE86IE1vdmUgdGhpcyB0eXBlIGNvbnZlcnNpb24gdG8gdGhlIGV2ZW50IHByaW9yaXR5IG1vZHVsZS5cblxuXG4gIHZhciBldmVudExhbmUgPSBnZXRDdXJyZW50RXZlbnRQcmlvcml0eSgpO1xuICByZXR1cm4gZXZlbnRMYW5lO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0UmV0cnlMYW5lKGZpYmVyKSB7XG4gIC8vIFRoaXMgaXMgYSBmb3JrIG9mIGByZXF1ZXN0VXBkYXRlTGFuZWAgZGVzaWduZWQgc3BlY2lmaWNhbGx5IGZvciBTdXNwZW5zZVxuICAvLyBcInJldHJpZXNcIiDigJQgYSBzcGVjaWFsIHVwZGF0ZSB0aGF0IGF0dGVtcHRzIHRvIGZsaXAgYSBTdXNwZW5zZSBib3VuZGFyeVxuICAvLyBmcm9tIGl0cyBwbGFjZWhvbGRlciBzdGF0ZSB0byBpdHMgcHJpbWFyeS9yZXNvbHZlZCBzdGF0ZS5cbiAgLy8gU3BlY2lhbCBjYXNlc1xuICB2YXIgbW9kZSA9IGZpYmVyLm1vZGU7XG5cbiAgaWYgKChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICByZXR1cm4gU3luY0xhbmU7XG4gIH1cblxuICByZXR1cm4gY2xhaW1OZXh0UmV0cnlMYW5lKCk7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKSB7XG4gIGNoZWNrRm9yTmVzdGVkVXBkYXRlcygpO1xuXG4gIHtcbiAgICBpZiAoaXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KSB7XG4gICAgICBlcnJvcigndXNlSW5zZXJ0aW9uRWZmZWN0IG11c3Qgbm90IHNjaGVkdWxlIHVwZGF0ZXMuJyk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChpc0ZsdXNoaW5nUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgIH1cbiAgfSAvLyBNYXJrIHRoYXQgdGhlIHJvb3QgaGFzIGEgcGVuZGluZyB1cGRhdGUuXG5cblxuICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgbGFuZSwgZXZlbnRUaW1lKTtcblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9MYW5lcyAmJiByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAvLyBUaGlzIHVwZGF0ZSB3YXMgZGlzcGF0Y2hlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS4gVGhpcyBpcyBhIG1pc3Rha2VcbiAgICAvLyBpZiB0aGUgdXBkYXRlIG9yaWdpbmF0ZXMgZnJvbSB1c2VyIHNwYWNlICh3aXRoIHRoZSBleGNlcHRpb24gb2YgbG9jYWxcbiAgICAvLyBob29rIHVwZGF0ZXMsIHdoaWNoIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5IGFuZCBkb24ndCByZWFjaCB0aGlzXG4gICAgLy8gZnVuY3Rpb24pLCBidXQgdGhlcmUgYXJlIHNvbWUgaW50ZXJuYWwgUmVhY3QgZmVhdHVyZXMgdGhhdCB1c2UgdGhpcyBhc1xuICAgIC8vIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgbGlrZSBzZWxlY3RpdmUgaHlkcmF0aW9uLlxuICAgIHdhcm5BYm91dFJlbmRlclBoYXNlVXBkYXRlc0luREVWKGZpYmVyKTsgLy8gVHJhY2sgbGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2VcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGEgbm9ybWFsIHVwZGF0ZSwgc2NoZWR1bGVkIGZyb20gb3V0c2lkZSB0aGUgcmVuZGVyIHBoYXNlLiBGb3JcbiAgICAvLyBleGFtcGxlLCBkdXJpbmcgYW4gaW5wdXQgZXZlbnQuXG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBmaWJlciwgbGFuZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2FybklmVXBkYXRlc05vdFdyYXBwZWRXaXRoQWN0REVWKGZpYmVyKTtcblxuICAgIGlmIChyb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAgIC8vIFJlY2VpdmVkIGFuIHVwZGF0ZSB0byBhIHRyZWUgdGhhdCdzIGluIHRoZSBtaWRkbGUgb2YgcmVuZGVyaW5nLiBNYXJrXG4gICAgICAvLyB0aGF0IHRoZXJlIHdhcyBhbiBpbnRlcmxlYXZlZCB1cGRhdGUgd29yayBvbiB0aGlzIHJvb3QuIFVubGVzcyB0aGVcbiAgICAgIC8vIGBkZWZlclJlbmRlclBoYXNlVXBkYXRlVG9OZXh0QmF0Y2hgIGZsYWcgaXMgb2ZmIGFuZCB0aGlzIGlzIGEgcmVuZGVyXG4gICAgICAvLyBwaGFzZSB1cGRhdGUuIEluIHRoYXQgY2FzZSwgd2UgZG9uJ3QgdHJlYXQgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgYXMgaWZcbiAgICAgIC8vIHRoZXkgd2VyZSBpbnRlcmxlYXZlZCwgZm9yIGJhY2t3YXJkcyBjb21wYXQgcmVhc29ucy5cbiAgICAgIGlmICggKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcywgbGFuZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkV2l0aERlbGF5KSB7XG4gICAgICAgIC8vIFRoZSByb290IGFscmVhZHkgc3VzcGVuZGVkIHdpdGggYSBkZWxheSwgd2hpY2ggbWVhbnMgdGhpcyByZW5kZXJcbiAgICAgICAgLy8gZGVmaW5pdGVseSB3b24ndCBmaW5pc2guIFNpbmNlIHdlIGhhdmUgYSBuZXcgdXBkYXRlLCBsZXQncyBtYXJrIGl0IGFzXG4gICAgICAgIC8vIHN1c3BlbmRlZCBub3csIHJpZ2h0IGJlZm9yZSBtYXJraW5nIHRoZSBpbmNvbWluZyB1cGRhdGUuIFRoaXMgaGFzIHRoZVxuICAgICAgICAvLyBlZmZlY3Qgb2YgaW50ZXJydXB0aW5nIHRoZSBjdXJyZW50IHJlbmRlciBhbmQgc3dpdGNoaW5nIHRvIHRoZSB1cGRhdGUuXG4gICAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3Qgb3ZlcnJpZGUgcGluZ3MgdGhhdCBoYXBwZW4gd2hpbGUgd2UndmVcbiAgICAgICAgLy8gYWxyZWFkeSBzdGFydGVkIHJlbmRlcmluZy5cbiAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG5cbiAgICBpZiAobGFuZSA9PT0gU3luY0xhbmUgJiYgZXhlY3V0aW9uQ29udGV4dCA9PT0gTm9Db250ZXh0ICYmIChmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUgJiYgLy8gVHJlYXQgYGFjdGAgYXMgaWYgaXQncyBpbnNpZGUgYGJhdGNoZWRVcGRhdGVzYCwgZXZlbiBpbiBsZWdhY3kgbW9kZS5cbiAgICAhKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmlzQmF0Y2hpbmdMZWdhY3kpKSB7XG4gICAgICAvLyBGbHVzaCB0aGUgc3luY2hyb25vdXMgd29yayBub3csIHVubGVzcyB3ZSdyZSBhbHJlYWR5IHdvcmtpbmcgb3IgaW5zaWRlXG4gICAgICAvLyBhIGJhdGNoLiBUaGlzIGlzIGludGVudGlvbmFsbHkgaW5zaWRlIHNjaGVkdWxlVXBkYXRlT25GaWJlciBpbnN0ZWFkIG9mXG4gICAgICAvLyBzY2hlZHVsZUNhbGxiYWNrRm9yRmliZXIgdG8gcHJlc2VydmUgdGhlIGFiaWxpdHkgdG8gc2NoZWR1bGUgYSBjYWxsYmFja1xuICAgICAgLy8gd2l0aG91dCBpbW1lZGlhdGVseSBmbHVzaGluZyBpdC4gV2Ugb25seSBkbyB0aGlzIGZvciB1c2VyLWluaXRpYXRlZFxuICAgICAgLy8gdXBkYXRlcywgdG8gcHJlc2VydmUgaGlzdG9yaWNhbCBiZWhhdmlvciBvZiBsZWdhY3kgbW9kZS5cbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrc09ubHlJbkxlZ2FjeU1vZGUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNjaGVkdWxlSW5pdGlhbEh5ZHJhdGlvbk9uUm9vdChyb290LCBsYW5lLCBldmVudFRpbWUpIHtcbiAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgZm9yayBvZiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIgdGhhdCBpcyBvbmx5IHVzZWQgdG9cbiAgLy8gc2NoZWR1bGUgdGhlIGluaXRpYWwgaHlkcmF0aW9uIG9mIGEgcm9vdCB0aGF0IGhhcyBqdXN0IGJlZW4gY3JlYXRlZC4gTW9zdFxuICAvLyBvZiB0aGUgc3R1ZmYgaW4gc2NoZWR1bGVVcGRhdGVPbkZpYmVyIGNhbiBiZSBza2lwcGVkLlxuICAvL1xuICAvLyBUaGUgbWFpbiByZWFzb24gZm9yIHRoaXMgc2VwYXJhdGUgcGF0aCwgdGhvdWdoLCBpcyB0byBkaXN0aW5ndWlzaCB0aGVcbiAgLy8gaW5pdGlhbCBjaGlsZHJlbiBmcm9tIHN1YnNlcXVlbnQgdXBkYXRlcy4gSW4gZnVsbHkgY2xpZW50LXJlbmRlcmVkIHJvb3RzXG4gIC8vIChjcmVhdGVSb290IGluc3RlYWQgb2YgaHlkcmF0ZVJvb3QpLCBhbGwgdG9wLWxldmVsIHJlbmRlcnMgYXJlIG1vZGVsZWQgYXNcbiAgLy8gdXBkYXRlcywgYnV0IGh5ZHJhdGlvbiByb290cyBhcmUgc3BlY2lhbCBiZWNhdXNlIHRoZSBpbml0aWFsIHJlbmRlciBtdXN0XG4gIC8vIG1hdGNoIHdoYXQgd2FzIHJlbmRlcmVkIG9uIHRoZSBzZXJ2ZXIuXG4gIHZhciBjdXJyZW50ID0gcm9vdC5jdXJyZW50O1xuICBjdXJyZW50LmxhbmVzID0gbGFuZTtcbiAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIGxhbmUsIGV2ZW50VGltZSk7XG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xufVxuZnVuY3Rpb24gaXNVbnNhZmVDbGFzc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSB7XG4gIC8vIENoZWNrIGlmIHRoaXMgaXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlLiBPbmx5IGNhbGxlZCBieSBjbGFzcyBjb21wb25lbnRzLFxuICAvLyB3aGljaCBzcGVjaWFsIChkZXByZWNhdGVkKSBiZWhhdmlvciBmb3IgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlIHByb3BzLlxuICByZXR1cm4gKC8vIFRPRE86IFJlbW92ZSBvdXRkYXRlZCBkZWZlclJlbmRlclBoYXNlVXBkYXRlVG9OZXh0QmF0Y2ggZXhwZXJpbWVudC4gV2VcbiAgICAvLyBkZWNpZGVkIG5vdCB0byBlbmFibGUgaXQuXG4gICAgIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dFxuICApO1xufSAvLyBVc2UgdGhpcyBmdW5jdGlvbiB0byBzY2hlZHVsZSBhIHRhc2sgZm9yIGEgcm9vdC4gVGhlcmUncyBvbmx5IG9uZSB0YXNrIHBlclxuLy8gcm9vdDsgaWYgYSB0YXNrIHdhcyBhbHJlYWR5IHNjaGVkdWxlZCwgd2UnbGwgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBwcmlvcml0eVxuLy8gb2YgdGhlIGV4aXN0aW5nIHRhc2sgaXMgdGhlIHNhbWUgYXMgdGhlIHByaW9yaXR5IG9mIHRoZSBuZXh0IGxldmVsIHRoYXQgdGhlXG4vLyByb290IGhhcyB3b3JrIG9uLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBldmVyeSB1cGRhdGUsIGFuZCByaWdodCBiZWZvcmVcbi8vIGV4aXRpbmcgYSB0YXNrLlxuXG5mdW5jdGlvbiBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgY3VycmVudFRpbWUpIHtcbiAgdmFyIGV4aXN0aW5nQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7IC8vIENoZWNrIGlmIGFueSBsYW5lcyBhcmUgYmVpbmcgc3RhcnZlZCBieSBvdGhlciB3b3JrLiBJZiBzbywgbWFyayB0aGVtIGFzXG4gIC8vIGV4cGlyZWQgc28gd2Uga25vdyB0byB3b3JrIG9uIHRob3NlIG5leHQuXG5cbiAgbWFya1N0YXJ2ZWRMYW5lc0FzRXhwaXJlZChyb290LCBjdXJyZW50VGltZSk7IC8vIERldGVybWluZSB0aGUgbmV4dCBsYW5lcyB0byB3b3JrIG9uLCBhbmQgdGhlaXIgcHJpb3JpdHkuXG5cbiAgdmFyIG5leHRMYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA6IE5vTGFuZXMpO1xuXG4gIGlmIChuZXh0TGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IFRoZXJlJ3Mgbm90aGluZyB0byB3b3JrIG9uLlxuICAgIGlmIChleGlzdGluZ0NhbGxiYWNrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQ2FsbGJhY2skMShleGlzdGluZ0NhbGxiYWNrTm9kZSk7XG4gICAgfVxuXG4gICAgcm9vdC5jYWxsYmFja05vZGUgPSBudWxsO1xuICAgIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZTtcbiAgICByZXR1cm47XG4gIH0gLy8gV2UgdXNlIHRoZSBoaWdoZXN0IHByaW9yaXR5IGxhbmUgdG8gcmVwcmVzZW50IHRoZSBwcmlvcml0eSBvZiB0aGUgY2FsbGJhY2suXG5cblxuICB2YXIgbmV3Q2FsbGJhY2tQcmlvcml0eSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobmV4dExhbmVzKTsgLy8gQ2hlY2sgaWYgdGhlcmUncyBhbiBleGlzdGluZyB0YXNrLiBXZSBtYXkgYmUgYWJsZSB0byByZXVzZSBpdC5cblxuICB2YXIgZXhpc3RpbmdDYWxsYmFja1ByaW9yaXR5ID0gcm9vdC5jYWxsYmFja1ByaW9yaXR5O1xuXG4gIGlmIChleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgPT09IG5ld0NhbGxiYWNrUHJpb3JpdHkgJiYgLy8gU3BlY2lhbCBjYXNlIHJlbGF0ZWQgdG8gYGFjdGAuIElmIHRoZSBjdXJyZW50bHkgc2NoZWR1bGVkIHRhc2sgaXMgYVxuICAvLyBTY2hlZHVsZXIgdGFzaywgcmF0aGVyIHRoYW4gYW4gYGFjdGAgdGFzaywgY2FuY2VsIGl0IGFuZCByZS1zY2hlZHVsZWRcbiAgLy8gb24gdGhlIGBhY3RgIHF1ZXVlLlxuICAhKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgIT09IG51bGwgJiYgZXhpc3RpbmdDYWxsYmFja05vZGUgIT09IGZha2VBY3RDYWxsYmFja05vZGUpKSB7XG4gICAge1xuICAgICAgLy8gSWYgd2UncmUgZ29pbmcgdG8gcmUtdXNlIGFuIGV4aXN0aW5nIHRhc2ssIGl0IG5lZWRzIHRvIGV4aXN0LlxuICAgICAgLy8gQXNzdW1lIHRoYXQgZGlzY3JldGUgdXBkYXRlIG1pY3JvdGFza3MgYXJlIG5vbi1jYW5jZWxsYWJsZSBhbmQgbnVsbC5cbiAgICAgIC8vIFRPRE86IFRlbXBvcmFyeSB1bnRpbCB3ZSBjb25maXJtIHRoaXMgd2FybmluZyBpcyBub3QgZmlyZWQuXG4gICAgICBpZiAoZXhpc3RpbmdDYWxsYmFja05vZGUgPT0gbnVsbCAmJiBleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgIT09IFN5bmNMYW5lKSB7XG4gICAgICAgIGVycm9yKCdFeHBlY3RlZCBzY2hlZHVsZWQgY2FsbGJhY2sgdG8gZXhpc3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICB9XG4gICAgfSAvLyBUaGUgcHJpb3JpdHkgaGFzbid0IGNoYW5nZWQuIFdlIGNhbiByZXVzZSB0aGUgZXhpc3RpbmcgdGFzay4gRXhpdC5cblxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tOb2RlICE9IG51bGwpIHtcbiAgICAvLyBDYW5jZWwgdGhlIGV4aXN0aW5nIGNhbGxiYWNrLiBXZSdsbCBzY2hlZHVsZSBhIG5ldyBvbmUgYmVsb3cuXG4gICAgY2FuY2VsQ2FsbGJhY2skMShleGlzdGluZ0NhbGxiYWNrTm9kZSk7XG4gIH0gLy8gU2NoZWR1bGUgYSBuZXcgY2FsbGJhY2suXG5cblxuICB2YXIgbmV3Q2FsbGJhY2tOb2RlO1xuXG4gIGlmIChuZXdDYWxsYmFja1ByaW9yaXR5ID09PSBTeW5jTGFuZSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogU3luYyBSZWFjdCBjYWxsYmFja3MgYXJlIHNjaGVkdWxlZCBvbiBhIHNwZWNpYWxcbiAgICAvLyBpbnRlcm5hbCBxdWV1ZVxuICAgIGlmIChyb290LnRhZyA9PT0gTGVnYWN5Um9vdCkge1xuICAgICAgaWYgKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmlzQmF0Y2hpbmdMZWdhY3kgIT09IG51bGwpIHtcbiAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHNjaGVkdWxlTGVnYWN5U3luY0NhbGxiYWNrKHBlcmZvcm1TeW5jV29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2NoZWR1bGVTeW5jQ2FsbGJhY2socGVyZm9ybVN5bmNXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCkpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIEZsdXNoIHRoZSBxdWV1ZSBpbiBhIG1pY3JvdGFzay5cbiAgICAgIGlmICggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIEluc2lkZSBgYWN0YCwgdXNlIG91ciBpbnRlcm5hbCBgYWN0YCBxdWV1ZSBzbyB0aGF0IHRoZXNlIGdldCBmbHVzaGVkXG4gICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgc2NvcGUgZXZlbiB3aGVuIHVzaW5nIHRoZSBzeW5jIHZlcnNpb25cbiAgICAgICAgLy8gb2YgYGFjdGAuXG4gICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudC5wdXNoKGZsdXNoU3luY0NhbGxiYWNrcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2hlZHVsZU1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gSW4gU2FmYXJpLCBhcHBlbmRpbmcgYW4gaWZyYW1lIGZvcmNlcyBtaWNyb3Rhc2tzIHRvIHJ1bi5cbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIyNDU5XG4gICAgICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBydW5uaW5nIGNhbGxiYWNrcyBpbiB0aGUgbWlkZGxlIG9mIHJlbmRlclxuICAgICAgICAgIC8vIG9yIGNvbW1pdCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGFnYWluc3QgdGhhdC5cbiAgICAgICAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyB3b3VsZCBzdGlsbCBwcmVtYXR1cmVseSBmbHVzaCB0aGUgY2FsbGJhY2tzXG4gICAgICAgICAgICAvLyBpZiB0aGlzIGhhcHBlbnMgb3V0c2lkZSByZW5kZXIgb3IgY29tbWl0IHBoYXNlIChlLmcuIGluIGFuIGV2ZW50KS5cbiAgICAgICAgICAgIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV3Q2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbDtcblxuICAgIHN3aXRjaCAobGFuZXNUb0V2ZW50UHJpb3JpdHkobmV4dExhbmVzKSkge1xuICAgICAgY2FzZSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBJbW1lZGlhdGVQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQ29udGludW91c0V2ZW50UHJpb3JpdHk6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBVc2VyQmxvY2tpbmdQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRGVmYXVsdEV2ZW50UHJpb3JpdHk6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgSWRsZUV2ZW50UHJpb3JpdHk6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBJZGxlUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIG5ld0NhbGxiYWNrTm9kZSA9IHNjaGVkdWxlQ2FsbGJhY2skMShzY2hlZHVsZXJQcmlvcml0eUxldmVsLCBwZXJmb3JtQ29uY3VycmVudFdvcmtPblJvb3QuYmluZChudWxsLCByb290KSk7XG4gIH1cblxuICByb290LmNhbGxiYWNrUHJpb3JpdHkgPSBuZXdDYWxsYmFja1ByaW9yaXR5O1xuICByb290LmNhbGxiYWNrTm9kZSA9IG5ld0NhbGxiYWNrTm9kZTtcbn0gLy8gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIGV2ZXJ5IGNvbmN1cnJlbnQgdGFzaywgaS5lLiBhbnl0aGluZyB0aGF0XG4vLyBnb2VzIHRocm91Z2ggU2NoZWR1bGVyLlxuXG5cbmZ1bmN0aW9uIHBlcmZvcm1Db25jdXJyZW50V29ya09uUm9vdChyb290LCBkaWRUaW1lb3V0KSB7XG4gIHtcbiAgICByZXNldE5lc3RlZFVwZGF0ZUZsYWcoKTtcbiAgfSAvLyBTaW5jZSB3ZSBrbm93IHdlJ3JlIGluIGEgUmVhY3QgZXZlbnQsIHdlIGNhbiBjbGVhciB0aGUgY3VycmVudFxuICAvLyBldmVudCB0aW1lLiBUaGUgbmV4dCB1cGRhdGUgd2lsbCBjb21wdXRlIGEgbmV3IGV2ZW50IHRpbWUuXG5cblxuICBjdXJyZW50RXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG4gIGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lID0gTm9MYW5lcztcblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbm90IGFscmVhZHkgYmUgd29ya2luZy4nKTtcbiAgfSAvLyBGbHVzaCBhbnkgcGVuZGluZyBwYXNzaXZlIGVmZmVjdHMgYmVmb3JlIGRlY2lkaW5nIHdoaWNoIGxhbmVzIHRvIHdvcmsgb24sXG4gIC8vIGluIGNhc2UgdGhleSBzY2hlZHVsZSBhZGRpdGlvbmFsIHdvcmsuXG5cblxuICB2YXIgb3JpZ2luYWxDYWxsYmFja05vZGUgPSByb290LmNhbGxiYWNrTm9kZTtcbiAgdmFyIGRpZEZsdXNoUGFzc2l2ZUVmZmVjdHMgPSBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG5cbiAgaWYgKGRpZEZsdXNoUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAvLyBTb21ldGhpbmcgaW4gdGhlIHBhc3NpdmUgZWZmZWN0IHBoYXNlIG1heSBoYXZlIGNhbmNlbGVkIHRoZSBjdXJyZW50IHRhc2suXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHRhc2sgbm9kZSBmb3IgdGhpcyByb290IHdhcyBjaGFuZ2VkLlxuICAgIGlmIChyb290LmNhbGxiYWNrTm9kZSAhPT0gb3JpZ2luYWxDYWxsYmFja05vZGUpIHtcbiAgICAgIC8vIFRoZSBjdXJyZW50IHRhc2sgd2FzIGNhbmNlbGVkLiBFeGl0LiBXZSBkb24ndCBuZWVkIHRvIGNhbGxcbiAgICAgIC8vIGBlbnN1cmVSb290SXNTY2hlZHVsZWRgIGJlY2F1c2UgdGhlIGNoZWNrIGFib3ZlIGltcGxpZXMgZWl0aGVyIHRoYXRcbiAgICAgIC8vIHRoZXJlJ3MgYSBuZXcgdGFzaywgb3IgdGhhdCB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrIG9uIHRoaXMgcm9vdC5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSAvLyBEZXRlcm1pbmUgdGhlIG5leHQgbGFuZXMgdG8gd29yayBvbiwgdXNpbmcgdGhlIGZpZWxkcyBzdG9yZWRcbiAgLy8gb24gdGhlIHJvb3QuXG5cblxuICB2YXIgbGFuZXMgPSBnZXROZXh0TGFuZXMocm9vdCwgcm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290ID8gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgOiBOb0xhbmVzKTtcblxuICBpZiAobGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBEZWZlbnNpdmUgY29kaW5nLiBUaGlzIGlzIG5ldmVyIGV4cGVjdGVkIHRvIGhhcHBlbi5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBXZSBkaXNhYmxlIHRpbWUtc2xpY2luZyBpbiBzb21lIGNhc2VzOiBpZiB0aGUgd29yayBoYXMgYmVlbiBDUFUtYm91bmRcbiAgLy8gZm9yIHRvbyBsb25nIChcImV4cGlyZWRcIiB3b3JrLCB0byBwcmV2ZW50IHN0YXJ2YXRpb24pLCBvciB3ZSdyZSBpblxuICAvLyBzeW5jLXVwZGF0ZXMtYnktZGVmYXVsdCBtb2RlLlxuICAvLyBUT0RPOiBXZSBvbmx5IGNoZWNrIGBkaWRUaW1lb3V0YCBkZWZlbnNpdmVseSwgdG8gYWNjb3VudCBmb3IgYSBTY2hlZHVsZXJcbiAgLy8gYnVnIHdlJ3JlIHN0aWxsIGludmVzdGlnYXRpbmcuIE9uY2UgdGhlIGJ1ZyBpbiBTY2hlZHVsZXIgaXMgZml4ZWQsXG4gIC8vIHdlIGNhbiByZW1vdmUgdGhpcywgc2luY2Ugd2UgdHJhY2sgZXhwaXJhdGlvbiBvdXJzZWx2ZXMuXG5cblxuICB2YXIgc2hvdWxkVGltZVNsaWNlID0gIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIGxhbmVzKSAmJiAhaW5jbHVkZXNFeHBpcmVkTGFuZShyb290LCBsYW5lcykgJiYgKCAhZGlkVGltZW91dCk7XG4gIHZhciBleGl0U3RhdHVzID0gc2hvdWxkVGltZVNsaWNlID8gcmVuZGVyUm9vdENvbmN1cnJlbnQocm9vdCwgbGFuZXMpIDogcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpO1xuXG4gIGlmIChleGl0U3RhdHVzICE9PSBSb290SW5Qcm9ncmVzcykge1xuICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgICAgLy8gSWYgc29tZXRoaW5nIHRocmV3IGFuIGVycm9yLCB0cnkgcmVuZGVyaW5nIG9uZSBtb3JlIHRpbWUuIFdlJ2xsXG4gICAgICAvLyByZW5kZXIgc3luY2hyb25vdXNseSB0byBibG9jayBjb25jdXJyZW50IGRhdGEgbXV0YXRpb25zLCBhbmQgd2UnbGxcbiAgICAgIC8vIGluY2x1ZGVzIGFsbCBwZW5kaW5nIHVwZGF0ZXMgYXJlIGluY2x1ZGVkLiBJZiBpdCBzdGlsbCBmYWlscyBhZnRlclxuICAgICAgLy8gdGhlIHNlY29uZCBhdHRlbXB0LCB3ZSdsbCBnaXZlIHVwIGFuZCBjb21taXQgdGhlIHJlc3VsdGluZyB0cmVlLlxuICAgICAgdmFyIGVycm9yUmV0cnlMYW5lcyA9IGdldExhbmVzVG9SZXRyeVN5bmNocm9ub3VzbHlPbkVycm9yKHJvb3QpO1xuXG4gICAgICBpZiAoZXJyb3JSZXRyeUxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIGxhbmVzID0gZXJyb3JSZXRyeUxhbmVzO1xuICAgICAgICBleGl0U3RhdHVzID0gcmVjb3ZlckZyb21Db25jdXJyZW50RXJyb3Iocm9vdCwgZXJyb3JSZXRyeUxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEZhdGFsRXJyb3JlZCkge1xuICAgICAgdmFyIGZhdGFsRXJyb3IgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yO1xuICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gICAgICB0aHJvdyBmYXRhbEVycm9yO1xuICAgIH1cblxuICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RGlkTm90Q29tcGxldGUpIHtcbiAgICAgIC8vIFRoZSByZW5kZXIgdW53b3VuZCB3aXRob3V0IGNvbXBsZXRpbmcgdGhlIHRyZWUuIFRoaXMgaGFwcGVucyBpbiBzcGVjaWFsXG4gICAgICAvLyBjYXNlcyB3aGVyZSBuZWVkIHRvIGV4aXQgdGhlIGN1cnJlbnQgcmVuZGVyIHdpdGhvdXQgcHJvZHVjaW5nIGFcbiAgICAgIC8vIGNvbnNpc3RlbnQgdHJlZSBvciBjb21taXR0aW5nLlxuICAgICAgLy9cbiAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGR1cmluZyBhIGNvbmN1cnJlbnQgcmVuZGVyLCBub3QgYSBkaXNjcmV0ZSBvclxuICAgICAgLy8gc3luY2hyb25vdXMgdXBkYXRlLiBXZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgZm9yIHRoaXMgd2hlbiB3ZVxuICAgICAgLy8gdW53b3VuZCB0aGUgc3RhY2suXG4gICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHJlbmRlciBjb21wbGV0ZWQuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIHJlbmRlciBtYXkgaGF2ZSB5aWVsZGVkIHRvIGEgY29uY3VycmVudCBldmVudCwgYW5kIGlmIHNvLFxuICAgICAgLy8gY29uZmlybSB0aGF0IGFueSBuZXdseSByZW5kZXJlZCBzdG9yZXMgYXJlIGNvbnNpc3RlbnQuXG4gICAgICAvLyBUT0RPOiBJdCdzIHBvc3NpYmxlIHRoYXQgZXZlbiBhIGNvbmN1cnJlbnQgcmVuZGVyIG1heSBuZXZlciBoYXZlIHlpZWxkZWRcbiAgICAgIC8vIHRvIHRoZSBtYWluIHRocmVhZCwgaWYgaXQgd2FzIGZhc3QgZW5vdWdoLCBvciBpZiBpdCBleHBpcmVkLiBXZSBjb3VsZFxuICAgICAgLy8gc2tpcCB0aGUgY29uc2lzdGVuY3kgY2hlY2sgaW4gdGhhdCBjYXNlLCB0b28uXG4gICAgICB2YXIgcmVuZGVyV2FzQ29uY3VycmVudCA9ICFpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCBsYW5lcyk7XG4gICAgICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5jdXJyZW50LmFsdGVybmF0ZTtcblxuICAgICAgaWYgKHJlbmRlcldhc0NvbmN1cnJlbnQgJiYgIWlzUmVuZGVyQ29uc2lzdGVudFdpdGhFeHRlcm5hbFN0b3JlcyhmaW5pc2hlZFdvcmspKSB7XG4gICAgICAgIC8vIEEgc3RvcmUgd2FzIG11dGF0ZWQgaW4gYW4gaW50ZXJsZWF2ZWQgZXZlbnQuIFJlbmRlciBhZ2FpbixcbiAgICAgICAgLy8gc3luY2hyb25vdXNseSwgdG8gYmxvY2sgZnVydGhlciBtdXRhdGlvbnMuXG4gICAgICAgIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7IC8vIFdlIG5lZWQgdG8gY2hlY2sgYWdhaW4gaWYgc29tZXRoaW5nIHRocmV3XG5cbiAgICAgICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgICAgICAgdmFyIF9lcnJvclJldHJ5TGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgICAgICAgIGlmIChfZXJyb3JSZXRyeUxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgICAgICBsYW5lcyA9IF9lcnJvclJldHJ5TGFuZXM7XG4gICAgICAgICAgICBleGl0U3RhdHVzID0gcmVjb3ZlckZyb21Db25jdXJyZW50RXJyb3Iocm9vdCwgX2Vycm9yUmV0cnlMYW5lcyk7IC8vIFdlIGFzc3VtZSB0aGUgdHJlZSBpcyBub3cgY29uc2lzdGVudCBiZWNhdXNlIHdlIGRpZG4ndCB5aWVsZCB0byBhbnlcbiAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgZXZlbnRzLlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RmF0YWxFcnJvcmVkKSB7XG4gICAgICAgICAgdmFyIF9mYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICAgICAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICAgICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgICAgICAgIHRocm93IF9mYXRhbEVycm9yO1xuICAgICAgICB9XG4gICAgICB9IC8vIFdlIG5vdyBoYXZlIGEgY29uc2lzdGVudCB0cmVlLiBUaGUgbmV4dCBzdGVwIGlzIGVpdGhlciB0byBjb21taXQgaXQsXG4gICAgICAvLyBvciwgaWYgc29tZXRoaW5nIHN1c3BlbmRlZCwgd2FpdCB0byBjb21taXQgaXQgYWZ0ZXIgYSB0aW1lb3V0LlxuXG5cbiAgICAgIHJvb3QuZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrO1xuICAgICAgcm9vdC5maW5pc2hlZExhbmVzID0gbGFuZXM7XG4gICAgICBmaW5pc2hDb25jdXJyZW50UmVuZGVyKHJvb3QsIGV4aXRTdGF0dXMsIGxhbmVzKTtcbiAgICB9XG4gIH1cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuXG4gIGlmIChyb290LmNhbGxiYWNrTm9kZSA9PT0gb3JpZ2luYWxDYWxsYmFja05vZGUpIHtcbiAgICAvLyBUaGUgdGFzayBub2RlIHNjaGVkdWxlZCBmb3IgdGhpcyByb290IGlzIHRoZSBzYW1lIG9uZSB0aGF0J3NcbiAgICAvLyBjdXJyZW50bHkgZXhlY3V0ZWQuIE5lZWQgdG8gcmV0dXJuIGEgY29udGludWF0aW9uLlxuICAgIHJldHVybiBwZXJmb3JtQ29uY3VycmVudFdvcmtPblJvb3QuYmluZChudWxsLCByb290KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiByZWNvdmVyRnJvbUNvbmN1cnJlbnRFcnJvcihyb290LCBlcnJvclJldHJ5TGFuZXMpIHtcbiAgLy8gSWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGh5ZHJhdGlvbiwgZGlzY2FyZCBzZXJ2ZXIgcmVzcG9uc2UgYW5kIGZhbGxcbiAgLy8gYmFjayB0byBjbGllbnQgc2lkZSByZW5kZXIuXG4gIC8vIEJlZm9yZSByZW5kZXJpbmcgYWdhaW4sIHNhdmUgdGhlIGVycm9ycyBmcm9tIHRoZSBwcmV2aW91cyBhdHRlbXB0LlxuICB2YXIgZXJyb3JzRnJvbUZpcnN0QXR0ZW1wdCA9IHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnM7XG5cbiAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHtcbiAgICAvLyBUaGUgc2hlbGwgZmFpbGVkIHRvIGh5ZHJhdGUuIFNldCBhIGZsYWcgdG8gZm9yY2UgYSBjbGllbnQgcmVuZGVyaW5nXG4gICAgLy8gZHVyaW5nIHRoZSBuZXh0IGF0dGVtcHQuIFRvIGRvIHRoaXMsIHdlIGNhbGwgcHJlcGFyZUZyZXNoU3RhY2sgbm93XG4gICAgLy8gdG8gY3JlYXRlIHRoZSByb290IHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuIFRoaXMgaXMgYSBiaXQgd2VpcmQgaW4gdGVybXNcbiAgICAvLyBvZiBmYWN0b3JpbmcsIGJlY2F1c2UgaXQgcmVsaWVzIG9uIHJlbmRlclJvb3RTeW5jIG5vdCBjYWxsaW5nXG4gICAgLy8gcHJlcGFyZUZyZXNoU3RhY2sgYWdhaW4gaW4gdGhlIGNhbGwgYmVsb3csIHdoaWNoIGhhcHBlbnMgYmVjYXVzZSB0aGVcbiAgICAvLyByb290IGFuZCBsYW5lcyBoYXZlbid0IGNoYW5nZWQuXG4gICAgLy9cbiAgICAvLyBUT0RPOiBJIHRoaW5rIHdoYXQgd2Ugc2hvdWxkIGRvIGlzIHNldCBGb3JjZUNsaWVudFJlbmRlciBpbnNpZGVcbiAgICAvLyB0aHJvd0V4Y2VwdGlvbiwgbGlrZSB3ZSBkbyBmb3IgbmVzdGVkIFN1c3BlbnNlIGJvdW5kYXJpZXMuIFRoZSByZWFzb25cbiAgICAvLyBpdCdzIGhlcmUgaW5zdGVhZCBpcyBzbyB3ZSBjYW4gc3dpdGNoIHRvIHRoZSBzeW5jaHJvbm91cyB3b3JrIGxvb3AsIHRvby5cbiAgICAvLyBTb21ldGhpbmcgdG8gY29uc2lkZXIgZm9yIGEgZnV0dXJlIHJlZmFjdG9yLlxuICAgIHZhciByb290V29ya0luUHJvZ3Jlc3MgPSBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBlcnJvclJldHJ5TGFuZXMpO1xuICAgIHJvb3RXb3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlcjtcblxuICAgIHtcbiAgICAgIGVycm9ySHlkcmF0aW5nQ29udGFpbmVyKHJvb3QuY29udGFpbmVySW5mbyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBlcnJvclJldHJ5TGFuZXMpO1xuXG4gIGlmIChleGl0U3RhdHVzICE9PSBSb290RXJyb3JlZCkge1xuICAgIC8vIFN1Y2Nlc3NmdWxseSBmaW5pc2hlZCByZW5kZXJpbmcgb24gcmV0cnlcbiAgICAvLyBUaGUgZXJyb3JzIGZyb20gdGhlIGZhaWxlZCBmaXJzdCBhdHRlbXB0IGhhdmUgYmVlbiByZWNvdmVyZWQuIEFkZFxuICAgIC8vIHRoZW0gdG8gdGhlIGNvbGxlY3Rpb24gb2YgcmVjb3ZlcmFibGUgZXJyb3JzLiBXZSdsbCBsb2cgdGhlbSBpbiB0aGVcbiAgICAvLyBjb21taXQgcGhhc2UuXG4gICAgdmFyIGVycm9yc0Zyb21TZWNvbmRBdHRlbXB0ID0gd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnM7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSBlcnJvcnNGcm9tRmlyc3RBdHRlbXB0OyAvLyBUaGUgZXJyb3JzIGZyb20gdGhlIHNlY29uZCBhdHRlbXB0IHNob3VsZCBiZSBxdWV1ZWQgYWZ0ZXIgdGhlIGVycm9yc1xuICAgIC8vIGZyb20gdGhlIGZpcnN0IGF0dGVtcHQsIHRvIHByZXNlcnZlIHRoZSBjYXVzYWwgc2VxdWVuY2UuXG5cbiAgICBpZiAoZXJyb3JzRnJvbVNlY29uZEF0dGVtcHQgIT09IG51bGwpIHtcbiAgICAgIHF1ZXVlUmVjb3ZlcmFibGVFcnJvcnMoZXJyb3JzRnJvbVNlY29uZEF0dGVtcHQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGl0U3RhdHVzO1xufVxuXG5mdW5jdGlvbiBxdWV1ZVJlY292ZXJhYmxlRXJyb3JzKGVycm9ycykge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPT09IG51bGwpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IGVycm9ycztcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycy5wdXNoLmFwcGx5KHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCBlcnJvcnMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaENvbmN1cnJlbnRSZW5kZXIocm9vdCwgZXhpdFN0YXR1cywgbGFuZXMpIHtcbiAgc3dpdGNoIChleGl0U3RhdHVzKSB7XG4gICAgY2FzZSBSb290SW5Qcm9ncmVzczpcbiAgICBjYXNlIFJvb3RGYXRhbEVycm9yZWQ6XG4gICAgICB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUm9vdCBkaWQgbm90IGNvbXBsZXRlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuICAgIC8vIEZsb3cga25vd3MgYWJvdXQgaW52YXJpYW50LCBzbyBpdCBjb21wbGFpbnMgaWYgSSBhZGQgYSBicmVha1xuICAgIC8vIHN0YXRlbWVudCwgYnV0IGVzbGludCBkb2Vzbid0IGtub3cgYWJvdXQgaW52YXJpYW50LCBzbyBpdCBjb21wbGFpbnNcbiAgICAvLyBpZiBJIGRvLiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgUm9vdEVycm9yZWQ6XG4gICAgICB7XG4gICAgICAgIC8vIFdlIHNob3VsZCBoYXZlIGFscmVhZHkgYXR0ZW1wdGVkIHRvIHJldHJ5IHRoaXMgdHJlZS4gSWYgd2UgcmVhY2hlZFxuICAgICAgICAvLyB0aGlzIHBvaW50LCBpdCBlcnJvcmVkIGFnYWluLiBDb21taXQgaXQuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUm9vdFN1c3BlbmRlZDpcbiAgICAgIHtcbiAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7IC8vIFdlIGhhdmUgYW4gYWNjZXB0YWJsZSBsb2FkaW5nIHN0YXRlLiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgd2VcbiAgICAgICAgLy8gc2hvdWxkIGltbWVkaWF0ZWx5IGNvbW1pdCBpdCBvciB3YWl0IGEgYml0LlxuXG4gICAgICAgIGlmIChpbmNsdWRlc09ubHlSZXRyaWVzKGxhbmVzKSAmJiAvLyBkbyBub3QgZGVsYXkgaWYgd2UncmUgaW5zaWRlIGFuIGFjdCgpIHNjb3BlXG4gICAgICAgICFzaG91bGRGb3JjZUZsdXNoRmFsbGJhY2tzSW5ERVYoKSkge1xuICAgICAgICAgIC8vIFRoaXMgcmVuZGVyIG9ubHkgaW5jbHVkZWQgcmV0cmllcywgbm8gdXBkYXRlcy4gVGhyb3R0bGUgY29tbWl0dGluZ1xuICAgICAgICAgIC8vIHJldHJpZXMgc28gdGhhdCB3ZSBkb24ndCBzaG93IHRvbyBtYW55IGxvYWRpbmcgc3RhdGVzIHRvbyBxdWlja2x5LlxuICAgICAgICAgIHZhciBtc1VudGlsVGltZW91dCA9IGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgKyBGQUxMQkFDS19USFJPVFRMRV9NUyAtIG5vdygpOyAvLyBEb24ndCBib3RoZXIgd2l0aCBhIHZlcnkgc2hvcnQgc3VzcGVuc2UgdGltZS5cblxuICAgICAgICAgIGlmIChtc1VudGlsVGltZW91dCA+IDEwKSB7XG4gICAgICAgICAgICB2YXIgbmV4dExhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIE5vTGFuZXMpO1xuXG4gICAgICAgICAgICBpZiAobmV4dExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgICAgICAgIC8vIFRoZXJlJ3MgYWRkaXRpb25hbCB3b3JrIG9uIHRoaXMgcm9vdC5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXM7XG5cbiAgICAgICAgICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKHN1c3BlbmRlZExhbmVzLCBsYW5lcykpIHtcbiAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIHByZWZlciB0byByZW5kZXIgdGhlIGZhbGxiYWNrIG9mIGF0IHRoZSBsYXN0XG4gICAgICAgICAgICAgIC8vIHN1c3BlbmRlZCBsZXZlbC4gUGluZyB0aGUgbGFzdCBzdXNwZW5kZWQgbGV2ZWwgdG8gdHJ5XG4gICAgICAgICAgICAgIC8vIHJlbmRlcmluZyBpdCBhZ2Fpbi5cbiAgICAgICAgICAgICAgLy8gRklYTUU6IFdoYXQgaWYgdGhlIHN1c3BlbmRlZCBsYW5lcyBhcmUgSWRsZT8gU2hvdWxkIG5vdCByZXN0YXJ0LlxuICAgICAgICAgICAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgICAgICAgICAgICBtYXJrUm9vdFBpbmdlZChyb290LCBzdXNwZW5kZWRMYW5lcyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSAvLyBUaGUgcmVuZGVyIGlzIHN1c3BlbmRlZCwgaXQgaGFzbid0IHRpbWVkIG91dCwgYW5kIHRoZXJlJ3Mgbm9cbiAgICAgICAgICAgIC8vIGxvd2VyIHByaW9yaXR5IHdvcmsgdG8gZG8uIEluc3RlYWQgb2YgY29tbWl0dGluZyB0aGUgZmFsbGJhY2tcbiAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5LCB3YWl0IGZvciBtb3JlIGRhdGEgdG8gYXJyaXZlLlxuXG5cbiAgICAgICAgICAgIHJvb3QudGltZW91dEhhbmRsZSA9IHNjaGVkdWxlVGltZW91dChjb21taXRSb290LmJpbmQobnVsbCwgcm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpLCBtc1VudGlsVGltZW91dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVGhlIHdvcmsgZXhwaXJlZC4gQ29tbWl0IGltbWVkaWF0ZWx5LlxuXG5cbiAgICAgICAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBSb290U3VzcGVuZGVkV2l0aERlbGF5OlxuICAgICAge1xuICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcblxuICAgICAgICBpZiAoaW5jbHVkZXNPbmx5VHJhbnNpdGlvbnMobGFuZXMpKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBhIHRyYW5zaXRpb24sIHNvIHdlIHNob3VsZCBleGl0IHdpdGhvdXQgY29tbWl0dGluZyBhXG4gICAgICAgICAgLy8gcGxhY2Vob2xkZXIgYW5kIHdpdGhvdXQgc2NoZWR1bGluZyBhIHRpbWVvdXQuIERlbGF5IGluZGVmaW5pdGVseVxuICAgICAgICAgIC8vIHVudGlsIHdlIHJlY2VpdmUgbW9yZSBkYXRhLlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzaG91bGRGb3JjZUZsdXNoRmFsbGJhY2tzSW5ERVYoKSkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgdHJhbnNpdGlvbiwgYnV0IHdlIGRpZCB0cmlnZ2VyIGFuIGF2b2lkZWQgc3RhdGUuXG4gICAgICAgICAgLy8gU2NoZWR1bGUgYSBwbGFjZWhvbGRlciB0byBkaXNwbGF5IGFmdGVyIGEgc2hvcnQgZGVsYXksIHVzaW5nIHRoZSBKdXN0XG4gICAgICAgICAgLy8gTm90aWNlYWJsZSBEaWZmZXJlbmNlLlxuICAgICAgICAgIC8vIFRPRE86IElzIHRoZSBKTkQgb3B0aW1pemF0aW9uIHdvcnRoIHRoZSBhZGRlZCBjb21wbGV4aXR5PyBJZiB0aGlzIGlzXG4gICAgICAgICAgLy8gdGhlIG9ubHkgcmVhc29uIHdlIHRyYWNrIHRoZSBldmVudCB0aW1lLCB0aGVuIHByb2JhYmx5IG5vdC5cbiAgICAgICAgICAvLyBDb25zaWRlciByZW1vdmluZy5cbiAgICAgICAgICB2YXIgbW9zdFJlY2VudEV2ZW50VGltZSA9IGdldE1vc3RSZWNlbnRFdmVudFRpbWUocm9vdCwgbGFuZXMpO1xuICAgICAgICAgIHZhciBldmVudFRpbWVNcyA9IG1vc3RSZWNlbnRFdmVudFRpbWU7XG4gICAgICAgICAgdmFyIHRpbWVFbGFwc2VkTXMgPSBub3coKSAtIGV2ZW50VGltZU1zO1xuXG4gICAgICAgICAgdmFyIF9tc1VudGlsVGltZW91dCA9IGpuZCh0aW1lRWxhcHNlZE1zKSAtIHRpbWVFbGFwc2VkTXM7IC8vIERvbid0IGJvdGhlciB3aXRoIGEgdmVyeSBzaG9ydCBzdXNwZW5zZSB0aW1lLlxuXG5cbiAgICAgICAgICBpZiAoX21zVW50aWxUaW1lb3V0ID4gMTApIHtcbiAgICAgICAgICAgIC8vIEluc3RlYWQgb2YgY29tbWl0dGluZyB0aGUgZmFsbGJhY2sgaW1tZWRpYXRlbHksIHdhaXQgZm9yIG1vcmUgZGF0YVxuICAgICAgICAgICAgLy8gdG8gYXJyaXZlLlxuICAgICAgICAgICAgcm9vdC50aW1lb3V0SGFuZGxlID0gc2NoZWR1bGVUaW1lb3V0KGNvbW1pdFJvb3QuYmluZChudWxsLCByb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyksIF9tc1VudGlsVGltZW91dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gQ29tbWl0IHRoZSBwbGFjZWhvbGRlci5cblxuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUm9vdENvbXBsZXRlZDpcbiAgICAgIHtcbiAgICAgICAgLy8gVGhlIHdvcmsgY29tcGxldGVkLiBSZWFkeSB0byBjb21taXQuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biByb290IGV4aXQgc3RhdHVzLicpO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzUmVuZGVyQ29uc2lzdGVudFdpdGhFeHRlcm5hbFN0b3JlcyhmaW5pc2hlZFdvcmspIHtcbiAgLy8gU2VhcmNoIHRoZSByZW5kZXJlZCB0cmVlIGZvciBleHRlcm5hbCBzdG9yZSByZWFkcywgYW5kIGNoZWNrIHdoZXRoZXIgdGhlXG4gIC8vIHN0b3JlcyB3ZXJlIG11dGF0ZWQgaW4gYSBjb25jdXJyZW50IGV2ZW50LiBJbnRlbnRpb25hbGx5IHVzaW5nIGFuIGl0ZXJhdGl2ZVxuICAvLyBsb29wIGluc3RlYWQgb2YgcmVjdXJzaW9uIHNvIHdlIGNhbiBleGl0IGVhcmx5LlxuICB2YXIgbm9kZSA9IGZpbmlzaGVkV29yaztcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChub2RlLmZsYWdzICYgU3RvcmVDb25zaXN0ZW5jeSkge1xuICAgICAgdmFyIHVwZGF0ZVF1ZXVlID0gbm9kZS51cGRhdGVRdWV1ZTtcblxuICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBjaGVja3MgPSB1cGRhdGVRdWV1ZS5zdG9yZXM7XG5cbiAgICAgICAgaWYgKGNoZWNrcyAhPT0gbnVsbCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hlY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hlY2sgPSBjaGVja3NbaV07XG4gICAgICAgICAgICB2YXIgZ2V0U25hcHNob3QgPSBjaGVjay5nZXRTbmFwc2hvdDtcbiAgICAgICAgICAgIHZhciByZW5kZXJlZFZhbHVlID0gY2hlY2sudmFsdWU7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmICghb2JqZWN0SXMoZ2V0U25hcHNob3QoKSwgcmVuZGVyZWRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBGb3VuZCBhbiBpbmNvbnNpc3RlbnQgc3RvcmUuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAvLyBJZiBgZ2V0U25hcHNob3RgIHRocm93cywgcmV0dXJuIGBmYWxzZWAuIFRoaXMgd2lsbCBzY2hlZHVsZVxuICAgICAgICAgICAgICAvLyBhIHJlLXJlbmRlciwgYW5kIHRoZSBlcnJvciB3aWxsIGJlIHJldGhyb3duIGR1cmluZyByZW5kZXIuXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gICAgaWYgKG5vZGUuc3VidHJlZUZsYWdzICYgU3RvcmVDb25zaXN0ZW5jeSAmJiBjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgIG5vZGUgPSBjaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH0gLy8gRmxvdyBkb2Vzbid0IGtub3cgdGhpcyBpcyB1bnJlYWNoYWJsZSwgYnV0IGVzbGludCBkb2VzXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnJlYWNoYWJsZVxuXG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgc3VzcGVuZGVkTGFuZXMpIHtcbiAgLy8gV2hlbiBzdXNwZW5kaW5nLCB3ZSBzaG91bGQgYWx3YXlzIGV4Y2x1ZGUgbGFuZXMgdGhhdCB3ZXJlIHBpbmdlZCBvciAobW9yZVxuICAvLyByYXJlbHksIHNpbmNlIHdlIHRyeSB0byBhdm9pZCBpdCkgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgLy8gVE9ETzogTG9sIG1heWJlIHRoZXJlJ3MgYSBiZXR0ZXIgd2F5IHRvIGZhY3RvciB0aGlzIGJlc2lkZXMgdGhpc1xuICAvLyBvYm5veGlvdXNseSBuYW1lZCBmdW5jdGlvbiA6KVxuICBzdXNwZW5kZWRMYW5lcyA9IHJlbW92ZUxhbmVzKHN1c3BlbmRlZExhbmVzLCB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyk7XG4gIHN1c3BlbmRlZExhbmVzID0gcmVtb3ZlTGFuZXMoc3VzcGVuZGVkTGFuZXMsIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzKTtcbiAgbWFya1Jvb3RTdXNwZW5kZWQocm9vdCwgc3VzcGVuZGVkTGFuZXMpO1xufSAvLyBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3Igc3luY2hyb25vdXMgdGFza3MgdGhhdCBkb24ndCBnb1xuLy8gdGhyb3VnaCBTY2hlZHVsZXJcblxuXG5mdW5jdGlvbiBwZXJmb3JtU3luY1dvcmtPblJvb3Qocm9vdCkge1xuICB7XG4gICAgc3luY05lc3RlZFVwZGF0ZUZsYWcoKTtcbiAgfVxuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBub3QgYWxyZWFkeSBiZSB3b3JraW5nLicpO1xuICB9XG5cbiAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB2YXIgbGFuZXMgPSBnZXROZXh0TGFuZXMocm9vdCwgTm9MYW5lcyk7XG5cbiAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKGxhbmVzLCBTeW5jTGFuZSkpIHtcbiAgICAvLyBUaGVyZSdzIG5vIHJlbWFpbmluZyBzeW5jIHdvcmsgbGVmdC5cbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7XG5cbiAgaWYgKHJvb3QudGFnICE9PSBMZWdhY3lSb290ICYmIGV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgLy8gSWYgc29tZXRoaW5nIHRocmV3IGFuIGVycm9yLCB0cnkgcmVuZGVyaW5nIG9uZSBtb3JlIHRpbWUuIFdlJ2xsIHJlbmRlclxuICAgIC8vIHN5bmNocm9ub3VzbHkgdG8gYmxvY2sgY29uY3VycmVudCBkYXRhIG11dGF0aW9ucywgYW5kIHdlJ2xsIGluY2x1ZGVzXG4gICAgLy8gYWxsIHBlbmRpbmcgdXBkYXRlcyBhcmUgaW5jbHVkZWQuIElmIGl0IHN0aWxsIGZhaWxzIGFmdGVyIHRoZSBzZWNvbmRcbiAgICAvLyBhdHRlbXB0LCB3ZSdsbCBnaXZlIHVwIGFuZCBjb21taXQgdGhlIHJlc3VsdGluZyB0cmVlLlxuICAgIHZhciBlcnJvclJldHJ5TGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgIGlmIChlcnJvclJldHJ5TGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgIGxhbmVzID0gZXJyb3JSZXRyeUxhbmVzO1xuICAgICAgZXhpdFN0YXR1cyA9IHJlY292ZXJGcm9tQ29uY3VycmVudEVycm9yKHJvb3QsIGVycm9yUmV0cnlMYW5lcyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RGYXRhbEVycm9yZWQpIHtcbiAgICB2YXIgZmF0YWxFcnJvciA9IHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3I7XG4gICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgICB0aHJvdyBmYXRhbEVycm9yO1xuICB9XG5cbiAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3REaWROb3RDb21wbGV0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUm9vdCBkaWQgbm90IGNvbXBsZXRlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICB9IC8vIFdlIG5vdyBoYXZlIGEgY29uc2lzdGVudCB0cmVlLiBCZWNhdXNlIHRoaXMgaXMgYSBzeW5jIHJlbmRlciwgd2VcbiAgLy8gd2lsbCBjb21taXQgaXQgZXZlbiBpZiBzb21ldGhpbmcgc3VzcGVuZGVkLlxuXG5cbiAgdmFyIGZpbmlzaGVkV29yayA9IHJvb3QuY3VycmVudC5hbHRlcm5hdGU7XG4gIHJvb3QuZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrO1xuICByb290LmZpbmlzaGVkTGFuZXMgPSBsYW5lcztcbiAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7IC8vIEJlZm9yZSBleGl0aW5nLCBtYWtlIHN1cmUgdGhlcmUncyBhIGNhbGxiYWNrIHNjaGVkdWxlZCBmb3IgdGhlIG5leHRcbiAgLy8gcGVuZGluZyBsZXZlbC5cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmx1c2hSb290KHJvb3QsIGxhbmVzKSB7XG4gIGlmIChsYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIG1lcmdlTGFuZXMobGFuZXMsIFN5bmNMYW5lKSk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcblxuICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpIHtcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gYmF0Y2hlZFVwZGF0ZXMkMShmbiwgYSkge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IEJhdGNoZWRDb250ZXh0O1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKGEpO1xuICB9IGZpbmFsbHkge1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDsgLy8gSWYgdGhlcmUgd2VyZSBsZWdhY3kgc3luYyB1cGRhdGVzLCBmbHVzaCB0aGVtIGF0IHRoZSBlbmQgb2YgdGhlIG91dGVyXG4gICAgLy8gbW9zdCBiYXRjaGVkVXBkYXRlcy1saWtlIG1ldGhvZC5cblxuICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQgJiYgLy8gVHJlYXQgYGFjdGAgYXMgaWYgaXQncyBpbnNpZGUgYGJhdGNoZWRVcGRhdGVzYCwgZXZlbiBpbiBsZWdhY3kgbW9kZS5cbiAgICAhKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmlzQmF0Y2hpbmdMZWdhY3kpKSB7XG4gICAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgICBmbHVzaFN5bmNDYWxsYmFja3NPbmx5SW5MZWdhY3lNb2RlKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaXNjcmV0ZVVwZGF0ZXMoZm4sIGEsIGIsIGMsIGQpIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuXG4gIHRyeSB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcbiAgICByZXR1cm4gZm4oYSwgYiwgYywgZCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuXG4gICAgaWYgKGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCkge1xuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgIH1cbiAgfVxufSAvLyBPdmVybG9hZCB0aGUgZGVmaW5pdGlvbiB0byB0aGUgdHdvIHZhbGlkIHNpZ25hdHVyZXMuXG4vLyBXYXJuaW5nLCB0aGlzIG9wdHMtb3V0IG9mIGNoZWNraW5nIHRoZSBmdW5jdGlvbiBib2R5LlxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG5mdW5jdGlvbiBmbHVzaFN5bmMoZm4pIHtcbiAgLy8gSW4gbGVnYWN5IG1vZGUsIHdlIGZsdXNoIHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlXG4gIC8vIG5leHQgZXZlbnQsIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyBvbmUuXG4gIGlmIChyb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyAhPT0gbnVsbCAmJiByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cy50YWcgPT09IExlZ2FjeVJvb3QgJiYgKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB9XG5cbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBCYXRjaGVkQ29udGV4dDtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuXG4gIHRyeSB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcblxuICAgIGlmIChmbikge1xuICAgICAgcmV0dXJuIGZuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7IC8vIEZsdXNoIHRoZSBpbW1lZGlhdGUgY2FsbGJhY2tzIHRoYXQgd2VyZSBzY2hlZHVsZWQgZHVyaW5nIHRoaXMgYmF0Y2guXG4gICAgLy8gTm90ZSB0aGF0IHRoaXMgd2lsbCBoYXBwZW4gZXZlbiBpZiBiYXRjaGVkVXBkYXRlcyBpcyBoaWdoZXIgdXBcbiAgICAvLyB0aGUgc3RhY2suXG5cbiAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGlzQWxyZWFkeVJlbmRlcmluZygpIHtcbiAgLy8gVXNlZCBieSB0aGUgcmVuZGVyZXIgdG8gcHJpbnQgYSB3YXJuaW5nIGlmIGNlcnRhaW4gQVBJcyBhcmUgY2FsbGVkIGZyb21cbiAgLy8gdGhlIHdyb25nIGNvbnRleHQuXG4gIHJldHVybiAgKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0O1xufVxuZnVuY3Rpb24gcHVzaFJlbmRlckxhbmVzKGZpYmVyLCBsYW5lcykge1xuICBwdXNoKHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvciwgc3VidHJlZVJlbmRlckxhbmVzLCBmaWJlcik7XG4gIHN1YnRyZWVSZW5kZXJMYW5lcyA9IG1lcmdlTGFuZXMoc3VidHJlZVJlbmRlckxhbmVzLCBsYW5lcyk7XG4gIHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMsIGxhbmVzKTtcbn1cbmZ1bmN0aW9uIHBvcFJlbmRlckxhbmVzKGZpYmVyKSB7XG4gIHN1YnRyZWVSZW5kZXJMYW5lcyA9IHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvci5jdXJyZW50O1xuICBwb3Aoc3VidHJlZVJlbmRlckxhbmVzQ3Vyc29yLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGxhbmVzKSB7XG4gIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcbiAgcm9vdC5maW5pc2hlZExhbmVzID0gTm9MYW5lcztcbiAgdmFyIHRpbWVvdXRIYW5kbGUgPSByb290LnRpbWVvdXRIYW5kbGU7XG5cbiAgaWYgKHRpbWVvdXRIYW5kbGUgIT09IG5vVGltZW91dCkge1xuICAgIC8vIFRoZSByb290IHByZXZpb3VzIHN1c3BlbmRlZCBhbmQgc2NoZWR1bGVkIGEgdGltZW91dCB0byBjb21taXQgYSBmYWxsYmFja1xuICAgIC8vIHN0YXRlLiBOb3cgdGhhdCB3ZSBoYXZlIGFkZGl0aW9uYWwgd29yaywgY2FuY2VsIHRoZSB0aW1lb3V0LlxuICAgIHJvb3QudGltZW91dEhhbmRsZSA9IG5vVGltZW91dDsgLy8gJEZsb3dGaXhNZSBDb21wbGFpbnMgbm9UaW1lb3V0IGlzIG5vdCBhIFRpbWVvdXRJRCwgZGVzcGl0ZSB0aGUgY2hlY2sgYWJvdmVcblxuICAgIGNhbmNlbFRpbWVvdXQodGltZW91dEhhbmRsZSk7XG4gIH1cblxuICBpZiAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICB2YXIgaW50ZXJydXB0ZWRXb3JrID0gd29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuXG4gICAgd2hpbGUgKGludGVycnVwdGVkV29yayAhPT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBpbnRlcnJ1cHRlZFdvcmsuYWx0ZXJuYXRlO1xuICAgICAgdW53aW5kSW50ZXJydXB0ZWRXb3JrKGN1cnJlbnQsIGludGVycnVwdGVkV29yayk7XG4gICAgICBpbnRlcnJ1cHRlZFdvcmsgPSBpbnRlcnJ1cHRlZFdvcmsucmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzUm9vdCA9IHJvb3Q7XG4gIHZhciByb290V29ya0luUHJvZ3Jlc3MgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhyb290LmN1cnJlbnQsIG51bGwpO1xuICB3b3JrSW5Qcm9ncmVzcyA9IHJvb3RXb3JrSW5Qcm9ncmVzcztcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBzdWJ0cmVlUmVuZGVyTGFuZXMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gbGFuZXM7XG4gIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290SW5Qcm9ncmVzcztcbiAgd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvciA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID0gTm9MYW5lcztcbiAgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSBudWxsO1xuICBmaW5pc2hRdWV1ZWluZ0NvbmN1cnJlbnRVcGRhdGVzKCk7XG5cbiAge1xuICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmRpc2NhcmRQZW5kaW5nV2FybmluZ3MoKTtcbiAgfVxuXG4gIHJldHVybiByb290V29ya0luUHJvZ3Jlc3M7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKSB7XG4gIGRvIHtcbiAgICB2YXIgZXJyb3JlZFdvcmsgPSB3b3JrSW5Qcm9ncmVzcztcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXNldCBtb2R1bGUtbGV2ZWwgc3RhdGUgdGhhdCB3YXMgc2V0IGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gICAgICByZXNldEhvb2tzQWZ0ZXJUaHJvdygpO1xuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTsgLy8gVE9ETzogSSBmb3VuZCBhbmQgYWRkZWQgdGhpcyBtaXNzaW5nIGxpbmUgd2hpbGUgaW52ZXN0aWdhdGluZyBhXG4gICAgICAvLyBzZXBhcmF0ZSBpc3N1ZS4gV3JpdGUgYSByZWdyZXNzaW9uIHRlc3QgdXNpbmcgc3RyaW5nIHJlZnMuXG5cbiAgICAgIFJlYWN0Q3VycmVudE93bmVyJDIuY3VycmVudCA9IG51bGw7XG5cbiAgICAgIGlmIChlcnJvcmVkV29yayA9PT0gbnVsbCB8fCBlcnJvcmVkV29yay5yZXR1cm4gPT09IG51bGwpIHtcbiAgICAgICAgLy8gRXhwZWN0ZWQgdG8gYmUgd29ya2luZyBvbiBhIG5vbi1yb290IGZpYmVyLiBUaGlzIGlzIGEgZmF0YWwgZXJyb3JcbiAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSdzIG5vIGFuY2VzdG9yIHRoYXQgY2FuIGhhbmRsZSBpdDsgdGhlIHJvb3QgaXNcbiAgICAgICAgLy8gc3VwcG9zZWQgdG8gY2FwdHVyZSBhbGwgZXJyb3JzIHRoYXQgd2VyZW4ndCBjYXVnaHQgYnkgYW4gZXJyb3JcbiAgICAgICAgLy8gYm91bmRhcnkuXG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RmF0YWxFcnJvcmVkO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yID0gdGhyb3duVmFsdWU7IC8vIFNldCBgd29ya0luUHJvZ3Jlc3NgIHRvIG51bGwuIFRoaXMgcmVwcmVzZW50cyBhZHZhbmNpbmcgdG8gdGhlIG5leHRcbiAgICAgICAgLy8gc2libGluZywgb3IgdGhlIHBhcmVudCBpZiB0aGVyZSBhcmUgbm8gc2libGluZ3MuIEJ1dCBzaW5jZSB0aGUgcm9vdFxuICAgICAgICAvLyBoYXMgbm8gc2libGluZ3Mgbm9yIGEgcGFyZW50LCB3ZSBzZXQgaXQgdG8gbnVsbC4gVXN1YWxseSB0aGlzIGlzXG4gICAgICAgIC8vIGhhbmRsZWQgYnkgYGNvbXBsZXRlVW5pdE9mV29ya2Agb3IgYHVud2luZFdvcmtgLCBidXQgc2luY2Ugd2UncmVcbiAgICAgICAgLy8gaW50ZW50aW9uYWxseSBub3QgY2FsbGluZyB0aG9zZSwgd2UgbmVlZCBzZXQgaXQgaGVyZS5cbiAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgY2FsbGluZyBgdW53aW5kV29ya2AgdG8gcG9wIHRoZSBjb250ZXh0cy5cblxuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIgJiYgZXJyb3JlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgIC8vIFJlY29yZCB0aGUgdGltZSBzcGVudCByZW5kZXJpbmcgYmVmb3JlIGFuIGVycm9yIHdhcyB0aHJvd24uIFRoaXNcbiAgICAgICAgLy8gYXZvaWRzIGluYWNjdXJhdGUgUHJvZmlsZXIgZHVyYXRpb25zIGluIHRoZSBjYXNlIG9mIGFcbiAgICAgICAgLy8gc3VzcGVuZGVkIHJlbmRlci5cbiAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShlcnJvcmVkV29yaywgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbmFibGVTY2hlZHVsaW5nUHJvZmlsZXIpIHtcbiAgICAgICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcblxuICAgICAgICBpZiAodGhyb3duVmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHRocm93blZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdGhyb3duVmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhciB3YWtlYWJsZSA9IHRocm93blZhbHVlO1xuICAgICAgICAgIG1hcmtDb21wb25lbnRTdXNwZW5kZWQoZXJyb3JlZFdvcmssIHdha2VhYmxlLCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWFya0NvbXBvbmVudEVycm9yZWQoZXJyb3JlZFdvcmssIHRocm93blZhbHVlLCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3dFeGNlcHRpb24ocm9vdCwgZXJyb3JlZFdvcmsucmV0dXJuLCBlcnJvcmVkV29yaywgdGhyb3duVmFsdWUsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgIGNvbXBsZXRlVW5pdE9mV29yayhlcnJvcmVkV29yayk7XG4gICAgfSBjYXRjaCAoeWV0QW5vdGhlclRocm93blZhbHVlKSB7XG4gICAgICAvLyBTb21ldGhpbmcgaW4gdGhlIHJldHVybiBwYXRoIGFsc28gdGhyZXcuXG4gICAgICB0aHJvd25WYWx1ZSA9IHlldEFub3RoZXJUaHJvd25WYWx1ZTtcblxuICAgICAgaWYgKHdvcmtJblByb2dyZXNzID09PSBlcnJvcmVkV29yayAmJiBlcnJvcmVkV29yayAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiB0aGlzIGJvdW5kYXJ5IGhhcyBhbHJlYWR5IGVycm9yZWQsIHRoZW4gd2UgaGFkIHRyb3VibGUgcHJvY2Vzc2luZ1xuICAgICAgICAvLyB0aGUgZXJyb3IuIEJ1YmJsZSBpdCB0byB0aGUgbmV4dCBib3VuZGFyeS5cbiAgICAgICAgZXJyb3JlZFdvcmsgPSBlcnJvcmVkV29yay5yZXR1cm47XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gZXJyb3JlZFdvcms7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcmVkV29yayA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgfVxuXG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIFJldHVybiB0byB0aGUgbm9ybWFsIHdvcmsgbG9vcC5cblxuXG4gICAgcmV0dXJuO1xuICB9IHdoaWxlICh0cnVlKTtcbn1cblxuZnVuY3Rpb24gcHVzaERpc3BhdGNoZXIoKSB7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMi5jdXJyZW50O1xuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICBpZiAocHJldkRpc3BhdGNoZXIgPT09IG51bGwpIHtcbiAgICAvLyBUaGUgUmVhY3QgaXNvbW9ycGhpYyBwYWNrYWdlIGRvZXMgbm90IGluY2x1ZGUgYSBkZWZhdWx0IGRpc3BhdGNoZXIuXG4gICAgLy8gSW5zdGVhZCB0aGUgZmlyc3QgcmVuZGVyZXIgd2lsbCBsYXppbHkgYXR0YWNoIG9uZSwgaW4gb3JkZXIgdG8gZ2l2ZVxuICAgIC8vIG5pY2VyIGVycm9yIG1lc3NhZ2VzLlxuICAgIHJldHVybiBDb250ZXh0T25seURpc3BhdGNoZXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHByZXZEaXNwYXRjaGVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpIHtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbn1cblxuZnVuY3Rpb24gbWFya0NvbW1pdFRpbWVPZkZhbGxiYWNrKCkge1xuICBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lID0gbm93KCk7XG59XG5mdW5jdGlvbiBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKGxhbmUpIHtcbiAgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzID0gbWVyZ2VMYW5lcyhsYW5lLCB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMpO1xufVxuZnVuY3Rpb24gcmVuZGVyRGlkU3VzcGVuZCgpIHtcbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RTdXNwZW5kZWQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290SW5Qcm9ncmVzcyB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkIHx8IHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXk7XG4gIH0gLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIHVwZGF0ZXMgdGhhdCB3ZSBza2lwcGVkIHRyZWUgdGhhdCBtaWdodCBoYXZlIHVuYmxvY2tlZFxuICAvLyB0aGlzIHJlbmRlci5cblxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgIT09IG51bGwgJiYgKGluY2x1ZGVzTm9uSWRsZVdvcmsod29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzKSB8fCBpbmNsdWRlc05vbklkbGVXb3JrKHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzKSkpIHtcbiAgICAvLyBNYXJrIHRoZSBjdXJyZW50IHJlbmRlciBhcyBzdXNwZW5kZWQgc28gdGhhdCB3ZSBzd2l0Y2ggdG8gd29ya2luZyBvblxuICAgIC8vIHRoZSB1cGRhdGVzIHRoYXQgd2VyZSBza2lwcGVkLiBVc3VhbGx5IHdlIG9ubHkgc3VzcGVuZCBhdCB0aGUgZW5kIG9mXG4gICAgLy8gdGhlIHJlbmRlciBwaGFzZS5cbiAgICAvLyBUT0RPOiBXZSBzaG91bGQgcHJvYmFibHkgYWx3YXlzIG1hcmsgdGhlIHJvb3QgYXMgc3VzcGVuZGVkIGltbWVkaWF0ZWx5XG4gICAgLy8gKGluc2lkZSB0aGlzIGZ1bmN0aW9uKSwgc2luY2UgYnkgc3VzcGVuZGluZyBhdCB0aGUgZW5kIG9mIHRoZSByZW5kZXJcbiAgICAvLyBwaGFzZSBpbnRyb2R1Y2VzIGEgcG90ZW50aWFsIG1pc3Rha2Ugd2hlcmUgd2Ugc3VzcGVuZCBsYW5lcyB0aGF0IHdlcmVcbiAgICAvLyBwaW5nZWQgb3IgdXBkYXRlZCB3aGlsZSB3ZSB3ZXJlIHJlbmRlcmluZy5cbiAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHdvcmtJblByb2dyZXNzUm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICB9XG59XG5mdW5jdGlvbiByZW5kZXJEaWRFcnJvcihlcnJvcikge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyAhPT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RXJyb3JlZDtcbiAgfVxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID09PSBudWxsKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9IFtlcnJvcl07XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycy5wdXNoKGVycm9yKTtcbiAgfVxufSAvLyBDYWxsZWQgZHVyaW5nIHJlbmRlciB0byBkZXRlcm1pbmUgaWYgYW55dGhpbmcgaGFzIHN1c3BlbmRlZC5cbi8vIFJldHVybnMgZmFsc2UgaWYgd2UncmUgbm90IHN1cmUuXG5cbmZ1bmN0aW9uIHJlbmRlckhhc05vdFN1c3BlbmRlZFlldCgpIHtcbiAgLy8gSWYgc29tZXRoaW5nIGVycm9yZWQgb3IgY29tcGxldGVkLCB3ZSBjYW4ndCByZWFsbHkgYmUgc3VyZSxcbiAgLy8gc28gdGhvc2UgYXJlIGZhbHNlLlxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3M7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gUmVuZGVyQ29udGV4dDtcbiAgdmFyIHByZXZEaXNwYXRjaGVyID0gcHVzaERpc3BhdGNoZXIoKTsgLy8gSWYgdGhlIHJvb3Qgb3IgbGFuZXMgaGF2ZSBjaGFuZ2VkLCB0aHJvdyBvdXQgdGhlIGV4aXN0aW5nIHN0YWNrXG4gIC8vIGFuZCBwcmVwYXJlIGEgZnJlc2ggb25lLiBPdGhlcndpc2Ugd2UnbGwgY29udGludWUgd2hlcmUgd2UgbGVmdCBvZmYuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCAhPT0gcm9vdCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gbGFuZXMpIHtcbiAgICB7XG4gICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgdmFyIG1lbW9pemVkVXBkYXRlcnMgPSByb290Lm1lbW9pemVkVXBkYXRlcnM7XG5cbiAgICAgICAgaWYgKG1lbW9pemVkVXBkYXRlcnMuc2l6ZSA+IDApIHtcbiAgICAgICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzLmNsZWFyKCk7XG4gICAgICAgIH0gLy8gQXQgdGhpcyBwb2ludCwgbW92ZSBGaWJlcnMgdGhhdCBzY2hlZHVsZWQgdGhlIHVwY29taW5nIHdvcmsgZnJvbSB0aGUgTWFwIHRvIHRoZSBTZXQuXG4gICAgICAgIC8vIElmIHdlIGJhaWxvdXQgb24gdGhpcyB3b3JrLCB3ZSdsbCBtb3ZlIHRoZW0gYmFjayAobGlrZSBhYm92ZSkuXG4gICAgICAgIC8vIEl0J3MgaW1wb3J0YW50IHRvIG1vdmUgdGhlbSBub3cgaW4gY2FzZSB0aGUgd29yayBzcGF3bnMgbW9yZSB3b3JrIGF0IHRoZSBzYW1lIHByaW9yaXR5IHdpdGggZGlmZmVyZW50IHVwZGF0ZXJzLlxuICAgICAgICAvLyBUaGF0IHdheSB3ZSBjYW4ga2VlcCB0aGUgY3VycmVudCB1cGRhdGUgYW5kIGZ1dHVyZSB1cGRhdGVzIHNlcGFyYXRlLlxuXG5cbiAgICAgICAgbW92ZVBlbmRpbmdGaWJlcnNUb01lbW9pemVkKHJvb3QsIGxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zID0gZ2V0VHJhbnNpdGlvbnNGb3JMYW5lcygpO1xuICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGxhbmVzKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUmVuZGVyU3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICBkbyB7XG4gICAgdHJ5IHtcbiAgICAgIHdvcmtMb29wU3luYygpO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAodGhyb3duVmFsdWUpIHtcbiAgICAgIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKTtcbiAgICB9XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG4gIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgYSBzeW5jIHJlbmRlciwgc28gd2Ugc2hvdWxkIGhhdmUgZmluaXNoZWQgdGhlIHdob2xlIHRyZWUuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29tbWl0IGFuIGluY29tcGxldGUgcm9vdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgJyArICdidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAge1xuICAgIG1hcmtSZW5kZXJTdG9wcGVkKCk7XG4gIH0gLy8gU2V0IHRoaXMgdG8gbnVsbCB0byBpbmRpY2F0ZSB0aGVyZSdzIG5vIGluLXByb2dyZXNzIHJlbmRlci5cblxuXG4gIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXM7XG59IC8vIFRoZSB3b3JrIGxvb3AgaXMgYW4gZXh0cmVtZWx5IGhvdCBwYXRoLiBUZWxsIENsb3N1cmUgbm90IHRvIGlubGluZSBpdC5cblxuLyoqIEBub2lubGluZSAqL1xuXG5cbmZ1bmN0aW9uIHdvcmtMb29wU3luYygpIHtcbiAgLy8gQWxyZWFkeSB0aW1lZCBvdXQsIHNvIHBlcmZvcm0gd29yayB3aXRob3V0IGNoZWNraW5nIGlmIHdlIG5lZWQgdG8geWllbGQuXG4gIHdoaWxlICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuICAgIHBlcmZvcm1Vbml0T2ZXb3JrKHdvcmtJblByb2dyZXNzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW5kZXJSb290Q29uY3VycmVudChyb290LCBsYW5lcykge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IFJlbmRlckNvbnRleHQ7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IHB1c2hEaXNwYXRjaGVyKCk7IC8vIElmIHRoZSByb290IG9yIGxhbmVzIGhhdmUgY2hhbmdlZCwgdGhyb3cgb3V0IHRoZSBleGlzdGluZyBzdGFja1xuICAvLyBhbmQgcHJlcGFyZSBhIGZyZXNoIG9uZS4gT3RoZXJ3aXNlIHdlJ2xsIGNvbnRpbnVlIHdoZXJlIHdlIGxlZnQgb2ZmLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgIT09IHJvb3QgfHwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgIT09IGxhbmVzKSB7XG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuXG4gICAgICAgIGlmIChtZW1vaXplZFVwZGF0ZXJzLnNpemUgPiAwKSB7XG4gICAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycy5jbGVhcigpO1xuICAgICAgICB9IC8vIEF0IHRoaXMgcG9pbnQsIG1vdmUgRmliZXJzIHRoYXQgc2NoZWR1bGVkIHRoZSB1cGNvbWluZyB3b3JrIGZyb20gdGhlIE1hcCB0byB0aGUgU2V0LlxuICAgICAgICAvLyBJZiB3ZSBiYWlsb3V0IG9uIHRoaXMgd29yaywgd2UnbGwgbW92ZSB0aGVtIGJhY2sgKGxpa2UgYWJvdmUpLlxuICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBtb3ZlIHRoZW0gbm93IGluIGNhc2UgdGhlIHdvcmsgc3Bhd25zIG1vcmUgd29yayBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoIGRpZmZlcmVudCB1cGRhdGVycy5cbiAgICAgICAgLy8gVGhhdCB3YXkgd2UgY2FuIGtlZXAgdGhlIGN1cnJlbnQgdXBkYXRlIGFuZCBmdXR1cmUgdXBkYXRlcyBzZXBhcmF0ZS5cblxuXG4gICAgICAgIG1vdmVQZW5kaW5nRmliZXJzVG9NZW1vaXplZChyb290LCBsYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyA9IGdldFRyYW5zaXRpb25zRm9yTGFuZXMoKTtcbiAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgbGFuZXMpO1xuICB9XG5cbiAge1xuICAgIG1hcmtSZW5kZXJTdGFydGVkKGxhbmVzKTtcbiAgfVxuXG4gIGRvIHtcbiAgICB0cnkge1xuICAgICAgd29ya0xvb3BDb25jdXJyZW50KCk7XG4gICAgICBicmVhaztcbiAgICB9IGNhdGNoICh0aHJvd25WYWx1ZSkge1xuICAgICAgaGFuZGxlRXJyb3Iocm9vdCwgdGhyb3duVmFsdWUpO1xuICAgIH1cbiAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpO1xuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG5cblxuICBpZiAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICAvLyBTdGlsbCB3b3JrIHJlbWFpbmluZy5cbiAgICB7XG4gICAgICBtYXJrUmVuZGVyWWllbGRlZCgpO1xuICAgIH1cblxuICAgIHJldHVybiBSb290SW5Qcm9ncmVzcztcbiAgfSBlbHNlIHtcbiAgICAvLyBDb21wbGV0ZWQgdGhlIHRyZWUuXG4gICAge1xuICAgICAgbWFya1JlbmRlclN0b3BwZWQoKTtcbiAgICB9IC8vIFNldCB0aGlzIHRvIG51bGwgdG8gaW5kaWNhdGUgdGhlcmUncyBubyBpbi1wcm9ncmVzcyByZW5kZXIuXG5cblxuICAgIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzOyAvLyBSZXR1cm4gdGhlIGZpbmFsIGV4aXQgc3RhdHVzLlxuXG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXM7XG4gIH1cbn1cbi8qKiBAbm9pbmxpbmUgKi9cblxuXG5mdW5jdGlvbiB3b3JrTG9vcENvbmN1cnJlbnQoKSB7XG4gIC8vIFBlcmZvcm0gd29yayB1bnRpbCBTY2hlZHVsZXIgYXNrcyB1cyB0byB5aWVsZFxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwgJiYgIXNob3VsZFlpZWxkKCkpIHtcbiAgICBwZXJmb3JtVW5pdE9mV29yayh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGVyZm9ybVVuaXRPZldvcmsodW5pdE9mV29yaykge1xuICAvLyBUaGUgY3VycmVudCwgZmx1c2hlZCwgc3RhdGUgb2YgdGhpcyBmaWJlciBpcyB0aGUgYWx0ZXJuYXRlLiBJZGVhbGx5XG4gIC8vIG5vdGhpbmcgc2hvdWxkIHJlbHkgb24gdGhpcywgYnV0IHJlbHlpbmcgb24gaXQgaGVyZSBtZWFucyB0aGF0IHdlIGRvbid0XG4gIC8vIG5lZWQgYW4gYWRkaXRpb25hbCBmaWVsZCBvbiB0aGUgd29yayBpbiBwcm9ncmVzcy5cbiAgdmFyIGN1cnJlbnQgPSB1bml0T2ZXb3JrLmFsdGVybmF0ZTtcbiAgc2V0Q3VycmVudEZpYmVyKHVuaXRPZldvcmspO1xuICB2YXIgbmV4dDtcblxuICBpZiAoICh1bml0T2ZXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIHN0YXJ0UHJvZmlsZXJUaW1lcih1bml0T2ZXb3JrKTtcbiAgICBuZXh0ID0gYmVnaW5Xb3JrJDEoY3VycmVudCwgdW5pdE9mV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKHVuaXRPZldvcmssIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIG5leHQgPSBiZWdpbldvcmskMShjdXJyZW50LCB1bml0T2ZXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgdW5pdE9mV29yay5tZW1vaXplZFByb3BzID0gdW5pdE9mV29yay5wZW5kaW5nUHJvcHM7XG5cbiAgaWYgKG5leHQgPT09IG51bGwpIHtcbiAgICAvLyBJZiB0aGlzIGRvZXNuJ3Qgc3Bhd24gbmV3IHdvcmssIGNvbXBsZXRlIHRoZSBjdXJyZW50IHdvcmsuXG4gICAgY29tcGxldGVVbml0T2ZXb3JrKHVuaXRPZldvcmspO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzID0gbmV4dDtcbiAgfVxuXG4gIFJlYWN0Q3VycmVudE93bmVyJDIuY3VycmVudCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbXBsZXRlVW5pdE9mV29yayh1bml0T2ZXb3JrKSB7XG4gIC8vIEF0dGVtcHQgdG8gY29tcGxldGUgdGhlIGN1cnJlbnQgdW5pdCBvZiB3b3JrLCB0aGVuIG1vdmUgdG8gdGhlIG5leHRcbiAgLy8gc2libGluZy4gSWYgdGhlcmUgYXJlIG5vIG1vcmUgc2libGluZ3MsIHJldHVybiB0byB0aGUgcGFyZW50IGZpYmVyLlxuICB2YXIgY29tcGxldGVkV29yayA9IHVuaXRPZldvcms7XG5cbiAgZG8ge1xuICAgIC8vIFRoZSBjdXJyZW50LCBmbHVzaGVkLCBzdGF0ZSBvZiB0aGlzIGZpYmVyIGlzIHRoZSBhbHRlcm5hdGUuIElkZWFsbHlcbiAgICAvLyBub3RoaW5nIHNob3VsZCByZWx5IG9uIHRoaXMsIGJ1dCByZWx5aW5nIG9uIGl0IGhlcmUgbWVhbnMgdGhhdCB3ZSBkb24ndFxuICAgIC8vIG5lZWQgYW4gYWRkaXRpb25hbCBmaWVsZCBvbiB0aGUgd29yayBpbiBwcm9ncmVzcy5cbiAgICB2YXIgY3VycmVudCA9IGNvbXBsZXRlZFdvcmsuYWx0ZXJuYXRlO1xuICAgIHZhciByZXR1cm5GaWJlciA9IGNvbXBsZXRlZFdvcmsucmV0dXJuOyAvLyBDaGVjayBpZiB0aGUgd29yayBjb21wbGV0ZWQgb3IgaWYgc29tZXRoaW5nIHRocmV3LlxuXG4gICAgaWYgKChjb21wbGV0ZWRXb3JrLmZsYWdzICYgSW5jb21wbGV0ZSkgPT09IE5vRmxhZ3MpIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihjb21wbGV0ZWRXb3JrKTtcbiAgICAgIHZhciBuZXh0ID0gdm9pZCAwO1xuXG4gICAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICBuZXh0ID0gY29tcGxldGVXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydFByb2ZpbGVyVGltZXIoY29tcGxldGVkV29yayk7XG4gICAgICAgIG5leHQgPSBjb21wbGV0ZVdvcmsoY3VycmVudCwgY29tcGxldGVkV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTsgLy8gVXBkYXRlIHJlbmRlciBkdXJhdGlvbiBhc3N1bWluZyB3ZSBkaWRuJ3QgZXJyb3IuXG5cbiAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShjb21wbGV0ZWRXb3JrLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG5cbiAgICAgIGlmIChuZXh0ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIENvbXBsZXRpbmcgdGhpcyBmaWJlciBzcGF3bmVkIG5ldyB3b3JrLiBXb3JrIG9uIHRoYXQgbmV4dC5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBuZXh0O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgZmliZXIgZGlkIG5vdCBjb21wbGV0ZSBiZWNhdXNlIHNvbWV0aGluZyB0aHJldy4gUG9wIHZhbHVlcyBvZmZcbiAgICAgIC8vIHRoZSBzdGFjayB3aXRob3V0IGVudGVyaW5nIHRoZSBjb21wbGV0ZSBwaGFzZS4gSWYgdGhpcyBpcyBhIGJvdW5kYXJ5LFxuICAgICAgLy8gY2FwdHVyZSB2YWx1ZXMgaWYgcG9zc2libGUuXG4gICAgICB2YXIgX25leHQgPSB1bndpbmRXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmspOyAvLyBCZWNhdXNlIHRoaXMgZmliZXIgZGlkIG5vdCBjb21wbGV0ZSwgZG9uJ3QgcmVzZXQgaXRzIGxhbmVzLlxuXG5cbiAgICAgIGlmIChfbmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiBjb21wbGV0aW5nIHRoaXMgd29yayBzcGF3bmVkIG5ldyB3b3JrLCBkbyB0aGF0IG5leHQuIFdlJ2xsIGNvbWVcbiAgICAgICAgLy8gYmFjayBoZXJlIGFnYWluLlxuICAgICAgICAvLyBTaW5jZSB3ZSdyZSByZXN0YXJ0aW5nLCByZW1vdmUgYW55dGhpbmcgdGhhdCBpcyBub3QgYSBob3N0IGVmZmVjdFxuICAgICAgICAvLyBmcm9tIHRoZSBlZmZlY3QgdGFnLlxuICAgICAgICBfbmV4dC5mbGFncyAmPSBIb3N0RWZmZWN0TWFzaztcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBfbmV4dDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAvLyBSZWNvcmQgdGhlIHJlbmRlciBkdXJhdGlvbiBmb3IgdGhlIGZpYmVyIHRoYXQgZXJyb3JlZC5cbiAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShjb21wbGV0ZWRXb3JrLCBmYWxzZSk7IC8vIEluY2x1ZGUgdGhlIHRpbWUgc3BlbnQgd29ya2luZyBvbiBmYWlsZWQgY2hpbGRyZW4gYmVmb3JlIGNvbnRpbnVpbmcuXG5cbiAgICAgICAgdmFyIGFjdHVhbER1cmF0aW9uID0gY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbjtcbiAgICAgICAgdmFyIGNoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICBhY3R1YWxEdXJhdGlvbiArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbjtcbiAgICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uID0gYWN0dWFsRHVyYXRpb247XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAvLyBNYXJrIHRoZSBwYXJlbnQgZmliZXIgYXMgaW5jb21wbGV0ZSBhbmQgY2xlYXIgaXRzIHN1YnRyZWUgZmxhZ3MuXG4gICAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IEluY29tcGxldGU7XG4gICAgICAgIHJldHVybkZpYmVyLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXZSd2ZSB1bndvdW5kIGFsbCB0aGUgd2F5IHRvIHRoZSByb290LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdERpZE5vdENvbXBsZXRlO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc2libGluZ0ZpYmVyID0gY29tcGxldGVkV29yay5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmdGaWJlciAhPT0gbnVsbCkge1xuICAgICAgLy8gSWYgdGhlcmUgaXMgbW9yZSB3b3JrIHRvIGRvIGluIHRoaXMgcmV0dXJuRmliZXIsIGRvIHRoYXQgbmV4dC5cbiAgICAgIHdvcmtJblByb2dyZXNzID0gc2libGluZ0ZpYmVyO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gT3RoZXJ3aXNlLCByZXR1cm4gdG8gdGhlIHBhcmVudFxuXG5cbiAgICBjb21wbGV0ZWRXb3JrID0gcmV0dXJuRmliZXI7IC8vIFVwZGF0ZSB0aGUgbmV4dCB0aGluZyB3ZSdyZSB3b3JraW5nIG9uIGluIGNhc2Ugc29tZXRoaW5nIHRocm93cy5cblxuICAgIHdvcmtJblByb2dyZXNzID0gY29tcGxldGVkV29yaztcbiAgfSB3aGlsZSAoY29tcGxldGVkV29yayAhPT0gbnVsbCk7IC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIHJvb3QuXG5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3MpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdENvbXBsZXRlZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRSb290KHJvb3QsIHJlY292ZXJhYmxlRXJyb3JzLCB0cmFuc2l0aW9ucykge1xuICAvLyBUT0RPOiBUaGlzIG5vIGxvbmdlciBtYWtlcyBhbnkgc2Vuc2UuIFdlIGFscmVhZHkgd3JhcCB0aGUgbXV0YXRpb24gYW5kXG4gIC8vIGxheW91dCBwaGFzZXMuIFNob3VsZCBiZSBhYmxlIHRvIHJlbW92ZS5cbiAgdmFyIHByZXZpb3VzVXBkYXRlTGFuZVByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcblxuICB0cnkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgY29tbWl0Um9vdEltcGwocm9vdCwgcmVjb3ZlcmFibGVFcnJvcnMsIHRyYW5zaXRpb25zLCBwcmV2aW91c1VwZGF0ZUxhbmVQcmlvcml0eSk7XG4gIH0gZmluYWxseSB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzVXBkYXRlTGFuZVByaW9yaXR5KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21taXRSb290SW1wbChyb290LCByZWNvdmVyYWJsZUVycm9ycywgdHJhbnNpdGlvbnMsIHJlbmRlclByaW9yaXR5TGV2ZWwpIHtcbiAgZG8ge1xuICAgIC8vIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCB3aWxsIGNhbGwgYGZsdXNoU3luY1VwZGF0ZVF1ZXVlYCBhdCB0aGUgZW5kLCB3aGljaFxuICAgIC8vIG1lYW5zIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCB3aWxsIHNvbWV0aW1lcyByZXN1bHQgaW4gYWRkaXRpb25hbFxuICAgIC8vIHBhc3NpdmUgZWZmZWN0cy4gU28gd2UgbmVlZCB0byBrZWVwIGZsdXNoaW5nIGluIGEgbG9vcCB1bnRpbCB0aGVyZSBhcmVcbiAgICAvLyBubyBtb3JlIHBlbmRpbmcgZWZmZWN0cy5cbiAgICAvLyBUT0RPOiBNaWdodCBiZSBiZXR0ZXIgaWYgYGZsdXNoUGFzc2l2ZUVmZmVjdHNgIGRpZCBub3QgYXV0b21hdGljYWxseVxuICAgIC8vIGZsdXNoIHN5bmNocm9ub3VzIHdvcmsgYXQgdGhlIGVuZCwgdG8gYXZvaWQgZmFjdG9yaW5nIGhhemFyZHMgbGlrZSB0aGlzLlxuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgfSB3aGlsZSAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgIT09IG51bGwpO1xuXG4gIGZsdXNoUmVuZGVyUGhhc2VTdHJpY3RNb2RlV2FybmluZ3NJbkRFVigpO1xuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBub3QgYWxyZWFkeSBiZSB3b3JraW5nLicpO1xuICB9XG5cbiAgdmFyIGZpbmlzaGVkV29yayA9IHJvb3QuZmluaXNoZWRXb3JrO1xuICB2YXIgbGFuZXMgPSByb290LmZpbmlzaGVkTGFuZXM7XG5cbiAge1xuICAgIG1hcmtDb21taXRTdGFydGVkKGxhbmVzKTtcbiAgfVxuXG4gIGlmIChmaW5pc2hlZFdvcmsgPT09IG51bGwpIHtcblxuICAgIHtcbiAgICAgIG1hcmtDb21taXRTdG9wcGVkKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgaWYgKGxhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgICAgIGVycm9yKCdyb290LmZpbmlzaGVkTGFuZXMgc2hvdWxkIG5vdCBiZSBlbXB0eSBkdXJpbmcgYSBjb21taXQuIFRoaXMgaXMgYSAnICsgJ2J1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByb290LmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IE5vTGFuZXM7XG5cbiAgaWYgKGZpbmlzaGVkV29yayA9PT0gcm9vdC5jdXJyZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29tbWl0IHRoZSBzYW1lIHRyZWUgYXMgYmVmb3JlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgJyArICdhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH0gLy8gY29tbWl0Um9vdCBuZXZlciByZXR1cm5zIGEgY29udGludWF0aW9uOyBpdCBhbHdheXMgZmluaXNoZXMgc3luY2hyb25vdXNseS5cbiAgLy8gU28gd2UgY2FuIGNsZWFyIHRoZXNlIG5vdyB0byBhbGxvdyBhIG5ldyBjYWxsYmFjayB0byBiZSBzY2hlZHVsZWQuXG5cblxuICByb290LmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZTsgLy8gVXBkYXRlIHRoZSBmaXJzdCBhbmQgbGFzdCBwZW5kaW5nIHRpbWVzIG9uIHRoaXMgcm9vdC4gVGhlIG5ldyBmaXJzdFxuICAvLyBwZW5kaW5nIHRpbWUgaXMgd2hhdGV2ZXIgaXMgbGVmdCBvbiB0aGUgcm9vdCBmaWJlci5cblxuICB2YXIgcmVtYWluaW5nTGFuZXMgPSBtZXJnZUxhbmVzKGZpbmlzaGVkV29yay5sYW5lcywgZmluaXNoZWRXb3JrLmNoaWxkTGFuZXMpO1xuICBtYXJrUm9vdEZpbmlzaGVkKHJvb3QsIHJlbWFpbmluZ0xhbmVzKTtcblxuICBpZiAocm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290KSB7XG4gICAgLy8gV2UgY2FuIHJlc2V0IHRoZXNlIG5vdyB0aGF0IHRoZXkgYXJlIGZpbmlzaGVkLlxuICAgIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgfSAvLyBJZiB0aGVyZSBhcmUgcGVuZGluZyBwYXNzaXZlIGVmZmVjdHMsIHNjaGVkdWxlIGEgY2FsbGJhY2sgdG8gcHJvY2VzcyB0aGVtLlxuICAvLyBEbyB0aGlzIGFzIGVhcmx5IGFzIHBvc3NpYmxlLCBzbyBpdCBpcyBxdWV1ZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UgdGhhdFxuICAvLyBtaWdodCBnZXQgc2NoZWR1bGVkIGluIHRoZSBjb21taXQgcGhhc2UuIChTZWUgIzE2NzE0LilcbiAgLy8gVE9ETzogRGVsZXRlIGFsbCBvdGhlciBwbGFjZXMgdGhhdCBzY2hlZHVsZSB0aGUgcGFzc2l2ZSBlZmZlY3QgY2FsbGJhY2tcbiAgLy8gVGhleSdyZSByZWR1bmRhbnQuXG5cblxuICBpZiAoKGZpbmlzaGVkV29yay5zdWJ0cmVlRmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MgfHwgKGZpbmlzaGVkV29yay5mbGFncyAmIFBhc3NpdmVNYXNrKSAhPT0gTm9GbGFncykge1xuICAgIGlmICghcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICAgIC8vIHRvIHN0b3JlIGl0IGluIHBlbmRpbmdQYXNzaXZlVHJhbnNpdGlvbnMgdW50aWwgdGhleSBnZXQgcHJvY2Vzc2VkXG4gICAgICAvLyBXZSBuZWVkIHRvIHBhc3MgdGhpcyB0aHJvdWdoIGFzIGFuIGFyZ3VtZW50IHRvIGNvbW1pdFJvb3RcbiAgICAgIC8vIGJlY2F1c2Ugd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyBtaWdodCBoYXZlIGNoYW5nZWQgYmV0d2VlblxuICAgICAgLy8gdGhlIHByZXZpb3VzIHJlbmRlciBhbmQgY29tbWl0IGlmIHdlIHRocm90dGxlIHRoZSBjb21taXRcbiAgICAgIC8vIHdpdGggc2V0VGltZW91dFxuXG4gICAgICBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gdHJhbnNpdGlvbnM7XG4gICAgICBzY2hlZHVsZUNhbGxiYWNrJDEoTm9ybWFsUHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpOyAvLyBUaGlzIHJlbmRlciB0cmlnZ2VyZWQgcGFzc2l2ZSBlZmZlY3RzOiByZWxlYXNlIHRoZSByb290IGNhY2hlIHBvb2xcbiAgICAgICAgLy8gKmFmdGVyKiBwYXNzaXZlIGVmZmVjdHMgZmlyZSB0byBhdm9pZCBmcmVlaW5nIGEgY2FjaGUgcG9vbCB0aGF0IG1heVxuICAgICAgICAvLyBiZSByZWZlcmVuY2VkIGJ5IGEgbm9kZSBpbiB0aGUgdHJlZSAoSG9zdFJvb3QsIENhY2hlIGJvdW5kYXJ5IGV0YylcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGVmZmVjdHMgaW4gdGhlIHdob2xlIHRyZWUuXG4gIC8vIFRPRE86IFRoaXMgaXMgbGVmdCBvdmVyIGZyb20gdGhlIGVmZmVjdCBsaXN0IGltcGxlbWVudGF0aW9uLCB3aGVyZSB3ZSBoYWRcbiAgLy8gdG8gY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYGZpcnN0RWZmZWN0YCB0byBzYXRpc2Z5IEZsb3cuIEkgdGhpbmsgdGhlXG4gIC8vIG9ubHkgb3RoZXIgcmVhc29uIHRoaXMgb3B0aW1pemF0aW9uIGV4aXN0cyBpcyBiZWNhdXNlIGl0IGFmZmVjdHMgcHJvZmlsaW5nLlxuICAvLyBSZWNvbnNpZGVyIHdoZXRoZXIgdGhpcyBpcyBuZWNlc3NhcnkuXG5cblxuICB2YXIgc3VidHJlZUhhc0VmZmVjdHMgPSAoZmluaXNoZWRXb3JrLnN1YnRyZWVGbGFncyAmIChCZWZvcmVNdXRhdGlvbk1hc2sgfCBNdXRhdGlvbk1hc2sgfCBMYXlvdXRNYXNrIHwgUGFzc2l2ZU1hc2spKSAhPT0gTm9GbGFncztcbiAgdmFyIHJvb3RIYXNFZmZlY3QgPSAoZmluaXNoZWRXb3JrLmZsYWdzICYgKEJlZm9yZU11dGF0aW9uTWFzayB8IE11dGF0aW9uTWFzayB8IExheW91dE1hc2sgfCBQYXNzaXZlTWFzaykpICE9PSBOb0ZsYWdzO1xuXG4gIGlmIChzdWJ0cmVlSGFzRWZmZWN0cyB8fCByb290SGFzRWZmZWN0KSB7XG4gICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcbiAgICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgfD0gQ29tbWl0Q29udGV4dDsgLy8gUmVzZXQgdGhpcyB0byBudWxsIGJlZm9yZSBjYWxsaW5nIGxpZmVjeWNsZXNcblxuICAgIFJlYWN0Q3VycmVudE93bmVyJDIuY3VycmVudCA9IG51bGw7IC8vIFRoZSBjb21taXQgcGhhc2UgaXMgYnJva2VuIGludG8gc2V2ZXJhbCBzdWItcGhhc2VzLiBXZSBkbyBhIHNlcGFyYXRlIHBhc3NcbiAgICAvLyBvZiB0aGUgZWZmZWN0IGxpc3QgZm9yIGVhY2ggcGhhc2U6IGFsbCBtdXRhdGlvbiBlZmZlY3RzIGNvbWUgYmVmb3JlIGFsbFxuICAgIC8vIGxheW91dCBlZmZlY3RzLCBhbmQgc28gb24uXG4gICAgLy8gVGhlIGZpcnN0IHBoYXNlIGEgXCJiZWZvcmUgbXV0YXRpb25cIiBwaGFzZS4gV2UgdXNlIHRoaXMgcGhhc2UgdG8gcmVhZCB0aGVcbiAgICAvLyBzdGF0ZSBvZiB0aGUgaG9zdCB0cmVlIHJpZ2h0IGJlZm9yZSB3ZSBtdXRhdGUgaXQuIFRoaXMgaXMgd2hlcmVcbiAgICAvLyBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSBpcyBjYWxsZWQuXG5cbiAgICB2YXIgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG5cbiAgICB7XG4gICAgICAvLyBNYXJrIHRoZSBjdXJyZW50IGNvbW1pdCB0aW1lIHRvIGJlIHNoYXJlZCBieSBhbGwgUHJvZmlsZXJzIGluIHRoaXNcbiAgICAgIC8vIGJhdGNoLiBUaGlzIGVuYWJsZXMgdGhlbSB0byBiZSBncm91cGVkIGxhdGVyLlxuICAgICAgcmVjb3JkQ29tbWl0VGltZSgpO1xuICAgIH1cblxuXG4gICAgY29tbWl0TXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgbGFuZXMpO1xuXG4gICAgcmVzZXRBZnRlckNvbW1pdChyb290LmNvbnRhaW5lckluZm8pOyAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyB0cmVlIGlzIG5vdyB0aGUgY3VycmVudCB0cmVlLiBUaGlzIG11c3QgY29tZSBhZnRlclxuICAgIC8vIHRoZSBtdXRhdGlvbiBwaGFzZSwgc28gdGhhdCB0aGUgcHJldmlvdXMgdHJlZSBpcyBzdGlsbCBjdXJyZW50IGR1cmluZ1xuICAgIC8vIGNvbXBvbmVudFdpbGxVbm1vdW50LCBidXQgYmVmb3JlIHRoZSBsYXlvdXQgcGhhc2UsIHNvIHRoYXQgdGhlIGZpbmlzaGVkXG4gICAgLy8gd29yayBpcyBjdXJyZW50IGR1cmluZyBjb21wb25lbnREaWRNb3VudC9VcGRhdGUuXG5cbiAgICByb290LmN1cnJlbnQgPSBmaW5pc2hlZFdvcms7IC8vIFRoZSBuZXh0IHBoYXNlIGlzIHRoZSBsYXlvdXQgcGhhc2UsIHdoZXJlIHdlIGNhbGwgZWZmZWN0cyB0aGF0IHJlYWRcblxuICAgIHtcbiAgICAgIG1hcmtMYXlvdXRFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gICAgfVxuXG4gICAgY29tbWl0TGF5b3V0RWZmZWN0cyhmaW5pc2hlZFdvcmssIHJvb3QsIGxhbmVzKTtcblxuICAgIHtcbiAgICAgIG1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCgpO1xuICAgIH1cbiAgICAvLyBvcHBvcnR1bml0eSB0byBwYWludC5cblxuXG4gICAgcmVxdWVzdFBhaW50KCk7XG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0OyAvLyBSZXNldCB0aGUgcHJpb3JpdHkgdG8gdGhlIHByZXZpb3VzIG5vbi1zeW5jIHZhbHVlLlxuXG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICB9IGVsc2Uge1xuICAgIC8vIE5vIGVmZmVjdHMuXG4gICAgcm9vdC5jdXJyZW50ID0gZmluaXNoZWRXb3JrOyAvLyBNZWFzdXJlIHRoZXNlIGFueXdheSBzbyB0aGUgZmxhbWVncmFwaCBleHBsaWNpdGx5IHNob3dzIHRoYXQgdGhlcmUgd2VyZVxuICAgIC8vIG5vIGVmZmVjdHMuXG4gICAgLy8gVE9ETzogTWF5YmUgdGhlcmUncyBhIGJldHRlciB3YXkgdG8gcmVwb3J0IHRoaXMuXG5cbiAgICB7XG4gICAgICByZWNvcmRDb21taXRUaW1lKCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3REaWRIYXZlUGFzc2l2ZUVmZmVjdHMgPSByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cztcblxuICBpZiAocm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAvLyBUaGlzIGNvbW1pdCBoYXMgcGFzc2l2ZSBlZmZlY3RzLiBTdGFzaCBhIHJlZmVyZW5jZSB0byB0aGVtLiBCdXQgZG9uJ3RcbiAgICAvLyBzY2hlZHVsZSBhIGNhbGxiYWNrIHVudGlsIGFmdGVyIGZsdXNoaW5nIGxheW91dCB3b3JrLlxuICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gICAgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSByb290O1xuICAgIHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzID0gbGFuZXM7XG4gIH0gZWxzZSB7XG5cbiAgICB7XG4gICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xuICAgICAgcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IG51bGw7XG4gICAgfVxuICB9IC8vIFJlYWQgdGhpcyBhZ2Fpbiwgc2luY2UgYW4gZWZmZWN0IG1pZ2h0IGhhdmUgdXBkYXRlZCBpdFxuXG5cbiAgcmVtYWluaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lczsgLy8gQ2hlY2sgaWYgdGhlcmUncyByZW1haW5pbmcgd29yayBvbiB0aGlzIHJvb3RcbiAgLy8gVE9ETzogVGhpcyBpcyBwYXJ0IG9mIHRoZSBgY29tcG9uZW50RGlkQ2F0Y2hgIGltcGxlbWVudGF0aW9uLiBJdHMgcHVycG9zZVxuICAvLyBpcyB0byBkZXRlY3Qgd2hldGhlciBzb21ldGhpbmcgbWlnaHQgaGF2ZSBjYWxsZWQgc2V0U3RhdGUgaW5zaWRlXG4gIC8vIGBjb21wb25lbnREaWRDYXRjaGAuIFRoZSBtZWNoYW5pc20gaXMga25vd24gdG8gYmUgZmxhd2VkIGJlY2F1c2UgYHNldFN0YXRlYFxuICAvLyBpbnNpZGUgYGNvbXBvbmVudERpZENhdGNoYCBpcyBpdHNlbGYgZmxhd2VkIOKAlCB0aGF0J3Mgd2h5IHdlIHJlY29tbWVuZFxuICAvLyBgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yYCBpbnN0ZWFkLiBIb3dldmVyLCBpdCBjb3VsZCBiZSBpbXByb3ZlZCBieVxuICAvLyBjaGVja2luZyBpZiByZW1haW5pbmdMYW5lcyBpbmNsdWRlcyBTeW5jIHdvcmssIGluc3RlYWQgb2Ygd2hldGhlciB0aGVyZSdzXG4gIC8vIGFueSB3b3JrIHJlbWFpbmluZyBhdCBhbGwgKHdoaWNoIHdvdWxkIGFsc28gaW5jbHVkZSBzdHVmZiBsaWtlIFN1c3BlbnNlXG4gIC8vIHJldHJpZXMgb3IgdHJhbnNpdGlvbnMpLiBJdCdzIGJlZW4gbGlrZSB0aGlzIGZvciBhIHdoaWxlLCB0aG91Z2gsIHNvIGZpeGluZ1xuICAvLyBpdCBwcm9iYWJseSBpc24ndCB0aGF0IHVyZ2VudC5cblxuICBpZiAocmVtYWluaW5nTGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBJZiB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLCB3ZSBjYW4gY2xlYXIgdGhlIHNldCBvZiBhbHJlYWR5IGZhaWxlZFxuICAgIC8vIGVycm9yIGJvdW5kYXJpZXMuXG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICghcm9vdERpZEhhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgICAgY29tbWl0RG91YmxlSW52b2tlRWZmZWN0c0luREVWKHJvb3QuY3VycmVudCwgZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ29tbWl0Um9vdChmaW5pc2hlZFdvcmsuc3RhdGVOb2RlLCByZW5kZXJQcmlvcml0eUxldmVsKTtcblxuICB7XG4gICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICByb290Lm1lbW9pemVkVXBkYXRlcnMuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgb25Db21taXRSb290JDEoKTtcbiAgfSAvLyBBbHdheXMgY2FsbCB0aGlzIGJlZm9yZSBleGl0aW5nIGBjb21taXRSb290YCwgdG8gZW5zdXJlIHRoYXQgYW55XG4gIC8vIGFkZGl0aW9uYWwgd29yayBvbiB0aGlzIHJvb3QgaXMgc2NoZWR1bGVkLlxuXG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcblxuICBpZiAocmVjb3ZlcmFibGVFcnJvcnMgIT09IG51bGwpIHtcbiAgICAvLyBUaGVyZSB3ZXJlIGVycm9ycyBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCByZWNvdmVyZWQgZnJvbSB0aGVtIHdpdGhvdXRcbiAgICAvLyBuZWVkaW5nIHRvIHN1cmZhY2UgaXQgdG8gdGhlIFVJLiBXZSBsb2cgdGhlbSBoZXJlLlxuICAgIHZhciBvblJlY292ZXJhYmxlRXJyb3IgPSByb290Lm9uUmVjb3ZlcmFibGVFcnJvcjtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVjb3ZlcmFibGVFcnJvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByZWNvdmVyYWJsZUVycm9yID0gcmVjb3ZlcmFibGVFcnJvcnNbaV07XG4gICAgICB2YXIgY29tcG9uZW50U3RhY2sgPSByZWNvdmVyYWJsZUVycm9yLnN0YWNrO1xuICAgICAgdmFyIGRpZ2VzdCA9IHJlY292ZXJhYmxlRXJyb3IuZGlnZXN0O1xuICAgICAgb25SZWNvdmVyYWJsZUVycm9yKHJlY292ZXJhYmxlRXJyb3IudmFsdWUsIHtcbiAgICAgICAgY29tcG9uZW50U3RhY2s6IGNvbXBvbmVudFN0YWNrLFxuICAgICAgICBkaWdlc3Q6IGRpZ2VzdFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGhhc1VuY2F1Z2h0RXJyb3IpIHtcbiAgICBoYXNVbmNhdWdodEVycm9yID0gZmFsc2U7XG4gICAgdmFyIGVycm9yJDEgPSBmaXJzdFVuY2F1Z2h0RXJyb3I7XG4gICAgZmlyc3RVbmNhdWdodEVycm9yID0gbnVsbDtcbiAgICB0aHJvdyBlcnJvciQxO1xuICB9IC8vIElmIHRoZSBwYXNzaXZlIGVmZmVjdHMgYXJlIHRoZSByZXN1bHQgb2YgYSBkaXNjcmV0ZSByZW5kZXIsIGZsdXNoIHRoZW1cbiAgLy8gc3luY2hyb25vdXNseSBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHRhc2sgc28gdGhhdCB0aGUgcmVzdWx0IGlzXG4gIC8vIGltbWVkaWF0ZWx5IG9ic2VydmFibGUuIE90aGVyd2lzZSwgd2UgYXNzdW1lIHRoYXQgdGhleSBhcmUgbm90XG4gIC8vIG9yZGVyLWRlcGVuZGVudCBhbmQgZG8gbm90IG5lZWQgdG8gYmUgb2JzZXJ2ZWQgYnkgZXh0ZXJuYWwgc3lzdGVtcywgc28gd2VcbiAgLy8gY2FuIHdhaXQgdW50aWwgYWZ0ZXIgcGFpbnQuXG4gIC8vIFRPRE86IFdlIGNhbiBvcHRpbWl6ZSB0aGlzIGJ5IG5vdCBzY2hlZHVsaW5nIHRoZSBjYWxsYmFjayBlYXJsaWVyLiBTaW5jZSB3ZVxuICAvLyBjdXJyZW50bHkgc2NoZWR1bGUgdGhlIGNhbGxiYWNrIGluIG11bHRpcGxlIHBsYWNlcywgd2lsbCB3YWl0IHVudGlsIHRob3NlXG4gIC8vIGFyZSBjb25zb2xpZGF0ZWQuXG5cblxuICBpZiAoaW5jbHVkZXNTb21lTGFuZShwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcywgU3luY0xhbmUpICYmIHJvb3QudGFnICE9PSBMZWdhY3lSb290KSB7XG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB9IC8vIFJlYWQgdGhpcyBhZ2Fpbiwgc2luY2UgYSBwYXNzaXZlIGVmZmVjdCBtaWdodCBoYXZlIHVwZGF0ZWQgaXRcblxuXG4gIHJlbWFpbmluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7XG5cbiAgaWYgKGluY2x1ZGVzU29tZUxhbmUocmVtYWluaW5nTGFuZXMsIFN5bmNMYW5lKSkge1xuICAgIHtcbiAgICAgIG1hcmtOZXN0ZWRVcGRhdGVTY2hlZHVsZWQoKTtcbiAgICB9IC8vIENvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHJvb3Qgc3luY2hyb25vdXNseSByZS1yZW5kZXJzIHdpdGhvdXRcbiAgICAvLyBmaW5pc2hpbmcuIElmIHRoZXJlIGFyZSB0b28gbWFueSwgaXQgaW5kaWNhdGVzIGFuIGluZmluaXRlIHVwZGF0ZSBsb29wLlxuXG5cbiAgICBpZiAocm9vdCA9PT0gcm9vdFdpdGhOZXN0ZWRVcGRhdGVzKSB7XG4gICAgICBuZXN0ZWRVcGRhdGVDb3VudCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gICAgICByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSByb290O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gIH0gLy8gSWYgbGF5b3V0IHdvcmsgd2FzIHNjaGVkdWxlZCwgZmx1c2ggaXQgbm93LlxuXG5cbiAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG5cbiAge1xuICAgIG1hcmtDb21taXRTdG9wcGVkKCk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmx1c2hQYXNzaXZlRWZmZWN0cygpIHtcbiAgLy8gUmV0dXJucyB3aGV0aGVyIHBhc3NpdmUgZWZmZWN0cyB3ZXJlIGZsdXNoZWQuXG4gIC8vIFRPRE86IENvbWJpbmUgdGhpcyBjaGVjayB3aXRoIHRoZSBvbmUgaW4gZmx1c2hQYXNzaXZlRUZmZWN0c0ltcGwuIFdlIHNob3VsZFxuICAvLyBwcm9iYWJseSBqdXN0IGNvbWJpbmUgdGhlIHR3byBmdW5jdGlvbnMuIEkgYmVsaWV2ZSB0aGV5IHdlcmUgb25seSBzZXBhcmF0ZVxuICAvLyBpbiB0aGUgZmlyc3QgcGxhY2UgYmVjYXVzZSB3ZSB1c2VkIHRvIHdyYXAgaXQgd2l0aFxuICAvLyBgU2NoZWR1bGVyLnJ1bldpdGhQcmlvcml0eWAsIHdoaWNoIGFjY2VwdHMgYSBmdW5jdGlvbi4gQnV0IG5vdyB3ZSB0cmFjayB0aGVcbiAgLy8gcHJpb3JpdHkgd2l0aGluIFJlYWN0IGl0c2VsZiwgc28gd2UgY2FuIG11dGF0ZSB0aGUgdmFyaWFibGUgZGlyZWN0bHkuXG4gIGlmIChyb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyAhPT0gbnVsbCkge1xuICAgIHZhciByZW5kZXJQcmlvcml0eSA9IGxhbmVzVG9FdmVudFByaW9yaXR5KHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzKTtcbiAgICB2YXIgcHJpb3JpdHkgPSBsb3dlckV2ZW50UHJpb3JpdHkoRGVmYXVsdEV2ZW50UHJpb3JpdHksIHJlbmRlclByaW9yaXR5KTtcbiAgICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG4gICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICAgIHRyeSB7XG4gICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByaW9yaXR5KTtcbiAgICAgIHJldHVybiBmbHVzaFBhc3NpdmVFZmZlY3RzSW1wbCgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjsgLy8gT25jZSBwYXNzaXZlIGVmZmVjdHMgaGF2ZSBydW4gZm9yIHRoZSB0cmVlIC0gZ2l2aW5nIGNvbXBvbmVudHMgYVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGVucXVldWVQZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0KGZpYmVyKSB7XG4gIHtcbiAgICBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cy5wdXNoKGZpYmVyKTtcblxuICAgIGlmICghcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICAgIHNjaGVkdWxlQ2FsbGJhY2skMShOb3JtYWxQcmlvcml0eSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoUGFzc2l2ZUVmZmVjdHNJbXBsKCkge1xuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gQ2FjaGUgYW5kIGNsZWFyIHRoZSB0cmFuc2l0aW9ucyBmbGFnXG5cblxuICB2YXIgdHJhbnNpdGlvbnMgPSBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zO1xuICBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gbnVsbDtcbiAgdmFyIHJvb3QgPSByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cztcbiAgdmFyIGxhbmVzID0gcGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXM7XG4gIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gbnVsbDsgLy8gVE9ETzogVGhpcyBpcyBzb21ldGltZXMgb3V0IG9mIHN5bmMgd2l0aCByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cy5cbiAgLy8gRmlndXJlIG91dCB3aHkgYW5kIGZpeCBpdC4gSXQncyBub3QgY2F1c2luZyBhbnkga25vd24gaXNzdWVzIChwcm9iYWJseVxuICAvLyBiZWNhdXNlIGl0J3Mgb25seSB1c2VkIGZvciBwcm9maWxpbmcpLCBidXQgaXQncyBhIHJlZmFjdG9yIGhhemFyZC5cblxuICBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IE5vTGFuZXM7XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZsdXNoIHBhc3NpdmUgZWZmZWN0cyB3aGlsZSBhbHJlYWR5IHJlbmRlcmluZy4nKTtcbiAgfVxuXG4gIHtcbiAgICBpc0ZsdXNoaW5nUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkKGxhbmVzKTtcbiAgfVxuXG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQ29tbWl0Q29udGV4dDtcbiAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzKHJvb3QuY3VycmVudCk7XG4gIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHMocm9vdCwgcm9vdC5jdXJyZW50LCBsYW5lcywgdHJhbnNpdGlvbnMpOyAvLyBUT0RPOiBNb3ZlIHRvIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNcblxuICB7XG4gICAgdmFyIHByb2ZpbGVyRWZmZWN0cyA9IHBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3RzO1xuICAgIHBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3RzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb2ZpbGVyRWZmZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIF9maWJlciA9IHByb2ZpbGVyRWZmZWN0c1tpXTtcbiAgICAgIGNvbW1pdFBhc3NpdmVFZmZlY3REdXJhdGlvbnMocm9vdCwgX2ZpYmVyKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgbWFya1Bhc3NpdmVFZmZlY3RzU3RvcHBlZCgpO1xuICB9XG5cbiAge1xuICAgIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihyb290LmN1cnJlbnQsIHRydWUpO1xuICB9XG5cbiAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcblxuICB7XG4gICAgLy8gSWYgYWRkaXRpb25hbCBwYXNzaXZlIGVmZmVjdHMgd2VyZSBzY2hlZHVsZWQsIGluY3JlbWVudCBhIGNvdW50ZXIuIElmIHRoaXNcbiAgICAvLyBleGNlZWRzIHRoZSBsaW1pdCwgd2UnbGwgZmlyZSBhIHdhcm5pbmcuXG4gICAgaWYgKGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGlmIChyb290ID09PSByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzKSB7XG4gICAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICAgICAgcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IHJvb3Q7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gICAgZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xuICB9IC8vIFRPRE86IE1vdmUgdG8gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c1xuXG5cbiAgb25Qb3N0Q29tbWl0Um9vdChyb290KTtcblxuICB7XG4gICAgdmFyIHN0YXRlTm9kZSA9IHJvb3QuY3VycmVudC5zdGF0ZU5vZGU7XG4gICAgc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uID0gMDtcbiAgICBzdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSB7XG4gIHJldHVybiBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCAhPT0gbnVsbCAmJiBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZC5oYXMoaW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gbWFya0xlZ2FjeUVycm9yQm91bmRhcnlBc0ZhaWxlZChpbnN0YW5jZSkge1xuICBpZiAobGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPT09IG51bGwpIHtcbiAgICBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG5ldyBTZXQoW2luc3RhbmNlXSk7XG4gIH0gZWxzZSB7XG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQuYWRkKGluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9UaHJvd1VuY2F1Z2h0RXJyb3IoZXJyb3IpIHtcbiAgaWYgKCFoYXNVbmNhdWdodEVycm9yKSB7XG4gICAgaGFzVW5jYXVnaHRFcnJvciA9IHRydWU7XG4gICAgZmlyc3RVbmNhdWdodEVycm9yID0gZXJyb3I7XG4gIH1cbn1cblxudmFyIG9uVW5jYXVnaHRFcnJvciA9IHByZXBhcmVUb1Rocm93VW5jYXVnaHRFcnJvcjtcblxuZnVuY3Rpb24gY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3JPblJvb3Qocm9vdEZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IpIHtcbiAgdmFyIGVycm9ySW5mbyA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKGVycm9yLCBzb3VyY2VGaWJlcik7XG4gIHZhciB1cGRhdGUgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUocm9vdEZpYmVyLCBlcnJvckluZm8sIFN5bmNMYW5lKTtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKHJvb3RGaWJlciwgdXBkYXRlLCBTeW5jTGFuZSk7XG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgU3luY0xhbmUsIGV2ZW50VGltZSk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3Ioc291cmNlRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yJDEpIHtcbiAge1xuICAgIHJlcG9ydFVuY2F1Z2h0RXJyb3JJbkRFVihlcnJvciQxKTtcbiAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoZmFsc2UpO1xuICB9XG5cbiAgaWYgKHNvdXJjZUZpYmVyLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAvLyBFcnJvciB3YXMgdGhyb3duIGF0IHRoZSByb290LiBUaGVyZSBpcyBubyBwYXJlbnQsIHNvIHRoZSByb290XG4gICAgLy8gaXRzZWxmIHNob3VsZCBjYXB0dXJlIGl0LlxuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KHNvdXJjZUZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IkMSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGZpYmVyID0gbnVsbDtcblxuICB7XG4gICAgZmliZXIgPSBuZWFyZXN0TW91bnRlZEFuY2VzdG9yO1xuICB9XG5cbiAgd2hpbGUgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgaWYgKGZpYmVyLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KGZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IkMSk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICB2YXIgY3RvciA9IGZpYmVyLnR5cGU7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkge1xuICAgICAgICB2YXIgZXJyb3JJbmZvID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIoZXJyb3IkMSwgc291cmNlRmliZXIpO1xuICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZShmaWJlciwgZXJyb3JJbmZvLCBTeW5jTGFuZSk7XG4gICAgICAgIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBTeW5jTGFuZSk7XG4gICAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG5cbiAgICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgU3luY0xhbmUsIGV2ZW50VGltZSk7XG4gICAgICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmliZXIgPSBmaWJlci5yZXR1cm47XG4gIH1cblxuICB7XG4gICAgLy8gVE9ETzogVW50aWwgd2UgcmUtbGFuZCBza2lwVW5tb3VudGVkQm91bmRhcmllcyAoc2VlICMyMDE0NyksIHRoaXMgd2FybmluZ1xuICAgIC8vIHdpbGwgZmlyZSBmb3IgZXJyb3JzIHRoYXQgYXJlIHRocm93biBieSBkZXN0cm95IGZ1bmN0aW9ucyBpbnNpZGUgZGVsZXRlZFxuICAgIC8vIHRyZWVzLiBXaGF0IGl0IHNob3VsZCBpbnN0ZWFkIGRvIGlzIHByb3BhZ2F0ZSB0aGUgZXJyb3IgdG8gdGhlIHBhcmVudCBvZlxuICAgIC8vIHRoZSBkZWxldGVkIHRyZWUuIEluIHRoZSBtZWFudGltZSwgZG8gbm90IGFkZCB0aGlzIHdhcm5pbmcgdG8gdGhlXG4gICAgLy8gYWxsb3dsaXN0OyB0aGlzIGlzIG9ubHkgZm9yIG91ciBpbnRlcm5hbCB1c2UuXG4gICAgZXJyb3IoJ0ludGVybmFsIFJlYWN0IGVycm9yOiBBdHRlbXB0ZWQgdG8gY2FwdHVyZSBhIGNvbW1pdCBwaGFzZSBlcnJvciAnICsgJ2luc2lkZSBhIGRldGFjaGVkIHRyZWUuIFRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIFJlYWN0LiBMaWtlbHkgJyArICdjYXVzZXMgaW5jbHVkZSBkZWxldGluZyB0aGUgc2FtZSBmaWJlciBtb3JlIHRoYW4gb25jZSwgY29tbWl0dGluZyBhbiAnICsgJ2FscmVhZHktZmluaXNoZWQgdHJlZSwgb3IgYW4gaW5jb25zaXN0ZW50IHJldHVybiBwb2ludGVyLlxcblxcbicgKyAnRXJyb3IgbWVzc2FnZTpcXG5cXG4lcycsIGVycm9yJDEpO1xuICB9XG59XG5mdW5jdGlvbiBwaW5nU3VzcGVuZGVkUm9vdChyb290LCB3YWtlYWJsZSwgcGluZ2VkTGFuZXMpIHtcbiAgdmFyIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlO1xuXG4gIGlmIChwaW5nQ2FjaGUgIT09IG51bGwpIHtcbiAgICAvLyBUaGUgd2FrZWFibGUgcmVzb2x2ZWQsIHNvIHdlIG5vIGxvbmdlciBuZWVkIHRvIG1lbW9pemUsIGJlY2F1c2UgaXQgd2lsbFxuICAgIC8vIG5ldmVyIGJlIHRocm93biBhZ2Fpbi5cbiAgICBwaW5nQ2FjaGUuZGVsZXRlKHdha2VhYmxlKTtcbiAgfVxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIG1hcmtSb290UGluZ2VkKHJvb3QsIHBpbmdlZExhbmVzKTtcbiAgd2FybklmU3VzcGVuc2VSZXNvbHV0aW9uTm90V3JhcHBlZFdpdGhBY3RERVYocm9vdCk7XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCA9PT0gcm9vdCAmJiBpc1N1YnNldE9mTGFuZXMod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMsIHBpbmdlZExhbmVzKSkge1xuICAgIC8vIFJlY2VpdmVkIGEgcGluZyBhdCB0aGUgc2FtZSBwcmlvcml0eSBsZXZlbCBhdCB3aGljaCB3ZSdyZSBjdXJyZW50bHlcbiAgICAvLyByZW5kZXJpbmcuIFdlIG1pZ2h0IHdhbnQgdG8gcmVzdGFydCB0aGlzIHJlbmRlci4gVGhpcyBzaG91bGQgbWlycm9yXG4gICAgLy8gdGhlIGxvZ2ljIG9mIHdoZXRoZXIgb3Igbm90IGEgcm9vdCBzdXNwZW5kcyBvbmNlIGl0IGNvbXBsZXRlcy5cbiAgICAvLyBUT0RPOiBJZiB3ZSdyZSByZW5kZXJpbmcgc3luYyBlaXRoZXIgZHVlIHRvIFN5bmMsIEJhdGNoZWQgb3IgZXhwaXJlZCxcbiAgICAvLyB3ZSBzaG91bGQgcHJvYmFibHkgbmV2ZXIgcmVzdGFydC5cbiAgICAvLyBJZiB3ZSdyZSBzdXNwZW5kZWQgd2l0aCBkZWxheSwgb3IgaWYgaXQncyBhIHJldHJ5LCB3ZSdsbCBhbHdheXMgc3VzcGVuZFxuICAgIC8vIHNvIHdlIGNhbiBhbHdheXMgcmVzdGFydC5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkICYmIGluY2x1ZGVzT25seVJldHJpZXMod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpICYmIG5vdygpIC0gZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA8IEZBTExCQUNLX1RIUk9UVExFX01TKSB7XG4gICAgICAvLyBSZXN0YXJ0IGZyb20gdGhlIHJvb3QuXG4gICAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRXZlbiB0aG91Z2ggd2UgY2FuJ3QgcmVzdGFydCByaWdodCBub3csIHdlIG1pZ2h0IGdldCBhblxuICAgICAgLy8gb3Bwb3J0dW5pdHkgbGF0ZXIuIFNvIHdlIG1hcmsgdGhpcyByZW5kZXIgYXMgaGF2aW5nIGEgcGluZy5cbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcywgcGluZ2VkTGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xufVxuXG5mdW5jdGlvbiByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKSB7XG4gIC8vIFRoZSBib3VuZGFyeSBmaWJlciAoYSBTdXNwZW5zZSBjb21wb25lbnQgb3IgU3VzcGVuc2VMaXN0IGNvbXBvbmVudClcbiAgLy8gcHJldmlvdXNseSB3YXMgcmVuZGVyZWQgaW4gaXRzIGZhbGxiYWNrIHN0YXRlLiBPbmUgb2YgdGhlIHByb21pc2VzIHRoYXRcbiAgLy8gc3VzcGVuZGVkIGl0IGhhcyByZXNvbHZlZCwgd2hpY2ggbWVhbnMgYXQgbGVhc3QgcGFydCBvZiB0aGUgdHJlZSB3YXNcbiAgLy8gbGlrZWx5IHVuYmxvY2tlZC4gVHJ5IHJlbmRlcmluZyBhZ2FpbiwgYXQgYSBuZXcgbGFuZXMuXG4gIGlmIChyZXRyeUxhbmUgPT09IE5vTGFuZSkge1xuICAgIC8vIFRPRE86IEFzc2lnbiB0aGlzIHRvIGBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZWA/IHRvIGF2b2lkXG4gICAgLy8gdW5uZWNlc3NhcnkgZW50YW5nbGVtZW50P1xuICAgIHJldHJ5TGFuZSA9IHJlcXVlc3RSZXRyeUxhbmUoYm91bmRhcnlGaWJlcik7XG4gIH0gLy8gVE9ETzogU3BlY2lhbCBjYXNlIGlkbGUgcHJpb3JpdHk/XG5cblxuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIHJldHJ5TGFuZSwgZXZlbnRUaW1lKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXRyeURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIpIHtcbiAgdmFyIHN1c3BlbnNlU3RhdGUgPSBib3VuZGFyeUZpYmVyLm1lbW9pemVkU3RhdGU7XG4gIHZhciByZXRyeUxhbmUgPSBOb0xhbmU7XG5cbiAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHtcbiAgICByZXRyeUxhbmUgPSBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZTtcbiAgfVxuXG4gIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVJldHJ5V2FrZWFibGUoYm91bmRhcnlGaWJlciwgd2FrZWFibGUpIHtcbiAgdmFyIHJldHJ5TGFuZSA9IE5vTGFuZTsgLy8gRGVmYXVsdFxuXG4gIHZhciByZXRyeUNhY2hlO1xuXG4gIHN3aXRjaCAoYm91bmRhcnlGaWJlci50YWcpIHtcbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0cnlDYWNoZSA9IGJvdW5kYXJ5RmliZXIuc3RhdGVOb2RlO1xuICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBib3VuZGFyeUZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHJldHJ5TGFuZSA9IHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcmV0cnlDYWNoZSA9IGJvdW5kYXJ5RmliZXIuc3RhdGVOb2RlO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQaW5nZWQgdW5rbm93biBzdXNwZW5zZSBib3VuZGFyeSB0eXBlLiAnICsgJ1RoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gUmVhY3QuJyk7XG4gIH1cblxuICBpZiAocmV0cnlDYWNoZSAhPT0gbnVsbCkge1xuICAgIC8vIFRoZSB3YWtlYWJsZSByZXNvbHZlZCwgc28gd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gbWVtb2l6ZSwgYmVjYXVzZSBpdCB3aWxsXG4gICAgLy8gbmV2ZXIgYmUgdGhyb3duIGFnYWluLlxuICAgIHJldHJ5Q2FjaGUuZGVsZXRlKHdha2VhYmxlKTtcbiAgfVxuXG4gIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xufSAvLyBDb21wdXRlcyB0aGUgbmV4dCBKdXN0IE5vdGljZWFibGUgRGlmZmVyZW5jZSAoSk5EKSBib3VuZGFyeS5cbi8vIFRoZSB0aGVvcnkgaXMgdGhhdCBhIHBlcnNvbiBjYW4ndCB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc21hbGwgZGlmZmVyZW5jZXMgaW4gdGltZS5cbi8vIFRoZXJlZm9yZSwgaWYgd2Ugd2FpdCBhIGJpdCBsb25nZXIgdGhhbiBuZWNlc3NhcnkgdGhhdCB3b24ndCB0cmFuc2xhdGUgdG8gYSBub3RpY2VhYmxlXG4vLyBkaWZmZXJlbmNlIGluIHRoZSBleHBlcmllbmNlLiBIb3dldmVyLCB3YWl0aW5nIGZvciBsb25nZXIgbWlnaHQgbWVhbiB0aGF0IHdlIGNhbiBhdm9pZFxuLy8gc2hvd2luZyBhbiBpbnRlcm1lZGlhdGUgbG9hZGluZyBzdGF0ZS4gVGhlIGxvbmdlciB3ZSBoYXZlIGFscmVhZHkgd2FpdGVkLCB0aGUgaGFyZGVyIGl0XG4vLyBpcyB0byB0ZWxsIHNtYWxsIGRpZmZlcmVuY2VzIGluIHRpbWUuIFRoZXJlZm9yZSwgdGhlIGxvbmdlciB3ZSd2ZSBhbHJlYWR5IHdhaXRlZCxcbi8vIHRoZSBsb25nZXIgd2UgY2FuIHdhaXQgYWRkaXRpb25hbGx5LiBBdCBzb21lIHBvaW50IHdlIGhhdmUgdG8gZ2l2ZSB1cCB0aG91Z2guXG4vLyBXZSBwaWNrIGEgdHJhaW4gbW9kZWwgd2hlcmUgdGhlIG5leHQgYm91bmRhcnkgY29tbWl0cyBhdCBhIGNvbnNpc3RlbnQgc2NoZWR1bGUuXG4vLyBUaGVzZSBwYXJ0aWN1bGFyIG51bWJlcnMgYXJlIHZhZ3VlIGVzdGltYXRlcy4gV2UgZXhwZWN0IHRvIGFkanVzdCB0aGVtIGJhc2VkIG9uIHJlc2VhcmNoLlxuXG5mdW5jdGlvbiBqbmQodGltZUVsYXBzZWQpIHtcbiAgcmV0dXJuIHRpbWVFbGFwc2VkIDwgMTIwID8gMTIwIDogdGltZUVsYXBzZWQgPCA0ODAgPyA0ODAgOiB0aW1lRWxhcHNlZCA8IDEwODAgPyAxMDgwIDogdGltZUVsYXBzZWQgPCAxOTIwID8gMTkyMCA6IHRpbWVFbGFwc2VkIDwgMzAwMCA/IDMwMDAgOiB0aW1lRWxhcHNlZCA8IDQzMjAgPyA0MzIwIDogY2VpbCh0aW1lRWxhcHNlZCAvIDE5NjApICogMTk2MDtcbn1cblxuZnVuY3Rpb24gY2hlY2tGb3JOZXN0ZWRVcGRhdGVzKCkge1xuICBpZiAobmVzdGVkVXBkYXRlQ291bnQgPiBORVNURURfVVBEQVRFX0xJTUlUKSB7XG4gICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICAgIHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IG51bGw7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIHVwZGF0ZSBkZXB0aCBleGNlZWRlZC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb21wb25lbnQgJyArICdyZXBlYXRlZGx5IGNhbGxzIHNldFN0YXRlIGluc2lkZSBjb21wb25lbnRXaWxsVXBkYXRlIG9yICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiBuZXN0ZWQgdXBkYXRlcyB0byAnICsgJ3ByZXZlbnQgaW5maW5pdGUgbG9vcHMuJyk7XG4gIH1cblxuICB7XG4gICAgaWYgKG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA+IE5FU1RFRF9QQVNTSVZFX1VQREFURV9MSU1JVCkge1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICAgIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuXG4gICAgICBlcnJvcignTWF4aW11bSB1cGRhdGUgZGVwdGggZXhjZWVkZWQuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgY29tcG9uZW50ICcgKyBcImNhbGxzIHNldFN0YXRlIGluc2lkZSB1c2VFZmZlY3QsIGJ1dCB1c2VFZmZlY3QgZWl0aGVyIGRvZXNuJ3QgXCIgKyAnaGF2ZSBhIGRlcGVuZGVuY3kgYXJyYXksIG9yIG9uZSBvZiB0aGUgZGVwZW5kZW5jaWVzIGNoYW5nZXMgb24gJyArICdldmVyeSByZW5kZXIuJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoUmVuZGVyUGhhc2VTdHJpY3RNb2RlV2FybmluZ3NJbkRFVigpIHtcbiAge1xuICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmcoKTtcblxuICAgIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoUGVuZGluZ1Vuc2FmZUxpZmVjeWNsZVdhcm5pbmdzKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihmaWJlciwgaGFzUGFzc2l2ZUVmZmVjdHMpIHtcbiAge1xuICAgIC8vIFRPRE8gKFN0cmljdEVmZmVjdHMpIFNob3VsZCB3ZSBzZXQgYSBtYXJrZXIgb24gdGhlIHJvb3QgaWYgaXQgY29udGFpbnMgc3RyaWN0IGVmZmVjdHNcbiAgICAvLyBzbyB3ZSBkb24ndCB0cmF2ZXJzZSB1bm5lY2Vzc2FyaWx5PyBzaW1pbGFyIHRvIHN1YnRyZWVGbGFncyBidXQganVzdCBhdCB0aGUgcm9vdCBsZXZlbC5cbiAgICAvLyBNYXliZSBub3QgYSBiaWcgZGVhbCBzaW5jZSB0aGlzIGlzIERFViBvbmx5IGJlaGF2aW9yLlxuICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudExheW91dERldiwgaW52b2tlTGF5b3V0RWZmZWN0VW5tb3VudEluREVWKTtcblxuICAgIGlmIChoYXNQYXNzaXZlRWZmZWN0cykge1xuICAgICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudFBhc3NpdmVEZXYsIGludm9rZVBhc3NpdmVFZmZlY3RVbm1vdW50SW5ERVYpO1xuICAgIH1cblxuICAgIGludm9rZUVmZmVjdHNJbkRldihmaWJlciwgTW91bnRMYXlvdXREZXYsIGludm9rZUxheW91dEVmZmVjdE1vdW50SW5ERVYpO1xuXG4gICAgaWYgKGhhc1Bhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBpbnZva2VFZmZlY3RzSW5EZXYoZmliZXIsIE1vdW50UGFzc2l2ZURldiwgaW52b2tlUGFzc2l2ZUVmZmVjdE1vdW50SW5ERVYpO1xuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlRWZmZWN0c0luRGV2KGZpcnN0Q2hpbGQsIGZpYmVyRmxhZ3MsIGludm9rZUVmZmVjdEZuKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICB2YXIgY3VycmVudCA9IGZpcnN0Q2hpbGQ7XG4gICAgdmFyIHN1YnRyZWVSb290ID0gbnVsbDtcblxuICAgIHdoaWxlIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJpbWFyeVN1YnRyZWVGbGFnID0gY3VycmVudC5zdWJ0cmVlRmxhZ3MgJiBmaWJlckZsYWdzO1xuXG4gICAgICBpZiAoY3VycmVudCAhPT0gc3VidHJlZVJvb3QgJiYgY3VycmVudC5jaGlsZCAhPT0gbnVsbCAmJiBwcmltYXJ5U3VidHJlZUZsYWcgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKGN1cnJlbnQuZmxhZ3MgJiBmaWJlckZsYWdzKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgIGludm9rZUVmZmVjdEZuKGN1cnJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnQuc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnNpYmxpbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudCA9IHN1YnRyZWVSb290ID0gY3VycmVudC5yZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQgPSBudWxsO1xuZnVuY3Rpb24gd2FybkFib3V0VXBkYXRlT25Ob3RZZXRNb3VudGVkRmliZXJJbkRFVihmaWJlcikge1xuICB7XG4gICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCkge1xuICAgICAgLy8gV2UgbGV0IHRoZSBvdGhlciB3YXJuaW5nIGFib3V0IHJlbmRlciBwaGFzZSB1cGRhdGVzIGRlYWwgd2l0aCB0aGlzIG9uZS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIShmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHRhZyA9IGZpYmVyLnRhZztcblxuICAgIGlmICh0YWcgIT09IEluZGV0ZXJtaW5hdGVDb21wb25lbnQgJiYgdGFnICE9PSBIb3N0Um9vdCAmJiB0YWcgIT09IENsYXNzQ29tcG9uZW50ICYmIHRhZyAhPT0gRnVuY3Rpb25Db21wb25lbnQgJiYgdGFnICE9PSBGb3J3YXJkUmVmICYmIHRhZyAhPT0gTWVtb0NvbXBvbmVudCAmJiB0YWcgIT09IFNpbXBsZU1lbW9Db21wb25lbnQpIHtcbiAgICAgIC8vIE9ubHkgd2FybiBmb3IgdXNlci1kZWZpbmVkIGNvbXBvbmVudHMsIG5vdCBpbnRlcm5hbCBvbmVzIGxpa2UgU3VzcGVuc2UuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBXZSBzaG93IHRoZSB3aG9sZSBzdGFjayBidXQgZGVkdXBlIG9uIHRoZSB0b3AgY29tcG9uZW50J3MgbmFtZSBiZWNhdXNlXG4gICAgLy8gdGhlIHByb2JsZW1hdGljIGNvZGUgYWxtb3N0IGFsd2F5cyBsaWVzIGluc2lkZSB0aGF0IGNvbXBvbmVudC5cblxuXG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnUmVhY3RDb21wb25lbnQnO1xuXG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQgIT09IG51bGwpIHtcbiAgICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50Lmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50ID0gbmV3IFNldChbY29tcG9uZW50TmFtZV0pO1xuICAgIH1cblxuICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgIHRyeSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgICBlcnJvcihcIkNhbid0IHBlcmZvcm0gYSBSZWFjdCBzdGF0ZSB1cGRhdGUgb24gYSBjb21wb25lbnQgdGhhdCBoYXNuJ3QgbW91bnRlZCB5ZXQuIFwiICsgJ1RoaXMgaW5kaWNhdGVzIHRoYXQgeW91IGhhdmUgYSBzaWRlLWVmZmVjdCBpbiB5b3VyIHJlbmRlciBmdW5jdGlvbiB0aGF0ICcgKyAnYXN5bmNocm9ub3VzbHkgbGF0ZXIgY2FsbHMgdHJpZXMgdG8gdXBkYXRlIHRoZSBjb21wb25lbnQuIE1vdmUgdGhpcyB3b3JrIHRvICcgKyAndXNlRWZmZWN0IGluc3RlYWQuJyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChwcmV2aW91c0ZpYmVyKSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxudmFyIGJlZ2luV29yayQxO1xuXG57XG4gIHZhciBkdW1teUZpYmVyID0gbnVsbDtcblxuICBiZWdpbldvcmskMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcykge1xuICAgIC8vIElmIGEgY29tcG9uZW50IHRocm93cyBhbiBlcnJvciwgd2UgcmVwbGF5IGl0IGFnYWluIGluIGEgc3luY2hyb25vdXNseVxuICAgIC8vIGRpc3BhdGNoZWQgZXZlbnQsIHNvIHRoYXQgdGhlIGRlYnVnZ2VyIHdpbGwgdHJlYXQgaXQgYXMgYW4gdW5jYXVnaHRcbiAgICAvLyBlcnJvciBTZWUgUmVhY3RFcnJvclV0aWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgIC8vIEJlZm9yZSBlbnRlcmluZyB0aGUgYmVnaW4gcGhhc2UsIGNvcHkgdGhlIHdvcmstaW4tcHJvZ3Jlc3Mgb250byBhIGR1bW15XG4gICAgLy8gZmliZXIuIElmIGJlZ2luV29yayB0aHJvd3MsIHdlJ2xsIHVzZSB0aGlzIHRvIHJlc2V0IHRoZSBzdGF0ZS5cbiAgICB2YXIgb3JpZ2luYWxXb3JrSW5Qcm9ncmVzc0NvcHkgPSBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVihkdW1teUZpYmVyLCB1bml0T2ZXb3JrKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYmVnaW5Xb3JrKGN1cnJlbnQsIHVuaXRPZldvcmssIGxhbmVzKTtcbiAgICB9IGNhdGNoIChvcmlnaW5hbEVycm9yKSB7XG4gICAgICBpZiAoZGlkU3VzcGVuZE9yRXJyb3JXaGlsZUh5ZHJhdGluZ0RFVigpIHx8IG9yaWdpbmFsRXJyb3IgIT09IG51bGwgJiYgdHlwZW9mIG9yaWdpbmFsRXJyb3IgPT09ICdvYmplY3QnICYmIHR5cGVvZiBvcmlnaW5hbEVycm9yLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gRG9uJ3QgcmVwbGF5IHByb21pc2VzLlxuICAgICAgICAvLyBEb24ndCByZXBsYXkgZXJyb3JzIGlmIHdlIGFyZSBoeWRyYXRpbmcgYW5kIGhhdmUgYWxyZWFkeSBzdXNwZW5kZWQgb3IgaGFuZGxlZCBhbiBlcnJvclxuICAgICAgICB0aHJvdyBvcmlnaW5hbEVycm9yO1xuICAgICAgfSAvLyBLZWVwIHRoaXMgY29kZSBpbiBzeW5jIHdpdGggaGFuZGxlRXJyb3I7IGFueSBjaGFuZ2VzIGhlcmUgbXVzdCBoYXZlXG4gICAgICAvLyBjb3JyZXNwb25kaW5nIGNoYW5nZXMgdGhlcmUuXG5cblxuICAgICAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gICAgICByZXNldEhvb2tzQWZ0ZXJUaHJvdygpOyAvLyBEb24ndCByZXNldCBjdXJyZW50IGRlYnVnIGZpYmVyLCBzaW5jZSB3ZSdyZSBhYm91dCB0byB3b3JrIG9uIHRoZVxuICAgICAgLy8gc2FtZSBmaWJlciBhZ2Fpbi5cbiAgICAgIC8vIFVud2luZCB0aGUgZmFpbGVkIHN0YWNrIGZyYW1lXG5cbiAgICAgIHVud2luZEludGVycnVwdGVkV29yayhjdXJyZW50LCB1bml0T2ZXb3JrKTsgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcHJvcGVydGllcyBvZiB0aGUgZmliZXIuXG5cbiAgICAgIGFzc2lnbkZpYmVyUHJvcGVydGllc0luREVWKHVuaXRPZldvcmssIG9yaWdpbmFsV29ya0luUHJvZ3Jlc3NDb3B5KTtcblxuICAgICAgaWYgKCB1bml0T2ZXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAvLyBSZXNldCB0aGUgcHJvZmlsZXIgdGltZXIuXG4gICAgICAgIHN0YXJ0UHJvZmlsZXJUaW1lcih1bml0T2ZXb3JrKTtcbiAgICAgIH0gLy8gUnVuIGJlZ2luV29yayBhZ2Fpbi5cblxuXG4gICAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgYmVnaW5Xb3JrLCBudWxsLCBjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcyk7XG5cbiAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgIHZhciByZXBsYXlFcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcblxuICAgICAgICBpZiAodHlwZW9mIHJlcGxheUVycm9yID09PSAnb2JqZWN0JyAmJiByZXBsYXlFcnJvciAhPT0gbnVsbCAmJiByZXBsYXlFcnJvci5fc3VwcHJlc3NMb2dnaW5nICYmIHR5cGVvZiBvcmlnaW5hbEVycm9yID09PSAnb2JqZWN0JyAmJiBvcmlnaW5hbEVycm9yICE9PSBudWxsICYmICFvcmlnaW5hbEVycm9yLl9zdXBwcmVzc0xvZ2dpbmcpIHtcbiAgICAgICAgICAvLyBJZiBzdXBwcmVzc2VkLCBsZXQgdGhlIGZsYWcgY2Fycnkgb3ZlciB0byB0aGUgb3JpZ2luYWwgZXJyb3Igd2hpY2ggaXMgdGhlIG9uZSB3ZSdsbCByZXRocm93LlxuICAgICAgICAgIG9yaWdpbmFsRXJyb3IuX3N1cHByZXNzTG9nZ2luZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gV2UgYWx3YXlzIHRocm93IHRoZSBvcmlnaW5hbCBlcnJvciBpbiBjYXNlIHRoZSBzZWNvbmQgcmVuZGVyIHBhc3MgaXMgbm90IGlkZW1wb3RlbnQuXG4gICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgYSBtZW1vaXplZCBmdW5jdGlvbiBvciBDb21tb25KUyBtb2R1bGUgZG9lc24ndCB0aHJvdyBhZnRlciBmaXJzdCBpbnZvY2F0aW9uLlxuXG5cbiAgICAgIHRocm93IG9yaWdpbmFsRXJyb3I7XG4gICAgfVxuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIgPSBmYWxzZTtcbnZhciBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQ7XG5cbntcbiAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50ID0gbmV3IFNldCgpO1xufVxuXG5mdW5jdGlvbiB3YXJuQWJvdXRSZW5kZXJQaGFzZVVwZGF0ZXNJbkRFVihmaWJlcikge1xuICB7XG4gICAgaWYgKGlzUmVuZGVyaW5nICYmICFnZXRJc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlSW5ERVYoKSkge1xuICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHJlbmRlcmluZ0NvbXBvbmVudE5hbWUgPSB3b3JrSW5Qcm9ncmVzcyAmJiBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnVW5rbm93bic7IC8vIERlZHVwZSBieSB0aGUgcmVuZGVyaW5nIGNvbXBvbmVudCBiZWNhdXNlIGl0J3MgdGhlIG9uZSB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLlxuXG4gICAgICAgICAgICB2YXIgZGVkdXBlS2V5ID0gcmVuZGVyaW5nQ29tcG9uZW50TmFtZTtcblxuICAgICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQuaGFzKGRlZHVwZUtleSkpIHtcbiAgICAgICAgICAgICAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50LmFkZChkZWR1cGVLZXkpO1xuICAgICAgICAgICAgICB2YXIgc2V0U3RhdGVDb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nO1xuXG4gICAgICAgICAgICAgIGVycm9yKCdDYW5ub3QgdXBkYXRlIGEgY29tcG9uZW50IChgJXNgKSB3aGlsZSByZW5kZXJpbmcgYSAnICsgJ2RpZmZlcmVudCBjb21wb25lbnQgKGAlc2ApLiBUbyBsb2NhdGUgdGhlIGJhZCBzZXRTdGF0ZSgpIGNhbGwgaW5zaWRlIGAlc2AsICcgKyAnZm9sbG93IHRoZSBzdGFjayB0cmFjZSBhcyBkZXNjcmliZWQgaW4gaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NldHN0YXRlLWluLXJlbmRlcicsIHNldFN0YXRlQ29tcG9uZW50TmFtZSwgcmVuZGVyaW5nQ29tcG9uZW50TmFtZSwgcmVuZGVyaW5nQ29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICghZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIpIHtcbiAgICAgICAgICAgICAgZXJyb3IoJ0Nhbm5vdCB1cGRhdGUgZHVyaW5nIGFuIGV4aXN0aW5nIHN0YXRlIHRyYW5zaXRpb24gKHN1Y2ggYXMgJyArICd3aXRoaW4gYHJlbmRlcmApLiBSZW5kZXIgbWV0aG9kcyBzaG91bGQgYmUgYSBwdXJlICcgKyAnZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLicpO1xuXG4gICAgICAgICAgICAgIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuICAgICAgbWVtb2l6ZWRVcGRhdGVycy5mb3JFYWNoKGZ1bmN0aW9uIChzY2hlZHVsaW5nRmliZXIpIHtcbiAgICAgICAgYWRkRmliZXJUb0xhbmVzTWFwKHJvb3QsIHNjaGVkdWxpbmdGaWJlciwgbGFuZXMpO1xuICAgICAgfSk7IC8vIFRoaXMgZnVuY3Rpb24gaW50ZW50aW9uYWxseSBkb2VzIG5vdCBjbGVhciBtZW1vaXplZCB1cGRhdGVycy5cbiAgICAgIC8vIFRob3NlIG1heSBzdGlsbCBiZSByZWxldmFudCB0byB0aGUgY3VycmVudCBjb21taXRcbiAgICAgIC8vIGFuZCBhIGZ1dHVyZSBvbmUgKGUuZy4gU3VzcGVuc2UpLlxuICAgIH1cbiAgfVxufVxudmFyIGZha2VBY3RDYWxsYmFja05vZGUgPSB7fTtcblxuZnVuY3Rpb24gc2NoZWR1bGVDYWxsYmFjayQxKHByaW9yaXR5TGV2ZWwsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICAvLyBJZiB3ZSdyZSBjdXJyZW50bHkgaW5zaWRlIGFuIGBhY3RgIHNjb3BlLCBieXBhc3MgU2NoZWR1bGVyIGFuZCBwdXNoIHRvXG4gICAgLy8gdGhlIGBhY3RgIHF1ZXVlIGluc3RlYWQuXG4gICAgdmFyIGFjdFF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50O1xuXG4gICAgaWYgKGFjdFF1ZXVlICE9PSBudWxsKSB7XG4gICAgICBhY3RRdWV1ZS5wdXNoKGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiBmYWtlQWN0Q2FsbGJhY2tOb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc2NoZWR1bGVDYWxsYmFjayhwcmlvcml0eUxldmVsLCBjYWxsYmFjayk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNhbmNlbENhbGxiYWNrJDEoY2FsbGJhY2tOb2RlKSB7XG4gIGlmICggY2FsbGJhY2tOb2RlID09PSBmYWtlQWN0Q2FsbGJhY2tOb2RlKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIEluIHByb2R1Y3Rpb24sIGFsd2F5cyBjYWxsIFNjaGVkdWxlci4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHN0cmlwcGVkIG91dC5cblxuXG4gIHJldHVybiBjYW5jZWxDYWxsYmFjayhjYWxsYmFja05vZGUpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRGb3JjZUZsdXNoRmFsbGJhY2tzSW5ERVYoKSB7XG4gIC8vIE5ldmVyIGZvcmNlIGZsdXNoIGluIHByb2R1Y3Rpb24uIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGdldCBzdHJpcHBlZCBvdXQuXG4gIHJldHVybiAgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZVcGRhdGVzTm90V3JhcHBlZFdpdGhBY3RERVYoZmliZXIpIHtcbiAge1xuICAgIGlmIChmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgIGlmICghaXNDb25jdXJyZW50QWN0RW52aXJvbm1lbnQoKSkge1xuICAgICAgICAvLyBOb3QgaW4gYW4gYWN0IGVudmlyb25tZW50LiBObyBuZWVkIHRvIHdhcm4uXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTGVnYWN5IG1vZGUgaGFzIGFkZGl0aW9uYWwgY2FzZXMgd2hlcmUgd2Ugc3VwcHJlc3MgYSB3YXJuaW5nLlxuICAgICAgaWYgKCFpc0xlZ2FjeUFjdEVudmlyb25tZW50KCkpIHtcbiAgICAgICAgLy8gTm90IGluIGFuIGFjdCBlbnZpcm9ubWVudC4gTm8gbmVlZCB0byB3YXJuLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChleGVjdXRpb25Db250ZXh0ICE9PSBOb0NvbnRleHQpIHtcbiAgICAgICAgLy8gTGVnYWN5IG1vZGUgZG9lc24ndCB3YXJuIGlmIHRoZSB1cGRhdGUgaXMgYmF0Y2hlZCwgaS5lLlxuICAgICAgICAvLyBiYXRjaGVkVXBkYXRlcyBvciBmbHVzaFN5bmMuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpYmVyLnRhZyAhPT0gRnVuY3Rpb25Db21wb25lbnQgJiYgZmliZXIudGFnICE9PSBGb3J3YXJkUmVmICYmIGZpYmVyLnRhZyAhPT0gU2ltcGxlTWVtb0NvbXBvbmVudCkge1xuICAgICAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBwcmUtaG9va3MgY29kZSwgbGVnYWN5IG1vZGUgb25seVxuICAgICAgICAvLyB3YXJucyBmb3IgdXBkYXRlcyB0aGF0IG9yaWdpbmF0ZSBmcm9tIGEgaG9vay5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgICBlcnJvcignQW4gdXBkYXRlIHRvICVzIGluc2lkZSBhIHRlc3Qgd2FzIG5vdCB3cmFwcGVkIGluIGFjdCguLi4pLlxcblxcbicgKyAnV2hlbiB0ZXN0aW5nLCBjb2RlIHRoYXQgY2F1c2VzIFJlYWN0IHN0YXRlIHVwZGF0ZXMgc2hvdWxkIGJlICcgKyAnd3JhcHBlZCBpbnRvIGFjdCguLi4pOlxcblxcbicgKyAnYWN0KCgpID0+IHtcXG4nICsgJyAgLyogZmlyZSBldmVudHMgdGhhdCB1cGRhdGUgc3RhdGUgKi9cXG4nICsgJ30pO1xcbicgKyAnLyogYXNzZXJ0IG9uIHRoZSBvdXRwdXQgKi9cXG5cXG4nICsgXCJUaGlzIGVuc3VyZXMgdGhhdCB5b3UncmUgdGVzdGluZyB0aGUgYmVoYXZpb3IgdGhlIHVzZXIgd291bGQgc2VlIFwiICsgJ2luIHRoZSBicm93c2VyLicgKyAnIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dyYXAtdGVzdHMtd2l0aC1hY3QnLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuSWZTdXNwZW5zZVJlc29sdXRpb25Ob3RXcmFwcGVkV2l0aEFjdERFVihyb290KSB7XG4gIHtcbiAgICBpZiAocm9vdC50YWcgIT09IExlZ2FjeVJvb3QgJiYgaXNDb25jdXJyZW50QWN0RW52aXJvbm1lbnQoKSAmJiBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdBIHN1c3BlbmRlZCByZXNvdXJjZSBmaW5pc2hlZCBsb2FkaW5nIGluc2lkZSBhIHRlc3QsIGJ1dCB0aGUgZXZlbnQgJyArICd3YXMgbm90IHdyYXBwZWQgaW4gYWN0KC4uLikuXFxuXFxuJyArICdXaGVuIHRlc3RpbmcsIGNvZGUgdGhhdCByZXNvbHZlcyBzdXNwZW5kZWQgZGF0YSBzaG91bGQgYmUgd3JhcHBlZCAnICsgJ2ludG8gYWN0KC4uLik6XFxuXFxuJyArICdhY3QoKCkgPT4ge1xcbicgKyAnICAvKiBmaW5pc2ggbG9hZGluZyBzdXNwZW5kZWQgZGF0YSAqL1xcbicgKyAnfSk7XFxuJyArICcvKiBhc3NlcnQgb24gdGhlIG91dHB1dCAqL1xcblxcbicgKyBcIlRoaXMgZW5zdXJlcyB0aGF0IHlvdSdyZSB0ZXN0aW5nIHRoZSBiZWhhdmlvciB0aGUgdXNlciB3b3VsZCBzZWUgXCIgKyAnaW4gdGhlIGJyb3dzZXIuJyArICcgTGVhcm4gbW9yZSBhdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd3JhcC10ZXN0cy13aXRoLWFjdCcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoaXNSdW5uaW5nKSB7XG4gIHtcbiAgICBpc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QgPSBpc1J1bm5pbmc7XG4gIH1cbn1cblxuLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2RlcyAqL1xudmFyIHJlc29sdmVGYW1pbHkgPSBudWxsOyAvLyAkRmxvd0ZpeE1lIEZsb3cgZ2V0cyBjb25mdXNlZCBieSBhIFdlYWtTZXQgZmVhdHVyZSBjaGVjayBiZWxvdy5cblxudmFyIGZhaWxlZEJvdW5kYXJpZXMgPSBudWxsO1xudmFyIHNldFJlZnJlc2hIYW5kbGVyID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAge1xuICAgIHJlc29sdmVGYW1pbHkgPSBoYW5kbGVyO1xuICB9XG59O1xuZnVuY3Rpb24gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuXG4gICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkodHlwZSk7XG5cbiAgICBpZiAoZmFtaWx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH0gLy8gVXNlIHRoZSBsYXRlc3Qga25vd24gaW1wbGVtZW50YXRpb24uXG5cblxuICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAgLy8gTm8gaW1wbGVtZW50YXRpb24gZGlmZmVyZW5jZXMuXG4gIHJldHVybiByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZSk7XG59XG5mdW5jdGlvbiByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyh0eXBlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KHR5cGUpO1xuXG4gICAgaWYgKGZhbWlseSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSByZWFsIGZvcndhcmRSZWYuIERvbid0IHdhbnQgdG8gY3Jhc2ggZWFybHkuXG4gICAgICBpZiAodHlwZSAhPT0gbnVsbCAmJiB0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHR5cGUucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEZvcndhcmRSZWYgaXMgc3BlY2lhbCBiZWNhdXNlIGl0cyByZXNvbHZlZCAudHlwZSBpcyBhbiBvYmplY3QsXG4gICAgICAgIC8vIGJ1dCBpdCdzIHBvc3NpYmxlIHRoYXQgd2Ugb25seSBoYXZlIGl0cyBpbm5lciByZW5kZXIgZnVuY3Rpb24gaW4gdGhlIG1hcC5cbiAgICAgICAgLy8gSWYgdGhhdCBpbm5lciByZW5kZXIgZnVuY3Rpb24gaXMgZGlmZmVyZW50LCB3ZSdsbCBidWlsZCBhIG5ldyBmb3J3YXJkUmVmIHR5cGUuXG4gICAgICAgIHZhciBjdXJyZW50UmVuZGVyID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUucmVuZGVyKTtcblxuICAgICAgICBpZiAodHlwZS5yZW5kZXIgIT09IGN1cnJlbnRSZW5kZXIpIHtcbiAgICAgICAgICB2YXIgc3ludGhldGljVHlwZSA9IHtcbiAgICAgICAgICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgICAgICAgICAgcmVuZGVyOiBjdXJyZW50UmVuZGVyXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmICh0eXBlLmRpc3BsYXlOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN5bnRoZXRpY1R5cGUuZGlzcGxheU5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBzeW50aGV0aWNUeXBlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH0gLy8gVXNlIHRoZSBsYXRlc3Qga25vd24gaW1wbGVtZW50YXRpb24uXG5cblxuICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGZpYmVyLCBlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgcHJldlR5cGUgPSBmaWJlci5lbGVtZW50VHlwZTtcbiAgICB2YXIgbmV4dFR5cGUgPSBlbGVtZW50LnR5cGU7IC8vIElmIHdlIGdvdCBoZXJlLCB3ZSBrbm93IHR5cGVzIGFyZW4ndCA9PT0gZXF1YWwuXG5cbiAgICB2YXIgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSBmYWxzZTtcbiAgICB2YXIgJCR0eXBlb2ZOZXh0VHlwZSA9IHR5cGVvZiBuZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgbmV4dFR5cGUgIT09IG51bGwgPyBuZXh0VHlwZS4kJHR5cGVvZiA6IG51bGw7XG5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV4dFR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXh0VHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHRoZSBpbm5lciB0eXBlIHlldC5cbiAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGFzc3VtZSB0aGF0IHRoZSBsYXp5IGlubmVyIHR5cGUgaXMgc3RhYmxlLFxuICAgICAgICAgICAgLy8gYW5kIHNvIGl0IGlzIHN1ZmZpY2llbnQgdG8gYXZvaWQgcmVjb25jaWxpbmcgaXQgYXdheS5cbiAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBnb2luZyB0byB1bndyYXAgb3IgYWN0dWFsbHkgdXNlIHRoZSBuZXcgbGF6eSB0eXBlLlxuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAge1xuICAgICAgICAgIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBpZiBpdCB3YXMgYnV0IGNhbiBubyBsb25nZXIgYmUgc2ltcGxlLFxuICAgICAgICAgICAgLy8gd2Ugc2hvdWxkbid0IHNldCB0aGlzLlxuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gQ2hlY2sgaWYgYm90aCB0eXBlcyBoYXZlIGEgZmFtaWx5IGFuZCBpdCdzIHRoZSBzYW1lIG9uZS5cblxuXG4gICAgaWYgKG5lZWRzQ29tcGFyZUZhbWlsaWVzKSB7XG4gICAgICAvLyBOb3RlOiBtZW1vKCkgYW5kIGZvcndhcmRSZWYoKSB3ZSdsbCBjb21wYXJlIG91dGVyIHJhdGhlciB0aGFuIGlubmVyIHR5cGUuXG4gICAgICAvLyBUaGlzIG1lYW5zIGJvdGggb2YgdGhlbSBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgdG8gcHJlc2VydmUgc3RhdGUuXG4gICAgICAvLyBJZiB3ZSB1bndyYXBwZWQgYW5kIGNvbXBhcmVkIHRoZSBpbm5lciB0eXBlcyBmb3Igd3JhcHBlcnMgaW5zdGVhZCxcbiAgICAgIC8vIHRoZW4gd2Ugd291bGQgcmlzayBmYWxzZWx5IHNheWluZyB0d28gc2VwYXJhdGUgbWVtbyhGb28pXG4gICAgICAvLyBjYWxscyBhcmUgZXF1aXZhbGVudCBiZWNhdXNlIHRoZXkgd3JhcCB0aGUgc2FtZSBGb28gZnVuY3Rpb24uXG4gICAgICB2YXIgcHJldkZhbWlseSA9IHJlc29sdmVGYW1pbHkocHJldlR5cGUpO1xuXG4gICAgICBpZiAocHJldkZhbWlseSAhPT0gdW5kZWZpbmVkICYmIHByZXZGYW1pbHkgPT09IHJlc29sdmVGYW1pbHkobmV4dFR5cGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gbWFya0ZhaWxlZEVycm9yQm91bmRhcnlGb3JIb3RSZWxvYWRpbmcoZmliZXIpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgV2Vha1NldCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmYWlsZWRCb3VuZGFyaWVzID09PSBudWxsKSB7XG4gICAgICBmYWlsZWRCb3VuZGFyaWVzID0gbmV3IFdlYWtTZXQoKTtcbiAgICB9XG5cbiAgICBmYWlsZWRCb3VuZGFyaWVzLmFkZChmaWJlcik7XG4gIH1cbn1cbnZhciBzY2hlZHVsZVJlZnJlc2ggPSBmdW5jdGlvbiAocm9vdCwgdXBkYXRlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc3RhbGVGYW1pbGllcyA9IHVwZGF0ZS5zdGFsZUZhbWlsaWVzLFxuICAgICAgICB1cGRhdGVkRmFtaWxpZXMgPSB1cGRhdGUudXBkYXRlZEZhbWlsaWVzO1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShyb290LmN1cnJlbnQsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfSk7XG4gIH1cbn07XG52YXIgc2NoZWR1bGVSb290ID0gZnVuY3Rpb24gKHJvb3QsIGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChyb290LmNvbnRleHQgIT09IGVtcHR5Q29udGV4dE9iamVjdCkge1xuICAgICAgLy8gU3VwZXIgZWRnZSBjYXNlOiByb290IGhhcyBhIGxlZ2FjeSBfcmVuZGVyU3VidHJlZSBjb250ZXh0XG4gICAgICAvLyBidXQgd2UgZG9uJ3Qga25vdyB0aGUgcGFyZW50Q29tcG9uZW50IHNvIHdlIGNhbid0IHBhc3MgaXQuXG4gICAgICAvLyBKdXN0IGlnbm9yZS4gV2UnbGwgZGVsZXRlIHRoaXMgd2l0aCBfcmVuZGVyU3VidHJlZSBjb2RlIHBhdGggbGF0ZXIuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICB1cGRhdGVDb250YWluZXIoZWxlbWVudCwgcm9vdCwgbnVsbCwgbnVsbCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkoZmliZXIsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcykge1xuICB7XG4gICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZSxcbiAgICAgICAgY2hpbGQgPSBmaWJlci5jaGlsZCxcbiAgICAgICAgc2libGluZyA9IGZpYmVyLnNpYmxpbmcsXG4gICAgICAgIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgdmFyIGNhbmRpZGF0ZVR5cGUgPSBudWxsO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZXNvbHZlRmFtaWx5IHRvIGJlIHNldCBkdXJpbmcgaG90IHJlbG9hZC4nKTtcbiAgICB9XG5cbiAgICB2YXIgbmVlZHNSZW5kZXIgPSBmYWxzZTtcbiAgICB2YXIgbmVlZHNSZW1vdW50ID0gZmFsc2U7XG5cbiAgICBpZiAoY2FuZGlkYXRlVHlwZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkoY2FuZGlkYXRlVHlwZSk7XG5cbiAgICAgIGlmIChmYW1pbHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoc3RhbGVGYW1pbGllcy5oYXMoZmFtaWx5KSkge1xuICAgICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodXBkYXRlZEZhbWlsaWVzLmhhcyhmYW1pbHkpKSB7XG4gICAgICAgICAgaWYgKHRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5lZWRzUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZmFpbGVkQm91bmRhcmllcyAhPT0gbnVsbCkge1xuICAgICAgaWYgKGZhaWxlZEJvdW5kYXJpZXMuaGFzKGZpYmVyKSB8fCBhbHRlcm5hdGUgIT09IG51bGwgJiYgZmFpbGVkQm91bmRhcmllcy5oYXMoYWx0ZXJuYXRlKSkge1xuICAgICAgICBuZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZWVkc1JlbW91bnQpIHtcbiAgICAgIGZpYmVyLl9kZWJ1Z05lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5lZWRzUmVtb3VudCB8fCBuZWVkc1JlbmRlcikge1xuICAgICAgdmFyIF9yb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICAgIGlmIChfcm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoX3Jvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiAhbmVlZHNSZW1vdW50KSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KGNoaWxkLCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpO1xuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KHNpYmxpbmcsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2ggPSBmdW5jdGlvbiAocm9vdCwgZmFtaWxpZXMpIHtcbiAge1xuICAgIHZhciBob3N0SW5zdGFuY2VzID0gbmV3IFNldCgpO1xuICAgIHZhciB0eXBlcyA9IG5ldyBTZXQoZmFtaWxpZXMubWFwKGZ1bmN0aW9uIChmYW1pbHkpIHtcbiAgICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgICB9KSk7XG4gICAgZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KHJvb3QuY3VycmVudCwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgIHJldHVybiBob3N0SW5zdGFuY2VzO1xuICB9XG59O1xuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoZmliZXIsIHR5cGVzLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZCxcbiAgICAgICAgc2libGluZyA9IGZpYmVyLnNpYmxpbmcsXG4gICAgICAgIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgdmFyIGNhbmRpZGF0ZVR5cGUgPSBudWxsO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZGlkTWF0Y2ggPSBmYWxzZTtcblxuICAgIGlmIChjYW5kaWRhdGVUeXBlICE9PSBudWxsKSB7XG4gICAgICBpZiAodHlwZXMuaGFzKGNhbmRpZGF0ZVR5cGUpKSB7XG4gICAgICAgIGRpZE1hdGNoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlkTWF0Y2gpIHtcbiAgICAgIC8vIFdlIGhhdmUgYSBtYXRjaC4gVGhpcyBvbmx5IGRyaWxscyBkb3duIHRvIHRoZSBjbG9zZXN0IGhvc3QgY29tcG9uZW50cy5cbiAgICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBzZWFyY2ggZGVlcGVyIGJlY2F1c2UgZm9yIHRoZSBwdXJwb3NlIG9mIGdpdmluZ1xuICAgICAgLy8gdmlzdWFsIGZlZWRiYWNrLCBcImZsYXNoaW5nXCIgb3V0ZXJtb3N0IHBhcmVudCByZWN0YW5nbGVzIGlzIHN1ZmZpY2llbnQuXG4gICAgICBmaW5kSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlcmUncyBubyBtYXRjaCwgbWF5YmUgdGhlcmUgd2lsbCBiZSBvbmUgZnVydGhlciBkb3duIGluIHRoZSBjaGlsZCB0cmVlLlxuICAgICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShjaGlsZCwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoc2libGluZywgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgZm91bmRIb3N0SW5zdGFuY2VzID0gZmluZENoaWxkSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKTtcblxuICAgIGlmIChmb3VuZEhvc3RJbnN0YW5jZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueSBob3N0IGNoaWxkcmVuLCBmYWxsYmFjayB0byBjbG9zZXN0IGhvc3QgcGFyZW50LlxuXG5cbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlKTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gcmVhY2ggcm9vdCBmaXJzdC4nKTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ2hpbGRIb3N0SW5zdGFuY2VzRm9yRmliZXJTaGFsbG93bHkoZmliZXIsIGhvc3RJbnN0YW5jZXMpIHtcbiAge1xuICAgIHZhciBub2RlID0gZmliZXI7XG4gICAgdmFyIGZvdW5kSG9zdEluc3RhbmNlcyA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgICAvLyBXZSBnb3QgYSBtYXRjaC5cbiAgICAgICAgZm91bmRIb3N0SW5zdGFuY2VzID0gdHJ1ZTtcbiAgICAgICAgaG9zdEluc3RhbmNlcy5hZGQobm9kZS5zdGF0ZU5vZGUpOyAvLyBUaGVyZSBtYXkgc3RpbGwgYmUgbW9yZSwgc28ga2VlcCBzZWFyY2hpbmcuXG4gICAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmaWJlcikge1xuICAgICAgICByZXR1cm4gZm91bmRIb3N0SW5zdGFuY2VzO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmliZXIpIHtcbiAgICAgICAgICByZXR1cm4gZm91bmRIb3N0SW5zdGFuY2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxudmFyIGhhc0JhZE1hcFBvbHlmaWxsO1xuXG57XG4gIGhhc0JhZE1hcFBvbHlmaWxsID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICB2YXIgbm9uRXh0ZW5zaWJsZU9iamVjdCA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSk7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tbmV3ICovXG5cbiAgICBuZXcgTWFwKFtbbm9uRXh0ZW5zaWJsZU9iamVjdCwgbnVsbF1dKTtcbiAgICBuZXcgU2V0KFtub25FeHRlbnNpYmxlT2JqZWN0XSk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1uZXcgKi9cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIFRPRE86IENvbnNpZGVyIHdhcm5pbmcgYWJvdXQgYmFkIHBvbHlmaWxsc1xuICAgIGhhc0JhZE1hcFBvbHlmaWxsID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBGaWJlck5vZGUodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSkge1xuICAvLyBJbnN0YW5jZVxuICB0aGlzLnRhZyA9IHRhZztcbiAgdGhpcy5rZXkgPSBrZXk7XG4gIHRoaXMuZWxlbWVudFR5cGUgPSBudWxsO1xuICB0aGlzLnR5cGUgPSBudWxsO1xuICB0aGlzLnN0YXRlTm9kZSA9IG51bGw7IC8vIEZpYmVyXG5cbiAgdGhpcy5yZXR1cm4gPSBudWxsO1xuICB0aGlzLmNoaWxkID0gbnVsbDtcbiAgdGhpcy5zaWJsaW5nID0gbnVsbDtcbiAgdGhpcy5pbmRleCA9IDA7XG4gIHRoaXMucmVmID0gbnVsbDtcbiAgdGhpcy5wZW5kaW5nUHJvcHMgPSBwZW5kaW5nUHJvcHM7XG4gIHRoaXMubWVtb2l6ZWRQcm9wcyA9IG51bGw7XG4gIHRoaXMudXBkYXRlUXVldWUgPSBudWxsO1xuICB0aGlzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICB0aGlzLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gIHRoaXMubW9kZSA9IG1vZGU7IC8vIEVmZmVjdHNcblxuICB0aGlzLmZsYWdzID0gTm9GbGFncztcbiAgdGhpcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICB0aGlzLmRlbGV0aW9ucyA9IG51bGw7XG4gIHRoaXMubGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmFsdGVybmF0ZSA9IG51bGw7XG5cbiAge1xuICAgIC8vIE5vdGU6IFRoZSBmb2xsb3dpbmcgaXMgZG9uZSB0byBhdm9pZCBhIHY4IHBlcmZvcm1hbmNlIGNsaWZmLlxuICAgIC8vXG4gICAgLy8gSW5pdGlhbGl6aW5nIHRoZSBmaWVsZHMgYmVsb3cgdG8gc21pcyBhbmQgbGF0ZXIgdXBkYXRpbmcgdGhlbSB3aXRoXG4gICAgLy8gZG91YmxlIHZhbHVlcyB3aWxsIGNhdXNlIEZpYmVycyB0byBlbmQgdXAgaGF2aW5nIHNlcGFyYXRlIHNoYXBlcy5cbiAgICAvLyBUaGlzIGJlaGF2aW9yL2J1ZyBoYXMgc29tZXRoaW5nIHRvIGRvIHdpdGggT2JqZWN0LnByZXZlbnRFeHRlbnNpb24oKS5cbiAgICAvLyBGb3J0dW5hdGVseSB0aGlzIG9ubHkgaW1wYWN0cyBERVYgYnVpbGRzLlxuICAgIC8vIFVuZm9ydHVuYXRlbHkgaXQgbWFrZXMgUmVhY3QgdW51c2FibHkgc2xvdyBmb3Igc29tZSBhcHBsaWNhdGlvbnMuXG4gICAgLy8gVG8gd29yayBhcm91bmQgdGhpcywgaW5pdGlhbGl6ZSB0aGUgZmllbGRzIGJlbG93IHdpdGggZG91Ymxlcy5cbiAgICAvL1xuICAgIC8vIExlYXJuIG1vcmUgYWJvdXQgdGhpcyBoZXJlOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTQzNjVcbiAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD04NTM4XG4gICAgdGhpcy5hY3R1YWxEdXJhdGlvbiA9IE51bWJlci5OYU47XG4gICAgdGhpcy5hY3R1YWxTdGFydFRpbWUgPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMuc2VsZkJhc2VEdXJhdGlvbiA9IE51bWJlci5OYU47XG4gICAgdGhpcy50cmVlQmFzZUR1cmF0aW9uID0gTnVtYmVyLk5hTjsgLy8gSXQncyBva2F5IHRvIHJlcGxhY2UgdGhlIGluaXRpYWwgZG91YmxlcyB3aXRoIHNtaXMgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXG4gICAgLy8gVGhpcyB3b24ndCB0cmlnZ2VyIHRoZSBwZXJmb3JtYW5jZSBjbGlmZiBtZW50aW9uZWQgYWJvdmUsXG4gICAgLy8gYW5kIGl0IHNpbXBsaWZpZXMgb3RoZXIgcHJvZmlsZXIgY29kZSAoaW5jbHVkaW5nIERldlRvb2xzKS5cblxuICAgIHRoaXMuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgIHRoaXMuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgdGhpcy5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICB0aGlzLnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICB9XG5cbiAge1xuICAgIC8vIFRoaXMgaXNuJ3QgZGlyZWN0bHkgdXNlZCBidXQgaXMgaGFuZHkgZm9yIGRlYnVnZ2luZyBpbnRlcm5hbHM6XG4gICAgdGhpcy5fZGVidWdTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuX2RlYnVnT3duZXIgPSBudWxsO1xuICAgIHRoaXMuX2RlYnVnTmVlZHNSZW1vdW50ID0gZmFsc2U7XG4gICAgdGhpcy5fZGVidWdIb29rVHlwZXMgPSBudWxsO1xuXG4gICAgaWYgKCFoYXNCYWRNYXBQb2x5ZmlsbCAmJiB0eXBlb2YgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnModGhpcyk7XG4gICAgfVxuICB9XG59IC8vIFRoaXMgaXMgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiwgcmF0aGVyIHRoYW4gYSBQT0pPIGNvbnN0cnVjdG9yLCBzdGlsbFxuLy8gcGxlYXNlIGVuc3VyZSB3ZSBkbyB0aGUgZm9sbG93aW5nOlxuLy8gMSkgTm9ib2R5IHNob3VsZCBhZGQgYW55IGluc3RhbmNlIG1ldGhvZHMgb24gdGhpcy4gSW5zdGFuY2UgbWV0aG9kcyBjYW4gYmVcbi8vICAgIG1vcmUgZGlmZmljdWx0IHRvIHByZWRpY3Qgd2hlbiB0aGV5IGdldCBvcHRpbWl6ZWQgYW5kIHRoZXkgYXJlIGFsbW9zdFxuLy8gICAgbmV2ZXIgaW5saW5lZCBwcm9wZXJseSBpbiBzdGF0aWMgY29tcGlsZXJzLlxuLy8gMikgTm9ib2R5IHNob3VsZCByZWx5IG9uIGBpbnN0YW5jZW9mIEZpYmVyYCBmb3IgdHlwZSB0ZXN0aW5nLiBXZSBzaG91bGRcbi8vICAgIGFsd2F5cyBrbm93IHdoZW4gaXQgaXMgYSBmaWJlci5cbi8vIDMpIFdlIG1pZ2h0IHdhbnQgdG8gZXhwZXJpbWVudCB3aXRoIHVzaW5nIG51bWVyaWMga2V5cyBzaW5jZSB0aGV5IGFyZSBlYXNpZXJcbi8vICAgIHRvIG9wdGltaXplIGluIGEgbm9uLUpJVCBlbnZpcm9ubWVudC5cbi8vIDQpIFdlIGNhbiBlYXNpbHkgZ28gZnJvbSBhIGNvbnN0cnVjdG9yIHRvIGEgY3JlYXRlRmliZXIgb2JqZWN0IGxpdGVyYWwgaWYgdGhhdFxuLy8gICAgaXMgZmFzdGVyLlxuLy8gNSkgSXQgc2hvdWxkIGJlIGVhc3kgdG8gcG9ydCB0aGlzIHRvIGEgQyBzdHJ1Y3QgYW5kIGtlZXAgYSBDIGltcGxlbWVudGF0aW9uXG4vLyAgICBjb21wYXRpYmxlLlxuXG5cbnZhciBjcmVhdGVGaWJlciA9IGZ1bmN0aW9uICh0YWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKSB7XG4gIC8vICRGbG93Rml4TWU6IHRoZSBzaGFwZXMgYXJlIGV4YWN0IGhlcmUgYnV0IEZsb3cgZG9lc24ndCBsaWtlIGNvbnN0cnVjdG9yc1xuICByZXR1cm4gbmV3IEZpYmVyTm9kZSh0YWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbn07XG5cbmZ1bmN0aW9uIHNob3VsZENvbnN0cnVjdCQxKENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGlzU2ltcGxlRnVuY3Rpb25Db21wb25lbnQodHlwZSkge1xuICByZXR1cm4gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgJiYgIXNob3VsZENvbnN0cnVjdCQxKHR5cGUpICYmIHR5cGUuZGVmYXVsdFByb3BzID09PSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiByZXNvbHZlTGF6eUNvbXBvbmVudFRhZyhDb21wb25lbnQpIHtcbiAgaWYgKHR5cGVvZiBDb21wb25lbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc2hvdWxkQ29uc3RydWN0JDEoQ29tcG9uZW50KSA/IENsYXNzQ29tcG9uZW50IDogRnVuY3Rpb25Db21wb25lbnQ7XG4gIH0gZWxzZSBpZiAoQ29tcG9uZW50ICE9PSB1bmRlZmluZWQgJiYgQ29tcG9uZW50ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gQ29tcG9uZW50LiQkdHlwZW9mO1xuXG4gICAgaWYgKCQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFKSB7XG4gICAgICByZXR1cm4gRm9yd2FyZFJlZjtcbiAgICB9XG5cbiAgICBpZiAoJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgcmV0dXJuIE1lbW9Db21wb25lbnQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ7XG59IC8vIFRoaXMgaXMgdXNlZCB0byBjcmVhdGUgYW4gYWx0ZXJuYXRlIGZpYmVyIHRvIGRvIHdvcmsgb24uXG5cbmZ1bmN0aW9uIGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnQsIHBlbmRpbmdQcm9wcykge1xuICB2YXIgd29ya0luUHJvZ3Jlc3MgPSBjdXJyZW50LmFsdGVybmF0ZTtcblxuICBpZiAod29ya0luUHJvZ3Jlc3MgPT09IG51bGwpIHtcbiAgICAvLyBXZSB1c2UgYSBkb3VibGUgYnVmZmVyaW5nIHBvb2xpbmcgdGVjaG5pcXVlIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHdlJ2xsXG4gICAgLy8gb25seSBldmVyIG5lZWQgYXQgbW9zdCB0d28gdmVyc2lvbnMgb2YgYSB0cmVlLiBXZSBwb29sIHRoZSBcIm90aGVyXCIgdW51c2VkXG4gICAgLy8gbm9kZSB0aGF0IHdlJ3JlIGZyZWUgdG8gcmV1c2UuIFRoaXMgaXMgbGF6aWx5IGNyZWF0ZWQgdG8gYXZvaWQgYWxsb2NhdGluZ1xuICAgIC8vIGV4dHJhIG9iamVjdHMgZm9yIHRoaW5ncyB0aGF0IGFyZSBuZXZlciB1cGRhdGVkLiBJdCBhbHNvIGFsbG93IHVzIHRvXG4gICAgLy8gcmVjbGFpbSB0aGUgZXh0cmEgbWVtb3J5IGlmIG5lZWRlZC5cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IGNyZWF0ZUZpYmVyKGN1cnJlbnQudGFnLCBwZW5kaW5nUHJvcHMsIGN1cnJlbnQua2V5LCBjdXJyZW50Lm1vZGUpO1xuICAgIHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID0gY3VycmVudC5lbGVtZW50VHlwZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlO1xuICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGN1cnJlbnQuc3RhdGVOb2RlO1xuXG4gICAge1xuICAgICAgLy8gREVWLW9ubHkgZmllbGRzXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdTb3VyY2UgPSBjdXJyZW50Ll9kZWJ1Z1NvdXJjZTtcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z093bmVyID0gY3VycmVudC5fZGVidWdPd25lcjtcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z0hvb2tUeXBlcyA9IGN1cnJlbnQuX2RlYnVnSG9va1R5cGVzO1xuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IGN1cnJlbnQ7XG4gICAgY3VycmVudC5hbHRlcm5hdGUgPSB3b3JrSW5Qcm9ncmVzcztcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMgPSBwZW5kaW5nUHJvcHM7IC8vIE5lZWRlZCBiZWNhdXNlIEJsb2NrcyBzdG9yZSBkYXRhIG9uIHR5cGUuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlOyAvLyBXZSBhbHJlYWR5IGhhdmUgYW4gYWx0ZXJuYXRlLlxuICAgIC8vIFJlc2V0IHRoZSBlZmZlY3QgdGFnLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBOb0ZsYWdzOyAvLyBUaGUgZWZmZWN0cyBhcmUgbm8gbG9uZ2VyIHZhbGlkLlxuXG4gICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBudWxsO1xuXG4gICAge1xuICAgICAgLy8gV2UgaW50ZW50aW9uYWxseSByZXNldCwgcmF0aGVyIHRoYW4gY29weSwgYWN0dWFsRHVyYXRpb24gJiBhY3R1YWxTdGFydFRpbWUuXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIHRpbWUgZnJvbSBlbmRsZXNzbHkgYWNjdW11bGF0aW5nIGluIG5ldyBjb21taXRzLlxuICAgICAgLy8gVGhpcyBoYXMgdGhlIGRvd25zaWRlIG9mIHJlc2V0dGluZyB2YWx1ZXMgZm9yIGRpZmZlcmVudCBwcmlvcml0eSByZW5kZXJzLFxuICAgICAgLy8gQnV0IHdvcmtzIGZvciB5aWVsZGluZyAodGhlIGNvbW1vbiBjYXNlKSBhbmQgc2hvdWxkIHN1cHBvcnQgcmVzdW1pbmcuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5hY3R1YWxEdXJhdGlvbiA9IDA7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5hY3R1YWxTdGFydFRpbWUgPSAtMTtcbiAgICB9XG4gIH0gLy8gUmVzZXQgYWxsIGVmZmVjdHMgZXhjZXB0IHN0YXRpYyBvbmVzLlxuICAvLyBTdGF0aWMgZWZmZWN0cyBhcmUgbm90IHNwZWNpZmljIHRvIGEgcmVuZGVyLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBjdXJyZW50LmZsYWdzICYgU3RhdGljTWFzaztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IGN1cnJlbnQuY2hpbGRMYW5lcztcbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQ7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTsgLy8gQ2xvbmUgdGhlIGRlcGVuZGVuY2llcyBvYmplY3QuIFRoaXMgaXMgbXV0YXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSwgc29cbiAgLy8gaXQgY2Fubm90IGJlIHNoYXJlZCB3aXRoIHRoZSBjdXJyZW50IGZpYmVyLlxuXG4gIHZhciBjdXJyZW50RGVwZW5kZW5jaWVzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IGN1cnJlbnREZXBlbmRlbmNpZXMgPT09IG51bGwgPyBudWxsIDoge1xuICAgIGxhbmVzOiBjdXJyZW50RGVwZW5kZW5jaWVzLmxhbmVzLFxuICAgIGZpcnN0Q29udGV4dDogY3VycmVudERlcGVuZGVuY2llcy5maXJzdENvbnRleHRcbiAgfTsgLy8gVGhlc2Ugd2lsbCBiZSBvdmVycmlkZGVuIGR1cmluZyB0aGUgcGFyZW50J3MgcmVjb25jaWxpYXRpb25cblxuICB3b3JrSW5Qcm9ncmVzcy5zaWJsaW5nID0gY3VycmVudC5zaWJsaW5nO1xuICB3b3JrSW5Qcm9ncmVzcy5pbmRleCA9IGN1cnJlbnQuaW5kZXg7XG4gIHdvcmtJblByb2dyZXNzLnJlZiA9IGN1cnJlbnQucmVmO1xuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50LnRyZWVCYXNlRHVyYXRpb247XG4gIH1cblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnTmVlZHNSZW1vdW50ID0gY3VycmVudC5fZGVidWdOZWVkc1JlbW91bnQ7XG5cbiAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhjdXJyZW50LnR5cGUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyhjdXJyZW50LnR5cGUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gcmVzb2x2ZUZvcndhcmRSZWZGb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xufSAvLyBVc2VkIHRvIHJldXNlIGEgRmliZXIgZm9yIGEgc2Vjb25kIHBhc3MuXG5cbmZ1bmN0aW9uIHJlc2V0V29ya0luUHJvZ3Jlc3Mod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgcmVzZXRzIHRoZSBGaWJlciB0byB3aGF0IGNyZWF0ZUZpYmVyIG9yIGNyZWF0ZVdvcmtJblByb2dyZXNzIHdvdWxkXG4gIC8vIGhhdmUgc2V0IHRoZSB2YWx1ZXMgdG8gYmVmb3JlIGR1cmluZyB0aGUgZmlyc3QgcGFzcy4gSWRlYWxseSB0aGlzIHdvdWxkbid0XG4gIC8vIGJlIG5lY2Vzc2FyeSBidXQgdW5mb3J0dW5hdGVseSBtYW55IGNvZGUgcGF0aHMgcmVhZHMgZnJvbSB0aGUgd29ya0luUHJvZ3Jlc3NcbiAgLy8gd2hlbiB0aGV5IHNob3VsZCBiZSByZWFkaW5nIGZyb20gY3VycmVudCBhbmQgd3JpdGluZyB0byB3b3JrSW5Qcm9ncmVzcy5cbiAgLy8gV2UgYXNzdW1lIHBlbmRpbmdQcm9wcywgaW5kZXgsIGtleSwgcmVmLCByZXR1cm4gYXJlIHN0aWxsIHVudG91Y2hlZCB0b1xuICAvLyBhdm9pZCBkb2luZyBhbm90aGVyIHJlY29uY2lsaWF0aW9uLlxuICAvLyBSZXNldCB0aGUgZWZmZWN0IGZsYWdzIGJ1dCBrZWVwIGFueSBQbGFjZW1lbnQgdGFncywgc2luY2UgdGhhdCdzIHNvbWV0aGluZ1xuICAvLyB0aGF0IGNoaWxkIGZpYmVyIGlzIHNldHRpbmcsIG5vdCB0aGUgcmVjb25jaWxpYXRpb24uXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IFN0YXRpY01hc2sgfCBQbGFjZW1lbnQ7IC8vIFRoZSBlZmZlY3RzIGFyZSBubyBsb25nZXIgdmFsaWQuXG5cbiAgdmFyIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBSZXNldCB0byBjcmVhdGVGaWJlcidzIGluaXRpYWwgdmFsdWVzLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gcmVuZGVyTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gbnVsbDtcblxuICAgIHtcbiAgICAgIC8vIE5vdGU6IFdlIGRvbid0IHJlc2V0IHRoZSBhY3R1YWxUaW1lIGNvdW50cy4gSXQncyB1c2VmdWwgdG8gYWNjdW11bGF0ZVxuICAgICAgLy8gYWN0dWFsIHRpbWUgYWNyb3NzIG11bHRpcGxlIHJlbmRlciBwYXNzZXMuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBSZXNldCB0byB0aGUgY2xvbmVkIHZhbHVlcyB0aGF0IGNyZWF0ZVdvcmtJblByb2dyZXNzIHdvdWxkJ3ZlLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBjdXJyZW50LmNoaWxkTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgIHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTsgLy8gTmVlZGVkIGJlY2F1c2UgQmxvY2tzIHN0b3JlIGRhdGEgb24gdHlwZS5cblxuICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGU7IC8vIENsb25lIHRoZSBkZXBlbmRlbmNpZXMgb2JqZWN0LiBUaGlzIGlzIG11dGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UsIHNvXG4gICAgLy8gaXQgY2Fubm90IGJlIHNoYXJlZCB3aXRoIHRoZSBjdXJyZW50IGZpYmVyLlxuXG4gICAgdmFyIGN1cnJlbnREZXBlbmRlbmNpZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50RGVwZW5kZW5jaWVzID09PSBudWxsID8gbnVsbCA6IHtcbiAgICAgIGxhbmVzOiBjdXJyZW50RGVwZW5kZW5jaWVzLmxhbmVzLFxuICAgICAgZmlyc3RDb250ZXh0OiBjdXJyZW50RGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dFxuICAgIH07XG5cbiAgICB7XG4gICAgICAvLyBOb3RlOiBXZSBkb24ndCByZXNldCB0aGUgYWN0dWFsVGltZSBjb3VudHMuIEl0J3MgdXNlZnVsIHRvIGFjY3VtdWxhdGVcbiAgICAgIC8vIGFjdHVhbCB0aW1lIGFjcm9zcyBtdWx0aXBsZSByZW5kZXIgcGFzc2VzLlxuICAgICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xufVxuZnVuY3Rpb24gY3JlYXRlSG9zdFJvb3RGaWJlcih0YWcsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSkge1xuICB2YXIgbW9kZTtcblxuICBpZiAodGFnID09PSBDb25jdXJyZW50Um9vdCkge1xuICAgIG1vZGUgPSBDb25jdXJyZW50TW9kZTtcblxuICAgIGlmIChpc1N0cmljdE1vZGUgPT09IHRydWUpIHtcbiAgICAgIG1vZGUgfD0gU3RyaWN0TGVnYWN5TW9kZTtcblxuICAgICAge1xuICAgICAgICBtb2RlIHw9IFN0cmljdEVmZmVjdHNNb2RlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBtb2RlID0gTm9Nb2RlO1xuICB9XG5cbiAgaWYgKCBpc0RldlRvb2xzUHJlc2VudCkge1xuICAgIC8vIEFsd2F5cyBjb2xsZWN0IHByb2ZpbGUgdGltaW5ncyB3aGVuIERldlRvb2xzIGFyZSBwcmVzZW50LlxuICAgIC8vIFRoaXMgZW5hYmxlcyBEZXZUb29scyB0byBzdGFydCBjYXB0dXJpbmcgdGltaW5nIGF0IGFueSBwb2ludOKAk1xuICAgIC8vIFdpdGhvdXQgc29tZSBub2RlcyBpbiB0aGUgdHJlZSBoYXZpbmcgZW1wdHkgYmFzZSB0aW1lcy5cbiAgICBtb2RlIHw9IFByb2ZpbGVNb2RlO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUZpYmVyKEhvc3RSb290LCBudWxsLCBudWxsLCBtb2RlKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh0eXBlLCAvLyBSZWFjdCRFbGVtZW50VHlwZVxua2V5LCBwZW5kaW5nUHJvcHMsIG93bmVyLCBtb2RlLCBsYW5lcykge1xuICB2YXIgZmliZXJUYWcgPSBJbmRldGVybWluYXRlQ29tcG9uZW50OyAvLyBUaGUgcmVzb2x2ZWQgdHlwZSBpcyBzZXQgaWYgd2Uga25vdyB3aGF0IHRoZSBmaW5hbCB0eXBlIHdpbGwgYmUuIEkuZS4gaXQncyBub3QgbGF6eS5cblxuICB2YXIgcmVzb2x2ZWRUeXBlID0gdHlwZTtcblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoc2hvdWxkQ29uc3RydWN0JDEodHlwZSkpIHtcbiAgICAgIGZpYmVyVGFnID0gQ2xhc3NDb21wb25lbnQ7XG5cbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIGZpYmVyVGFnID0gSG9zdENvbXBvbmVudDtcbiAgfSBlbHNlIHtcbiAgICBnZXRUYWc6IHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQocGVuZGluZ1Byb3BzLmNoaWxkcmVuLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICBmaWJlclRhZyA9IE1vZGU7XG4gICAgICAgIG1vZGUgfD0gU3RyaWN0TGVnYWN5TW9kZTtcblxuICAgICAgICBpZiAoIChtb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAvLyBTdHJpY3QgZWZmZWN0cyBzaG91bGQgbmV2ZXIgcnVuIG9uIGxlZ2FjeSByb290c1xuICAgICAgICAgIG1vZGUgfD0gU3RyaWN0RWZmZWN0c01vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tUHJvZmlsZXIocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2UocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZUxpc3QocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9PRkZTQ1JFRU5fVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfU0NPUEVfVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfQ0FDSEVfVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfVFJBQ0lOR19NQVJLRVJfVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gQ29udGV4dFByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcblxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgY29uc3VtZXJcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IENvbnRleHRDb25zdW1lcjtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gRm9yd2FyZFJlZjtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gTWVtb0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBMYXp5Q29tcG9uZW50O1xuICAgICAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICBpbmZvICs9ICcgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgJyArIFwiaXQncyBkZWZpbmVkIGluLCBvciB5b3UgbWlnaHQgaGF2ZSBtaXhlZCB1cCBkZWZhdWx0IGFuZCBcIiArICduYW1lZCBpbXBvcnRzLic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBvd25lck5hbWUgPSBvd25lciA/IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIob3duZXIpIDogbnVsbDtcblxuICAgICAgICAgICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgICAgICAgICBpbmZvICs9ICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbGVtZW50IHR5cGUgaXMgaW52YWxpZDogZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciBidWlsdC1pbiAnICsgJ2NvbXBvbmVudHMpIG9yIGEgY2xhc3MvZnVuY3Rpb24gKGZvciBjb21wb3NpdGUgY29tcG9uZW50cykgJyArIChcImJ1dCBnb3Q6IFwiICsgKHR5cGUgPT0gbnVsbCA/IHR5cGUgOiB0eXBlb2YgdHlwZSkgKyBcIi5cIiArIGluZm8pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKGZpYmVyVGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gdHlwZTtcbiAgZmliZXIudHlwZSA9IHJlc29sdmVkVHlwZTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcblxuICB7XG4gICAgZmliZXIuX2RlYnVnT3duZXIgPSBvd25lcjtcbiAgfVxuXG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoZWxlbWVudCwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIG93bmVyID0gbnVsbDtcblxuICB7XG4gICAgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgfVxuXG4gIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gIHZhciBwZW5kaW5nUHJvcHMgPSBlbGVtZW50LnByb3BzO1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHModHlwZSwga2V5LCBwZW5kaW5nUHJvcHMsIG93bmVyLCBtb2RlLCBsYW5lcyk7XG5cbiAge1xuICAgIGZpYmVyLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICBmaWJlci5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICB9XG5cbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZWxlbWVudHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoRnJhZ21lbnQsIGVsZW1lbnRzLCBrZXksIG1vZGUpO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVByb2ZpbGVyKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB7XG4gICAgaWYgKHR5cGVvZiBwZW5kaW5nUHJvcHMuaWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICBlcnJvcignUHJvZmlsZXIgbXVzdCBzcGVjaWZ5IGFuIFwiaWRcIiBvZiB0eXBlIGBzdHJpbmdgIGFzIGEgcHJvcC4gUmVjZWl2ZWQgdGhlIHR5cGUgYCVzYCBpbnN0ZWFkLicsIHR5cGVvZiBwZW5kaW5nUHJvcHMuaWQpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKFByb2ZpbGVyLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSB8IFByb2ZpbGVNb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuXG4gIHtcbiAgICBmaWJlci5zdGF0ZU5vZGUgPSB7XG4gICAgICBlZmZlY3REdXJhdGlvbjogMCxcbiAgICAgIHBhc3NpdmVFZmZlY3REdXJhdGlvbjogMFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihTdXNwZW5zZUNvbXBvbmVudCwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlTGlzdChwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoU3VzcGVuc2VMaXN0Q29tcG9uZW50LCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW4ocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKE9mZnNjcmVlbkNvbXBvbmVudCwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX09GRlNDUkVFTl9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICB2YXIgcHJpbWFyeUNoaWxkSW5zdGFuY2UgPSB7XG4gICAgaXNIaWRkZW46IGZhbHNlXG4gIH07XG4gIGZpYmVyLnN0YXRlTm9kZSA9IHByaW1hcnlDaGlsZEluc3RhbmNlO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UZXh0KGNvbnRlbnQsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RUZXh0LCBjb250ZW50LCBudWxsLCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tSG9zdEluc3RhbmNlRm9yRGVsZXRpb24oKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RDb21wb25lbnQsIG51bGwsIG51bGwsIE5vTW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gJ0RFTEVURUQnO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21EZWh5ZHJhdGVkRnJhZ21lbnQoZGVoeWRyYXRlZE5vZGUpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoRGVoeWRyYXRlZEZyYWdtZW50LCBudWxsLCBudWxsLCBOb01vZGUpO1xuICBmaWJlci5zdGF0ZU5vZGUgPSBkZWh5ZHJhdGVkTm9kZTtcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIHBlbmRpbmdQcm9wcyA9IHBvcnRhbC5jaGlsZHJlbiAhPT0gbnVsbCA/IHBvcnRhbC5jaGlsZHJlbiA6IFtdO1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihIb3N0UG9ydGFsLCBwZW5kaW5nUHJvcHMsIHBvcnRhbC5rZXksIG1vZGUpO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICBmaWJlci5zdGF0ZU5vZGUgPSB7XG4gICAgY29udGFpbmVySW5mbzogcG9ydGFsLmNvbnRhaW5lckluZm8sXG4gICAgcGVuZGluZ0NoaWxkcmVuOiBudWxsLFxuICAgIC8vIFVzZWQgYnkgcGVyc2lzdGVudCB1cGRhdGVzXG4gICAgaW1wbGVtZW50YXRpb246IHBvcnRhbC5pbXBsZW1lbnRhdGlvblxuICB9O1xuICByZXR1cm4gZmliZXI7XG59IC8vIFVzZWQgZm9yIHN0YXNoaW5nIFdJUCBwcm9wZXJ0aWVzIHRvIHJlcGxheSBmYWlsZWQgd29yayBpbiBERVYuXG5cbmZ1bmN0aW9uIGFzc2lnbkZpYmVyUHJvcGVydGllc0luREVWKHRhcmdldCwgc291cmNlKSB7XG4gIGlmICh0YXJnZXQgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIEZpYmVyJ3MgaW5pdGlhbCBwcm9wZXJ0aWVzIHdpbGwgYWx3YXlzIGJlIG92ZXJ3cml0dGVuLlxuICAgIC8vIFdlIG9ubHkgdXNlIGEgRmliZXIgdG8gZW5zdXJlIHRoZSBzYW1lIGhpZGRlbiBjbGFzcyBzbyBERVYgaXNuJ3Qgc2xvdy5cbiAgICB0YXJnZXQgPSBjcmVhdGVGaWJlcihJbmRldGVybWluYXRlQ29tcG9uZW50LCBudWxsLCBudWxsLCBOb01vZGUpO1xuICB9IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSB3cml0dGVuIGFzIGEgbGlzdCBvZiBhbGwgcHJvcGVydGllcy5cbiAgLy8gV2UgdHJpZWQgdG8gdXNlIE9iamVjdC5hc3NpZ24oKSBpbnN0ZWFkIGJ1dCB0aGlzIGlzIGNhbGxlZCBpblxuICAvLyB0aGUgaG90dGVzdCBwYXRoLCBhbmQgT2JqZWN0LmFzc2lnbigpIHdhcyB0b28gc2xvdzpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjUwMlxuICAvLyBUaGlzIGNvZGUgaXMgREVWLW9ubHkgc28gc2l6ZSBpcyBub3QgYSBjb25jZXJuLlxuXG5cbiAgdGFyZ2V0LnRhZyA9IHNvdXJjZS50YWc7XG4gIHRhcmdldC5rZXkgPSBzb3VyY2Uua2V5O1xuICB0YXJnZXQuZWxlbWVudFR5cGUgPSBzb3VyY2UuZWxlbWVudFR5cGU7XG4gIHRhcmdldC50eXBlID0gc291cmNlLnR5cGU7XG4gIHRhcmdldC5zdGF0ZU5vZGUgPSBzb3VyY2Uuc3RhdGVOb2RlO1xuICB0YXJnZXQucmV0dXJuID0gc291cmNlLnJldHVybjtcbiAgdGFyZ2V0LmNoaWxkID0gc291cmNlLmNoaWxkO1xuICB0YXJnZXQuc2libGluZyA9IHNvdXJjZS5zaWJsaW5nO1xuICB0YXJnZXQuaW5kZXggPSBzb3VyY2UuaW5kZXg7XG4gIHRhcmdldC5yZWYgPSBzb3VyY2UucmVmO1xuICB0YXJnZXQucGVuZGluZ1Byb3BzID0gc291cmNlLnBlbmRpbmdQcm9wcztcbiAgdGFyZ2V0Lm1lbW9pemVkUHJvcHMgPSBzb3VyY2UubWVtb2l6ZWRQcm9wcztcbiAgdGFyZ2V0LnVwZGF0ZVF1ZXVlID0gc291cmNlLnVwZGF0ZVF1ZXVlO1xuICB0YXJnZXQubWVtb2l6ZWRTdGF0ZSA9IHNvdXJjZS5tZW1vaXplZFN0YXRlO1xuICB0YXJnZXQuZGVwZW5kZW5jaWVzID0gc291cmNlLmRlcGVuZGVuY2llcztcbiAgdGFyZ2V0Lm1vZGUgPSBzb3VyY2UubW9kZTtcbiAgdGFyZ2V0LmZsYWdzID0gc291cmNlLmZsYWdzO1xuICB0YXJnZXQuc3VidHJlZUZsYWdzID0gc291cmNlLnN1YnRyZWVGbGFncztcbiAgdGFyZ2V0LmRlbGV0aW9ucyA9IHNvdXJjZS5kZWxldGlvbnM7XG4gIHRhcmdldC5sYW5lcyA9IHNvdXJjZS5sYW5lcztcbiAgdGFyZ2V0LmNoaWxkTGFuZXMgPSBzb3VyY2UuY2hpbGRMYW5lcztcbiAgdGFyZ2V0LmFsdGVybmF0ZSA9IHNvdXJjZS5hbHRlcm5hdGU7XG5cbiAge1xuICAgIHRhcmdldC5hY3R1YWxEdXJhdGlvbiA9IHNvdXJjZS5hY3R1YWxEdXJhdGlvbjtcbiAgICB0YXJnZXQuYWN0dWFsU3RhcnRUaW1lID0gc291cmNlLmFjdHVhbFN0YXJ0VGltZTtcbiAgICB0YXJnZXQuc2VsZkJhc2VEdXJhdGlvbiA9IHNvdXJjZS5zZWxmQmFzZUR1cmF0aW9uO1xuICAgIHRhcmdldC50cmVlQmFzZUR1cmF0aW9uID0gc291cmNlLnRyZWVCYXNlRHVyYXRpb247XG4gIH1cblxuICB0YXJnZXQuX2RlYnVnU291cmNlID0gc291cmNlLl9kZWJ1Z1NvdXJjZTtcbiAgdGFyZ2V0Ll9kZWJ1Z093bmVyID0gc291cmNlLl9kZWJ1Z093bmVyO1xuICB0YXJnZXQuX2RlYnVnTmVlZHNSZW1vdW50ID0gc291cmNlLl9kZWJ1Z05lZWRzUmVtb3VudDtcbiAgdGFyZ2V0Ll9kZWJ1Z0hvb2tUeXBlcyA9IHNvdXJjZS5fZGVidWdIb29rVHlwZXM7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIEZpYmVyUm9vdE5vZGUoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpIHtcbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMuY29udGFpbmVySW5mbyA9IGNvbnRhaW5lckluZm87XG4gIHRoaXMucGVuZGluZ0NoaWxkcmVuID0gbnVsbDtcbiAgdGhpcy5jdXJyZW50ID0gbnVsbDtcbiAgdGhpcy5waW5nQ2FjaGUgPSBudWxsO1xuICB0aGlzLmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHRoaXMudGltZW91dEhhbmRsZSA9IG5vVGltZW91dDtcbiAgdGhpcy5jb250ZXh0ID0gbnVsbDtcbiAgdGhpcy5wZW5kaW5nQ29udGV4dCA9IG51bGw7XG4gIHRoaXMuY2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgdGhpcy5jYWxsYmFja1ByaW9yaXR5ID0gTm9MYW5lO1xuICB0aGlzLmV2ZW50VGltZXMgPSBjcmVhdGVMYW5lTWFwKE5vTGFuZXMpO1xuICB0aGlzLmV4cGlyYXRpb25UaW1lcyA9IGNyZWF0ZUxhbmVNYXAoTm9UaW1lc3RhbXApO1xuICB0aGlzLnBlbmRpbmdMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuc3VzcGVuZGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLnBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5leHBpcmVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLm11dGFibGVSZWFkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmZpbmlzaGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmVudGFuZ2xlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5lbnRhbmdsZW1lbnRzID0gY3JlYXRlTGFuZU1hcChOb0xhbmVzKTtcbiAgdGhpcy5pZGVudGlmaWVyUHJlZml4ID0gaWRlbnRpZmllclByZWZpeDtcbiAgdGhpcy5vblJlY292ZXJhYmxlRXJyb3IgPSBvblJlY292ZXJhYmxlRXJyb3I7XG5cbiAge1xuICAgIHRoaXMubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YSA9IG51bGw7XG4gIH1cblxuICB7XG4gICAgdGhpcy5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgdGhpcy5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICB9XG5cbiAge1xuICAgIHRoaXMubWVtb2l6ZWRVcGRhdGVycyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IHRoaXMucGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IFRvdGFsTGFuZXM7IF9pKyspIHtcbiAgICAgIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAucHVzaChuZXcgU2V0KCkpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSBDb25jdXJyZW50Um9vdDpcbiAgICAgICAgdGhpcy5fZGVidWdSb290VHlwZSA9IGh5ZHJhdGUgPyAnaHlkcmF0ZVJvb3QoKScgOiAnY3JlYXRlUm9vdCgpJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTGVnYWN5Um9vdDpcbiAgICAgICAgdGhpcy5fZGVidWdSb290VHlwZSA9IGh5ZHJhdGUgPyAnaHlkcmF0ZSgpJyA6ICdyZW5kZXIoKSc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlclJvb3QoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpbml0aWFsQ2hpbGRyZW4sIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCAvLyBUT0RPOiBXZSBoYXZlIHNldmVyYWwgb2YgdGhlc2UgYXJndW1lbnRzIHRoYXQgYXJlIGNvbmNlcHR1YWxseSBwYXJ0IG9mIHRoZVxuLy8gaG9zdCBjb25maWcsIGJ1dCBiZWNhdXNlIHRoZXkgYXJlIHBhc3NlZCBpbiBhdCBydW50aW1lLCB3ZSBoYXZlIHRvIHRocmVhZFxuLy8gdGhlbSB0aHJvdWdoIHRoZSByb290IGNvbnN0cnVjdG9yLiBQZXJoYXBzIHdlIHNob3VsZCBwdXQgdGhlbSBhbGwgaW50byBhXG4vLyBzaW5nbGUgdHlwZSwgbGlrZSBhIER5bmFtaWNIb3N0Q29uZmlnIHRoYXQgaXMgZGVmaW5lZCBieSB0aGUgcmVuZGVyZXIuXG5pZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IsIHRyYW5zaXRpb25DYWxsYmFja3MpIHtcbiAgdmFyIHJvb3QgPSBuZXcgRmliZXJSb290Tm9kZShjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7XG4gIC8vIHN0YXRlTm9kZSBpcyBhbnkuXG5cblxuICB2YXIgdW5pbml0aWFsaXplZEZpYmVyID0gY3JlYXRlSG9zdFJvb3RGaWJlcih0YWcsIGlzU3RyaWN0TW9kZSk7XG4gIHJvb3QuY3VycmVudCA9IHVuaW5pdGlhbGl6ZWRGaWJlcjtcbiAgdW5pbml0aWFsaXplZEZpYmVyLnN0YXRlTm9kZSA9IHJvb3Q7XG5cbiAge1xuICAgIHZhciBfaW5pdGlhbFN0YXRlID0ge1xuICAgICAgZWxlbWVudDogaW5pdGlhbENoaWxkcmVuLFxuICAgICAgaXNEZWh5ZHJhdGVkOiBoeWRyYXRlLFxuICAgICAgY2FjaGU6IG51bGwsXG4gICAgICAvLyBub3QgZW5hYmxlZCB5ZXRcbiAgICAgIHRyYW5zaXRpb25zOiBudWxsLFxuICAgICAgcGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczogbnVsbFxuICAgIH07XG4gICAgdW5pbml0aWFsaXplZEZpYmVyLm1lbW9pemVkU3RhdGUgPSBfaW5pdGlhbFN0YXRlO1xuICB9XG5cbiAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHVuaW5pdGlhbGl6ZWRGaWJlcik7XG4gIHJldHVybiByb290O1xufVxuXG52YXIgUmVhY3RWZXJzaW9uID0gJzE4LjIuMCc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVBvcnRhbChjaGlsZHJlbiwgY29udGFpbmVySW5mbywgLy8gVE9ETzogZmlndXJlIG91dCB0aGUgQVBJIGZvciBjcm9zcy1yZW5kZXJlciBpbXBsZW1lbnRhdGlvbi5cbmltcGxlbWVudGF0aW9uKSB7XG4gIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG5cbiAge1xuICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oa2V5KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3cgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IFBvcnRhbFxuICAgICQkdHlwZW9mOiBSRUFDVF9QT1JUQUxfVFlQRSxcbiAgICBrZXk6IGtleSA9PSBudWxsID8gbnVsbCA6ICcnICsga2V5LFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICBjb250YWluZXJJbmZvOiBjb250YWluZXJJbmZvLFxuICAgIGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvblxuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcztcbnZhciBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZTtcblxue1xuICBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlID0ge307XG59XG5cbmZ1bmN0aW9uIGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCkge1xuICBpZiAoIXBhcmVudENvbXBvbmVudCkge1xuICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQocGFyZW50Q29tcG9uZW50KTtcbiAgdmFyIHBhcmVudENvbnRleHQgPSBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcik7XG5cbiAgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICB2YXIgQ29tcG9uZW50ID0gZmliZXIudHlwZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc0NoaWxkQ29udGV4dChmaWJlciwgQ29tcG9uZW50LCBwYXJlbnRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFyZW50Q29udGV4dDtcbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nKGNvbXBvbmVudCwgbWV0aG9kTmFtZSkge1xuICB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGNvbXBvbmVudCk7XG5cbiAgICBpZiAoZmliZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhjb21wb25lbnQpLmpvaW4oJywnKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXJndW1lbnQgYXBwZWFycyB0byBub3QgYmUgYSBSZWFjdENvbXBvbmVudC4gS2V5czogXCIgKyBrZXlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXIoZmliZXIpO1xuXG4gICAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGhvc3RGaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZVtjb21wb25lbnROYW1lXSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZVtjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihob3N0RmliZXIpO1xuXG4gICAgICAgICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgICAgICBlcnJvcignJXMgaXMgZGVwcmVjYXRlZCBpbiBTdHJpY3RNb2RlLiAnICsgJyVzIHdhcyBwYXNzZWQgYW4gaW5zdGFuY2Ugb2YgJXMgd2hpY2ggaXMgaW5zaWRlIFN0cmljdE1vZGUuICcgKyAnSW5zdGVhZCwgYWRkIGEgcmVmIGRpcmVjdGx5IHRvIHRoZSBlbGVtZW50IHlvdSB3YW50IHRvIHJlZmVyZW5jZS4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLWZpbmQtbm9kZScsIG1ldGhvZE5hbWUsIG1ldGhvZE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcignJXMgaXMgZGVwcmVjYXRlZCBpbiBTdHJpY3RNb2RlLiAnICsgJyVzIHdhcyBwYXNzZWQgYW4gaW5zdGFuY2Ugb2YgJXMgd2hpY2ggcmVuZGVycyBTdHJpY3RNb2RlIGNoaWxkcmVuLiAnICsgJ0luc3RlYWQsIGFkZCBhIHJlZiBkaXJlY3RseSB0byB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byByZWZlcmVuY2UuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1maW5kLW5vZGUnLCBtZXRob2ROYW1lLCBtZXRob2ROYW1lLCBjb21wb25lbnROYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgLy8gSWRlYWxseSB0aGlzIHNob3VsZCByZXNldCB0byBwcmV2aW91cyBidXQgdGhpcyBzaG91bGRuJ3QgYmUgY2FsbGVkIGluXG4gICAgICAgICAgLy8gcmVuZGVyIGFuZCB0aGVyZSdzIGFub3RoZXIgd2FybmluZyBmb3IgdGhhdCBhbnl3YXkuXG4gICAgICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHtcbiAgICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihwcmV2aW91c0ZpYmVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaG9zdEZpYmVyLnN0YXRlTm9kZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDb250YWluZXIoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yLCB0cmFuc2l0aW9uQ2FsbGJhY2tzKSB7XG4gIHZhciBoeWRyYXRlID0gZmFsc2U7XG4gIHZhciBpbml0aWFsQ2hpbGRyZW4gPSBudWxsO1xuICByZXR1cm4gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaW5pdGlhbENoaWxkcmVuLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUh5ZHJhdGlvbkNvbnRhaW5lcihpbml0aWFsQ2hpbGRyZW4sIC8vIFRPRE86IFJlbW92ZSBgY2FsbGJhY2tgIHdoZW4gd2UgZGVsZXRlIGxlZ2FjeSBtb2RlLlxuY2FsbGJhY2ssIGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvciwgdHJhbnNpdGlvbkNhbGxiYWNrcykge1xuICB2YXIgaHlkcmF0ZSA9IHRydWU7XG4gIHZhciByb290ID0gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaW5pdGlhbENoaWxkcmVuLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTsgLy8gVE9ETzogTW92ZSB0aGlzIHRvIEZpYmVyUm9vdCBjb25zdHJ1Y3RvclxuXG4gIHJvb3QuY29udGV4dCA9IGdldENvbnRleHRGb3JTdWJ0cmVlKG51bGwpOyAvLyBTY2hlZHVsZSB0aGUgaW5pdGlhbCByZW5kZXIuIEluIGEgaHlkcmF0aW9uIHJvb3QsIHRoaXMgaXMgZGlmZmVyZW50IGZyb21cbiAgLy8gYSByZWd1bGFyIHVwZGF0ZSBiZWNhdXNlIHRoZSBpbml0aWFsIHJlbmRlciBtdXN0IG1hdGNoIHdhcyB3YXMgcmVuZGVyZWRcbiAgLy8gb24gdGhlIHNlcnZlci5cbiAgLy8gTk9URTogVGhpcyB1cGRhdGUgaW50ZW50aW9uYWxseSBkb2Vzbid0IGhhdmUgYSBwYXlsb2FkLiBXZSdyZSBvbmx5IHVzaW5nXG4gIC8vIHRoZSB1cGRhdGUgdG8gc2NoZWR1bGUgd29yayBvbiB0aGUgcm9vdCBmaWJlciAoYW5kLCBmb3IgbGVnYWN5IHJvb3RzLCB0b1xuICAvLyBlbnF1ZXVlIHRoZSBjYWxsYmFjayBpZiBvbmUgaXMgcHJvdmlkZWQpLlxuXG4gIHZhciBjdXJyZW50ID0gcm9vdC5jdXJyZW50O1xuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGN1cnJlbnQpO1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7XG4gIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwgPyBjYWxsYmFjayA6IG51bGw7XG4gIGVucXVldWVVcGRhdGUoY3VycmVudCwgdXBkYXRlLCBsYW5lKTtcbiAgc2NoZWR1bGVJbml0aWFsSHlkcmF0aW9uT25Sb290KHJvb3QsIGxhbmUsIGV2ZW50VGltZSk7XG4gIHJldHVybiByb290O1xufVxuZnVuY3Rpb24gdXBkYXRlQ29udGFpbmVyKGVsZW1lbnQsIGNvbnRhaW5lciwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjaykge1xuICB7XG4gICAgb25TY2hlZHVsZVJvb3QoY29udGFpbmVyLCBlbGVtZW50KTtcbiAgfVxuXG4gIHZhciBjdXJyZW50JDEgPSBjb250YWluZXIuY3VycmVudDtcbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShjdXJyZW50JDEpO1xuXG4gIHtcbiAgICBtYXJrUmVuZGVyU2NoZWR1bGVkKGxhbmUpO1xuICB9XG5cbiAgdmFyIGNvbnRleHQgPSBnZXRDb250ZXh0Rm9yU3VidHJlZShwYXJlbnRDb21wb25lbnQpO1xuXG4gIGlmIChjb250YWluZXIuY29udGV4dCA9PT0gbnVsbCkge1xuICAgIGNvbnRhaW5lci5jb250ZXh0ID0gY29udGV4dDtcbiAgfSBlbHNlIHtcbiAgICBjb250YWluZXIucGVuZGluZ0NvbnRleHQgPSBjb250ZXh0O1xuICB9XG5cbiAge1xuICAgIGlmIChpc1JlbmRlcmluZyAmJiBjdXJyZW50ICE9PSBudWxsICYmICFkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzKSB7XG4gICAgICBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzID0gdHJ1ZTtcblxuICAgICAgZXJyb3IoJ1JlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlOyAnICsgJ3RyaWdnZXJpbmcgbmVzdGVkIGNvbXBvbmVudCB1cGRhdGVzIGZyb20gcmVuZGVyIGlzIG5vdCBhbGxvd2VkLiAnICsgJ0lmIG5lY2Vzc2FyeSwgdHJpZ2dlciBuZXN0ZWQgdXBkYXRlcyBpbiBjb21wb25lbnREaWRVcGRhdGUuXFxuXFxuJyArICdDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiAlcy4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGN1cnJlbnQpIHx8ICdVbmtub3duJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpOyAvLyBDYXV0aW9uOiBSZWFjdCBEZXZUb29scyBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByb3BlcnR5XG4gIC8vIGJlaW5nIGNhbGxlZCBcImVsZW1lbnRcIi5cblxuICB1cGRhdGUucGF5bG9hZCA9IHtcbiAgICBlbGVtZW50OiBlbGVtZW50XG4gIH07XG4gIGNhbGxiYWNrID0gY2FsbGJhY2sgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjaztcblxuICBpZiAoY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICB7XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1bWVudCB0byBiZSBhICcgKyAnZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgfVxuXG4gIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShjdXJyZW50JDEsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgY3VycmVudCQxLCBsYW5lLCBldmVudFRpbWUpO1xuICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgY3VycmVudCQxLCBsYW5lKTtcbiAgfVxuXG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gZ2V0UHVibGljUm9vdEluc3RhbmNlKGNvbnRhaW5lcikge1xuICB2YXIgY29udGFpbmVyRmliZXIgPSBjb250YWluZXIuY3VycmVudDtcblxuICBpZiAoIWNvbnRhaW5lckZpYmVyLmNoaWxkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzd2l0Y2ggKGNvbnRhaW5lckZpYmVyLmNoaWxkLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiBnZXRQdWJsaWNJbnN0YW5jZShjb250YWluZXJGaWJlci5jaGlsZC5zdGF0ZU5vZGUpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBjb250YWluZXJGaWJlci5jaGlsZC5zdGF0ZU5vZGU7XG4gIH1cbn1cbmZ1bmN0aW9uIGF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbiQxKGZpYmVyKSB7XG4gIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHJvb3QgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHtcbiAgICAgICAgICAvLyBGbHVzaCB0aGUgZmlyc3Qgc2NoZWR1bGVkIFwidXBkYXRlXCIuXG4gICAgICAgICAgdmFyIGxhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5UGVuZGluZ0xhbmVzKHJvb3QpO1xuICAgICAgICAgIGZsdXNoUm9vdChyb290LCBsYW5lcyk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgICAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pOyAvLyBJZiB3ZSdyZSBzdGlsbCBibG9ja2VkIGFmdGVyIHRoaXMsIHdlIG5lZWQgdG8gaW5jcmVhc2VcbiAgICAgICAgLy8gdGhlIHByaW9yaXR5IG9mIGFueSBwcm9taXNlcyByZXNvbHZpbmcgd2l0aGluIHRoaXNcbiAgICAgICAgLy8gYm91bmRhcnkgc28gdGhhdCB0aGV5IG5leHQgYXR0ZW1wdCBhbHNvIGhhcyBoaWdoZXIgcHJpLlxuXG4gICAgICAgIHZhciByZXRyeUxhbmUgPSBTeW5jTGFuZTtcbiAgICAgICAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIHJldHJ5TGFuZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtSZXRyeUxhbmVJbXBsKGZpYmVyLCByZXRyeUxhbmUpIHtcbiAgdmFyIHN1c3BlbnNlU3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsICYmIHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgIHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lID0gaGlnaGVyUHJpb3JpdHlMYW5lKHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lLCByZXRyeUxhbmUpO1xuICB9XG59IC8vIEluY3JlYXNlcyB0aGUgcHJpb3JpdHkgb2YgdGhlbmFibGVzIHdoZW4gdGhleSByZXNvbHZlIHdpdGhpbiB0aGlzIGJvdW5kYXJ5LlxuXG5cbmZ1bmN0aW9uIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCByZXRyeUxhbmUpIHtcbiAgbWFya1JldHJ5TGFuZUltcGwoZmliZXIsIHJldHJ5TGFuZSk7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSkge1xuICAgIG1hcmtSZXRyeUxhbmVJbXBsKGFsdGVybmF0ZSwgcmV0cnlMYW5lKTtcbiAgfVxufVxuZnVuY3Rpb24gYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24kMShmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgYW5kIHRoZXkgc2hvdWxkIG5vdCBzdXNwZW5kIG9uIEkvTyxcbiAgICAvLyBzaW5jZSB5b3UgaGF2ZSB0byB3cmFwIGFueXRoaW5nIHRoYXQgbWlnaHQgc3VzcGVuZCBpblxuICAgIC8vIFN1c3BlbnNlLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBsYW5lID0gU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIGxhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gIH1cblxuICBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgbGFuZSk7XG59XG5mdW5jdGlvbiBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkkMShmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgb3RoZXIgdGhhbiBzeW5jaHJvbm91c2x5IGZsdXNoIGl0LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgbGFuZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgfVxuXG4gIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKGZpYmVyKSB7XG4gIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHMoZmliZXIpO1xuXG4gIGlmIChob3N0RmliZXIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBob3N0RmliZXIuc3RhdGVOb2RlO1xufVxuXG52YXIgc2hvdWxkRXJyb3JJbXBsID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gIHJldHVybiBudWxsO1xufTtcblxuZnVuY3Rpb24gc2hvdWxkRXJyb3IoZmliZXIpIHtcbiAgcmV0dXJuIHNob3VsZEVycm9ySW1wbChmaWJlcik7XG59XG5cbnZhciBzaG91bGRTdXNwZW5kSW1wbCA9IGZ1bmN0aW9uIChmaWJlcikge1xuICByZXR1cm4gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiBzaG91bGRTdXNwZW5kKGZpYmVyKSB7XG4gIHJldHVybiBzaG91bGRTdXNwZW5kSW1wbChmaWJlcik7XG59XG52YXIgb3ZlcnJpZGVIb29rU3RhdGUgPSBudWxsO1xudmFyIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCA9IG51bGw7XG52YXIgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzRGVsZXRlUGF0aCA9IG51bGw7XG52YXIgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGggPSBudWxsO1xudmFyIHNjaGVkdWxlVXBkYXRlID0gbnVsbDtcbnZhciBzZXRFcnJvckhhbmRsZXIgPSBudWxsO1xudmFyIHNldFN1c3BlbnNlSGFuZGxlciA9IG51bGw7XG5cbntcbiAgdmFyIGNvcHlXaXRoRGVsZXRlSW1wbCA9IGZ1bmN0aW9uIChvYmosIHBhdGgsIGluZGV4KSB7XG4gICAgdmFyIGtleSA9IHBhdGhbaW5kZXhdO1xuICAgIHZhciB1cGRhdGVkID0gaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBhc3NpZ24oe30sIG9iaik7XG5cbiAgICBpZiAoaW5kZXggKyAxID09PSBwYXRoLmxlbmd0aCkge1xuICAgICAgaWYgKGlzQXJyYXkodXBkYXRlZCkpIHtcbiAgICAgICAgdXBkYXRlZC5zcGxpY2Uoa2V5LCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB1cGRhdGVkW2tleV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH0gLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuXG5cbiAgICB1cGRhdGVkW2tleV0gPSBjb3B5V2l0aERlbGV0ZUltcGwob2JqW2tleV0sIHBhdGgsIGluZGV4ICsgMSk7XG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG4gIH07XG5cbiAgdmFyIGNvcHlXaXRoRGVsZXRlID0gZnVuY3Rpb24gKG9iaiwgcGF0aCkge1xuICAgIHJldHVybiBjb3B5V2l0aERlbGV0ZUltcGwob2JqLCBwYXRoLCAwKTtcbiAgfTtcblxuICB2YXIgY29weVdpdGhSZW5hbWVJbXBsID0gZnVuY3Rpb24gKG9iaiwgb2xkUGF0aCwgbmV3UGF0aCwgaW5kZXgpIHtcbiAgICB2YXIgb2xkS2V5ID0gb2xkUGF0aFtpbmRleF07XG4gICAgdmFyIHVwZGF0ZWQgPSBpc0FycmF5KG9iaikgPyBvYmouc2xpY2UoKSA6IGFzc2lnbih7fSwgb2JqKTtcblxuICAgIGlmIChpbmRleCArIDEgPT09IG9sZFBhdGgubGVuZ3RoKSB7XG4gICAgICB2YXIgbmV3S2V5ID0gbmV3UGF0aFtpbmRleF07IC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcblxuICAgICAgdXBkYXRlZFtuZXdLZXldID0gdXBkYXRlZFtvbGRLZXldO1xuXG4gICAgICBpZiAoaXNBcnJheSh1cGRhdGVkKSkge1xuICAgICAgICB1cGRhdGVkLnNwbGljZShvbGRLZXksIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRbb2xkS2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuICAgICAgdXBkYXRlZFtvbGRLZXldID0gY29weVdpdGhSZW5hbWVJbXBsKCAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG4gICAgICBvYmpbb2xkS2V5XSwgb2xkUGF0aCwgbmV3UGF0aCwgaW5kZXggKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhSZW5hbWUgPSBmdW5jdGlvbiAob2JqLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgaWYgKG9sZFBhdGgubGVuZ3RoICE9PSBuZXdQYXRoLmxlbmd0aCkge1xuICAgICAgd2FybignY29weVdpdGhSZW5hbWUoKSBleHBlY3RzIHBhdGhzIG9mIHRoZSBzYW1lIGxlbmd0aCcpO1xuXG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3UGF0aC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgaWYgKG9sZFBhdGhbaV0gIT09IG5ld1BhdGhbaV0pIHtcbiAgICAgICAgICB3YXJuKCdjb3B5V2l0aFJlbmFtZSgpIGV4cGVjdHMgcGF0aHMgdG8gYmUgdGhlIHNhbWUgZXhjZXB0IGZvciB0aGUgZGVlcGVzdCBrZXknKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb3B5V2l0aFJlbmFtZUltcGwob2JqLCBvbGRQYXRoLCBuZXdQYXRoLCAwKTtcbiAgfTtcblxuICB2YXIgY29weVdpdGhTZXRJbXBsID0gZnVuY3Rpb24gKG9iaiwgcGF0aCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgaWYgKGluZGV4ID49IHBhdGgubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIGtleSA9IHBhdGhbaW5kZXhdO1xuICAgIHZhciB1cGRhdGVkID0gaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBhc3NpZ24oe30sIG9iaik7IC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcblxuICAgIHVwZGF0ZWRba2V5XSA9IGNvcHlXaXRoU2V0SW1wbChvYmpba2V5XSwgcGF0aCwgaW5kZXggKyAxLCB2YWx1ZSk7XG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG4gIH07XG5cbiAgdmFyIGNvcHlXaXRoU2V0ID0gZnVuY3Rpb24gKG9iaiwgcGF0aCwgdmFsdWUpIHtcbiAgICByZXR1cm4gY29weVdpdGhTZXRJbXBsKG9iaiwgcGF0aCwgMCwgdmFsdWUpO1xuICB9O1xuXG4gIHZhciBmaW5kSG9vayA9IGZ1bmN0aW9uIChmaWJlciwgaWQpIHtcbiAgICAvLyBGb3Igbm93LCB0aGUgXCJpZFwiIG9mIHN0YXRlZnVsIGhvb2tzIGlzIGp1c3QgdGhlIHN0YXRlZnVsIGhvb2sgaW5kZXguXG4gICAgLy8gVGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUgd2l0aCBlLmcuIG5lc3RlZCBob29rcy5cbiAgICB2YXIgY3VycmVudEhvb2sgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuXG4gICAgd2hpbGUgKGN1cnJlbnRIb29rICE9PSBudWxsICYmIGlkID4gMCkge1xuICAgICAgY3VycmVudEhvb2sgPSBjdXJyZW50SG9vay5uZXh0O1xuICAgICAgaWQtLTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudEhvb2s7XG4gIH07IC8vIFN1cHBvcnQgRGV2VG9vbHMgZWRpdGFibGUgdmFsdWVzIGZvciB1c2VTdGF0ZSBhbmQgdXNlUmVkdWNlci5cblxuXG4gIG92ZXJyaWRlSG9va1N0YXRlID0gZnVuY3Rpb24gKGZpYmVyLCBpZCwgcGF0aCwgdmFsdWUpIHtcbiAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG5cbiAgICBpZiAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5ld1N0YXRlID0gY29weVdpdGhTZXQoaG9vay5tZW1vaXplZFN0YXRlLCBwYXRoLCB2YWx1ZSk7XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7IC8vIFdlIGFyZW4ndCBhY3R1YWxseSBhZGRpbmcgYW4gdXBkYXRlIHRvIHRoZSBxdWV1ZSxcbiAgICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gdXBkYXRlIHdlIGNhbiBhZGQgZm9yIHVzZVJlZHVjZXIgaG9va3MgdGhhdCB3b24ndCB0cmlnZ2VyIGFuIGVycm9yLlxuICAgICAgLy8gKFRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWN0aW9uIHR5cGUgZm9yIERldlRvb2xzIG92ZXJyaWRlcy4pXG4gICAgICAvLyBBcyBhIHJlc3VsdCB0aG91Z2gsIFJlYWN0IHdpbGwgc2VlIHRoZSBzY2hlZHVsZWQgdXBkYXRlIGFzIGEgbm9vcCBhbmQgYmFpbG91dC5cbiAgICAgIC8vIFNoYWxsb3cgY2xvbmluZyBwcm9wcyB3b3JrcyBhcyBhIHdvcmthcm91bmQgZm9yIG5vdyB0byBieXBhc3MgdGhlIGJhaWxvdXQgY2hlY2suXG5cbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBhc3NpZ24oe30sIGZpYmVyLm1lbW9pemVkUHJvcHMpO1xuICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIGlkLCBwYXRoKSB7XG4gICAgdmFyIGhvb2sgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuXG4gICAgaWYgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoRGVsZXRlKGhvb2subWVtb2l6ZWRTdGF0ZSwgcGF0aCk7XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7IC8vIFdlIGFyZW4ndCBhY3R1YWxseSBhZGRpbmcgYW4gdXBkYXRlIHRvIHRoZSBxdWV1ZSxcbiAgICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gdXBkYXRlIHdlIGNhbiBhZGQgZm9yIHVzZVJlZHVjZXIgaG9va3MgdGhhdCB3b24ndCB0cmlnZ2VyIGFuIGVycm9yLlxuICAgICAgLy8gKFRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWN0aW9uIHR5cGUgZm9yIERldlRvb2xzIG92ZXJyaWRlcy4pXG4gICAgICAvLyBBcyBhIHJlc3VsdCB0aG91Z2gsIFJlYWN0IHdpbGwgc2VlIHRoZSBzY2hlZHVsZWQgdXBkYXRlIGFzIGEgbm9vcCBhbmQgYmFpbG91dC5cbiAgICAgIC8vIFNoYWxsb3cgY2xvbmluZyBwcm9wcyB3b3JrcyBhcyBhIHdvcmthcm91bmQgZm9yIG5vdyB0byBieXBhc3MgdGhlIGJhaWxvdXQgY2hlY2suXG5cbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBhc3NpZ24oe30sIGZpYmVyLm1lbW9pemVkUHJvcHMpO1xuICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIGlkLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgdmFyIGhvb2sgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuXG4gICAgaWYgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoUmVuYW1lKGhvb2subWVtb2l6ZWRTdGF0ZSwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7IC8vIFdlIGFyZW4ndCBhY3R1YWxseSBhZGRpbmcgYW4gdXBkYXRlIHRvIHRoZSBxdWV1ZSxcbiAgICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gdXBkYXRlIHdlIGNhbiBhZGQgZm9yIHVzZVJlZHVjZXIgaG9va3MgdGhhdCB3b24ndCB0cmlnZ2VyIGFuIGVycm9yLlxuICAgICAgLy8gKFRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWN0aW9uIHR5cGUgZm9yIERldlRvb2xzIG92ZXJyaWRlcy4pXG4gICAgICAvLyBBcyBhIHJlc3VsdCB0aG91Z2gsIFJlYWN0IHdpbGwgc2VlIHRoZSBzY2hlZHVsZWQgdXBkYXRlIGFzIGEgbm9vcCBhbmQgYmFpbG91dC5cbiAgICAgIC8vIFNoYWxsb3cgY2xvbmluZyBwcm9wcyB3b3JrcyBhcyBhIHdvcmthcm91bmQgZm9yIG5vdyB0byBieXBhc3MgdGhlIGJhaWxvdXQgY2hlY2suXG5cbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBhc3NpZ24oe30sIGZpYmVyLm1lbW9pemVkUHJvcHMpO1xuICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cbiAgfTsgLy8gU3VwcG9ydCBEZXZUb29scyBwcm9wcyBmb3IgZnVuY3Rpb24gY29tcG9uZW50cywgZm9yd2FyZFJlZiwgbWVtbywgaG9zdCBjb21wb25lbnRzLCBldGMuXG5cblxuICBvdmVycmlkZVByb3BzID0gZnVuY3Rpb24gKGZpYmVyLCBwYXRoLCB2YWx1ZSkge1xuICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IGNvcHlXaXRoU2V0KGZpYmVyLm1lbW9pemVkUHJvcHMsIHBhdGgsIHZhbHVlKTtcblxuICAgIGlmIChmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAgIGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBwYXRoKSB7XG4gICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhEZWxldGUoZmliZXIubWVtb2l6ZWRQcm9wcywgcGF0aCk7XG5cbiAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgICBmaWJlci5hbHRlcm5hdGUucGVuZGluZ1Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZVByb3BzUmVuYW1lUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgb2xkUGF0aCwgbmV3UGF0aCkge1xuICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IGNvcHlXaXRoUmVuYW1lKGZpYmVyLm1lbW9pemVkUHJvcHMsIG9sZFBhdGgsIG5ld1BhdGgpO1xuXG4gICAgaWYgKGZpYmVyLmFsdGVybmF0ZSkge1xuICAgICAgZmliZXIuYWx0ZXJuYXRlLnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG4gIH07XG5cbiAgc2NoZWR1bGVVcGRhdGUgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG4gIH07XG5cbiAgc2V0RXJyb3JIYW5kbGVyID0gZnVuY3Rpb24gKG5ld1Nob3VsZEVycm9ySW1wbCkge1xuICAgIHNob3VsZEVycm9ySW1wbCA9IG5ld1Nob3VsZEVycm9ySW1wbDtcbiAgfTtcblxuICBzZXRTdXNwZW5zZUhhbmRsZXIgPSBmdW5jdGlvbiAobmV3U2hvdWxkU3VzcGVuZEltcGwpIHtcbiAgICBzaG91bGRTdXNwZW5kSW1wbCA9IG5ld1Nob3VsZFN1c3BlbmRJbXBsO1xuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlQnlGaWJlcihmaWJlcikge1xuICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXIoZmliZXIpO1xuXG4gIGlmIChob3N0RmliZXIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBob3N0RmliZXIuc3RhdGVOb2RlO1xufVxuXG5mdW5jdGlvbiBlbXB0eUZpbmRGaWJlckJ5SG9zdEluc3RhbmNlKGluc3RhbmNlKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXJGb3JEZXZUb29scygpIHtcbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbmZ1bmN0aW9uIGluamVjdEludG9EZXZUb29scyhkZXZUb29sc0NvbmZpZykge1xuICB2YXIgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2UgPSBkZXZUb29sc0NvbmZpZy5maW5kRmliZXJCeUhvc3RJbnN0YW5jZTtcbiAgdmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xuICByZXR1cm4gaW5qZWN0SW50ZXJuYWxzKHtcbiAgICBidW5kbGVUeXBlOiBkZXZUb29sc0NvbmZpZy5idW5kbGVUeXBlLFxuICAgIHZlcnNpb246IGRldlRvb2xzQ29uZmlnLnZlcnNpb24sXG4gICAgcmVuZGVyZXJQYWNrYWdlTmFtZTogZGV2VG9vbHNDb25maWcucmVuZGVyZXJQYWNrYWdlTmFtZSxcbiAgICByZW5kZXJlckNvbmZpZzogZGV2VG9vbHNDb25maWcucmVuZGVyZXJDb25maWcsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGU6IG92ZXJyaWRlSG9va1N0YXRlLFxuICAgIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aDogb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoLFxuICAgIG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aDogb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoLFxuICAgIG92ZXJyaWRlUHJvcHM6IG92ZXJyaWRlUHJvcHMsXG4gICAgb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGg6IG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoLFxuICAgIG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoOiBvdmVycmlkZVByb3BzUmVuYW1lUGF0aCxcbiAgICBzZXRFcnJvckhhbmRsZXI6IHNldEVycm9ySGFuZGxlcixcbiAgICBzZXRTdXNwZW5zZUhhbmRsZXI6IHNldFN1c3BlbnNlSGFuZGxlcixcbiAgICBzY2hlZHVsZVVwZGF0ZTogc2NoZWR1bGVVcGRhdGUsXG4gICAgY3VycmVudERpc3BhdGNoZXJSZWY6IFJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gICAgZmluZEhvc3RJbnN0YW5jZUJ5RmliZXI6IGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyLFxuICAgIGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOiBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZSB8fCBlbXB0eUZpbmRGaWJlckJ5SG9zdEluc3RhbmNlLFxuICAgIC8vIFJlYWN0IFJlZnJlc2hcbiAgICBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2g6ICBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2ggLFxuICAgIHNjaGVkdWxlUmVmcmVzaDogIHNjaGVkdWxlUmVmcmVzaCAsXG4gICAgc2NoZWR1bGVSb290OiAgc2NoZWR1bGVSb290ICxcbiAgICBzZXRSZWZyZXNoSGFuZGxlcjogIHNldFJlZnJlc2hIYW5kbGVyICxcbiAgICAvLyBFbmFibGVzIERldlRvb2xzIHRvIGFwcGVuZCBvd25lciBzdGFja3MgdG8gZXJyb3IgbWVzc2FnZXMgaW4gREVWIG1vZGUuXG4gICAgZ2V0Q3VycmVudEZpYmVyOiAgZ2V0Q3VycmVudEZpYmVyRm9yRGV2VG9vbHMgLFxuICAgIC8vIEVuYWJsZXMgRGV2VG9vbHMgdG8gZGV0ZWN0IHJlY29uY2lsZXIgdmVyc2lvbiByYXRoZXIgdGhhbiByZW5kZXJlciB2ZXJzaW9uXG4gICAgLy8gd2hpY2ggbWF5IG5vdCBtYXRjaCBmb3IgdGhpcmQgcGFydHkgcmVuZGVyZXJzLlxuICAgIHJlY29uY2lsZXJWZXJzaW9uOiBSZWFjdFZlcnNpb25cbiAgfSk7XG59XG5cbi8qIGdsb2JhbCByZXBvcnRFcnJvciAqL1xuXG52YXIgZGVmYXVsdE9uUmVjb3ZlcmFibGVFcnJvciA9IHR5cGVvZiByZXBvcnRFcnJvciA9PT0gJ2Z1bmN0aW9uJyA/IC8vIEluIG1vZGVybiBicm93c2VycywgcmVwb3J0RXJyb3Igd2lsbCBkaXNwYXRjaCBhbiBlcnJvciBldmVudCxcbi8vIGVtdWxhdGluZyBhbiB1bmNhdWdodCBKYXZhU2NyaXB0IGVycm9yLlxucmVwb3J0RXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgLy8gSW4gb2xkZXIgYnJvd3NlcnMgYW5kIHRlc3QgZW52aXJvbm1lbnRzLCBmYWxsYmFjayB0byBjb25zb2xlLmVycm9yLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG4gIGNvbnNvbGVbJ2Vycm9yJ10oZXJyb3IpO1xufTtcblxuZnVuY3Rpb24gUmVhY3RET01Sb290KGludGVybmFsUm9vdCkge1xuICB0aGlzLl9pbnRlcm5hbFJvb3QgPSBpbnRlcm5hbFJvb3Q7XG59XG5cblJlYWN0RE9NSHlkcmF0aW9uUm9vdC5wcm90b3R5cGUucmVuZGVyID0gUmVhY3RET01Sb290LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoY2hpbGRyZW4pIHtcbiAgdmFyIHJvb3QgPSB0aGlzLl9pbnRlcm5hbFJvb3Q7XG5cbiAgaWYgKHJvb3QgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgYW4gdW5tb3VudGVkIHJvb3QuJyk7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogZG9lcyBub3Qgc3VwcG9ydCB0aGUgc2Vjb25kIGNhbGxiYWNrIGFyZ3VtZW50LiAnICsgJ1RvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciByZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gYSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLicpO1xuICAgIH0gZWxzZSBpZiAoaXNWYWxpZENvbnRhaW5lcihhcmd1bWVudHNbMV0pKSB7XG4gICAgICBlcnJvcignWW91IHBhc3NlZCBhIGNvbnRhaW5lciB0byB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIHJvb3QucmVuZGVyKC4uLikuICcgKyBcIllvdSBkb24ndCBuZWVkIHRvIHBhc3MgaXQgYWdhaW4gc2luY2UgeW91IGFscmVhZHkgcGFzc2VkIGl0IHRvIGNyZWF0ZSB0aGUgcm9vdC5cIik7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXJndW1lbnRzWzFdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZXJyb3IoJ1lvdSBwYXNzZWQgYSBzZWNvbmQgYXJndW1lbnQgdG8gcm9vdC5yZW5kZXIoLi4uKSBidXQgaXQgb25seSBhY2NlcHRzICcgKyAnb25lIGFyZ3VtZW50LicpO1xuICAgIH1cblxuICAgIHZhciBjb250YWluZXIgPSByb290LmNvbnRhaW5lckluZm87XG5cbiAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlICE9PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBob3N0SW5zdGFuY2UgPSBmaW5kSG9zdEluc3RhbmNlV2l0aE5vUG9ydGFscyhyb290LmN1cnJlbnQpO1xuXG4gICAgICBpZiAoaG9zdEluc3RhbmNlKSB7XG4gICAgICAgIGlmIChob3N0SW5zdGFuY2UucGFyZW50Tm9kZSAhPT0gY29udGFpbmVyKSB7XG4gICAgICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBJdCBsb29rcyBsaWtlIHRoZSBSZWFjdC1yZW5kZXJlZCBjb250ZW50IG9mIHRoZSAnICsgJ3Jvb3QgY29udGFpbmVyIHdhcyByZW1vdmVkIHdpdGhvdXQgdXNpbmcgUmVhY3QuIFRoaXMgaXMgbm90ICcgKyAnc3VwcG9ydGVkIGFuZCB3aWxsIGNhdXNlIGVycm9ycy4gSW5zdGVhZCwgY2FsbCAnICsgXCJyb290LnVubW91bnQoKSB0byBlbXB0eSBhIHJvb3QncyBjb250YWluZXIuXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlQ29udGFpbmVyKGNoaWxkcmVuLCByb290LCBudWxsLCBudWxsKTtcbn07XG5cblJlYWN0RE9NSHlkcmF0aW9uUm9vdC5wcm90b3R5cGUudW5tb3VudCA9IFJlYWN0RE9NUm9vdC5wcm90b3R5cGUudW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcigndW5tb3VudCguLi4pOiBkb2VzIG5vdCBzdXBwb3J0IGEgY2FsbGJhY2sgYXJndW1lbnQuICcgKyAnVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyIHJlbmRlcmluZywgZGVjbGFyZSBpdCBpbiBhIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3QgPSB0aGlzLl9pbnRlcm5hbFJvb3Q7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICB0aGlzLl9pbnRlcm5hbFJvb3QgPSBudWxsO1xuICAgIHZhciBjb250YWluZXIgPSByb290LmNvbnRhaW5lckluZm87XG5cbiAgICB7XG4gICAgICBpZiAoaXNBbHJlYWR5UmVuZGVyaW5nKCkpIHtcbiAgICAgICAgZXJyb3IoJ0F0dGVtcHRlZCB0byBzeW5jaHJvbm91c2x5IHVubW91bnQgYSByb290IHdoaWxlIFJlYWN0IHdhcyBhbHJlYWR5ICcgKyAncmVuZGVyaW5nLiBSZWFjdCBjYW5ub3QgZmluaXNoIHVubW91bnRpbmcgdGhlIHJvb3QgdW50aWwgdGhlICcgKyAnY3VycmVudCByZW5kZXIgaGFzIGNvbXBsZXRlZCwgd2hpY2ggbWF5IGxlYWQgdG8gYSByYWNlIGNvbmRpdGlvbi4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgdXBkYXRlQ29udGFpbmVyKG51bGwsIHJvb3QsIG51bGwsIG51bGwpO1xuICAgIH0pO1xuICAgIHVubWFya0NvbnRhaW5lckFzUm9vdChjb250YWluZXIpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVSb290KGNvbnRhaW5lciwgb3B0aW9ucykge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignY3JlYXRlUm9vdCguLi4pOiBUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAgd2FybklmUmVhY3RET01Db250YWluZXJJbkRFVihjb250YWluZXIpO1xuICB2YXIgaXNTdHJpY3RNb2RlID0gZmFsc2U7XG4gIHZhciBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlID0gZmFsc2U7XG4gIHZhciBpZGVudGlmaWVyUHJlZml4ID0gJyc7XG4gIHZhciBvblJlY292ZXJhYmxlRXJyb3IgPSBkZWZhdWx0T25SZWNvdmVyYWJsZUVycm9yO1xuICB2YXIgdHJhbnNpdGlvbkNhbGxiYWNrcyA9IG51bGw7XG5cbiAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAge1xuICAgICAgaWYgKG9wdGlvbnMuaHlkcmF0ZSkge1xuICAgICAgICB3YXJuKCdoeWRyYXRlIHRocm91Z2ggY3JlYXRlUm9vdCBpcyBkZXByZWNhdGVkLiBVc2UgUmVhY3RET01DbGllbnQuaHlkcmF0ZVJvb3QoY29udGFpbmVyLCA8QXBwIC8+KSBpbnN0ZWFkLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgICAgIGVycm9yKCdZb3UgcGFzc2VkIGEgSlNYIGVsZW1lbnQgdG8gY3JlYXRlUm9vdC4gWW91IHByb2JhYmx5IG1lYW50IHRvICcgKyAnY2FsbCByb290LnJlbmRlciBpbnN0ZWFkLiAnICsgJ0V4YW1wbGUgdXNhZ2U6XFxuXFxuJyArICcgIGxldCByb290ID0gY3JlYXRlUm9vdChkb21Db250YWluZXIpO1xcbicgKyAnICByb290LnJlbmRlcig8QXBwIC8+KTsnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnVuc3RhYmxlX3N0cmljdE1vZGUgPT09IHRydWUpIHtcbiAgICAgIGlzU3RyaWN0TW9kZSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaWRlbnRpZmllclByZWZpeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZGVudGlmaWVyUHJlZml4ID0gb3B0aW9ucy5pZGVudGlmaWVyUHJlZml4O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvblJlY292ZXJhYmxlRXJyb3IgPSBvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvcjtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy50cmFuc2l0aW9uQ2FsbGJhY2tzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyYW5zaXRpb25DYWxsYmFja3MgPSBvcHRpb25zLnRyYW5zaXRpb25DYWxsYmFja3M7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3QgPSBjcmVhdGVDb250YWluZXIoY29udGFpbmVyLCBDb25jdXJyZW50Um9vdCwgbnVsbCwgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpO1xuICBtYXJrQ29udGFpbmVyQXNSb290KHJvb3QuY3VycmVudCwgY29udGFpbmVyKTtcbiAgdmFyIHJvb3RDb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lcjtcbiAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICByZXR1cm4gbmV3IFJlYWN0RE9NUm9vdChyb290KTtcbn1cblxuZnVuY3Rpb24gUmVhY3RET01IeWRyYXRpb25Sb290KGludGVybmFsUm9vdCkge1xuICB0aGlzLl9pbnRlcm5hbFJvb3QgPSBpbnRlcm5hbFJvb3Q7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlSHlkcmF0aW9uKHRhcmdldCkge1xuICBpZiAodGFyZ2V0KSB7XG4gICAgcXVldWVFeHBsaWNpdEh5ZHJhdGlvblRhcmdldCh0YXJnZXQpO1xuICB9XG59XG5cblJlYWN0RE9NSHlkcmF0aW9uUm9vdC5wcm90b3R5cGUudW5zdGFibGVfc2NoZWR1bGVIeWRyYXRpb24gPSBzY2hlZHVsZUh5ZHJhdGlvbjtcbmZ1bmN0aW9uIGh5ZHJhdGVSb290KGNvbnRhaW5lciwgaW5pdGlhbENoaWxkcmVuLCBvcHRpb25zKSB7XG4gIGlmICghaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdoeWRyYXRlUm9vdCguLi4pOiBUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAgd2FybklmUmVhY3RET01Db250YWluZXJJbkRFVihjb250YWluZXIpO1xuXG4gIHtcbiAgICBpZiAoaW5pdGlhbENoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVycm9yKCdNdXN0IHByb3ZpZGUgaW5pdGlhbCBjaGlsZHJlbiBhcyBzZWNvbmQgYXJndW1lbnQgdG8gaHlkcmF0ZVJvb3QuICcgKyAnRXhhbXBsZSB1c2FnZTogaHlkcmF0ZVJvb3QoZG9tQ29udGFpbmVyLCA8QXBwIC8+KScpO1xuICAgIH1cbiAgfSAvLyBGb3Igbm93IHdlIHJldXNlIHRoZSB3aG9sZSBiYWcgb2Ygb3B0aW9ucyBzaW5jZSB0aGV5IGNvbnRhaW5cbiAgLy8gdGhlIGh5ZHJhdGlvbiBjYWxsYmFja3MuXG5cblxuICB2YXIgaHlkcmF0aW9uQ2FsbGJhY2tzID0gb3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucyA6IG51bGw7IC8vIFRPRE86IERlbGV0ZSB0aGlzIG9wdGlvblxuXG4gIHZhciBtdXRhYmxlU291cmNlcyA9IG9wdGlvbnMgIT0gbnVsbCAmJiBvcHRpb25zLmh5ZHJhdGVkU291cmNlcyB8fCBudWxsO1xuICB2YXIgaXNTdHJpY3RNb2RlID0gZmFsc2U7XG4gIHZhciBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlID0gZmFsc2U7XG4gIHZhciBpZGVudGlmaWVyUHJlZml4ID0gJyc7XG4gIHZhciBvblJlY292ZXJhYmxlRXJyb3IgPSBkZWZhdWx0T25SZWNvdmVyYWJsZUVycm9yO1xuXG4gIGlmIChvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChvcHRpb25zLnVuc3RhYmxlX3N0cmljdE1vZGUgPT09IHRydWUpIHtcbiAgICAgIGlzU3RyaWN0TW9kZSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaWRlbnRpZmllclByZWZpeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZGVudGlmaWVyUHJlZml4ID0gb3B0aW9ucy5pZGVudGlmaWVyUHJlZml4O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvblJlY292ZXJhYmxlRXJyb3IgPSBvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvcjtcbiAgICB9XG4gIH1cblxuICB2YXIgcm9vdCA9IGNyZWF0ZUh5ZHJhdGlvbkNvbnRhaW5lcihpbml0aWFsQ2hpbGRyZW4sIG51bGwsIGNvbnRhaW5lciwgQ29uY3VycmVudFJvb3QsIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpO1xuICBtYXJrQ29udGFpbmVyQXNSb290KHJvb3QuY3VycmVudCwgY29udGFpbmVyKTsgLy8gVGhpcyBjYW4ndCBiZSBhIGNvbW1lbnQgbm9kZSBzaW5jZSBoeWRyYXRpb24gZG9lc24ndCB3b3JrIG9uIGNvbW1lbnQgbm9kZXMgYW55d2F5LlxuXG4gIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKGNvbnRhaW5lcik7XG5cbiAgaWYgKG11dGFibGVTb3VyY2VzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdXRhYmxlU291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG11dGFibGVTb3VyY2UgPSBtdXRhYmxlU291cmNlc1tpXTtcbiAgICAgIHJlZ2lzdGVyTXV0YWJsZVNvdXJjZUZvckh5ZHJhdGlvbihyb290LCBtdXRhYmxlU291cmNlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFJlYWN0RE9NSHlkcmF0aW9uUm9vdChyb290KTtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRDb250YWluZXIobm9kZSkge1xuICByZXR1cm4gISEobm9kZSAmJiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSB8fCAhZGlzYWJsZUNvbW1lbnRzQXNET01Db250YWluZXJzICApKTtcbn0gLy8gVE9ETzogUmVtb3ZlIHRoaXMgZnVuY3Rpb24gd2hpY2ggYWxzbyBpbmNsdWRlcyBjb21tZW50IG5vZGVzLlxuLy8gV2Ugb25seSB1c2UgaXQgaW4gcGxhY2VzIHRoYXQgYXJlIGN1cnJlbnRseSBtb3JlIHJlbGF4ZWQuXG5cbmZ1bmN0aW9uIGlzVmFsaWRDb250YWluZXJMZWdhY3kobm9kZSkge1xuICByZXR1cm4gISEobm9kZSAmJiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgJiYgbm9kZS5ub2RlVmFsdWUgPT09ICcgcmVhY3QtbW91bnQtcG9pbnQtdW5zdGFibGUgJykpO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZSZWFjdERPTUNvbnRhaW5lckluREVWKGNvbnRhaW5lcikge1xuICB7XG4gICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIGNvbnRhaW5lci50YWdOYW1lICYmIGNvbnRhaW5lci50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdCT0RZJykge1xuICAgICAgZXJyb3IoJ2NyZWF0ZVJvb3QoKTogQ3JlYXRpbmcgcm9vdHMgZGlyZWN0bHkgd2l0aCBkb2N1bWVudC5ib2R5IGlzICcgKyAnZGlzY291cmFnZWQsIHNpbmNlIGl0cyBjaGlsZHJlbiBhcmUgb2Z0ZW4gbWFuaXB1bGF0ZWQgYnkgdGhpcmQtcGFydHkgJyArICdzY3JpcHRzIGFuZCBicm93c2VyIGV4dGVuc2lvbnMuIFRoaXMgbWF5IGxlYWQgdG8gc3VidGxlICcgKyAncmVjb25jaWxpYXRpb24gaXNzdWVzLiBUcnkgdXNpbmcgYSBjb250YWluZXIgZWxlbWVudCBjcmVhdGVkICcgKyAnZm9yIHlvdXIgYXBwLicpO1xuICAgIH1cblxuICAgIGlmIChpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChjb250YWluZXIpKSB7XG4gICAgICBpZiAoY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIpIHtcbiAgICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTS5yZW5kZXIoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkgb24gYSBjb250YWluZXIgdGhhdCAnICsgJ2hhcyBhbHJlYWR5IGJlZW4gcGFzc2VkIHRvIGNyZWF0ZVJvb3QoKSBiZWZvcmUuIEluc3RlYWQsIGNhbGwgJyArICdyb290LnJlbmRlcigpIG9uIHRoZSBleGlzdGluZyByb290IGluc3RlYWQgaWYgeW91IHdhbnQgdG8gdXBkYXRlIGl0LicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIkMyA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xudmFyIHRvcExldmVsVXBkYXRlV2FybmluZ3M7XG5cbntcbiAgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncyA9IGZ1bmN0aW9uIChjb250YWluZXIpIHtcbiAgICBpZiAoY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgJiYgY29udGFpbmVyLm5vZGVUeXBlICE9PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBob3N0SW5zdGFuY2UgPSBmaW5kSG9zdEluc3RhbmNlV2l0aE5vUG9ydGFscyhjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lci5jdXJyZW50KTtcblxuICAgICAgaWYgKGhvc3RJbnN0YW5jZSkge1xuICAgICAgICBpZiAoaG9zdEluc3RhbmNlLnBhcmVudE5vZGUgIT09IGNvbnRhaW5lcikge1xuICAgICAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogSXQgbG9va3MgbGlrZSB0aGUgUmVhY3QtcmVuZGVyZWQgY29udGVudCBvZiB0aGlzICcgKyAnY29udGFpbmVyIHdhcyByZW1vdmVkIHdpdGhvdXQgdXNpbmcgUmVhY3QuIFRoaXMgaXMgbm90ICcgKyAnc3VwcG9ydGVkIGFuZCB3aWxsIGNhdXNlIGVycm9ycy4gSW5zdGVhZCwgY2FsbCAnICsgJ1JlYWN0RE9NLnVubW91bnRDb21wb25lbnRBdE5vZGUgdG8gZW1wdHkgYSBjb250YWluZXIuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaXNSb290UmVuZGVyZWRCeVNvbWVSZWFjdCA9ICEhY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXI7XG4gICAgdmFyIHJvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICAgIHZhciBoYXNOb25Sb290UmVhY3RDaGlsZCA9ICEhKHJvb3RFbCAmJiBnZXRJbnN0YW5jZUZyb21Ob2RlKHJvb3RFbCkpO1xuXG4gICAgaWYgKGhhc05vblJvb3RSZWFjdENoaWxkICYmICFpc1Jvb3RSZW5kZXJlZEJ5U29tZVJlYWN0KSB7XG4gICAgICBlcnJvcigncmVuZGVyKC4uLik6IFJlcGxhY2luZyBSZWFjdC1yZW5kZXJlZCBjaGlsZHJlbiB3aXRoIGEgbmV3IHJvb3QgJyArICdjb21wb25lbnQuIElmIHlvdSBpbnRlbmRlZCB0byB1cGRhdGUgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSwgJyArICd5b3Ugc2hvdWxkIGluc3RlYWQgaGF2ZSB0aGUgZXhpc3RpbmcgY2hpbGRyZW4gdXBkYXRlIHRoZWlyIHN0YXRlICcgKyAnYW5kIHJlbmRlciB0aGUgbmV3IGNvbXBvbmVudHMgaW5zdGVhZCBvZiBjYWxsaW5nIFJlYWN0RE9NLnJlbmRlci4nKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiYgY29udGFpbmVyLnRhZ05hbWUgJiYgY29udGFpbmVyLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0JPRFknKSB7XG4gICAgICBlcnJvcigncmVuZGVyKCk6IFJlbmRlcmluZyBjb21wb25lbnRzIGRpcmVjdGx5IGludG8gZG9jdW1lbnQuYm9keSBpcyAnICsgJ2Rpc2NvdXJhZ2VkLCBzaW5jZSBpdHMgY2hpbGRyZW4gYXJlIG9mdGVuIG1hbmlwdWxhdGVkIGJ5IHRoaXJkLXBhcnR5ICcgKyAnc2NyaXB0cyBhbmQgYnJvd3NlciBleHRlbnNpb25zLiBUaGlzIG1heSBsZWFkIHRvIHN1YnRsZSAnICsgJ3JlY29uY2lsaWF0aW9uIGlzc3Vlcy4gVHJ5IHJlbmRlcmluZyBpbnRvIGEgY29udGFpbmVyIGVsZW1lbnQgY3JlYXRlZCAnICsgJ2ZvciB5b3VyIGFwcC4nKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgaWYgKCFjb250YWluZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUpIHtcbiAgICByZXR1cm4gY29udGFpbmVyLmRvY3VtZW50RWxlbWVudDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9vcE9uUmVjb3ZlcmFibGVFcnJvcigpIHsvLyBUaGlzIGlzbid0IHJlYWNoYWJsZSBiZWNhdXNlIG9uUmVjb3ZlcmFibGVFcnJvciBpc24ndCBjYWxsZWQgaW4gdGhlXG4gIC8vIGxlZ2FjeSBBUEkuXG59XG5cbmZ1bmN0aW9uIGxlZ2FjeUNyZWF0ZVJvb3RGcm9tRE9NQ29udGFpbmVyKGNvbnRhaW5lciwgaW5pdGlhbENoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrLCBpc0h5ZHJhdGlvbkNvbnRhaW5lcikge1xuICBpZiAoaXNIeWRyYXRpb25Db250YWluZXIpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0UHVibGljUm9vdEluc3RhbmNlKHJvb3QpO1xuICAgICAgICBvcmlnaW5hbENhbGxiYWNrLmNhbGwoaW5zdGFuY2UpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGNyZWF0ZUh5ZHJhdGlvbkNvbnRhaW5lcihpbml0aWFsQ2hpbGRyZW4sIGNhbGxiYWNrLCBjb250YWluZXIsIExlZ2FjeVJvb3QsIG51bGwsIC8vIGh5ZHJhdGlvbkNhbGxiYWNrc1xuICAgIGZhbHNlLCAvLyBpc1N0cmljdE1vZGVcbiAgICBmYWxzZSwgLy8gY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSxcbiAgICAnJywgLy8gaWRlbnRpZmllclByZWZpeFxuICAgIG5vb3BPblJlY292ZXJhYmxlRXJyb3IpO1xuICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0gcm9vdDtcbiAgICBtYXJrQ29udGFpbmVyQXNSb290KHJvb3QuY3VycmVudCwgY29udGFpbmVyKTtcbiAgICB2YXIgcm9vdENvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IGNvbnRhaW5lci5wYXJlbnROb2RlIDogY29udGFpbmVyO1xuICAgIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHJvb3RDb250YWluZXJFbGVtZW50KTtcbiAgICBmbHVzaFN5bmMoKTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfSBlbHNlIHtcbiAgICAvLyBGaXJzdCBjbGVhciBhbnkgZXhpc3RpbmcgY29udGVudC5cbiAgICB2YXIgcm9vdFNpYmxpbmc7XG5cbiAgICB3aGlsZSAocm9vdFNpYmxpbmcgPSBjb250YWluZXIubGFzdENoaWxkKSB7XG4gICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQocm9vdFNpYmxpbmcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0UHVibGljUm9vdEluc3RhbmNlKF9yb290KTtcblxuICAgICAgICBfb3JpZ2luYWxDYWxsYmFjay5jYWxsKGluc3RhbmNlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9yb290ID0gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lciwgTGVnYWN5Um9vdCwgbnVsbCwgLy8gaHlkcmF0aW9uQ2FsbGJhY2tzXG4gICAgZmFsc2UsIC8vIGlzU3RyaWN0TW9kZVxuICAgIGZhbHNlLCAvLyBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLFxuICAgICcnLCAvLyBpZGVudGlmaWVyUHJlZml4XG4gICAgbm9vcE9uUmVjb3ZlcmFibGVFcnJvcik7XG5cbiAgICBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9IF9yb290O1xuICAgIG1hcmtDb250YWluZXJBc1Jvb3QoX3Jvb3QuY3VycmVudCwgY29udGFpbmVyKTtcblxuICAgIHZhciBfcm9vdENvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IGNvbnRhaW5lci5wYXJlbnROb2RlIDogY29udGFpbmVyO1xuXG4gICAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMoX3Jvb3RDb250YWluZXJFbGVtZW50KTsgLy8gSW5pdGlhbCBtb3VudCBzaG91bGQgbm90IGJlIGJhdGNoZWQuXG5cbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgdXBkYXRlQ29udGFpbmVyKGluaXRpYWxDaGlsZHJlbiwgX3Jvb3QsIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2spO1xuICAgIH0pO1xuICAgIHJldHVybiBfcm9vdDtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuT25JbnZhbGlkQ2FsbGJhY2skMShjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICB7XG4gICAgaWYgKGNhbGxiYWNrICE9PSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsZXJOYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgY2hpbGRyZW4sIGNvbnRhaW5lciwgZm9yY2VIeWRyYXRlLCBjYWxsYmFjaykge1xuICB7XG4gICAgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncyhjb250YWluZXIpO1xuICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayQxKGNhbGxiYWNrID09PSB1bmRlZmluZWQgPyBudWxsIDogY2FsbGJhY2ssICdyZW5kZXInKTtcbiAgfVxuXG4gIHZhciBtYXliZVJvb3QgPSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcjtcbiAgdmFyIHJvb3Q7XG5cbiAgaWYgKCFtYXliZVJvb3QpIHtcbiAgICAvLyBJbml0aWFsIG1vdW50XG4gICAgcm9vdCA9IGxlZ2FjeUNyZWF0ZVJvb3RGcm9tRE9NQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGRyZW4sIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2ssIGZvcmNlSHlkcmF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdCA9IG1heWJlUm9vdDtcblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBvcmlnaW5hbENhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRQdWJsaWNSb290SW5zdGFuY2Uocm9vdCk7XG4gICAgICAgIG9yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH0gLy8gVXBkYXRlXG5cblxuICAgIHVwZGF0ZUNvbnRhaW5lcihjaGlsZHJlbiwgcm9vdCwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjayk7XG4gIH1cblxuICByZXR1cm4gZ2V0UHVibGljUm9vdEluc3RhbmNlKHJvb3QpO1xufVxuXG5mdW5jdGlvbiBmaW5kRE9NTm9kZShjb21wb25lbnRPckVsZW1lbnQpIHtcbiAge1xuICAgIHZhciBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyJDMuY3VycmVudDtcblxuICAgIGlmIChvd25lciAhPT0gbnVsbCAmJiBvd25lci5zdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIHZhciB3YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IG93bmVyLnN0YXRlTm9kZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXI7XG5cbiAgICAgIGlmICghd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIpIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIGFjY2Vzc2luZyBmaW5kRE9NTm9kZSBpbnNpZGUgaXRzIHJlbmRlcigpLiAnICsgJ3JlbmRlcigpIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLiBJdCBzaG91bGQgJyArICduZXZlciBhY2Nlc3Mgc29tZXRoaW5nIHRoYXQgcmVxdWlyZXMgc3RhbGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyAnICsgJ3JlbmRlciwgc3VjaCBhcyByZWZzLiBNb3ZlIHRoaXMgbG9naWMgdG8gY29tcG9uZW50RGlkTW91bnQgYW5kICcgKyAnY29tcG9uZW50RGlkVXBkYXRlIGluc3RlYWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKG93bmVyLnR5cGUpIHx8ICdBIGNvbXBvbmVudCcpO1xuICAgICAgfVxuXG4gICAgICBvd25lci5zdGF0ZU5vZGUuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29tcG9uZW50T3JFbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChjb21wb25lbnRPckVsZW1lbnQubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgIHJldHVybiBjb21wb25lbnRPckVsZW1lbnQ7XG4gIH1cblxuICB7XG4gICAgcmV0dXJuIGZpbmRIb3N0SW5zdGFuY2VXaXRoV2FybmluZyhjb21wb25lbnRPckVsZW1lbnQsICdmaW5kRE9NTm9kZScpO1xuICB9XG59XG5mdW5jdGlvbiBoeWRyYXRlKGVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spIHtcbiAge1xuICAgIGVycm9yKCdSZWFjdERPTS5oeWRyYXRlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gUmVhY3QgMTguIFVzZSBoeWRyYXRlUm9vdCAnICsgJ2luc3RlYWQuIFVudGlsIHlvdSBzd2l0Y2ggdG8gdGhlIG5ldyBBUEksIHlvdXIgYXBwIHdpbGwgYmVoYXZlIGFzICcgKyBcImlmIGl0J3MgcnVubmluZyBSZWFjdCAxNy4gTGVhcm4gXCIgKyAnbW9yZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N3aXRjaC10by1jcmVhdGVyb290Jyk7XG4gIH1cblxuICBpZiAoIWlzVmFsaWRDb250YWluZXJMZWdhY3koY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIHtcbiAgICB2YXIgaXNNb2Rlcm5Sb290ID0gaXNDb250YWluZXJNYXJrZWRBc1Jvb3QoY29udGFpbmVyKSAmJiBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTW9kZXJuUm9vdCkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS5oeWRyYXRlKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCBoeWRyYXRlUm9vdChjb250YWluZXIsIGVsZW1lbnQpPycpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiB0aHJvdyBvciB3YXJuIGlmIHdlIGNvdWxkbid0IGh5ZHJhdGU/XG5cblxuICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgZWxlbWVudCwgY29udGFpbmVyLCB0cnVlLCBjYWxsYmFjayk7XG59XG5mdW5jdGlvbiByZW5kZXIoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICB7XG4gICAgZXJyb3IoJ1JlYWN0RE9NLnJlbmRlciBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGluIFJlYWN0IDE4LiBVc2UgY3JlYXRlUm9vdCAnICsgJ2luc3RlYWQuIFVudGlsIHlvdSBzd2l0Y2ggdG8gdGhlIG5ldyBBUEksIHlvdXIgYXBwIHdpbGwgYmVoYXZlIGFzICcgKyBcImlmIGl0J3MgcnVubmluZyBSZWFjdCAxNy4gTGVhcm4gXCIgKyAnbW9yZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N3aXRjaC10by1jcmVhdGVyb290Jyk7XG4gIH1cblxuICBpZiAoIWlzVmFsaWRDb250YWluZXJMZWdhY3koY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIHtcbiAgICB2YXIgaXNNb2Rlcm5Sb290ID0gaXNDb250YWluZXJNYXJrZWRBc1Jvb3QoY29udGFpbmVyKSAmJiBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTW9kZXJuUm9vdCkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS5yZW5kZXIoKSBvbiBhIGNvbnRhaW5lciB0aGF0IHdhcyBwcmV2aW91c2x5ICcgKyAncGFzc2VkIHRvIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIHJvb3QucmVuZGVyKGVsZW1lbnQpPycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBlbGVtZW50LCBjb250YWluZXIsIGZhbHNlLCBjYWxsYmFjayk7XG59XG5mdW5jdGlvbiB1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICBlcnJvcignUmVhY3RET00udW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIoKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkICcgKyAnaW4gUmVhY3QgMTguIENvbnNpZGVyIHVzaW5nIGEgcG9ydGFsIGluc3RlYWQuIFVudGlsIHlvdSBzd2l0Y2ggdG8gJyArIFwidGhlIGNyZWF0ZVJvb3QgQVBJLCB5b3VyIGFwcCB3aWxsIGJlaGF2ZSBhcyBpZiBpdCdzIHJ1bm5pbmcgUmVhY3QgXCIgKyAnMTcuIExlYXJuIG1vcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zd2l0Y2gtdG8tY3JlYXRlcm9vdCcpO1xuICB9XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lck5vZGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAgaWYgKHBhcmVudENvbXBvbmVudCA9PSBudWxsIHx8ICFoYXMocGFyZW50Q29tcG9uZW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncGFyZW50Q29tcG9uZW50IG11c3QgYmUgYSB2YWxpZCBSZWFjdCBDb21wb25lbnQnKTtcbiAgfVxuXG4gIHJldHVybiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGZhbHNlLCBjYWxsYmFjayk7XG59XG5mdW5jdGlvbiB1bm1vdW50Q29tcG9uZW50QXROb2RlKGNvbnRhaW5lcikge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXJMZWdhY3koY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndW5tb3VudENvbXBvbmVudEF0Tm9kZSguLi4pOiBUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAge1xuICAgIHZhciBpc01vZGVyblJvb3QgPSBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChjb250YWluZXIpICYmIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID09PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNNb2Rlcm5Sb290KSB7XG4gICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NLnVubW91bnRDb21wb25lbnRBdE5vZGUoKSBvbiBhIGNvbnRhaW5lciB0aGF0IHdhcyBwcmV2aW91c2x5ICcgKyAncGFzc2VkIHRvIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiBEaWQgeW91IG1lYW4gdG8gY2FsbCByb290LnVubW91bnQoKT8nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIpIHtcbiAgICB7XG4gICAgICB2YXIgcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gICAgICB2YXIgcmVuZGVyZWRCeURpZmZlcmVudFJlYWN0ID0gcm9vdEVsICYmICFnZXRJbnN0YW5jZUZyb21Ob2RlKHJvb3RFbCk7XG5cbiAgICAgIGlmIChyZW5kZXJlZEJ5RGlmZmVyZW50UmVhY3QpIHtcbiAgICAgICAgZXJyb3IoXCJ1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFRoZSBub2RlIHlvdSdyZSBhdHRlbXB0aW5nIHRvIHVubW91bnQgXCIgKyAnd2FzIHJlbmRlcmVkIGJ5IGFub3RoZXIgY29weSBvZiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICB9IC8vIFVubW91bnQgc2hvdWxkIG5vdCBiZSBiYXRjaGVkLlxuXG5cbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgbnVsbCwgY29udGFpbmVyLCBmYWxzZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgc2hvdWxkIHByb2JhYmx5IHVzZSBgZGVsZXRlIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyYFxuICAgICAgICBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9IG51bGw7XG4gICAgICAgIHVubWFya0NvbnRhaW5lckFzUm9vdChjb250YWluZXIpO1xuICAgICAgfSk7XG4gICAgfSk7IC8vIElmIHlvdSBjYWxsIHVubW91bnRDb21wb25lbnRBdE5vZGUgdHdpY2UgaW4gcXVpY2sgc3VjY2Vzc2lvbiwgeW91J2xsXG4gICAgLy8gZ2V0IGB0cnVlYCB0d2ljZS4gVGhhdCdzIHByb2JhYmx5IGZpbmU/XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB7XG4gICAgICB2YXIgX3Jvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuXG4gICAgICB2YXIgaGFzTm9uUm9vdFJlYWN0Q2hpbGQgPSAhIShfcm9vdEVsICYmIGdldEluc3RhbmNlRnJvbU5vZGUoX3Jvb3RFbCkpOyAvLyBDaGVjayBpZiB0aGUgY29udGFpbmVyIGl0c2VsZiBpcyBhIFJlYWN0IHJvb3Qgbm9kZS5cblxuICAgICAgdmFyIGlzQ29udGFpbmVyUmVhY3RSb290ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiYgaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIucGFyZW50Tm9kZSkgJiYgISFjb250YWluZXIucGFyZW50Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyO1xuXG4gICAgICBpZiAoaGFzTm9uUm9vdFJlYWN0Q2hpbGQpIHtcbiAgICAgICAgZXJyb3IoXCJ1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFRoZSBub2RlIHlvdSdyZSBhdHRlbXB0aW5nIHRvIHVubW91bnQgXCIgKyAnd2FzIHJlbmRlcmVkIGJ5IFJlYWN0IGFuZCBpcyBub3QgYSB0b3AtbGV2ZWwgY29udGFpbmVyLiAlcycsIGlzQ29udGFpbmVyUmVhY3RSb290ID8gJ1lvdSBtYXkgaGF2ZSBhY2NpZGVudGFsbHkgcGFzc2VkIGluIGEgUmVhY3Qgcm9vdCBub2RlIGluc3RlYWQgJyArICdvZiBpdHMgY29udGFpbmVyLicgOiAnSW5zdGVhZCwgaGF2ZSB0aGUgcGFyZW50IGNvbXBvbmVudCB1cGRhdGUgaXRzIHN0YXRlIGFuZCAnICsgJ3JlcmVuZGVyIGluIG9yZGVyIHRvIHJlbW92ZSB0aGlzIGNvbXBvbmVudC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuc2V0QXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbiQxKTtcbnNldEF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uJDEpO1xuc2V0QXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5KGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eSQxKTtcbnNldEdldEN1cnJlbnRVcGRhdGVQcmlvcml0eShnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkpO1xuc2V0QXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkocnVuV2l0aFByaW9yaXR5KTtcblxue1xuICBpZiAodHlwZW9mIE1hcCAhPT0gJ2Z1bmN0aW9uJyB8fCAvLyAkRmxvd0lzc3VlIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIE1hcCBoYXMgbm8gcHJvdG90eXBlXG4gIE1hcC5wcm90b3R5cGUgPT0gbnVsbCB8fCB0eXBlb2YgTWFwLnByb3RvdHlwZS5mb3JFYWNoICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBTZXQgIT09ICdmdW5jdGlvbicgfHwgLy8gJEZsb3dJc3N1ZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBTZXQgaGFzIG5vIHByb3RvdHlwZVxuICBTZXQucHJvdG90eXBlID09IG51bGwgfHwgdHlwZW9mIFNldC5wcm90b3R5cGUuY2xlYXIgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIFNldC5wcm90b3R5cGUuZm9yRWFjaCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGVycm9yKCdSZWFjdCBkZXBlbmRzIG9uIE1hcCBhbmQgU2V0IGJ1aWx0LWluIHR5cGVzLiBNYWtlIHN1cmUgdGhhdCB5b3UgbG9hZCBhICcgKyAncG9seWZpbGwgaW4gb2xkZXIgYnJvd3NlcnMuIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1wb2x5ZmlsbHMnKTtcbiAgfVxufVxuXG5zZXRSZXN0b3JlSW1wbGVtZW50YXRpb24ocmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQzKTtcbnNldEJhdGNoaW5nSW1wbGVtZW50YXRpb24oYmF0Y2hlZFVwZGF0ZXMkMSwgZGlzY3JldGVVcGRhdGVzLCBmbHVzaFN5bmMpO1xuXG5mdW5jdGlvbiBjcmVhdGVQb3J0YWwkMShjaGlsZHJlbiwgY29udGFpbmVyKSB7XG4gIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH0gLy8gVE9ETzogcGFzcyBSZWFjdERPTSBwb3J0YWwgaW1wbGVtZW50YXRpb24gYXMgdGhpcmQgYXJndW1lbnRcbiAgLy8gJEZsb3dGaXhNZSBUaGUgRmxvdyB0eXBlIGlzIG9wYXF1ZSBidXQgdGhlcmUncyBubyB3YXkgdG8gYWN0dWFsbHkgY3JlYXRlIGl0LlxuXG5cbiAgcmV0dXJuIGNyZWF0ZVBvcnRhbChjaGlsZHJlbiwgY29udGFpbmVyLCBudWxsLCBrZXkpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGNhbGxiYWNrKSB7XG4gIHJldHVybiB1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGNhbGxiYWNrKTtcbn1cblxudmFyIEludGVybmFscyA9IHtcbiAgdXNpbmdDbGllbnRFbnRyeVBvaW50OiBmYWxzZSxcbiAgLy8gS2VlcCBpbiBzeW5jIHdpdGggUmVhY3RUZXN0VXRpbHMuanMuXG4gIC8vIFRoaXMgaXMgYW4gYXJyYXkgZm9yIGJldHRlciBtaW5pZmljYXRpb24uXG4gIEV2ZW50czogW2dldEluc3RhbmNlRnJvbU5vZGUsIGdldE5vZGVGcm9tSW5zdGFuY2UsIGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUsIGVucXVldWVTdGF0ZVJlc3RvcmUsIHJlc3RvcmVTdGF0ZUlmTmVlZGVkLCBiYXRjaGVkVXBkYXRlcyQxXVxufTtcblxuZnVuY3Rpb24gY3JlYXRlUm9vdCQxKGNvbnRhaW5lciwgb3B0aW9ucykge1xuICB7XG4gICAgaWYgKCFJbnRlcm5hbHMudXNpbmdDbGllbnRFbnRyeVBvaW50ICYmICFmYWxzZSkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgaW1wb3J0aW5nIGNyZWF0ZVJvb3QgZnJvbSBcInJlYWN0LWRvbVwiIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnWW91IHNob3VsZCBpbnN0ZWFkIGltcG9ydCBpdCBmcm9tIFwicmVhY3QtZG9tL2NsaWVudFwiLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjcmVhdGVSb290KGNvbnRhaW5lciwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGh5ZHJhdGVSb290JDEoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIG9wdGlvbnMpIHtcbiAge1xuICAgIGlmICghSW50ZXJuYWxzLnVzaW5nQ2xpZW50RW50cnlQb2ludCAmJiAhZmFsc2UpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGltcG9ydGluZyBoeWRyYXRlUm9vdCBmcm9tIFwicmVhY3QtZG9tXCIgd2hpY2ggaXMgbm90IHN1cHBvcnRlZC4gJyArICdZb3Ugc2hvdWxkIGluc3RlYWQgaW1wb3J0IGl0IGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCIuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGh5ZHJhdGVSb290KGNvbnRhaW5lciwgaW5pdGlhbENoaWxkcmVuLCBvcHRpb25zKTtcbn0gLy8gT3ZlcmxvYWQgdGhlIGRlZmluaXRpb24gdG8gdGhlIHR3byB2YWxpZCBzaWduYXR1cmVzLlxuLy8gV2FybmluZywgdGhpcyBvcHRzLW91dCBvZiBjaGVja2luZyB0aGUgZnVuY3Rpb24gYm9keS5cblxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG5mdW5jdGlvbiBmbHVzaFN5bmMkMShmbikge1xuICB7XG4gICAgaWYgKGlzQWxyZWFkeVJlbmRlcmluZygpKSB7XG4gICAgICBlcnJvcignZmx1c2hTeW5jIHdhcyBjYWxsZWQgZnJvbSBpbnNpZGUgYSBsaWZlY3ljbGUgbWV0aG9kLiBSZWFjdCBjYW5ub3QgJyArICdmbHVzaCB3aGVuIFJlYWN0IGlzIGFscmVhZHkgcmVuZGVyaW5nLiBDb25zaWRlciBtb3ZpbmcgdGhpcyBjYWxsIHRvICcgKyAnYSBzY2hlZHVsZXIgdGFzayBvciBtaWNybyB0YXNrLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmbHVzaFN5bmMoZm4pO1xufVxudmFyIGZvdW5kRGV2VG9vbHMgPSBpbmplY3RJbnRvRGV2VG9vbHMoe1xuICBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTogZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUsXG4gIGJ1bmRsZVR5cGU6ICAxICxcbiAgdmVyc2lvbjogUmVhY3RWZXJzaW9uLFxuICByZW5kZXJlclBhY2thZ2VOYW1lOiAncmVhY3QtZG9tJ1xufSk7XG5cbntcbiAgaWYgKCFmb3VuZERldlRvb2xzICYmIGNhblVzZURPTSAmJiB3aW5kb3cudG9wID09PSB3aW5kb3cuc2VsZikge1xuICAgIC8vIElmIHdlJ3JlIGluIENocm9tZSBvciBGaXJlZm94LCBwcm92aWRlIGEgZG93bmxvYWQgbGluayBpZiBub3QgaW5zdGFsbGVkLlxuICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0Nocm9tZScpID4gLTEgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdFZGdlJykgPT09IC0xIHx8IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRmlyZWZveCcpID4gLTEpIHtcbiAgICAgIHZhciBwcm90b2NvbCA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbDsgLy8gRG9uJ3Qgd2FybiBpbiBleG90aWMgY2FzZXMgbGlrZSBjaHJvbWUtZXh0ZW5zaW9uOi8vLlxuXG4gICAgICBpZiAoL14oaHR0cHM/fGZpbGUpOiQvLnRlc3QocHJvdG9jb2wpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcbiAgICAgICAgY29uc29sZS5pbmZvKCclY0Rvd25sb2FkIHRoZSBSZWFjdCBEZXZUb29scyAnICsgJ2ZvciBhIGJldHRlciBkZXZlbG9wbWVudCBleHBlcmllbmNlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1kZXZ0b29scycgKyAocHJvdG9jb2wgPT09ICdmaWxlOicgPyAnXFxuWW91IG1pZ2h0IG5lZWQgdG8gdXNlIGEgbG9jYWwgSFRUUCBzZXJ2ZXIgKGluc3RlYWQgb2YgZmlsZTovLyk6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LWRldnRvb2xzLWZhcScgOiAnJyksICdmb250LXdlaWdodDpib2xkJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydHMuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQgPSBJbnRlcm5hbHM7XG5leHBvcnRzLmNyZWF0ZVBvcnRhbCA9IGNyZWF0ZVBvcnRhbCQxO1xuZXhwb3J0cy5jcmVhdGVSb290ID0gY3JlYXRlUm9vdCQxO1xuZXhwb3J0cy5maW5kRE9NTm9kZSA9IGZpbmRET01Ob2RlO1xuZXhwb3J0cy5mbHVzaFN5bmMgPSBmbHVzaFN5bmMkMTtcbmV4cG9ydHMuaHlkcmF0ZSA9IGh5ZHJhdGU7XG5leHBvcnRzLmh5ZHJhdGVSb290ID0gaHlkcmF0ZVJvb3QkMTtcbmV4cG9ydHMucmVuZGVyID0gcmVuZGVyO1xuZXhwb3J0cy51bm1vdW50Q29tcG9uZW50QXROb2RlID0gdW5tb3VudENvbXBvbmVudEF0Tm9kZTtcbmV4cG9ydHMudW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgPSBiYXRjaGVkVXBkYXRlcyQxO1xuZXhwb3J0cy51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lciA9IHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyO1xuZXhwb3J0cy52ZXJzaW9uID0gUmVhY3RWZXJzaW9uO1xuICAgICAgICAgIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgXG4gIH0pKCk7XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vZnJvbnRlbmQvLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzPyIpOwoKLyoqKi8gfSksCgovKioqLyAiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9jbGllbnQuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2NsaWVudC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCiJ1c2Ugc3RyaWN0IjsKZXZhbCgiXG5cbnZhciBtID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgcmVhY3QtZG9tICovIFwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9pbmRleC5qc1wiKTtcbmlmIChmYWxzZSkge30gZWxzZSB7XG4gIHZhciBpID0gbS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcbiAgZXhwb3J0cy5jcmVhdGVSb290ID0gZnVuY3Rpb24oYywgbykge1xuICAgIGkudXNpbmdDbGllbnRFbnRyeVBvaW50ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG0uY3JlYXRlUm9vdChjLCBvKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG4gIGV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBmdW5jdGlvbihjLCBoLCBvKSB7XG4gICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbS5oeWRyYXRlUm9vdChjLCBoLCBvKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vZnJvbnRlbmQvLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9jbGllbnQuanM/Iik7CgovKioqLyB9KSwKCi8qKiovICIuLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2luZGV4LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2luZGV4LmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoidXNlIHN0cmljdCI7CmV2YWwoIlxuXG5mdW5jdGlvbiBjaGVja0RDRSgpIHtcbiAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuICBpZiAoXG4gICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFICE9PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodHJ1ZSkge1xuICAgIC8vIFRoaXMgYnJhbmNoIGlzIHVucmVhY2hhYmxlIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZFxuICAgIC8vIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgY29uZGl0aW9uIGlzIHRydWUgb25seSBpbiBkZXZlbG9wbWVudC5cbiAgICAvLyBUaGVyZWZvcmUgaWYgdGhlIGJyYW5jaCBpcyBzdGlsbCBoZXJlLCBkZWFkIGNvZGUgZWxpbWluYXRpb24gd2Fzbid0XG4gICAgLy8gcHJvcGVybHkgYXBwbGllZC5cbiAgICAvLyBEb24ndCBjaGFuZ2UgdGhlIG1lc3NhZ2UuIFJlYWN0IERldlRvb2xzIHJlbGllcyBvbiBpdC4gQWxzbyBtYWtlIHN1cmVcbiAgICAvLyB0aGlzIG1lc3NhZ2UgZG9lc24ndCBvY2N1ciBlbHNld2hlcmUgaW4gdGhpcyBmdW5jdGlvbiwgb3IgaXQgd2lsbCBjYXVzZVxuICAgIC8vIGEgZmFsc2UgcG9zaXRpdmUuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdeX14nKTtcbiAgfVxuICB0cnkge1xuICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBjb2RlIGFib3ZlIGhhcyBiZWVuIGRlYWQgY29kZSBlbGltaW5hdGVkIChEQ0UnZCkuXG4gICAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFKGNoZWNrRENFKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gRGV2VG9vbHMgc2hvdWxkbid0IGNyYXNoIFJlYWN0LCBubyBtYXR0ZXIgd2hhdC5cbiAgICAvLyBXZSBzaG91bGQgc3RpbGwgcmVwb3J0IGluIGNhc2Ugd2UgYnJlYWsgdGhpcyBjb2RlLlxuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxufVxuXG5pZiAoZmFsc2UpIHt9IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vY2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qcyAqLyBcIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vY2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qc1wiKTtcbn1cblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9mcm9udGVuZC8uLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2luZGV4LmpzPyIpOwoKLyoqKi8gfSksCgovKioqLyAiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKChtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCiJ1c2Ugc3RyaWN0IjsKZXZhbCgiLyogbW9kdWxlIGRlY29yYXRvciAqLyBtb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm5tZChtb2R1bGUpO1xuLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5cblxuaWYgKHRydWUpIHtcbiAgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgICB2YXIgUmVhY3RWZXJzaW9uID0gJzE4LjIuMCc7XG5cbi8vIEFUVEVOVElPTlxuLy8gV2hlbiBhZGRpbmcgbmV3IHN5bWJvbHMgdG8gdGhpcyBmaWxlLFxuLy8gUGxlYXNlIGNvbnNpZGVyIGFsc28gYWRkaW5nIHRvICdyZWFjdC1kZXZ0b29scy1zaGFyZWQvc3JjL2JhY2tlbmQvUmVhY3RTeW1ib2xzJ1xuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpO1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJyk7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJyk7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubGF6eScpO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Qub2Zmc2NyZWVuJyk7XG52YXIgTUFZQkVfSVRFUkFUT1JfU1lNQk9MID0gU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InO1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gIGlmIChtYXliZUl0ZXJhYmxlID09PSBudWxsIHx8IHR5cGVvZiBtYXliZUl0ZXJhYmxlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG1heWJlSXRlcmF0b3IgPSBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtNQVlCRV9JVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdO1xuXG4gIGlmICh0eXBlb2YgbWF5YmVJdGVyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtYXliZUl0ZXJhdG9yO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgZGlzcGF0Y2hlci5cbiAqL1xudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHR5cGUge1JlYWN0Q29tcG9uZW50fVxuICAgKi9cbiAgY3VycmVudDogbnVsbFxufTtcblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBiYXRjaCdzIGNvbmZpZ3VyYXRpb24gc3VjaCBhcyBob3cgbG9uZyBhbiB1cGRhdGVcbiAqIHNob3VsZCBzdXNwZW5kIGZvciBpZiBpdCBuZWVkcyB0by5cbiAqL1xudmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnID0ge1xuICB0cmFuc2l0aW9uOiBudWxsXG59O1xuXG52YXIgUmVhY3RDdXJyZW50QWN0UXVldWUgPSB7XG4gIGN1cnJlbnQ6IG51bGwsXG4gIC8vIFVzZWQgdG8gcmVwcm9kdWNlIGJlaGF2aW9yIG9mIGBiYXRjaGVkVXBkYXRlc2AgaW4gbGVnYWN5IG1vZGUuXG4gIGlzQmF0Y2hpbmdMZWdhY3k6IGZhbHNlLFxuICBkaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZTogZmFsc2Vcbn07XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgb3duZXIuXG4gKlxuICogVGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIGNvbXBvbmVudCB3aG8gc2hvdWxkIG93biBhbnkgY29tcG9uZW50cyB0aGF0IGFyZVxuICogY3VycmVudGx5IGJlaW5nIGNvbnN0cnVjdGVkLlxuICovXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHR5cGUge1JlYWN0Q29tcG9uZW50fVxuICAgKi9cbiAgY3VycmVudDogbnVsbFxufTtcblxudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSB7fTtcbnZhciBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gbnVsbDtcbmZ1bmN0aW9uIHNldEV4dHJhU3RhY2tGcmFtZShzdGFjaykge1xuICB7XG4gICAgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IHN0YWNrO1xuICB9XG59XG5cbntcbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5zZXRFeHRyYVN0YWNrRnJhbWUgPSBmdW5jdGlvbiAoc3RhY2spIHtcbiAgICB7XG4gICAgICBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gc3RhY2s7XG4gICAgfVxuICB9OyAvLyBTdGFjayBpbXBsZW1lbnRhdGlvbiBpbmplY3RlZCBieSB0aGUgY3VycmVudCByZW5kZXJlci5cblxuXG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gbnVsbDtcblxuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN0YWNrID0gJyc7IC8vIEFkZCBhbiBleHRyYSB0b3AgZnJhbWUgd2hpbGUgYW4gZWxlbWVudCBpcyBiZWluZyB2YWxpZGF0ZWRcblxuICAgIGlmIChjdXJyZW50RXh0cmFTdGFja0ZyYW1lKSB7XG4gICAgICBzdGFjayArPSBjdXJyZW50RXh0cmFTdGFja0ZyYW1lO1xuICAgIH0gLy8gRGVsZWdhdGUgdG8gdGhlIGluamVjdGVkIHJlbmRlcmVyLXNwZWNpZmljIGltcGxlbWVudGF0aW9uXG5cblxuICAgIHZhciBpbXBsID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2s7XG5cbiAgICBpZiAoaW1wbCkge1xuICAgICAgc3RhY2sgKz0gaW1wbCgpIHx8ICcnO1xuICAgIH1cblxuICAgIHJldHVybiBzdGFjaztcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGVuYWJsZVNjb3BlQVBJID0gZmFsc2U7IC8vIEV4cGVyaW1lbnRhbCBDcmVhdGUgRXZlbnQgSGFuZGxlIEFQSS5cbnZhciBlbmFibGVDYWNoZUVsZW1lbnQgPSBmYWxzZTtcbnZhciBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyA9IGZhbHNlOyAvLyBObyBrbm93biBidWdzLCBidXQgbmVlZHMgcGVyZm9ybWFuY2UgdGVzdGluZ1xuXG52YXIgZW5hYmxlTGVnYWN5SGlkZGVuID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaWJlclxuLy8gc3R1ZmYuIEludGVuZGVkIHRvIGVuYWJsZSBSZWFjdCBjb3JlIG1lbWJlcnMgdG8gbW9yZSBlYXNpbHkgZGVidWcgc2NoZWR1bGluZ1xuLy8gaXNzdWVzIGluIERFViBidWlsZHMuXG5cbnZhciBlbmFibGVEZWJ1Z1RyYWNpbmcgPSBmYWxzZTsgLy8gVHJhY2sgd2hpY2ggRmliZXIocykgc2NoZWR1bGUgcmVuZGVyIHdvcmsuXG5cbnZhciBSZWFjdFNoYXJlZEludGVybmFscyA9IHtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjogUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLFxuICBSZWFjdEN1cnJlbnRPd25lcjogUmVhY3RDdXJyZW50T3duZXJcbn07XG5cbntcbiAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEFjdFF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWU7XG59XG5cbi8vIGJ5IGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYnkgYSBCYWJlbCBwbHVnaW4uXG4vL1xuLy8gSW4gUFJPRCAob3IgaW4gcGFja2FnZXMgd2l0aG91dCBhY2Nlc3MgdG8gUmVhY3QgaW50ZXJuYWxzKSxcbi8vIHRoZXkgYXJlIGxlZnQgYXMgdGhleSBhcmUgaW5zdGVhZC5cblxuZnVuY3Rpb24gd2Fybihmb3JtYXQpIHtcbiAge1xuICAgIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnd2FybicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlcnJvcihmb3JtYXQpIHtcbiAge1xuICAgIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnZXJyb3InLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykge1xuICAvLyBXaGVuIGNoYW5naW5nIHRoaXMgbG9naWMsIHlvdSBtaWdodCB3YW50IHRvIGFsc29cbiAgLy8gdXBkYXRlIGNvbnNvbGVXaXRoU3RhY2tEZXYud3d3LmpzIGFzIHdlbGwuXG4gIHtcbiAgICB2YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gICAgdmFyIHN0YWNrID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKCk7XG5cbiAgICBpZiAoc3RhY2sgIT09ICcnKSB7XG4gICAgICBmb3JtYXQgKz0gJyVzJztcbiAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChbc3RhY2tdKTtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuXG5cbiAgICB2YXIgYXJnc1dpdGhGb3JtYXQgPSBhcmdzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIFN0cmluZyhpdGVtKTtcbiAgICB9KTsgLy8gQ2FyZWZ1bDogUk4gY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcmVmaXhcblxuICAgIGFyZ3NXaXRoRm9ybWF0LnVuc2hpZnQoJ1dhcm5pbmc6ICcgKyBmb3JtYXQpOyAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBzcHJlYWQgKG9yIC5hcHBseSkgZGlyZWN0bHkgYmVjYXVzZSBpdFxuICAgIC8vIGJyZWFrcyBJRTk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2MTBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG5cbiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlW2xldmVsXSwgY29uc29sZSwgYXJnc1dpdGhGb3JtYXQpO1xuICB9XG59XG5cbnZhciBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnQgPSB7fTtcblxuZnVuY3Rpb24gd2Fybk5vb3AocHVibGljSW5zdGFuY2UsIGNhbGxlck5hbWUpIHtcbiAge1xuICAgIHZhciBfY29uc3RydWN0b3IgPSBwdWJsaWNJbnN0YW5jZS5jb25zdHJ1Y3RvcjtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IF9jb25zdHJ1Y3RvciAmJiAoX2NvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IF9jb25zdHJ1Y3Rvci5uYW1lKSB8fCAnUmVhY3RDbGFzcyc7XG4gICAgdmFyIHdhcm5pbmdLZXkgPSBjb21wb25lbnROYW1lICsgXCIuXCIgKyBjYWxsZXJOYW1lO1xuXG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudFt3YXJuaW5nS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVycm9yKFwiQ2FuJ3QgY2FsbCAlcyBvbiBhIGNvbXBvbmVudCB0aGF0IGlzIG5vdCB5ZXQgbW91bnRlZC4gXCIgKyAnVGhpcyBpcyBhIG5vLW9wLCBidXQgaXQgbWlnaHQgaW5kaWNhdGUgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gJyArICdJbnN0ZWFkLCBhc3NpZ24gdG8gYHRoaXMuc3RhdGVgIGRpcmVjdGx5IG9yIGRlZmluZSBhIGBzdGF0ZSA9IHt9O2AgJyArICdjbGFzcyBwcm9wZXJ0eSB3aXRoIHRoZSBkZXNpcmVkIHN0YXRlIGluIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFtZSwgY29tcG9uZW50TmFtZSk7XG5cbiAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbd2FybmluZ0tleV0gPSB0cnVlO1xuICB9XG59XG4vKipcbiAqIFRoaXMgaXMgdGhlIGFic3RyYWN0IEFQSSBmb3IgYW4gdXBkYXRlIHF1ZXVlLlxuICovXG5cblxudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0ge1xuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB3ZSB3YW50IHRvIHRlc3QuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgaXNNb3VudGVkOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAgICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAgICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gICAqXG4gICAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAgICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gY2FsbGVyTmFtZSBuYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVGb3JjZVVwZGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnZm9yY2VVcGRhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogUmVwbGFjZXMgYWxsIG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIG9yIGBzZXRTdGF0ZWAgdG8gbXV0YXRlIHN0YXRlLlxuICAgKiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gICAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcGxldGVTdGF0ZSBOZXh0IHN0YXRlLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IGNhbGxlck5hbWUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNvbXBsZXRlU3RhdGUsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdyZXBsYWNlU3RhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIFRoaXMgb25seSBleGlzdHMgYmVjYXVzZSBfcGVuZGluZ1N0YXRlIGlzXG4gICAqIGludGVybmFsLiBUaGlzIHByb3ZpZGVzIGEgbWVyZ2luZyBzdHJhdGVneSB0aGF0IGlzIG5vdCBhdmFpbGFibGUgdG8gZGVlcFxuICAgKiBwcm9wZXJ0aWVzIHdoaWNoIGlzIGNvbmZ1c2luZy4gVE9ETzogRXhwb3NlIHBlbmRpbmdTdGF0ZSBvciBkb24ndCB1c2UgaXRcbiAgICogZHVyaW5nIHRoZSBtZXJnZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIHN0YXRlLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IE5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3NldFN0YXRlJyk7XG4gIH1cbn07XG5cbnZhciBhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuXG52YXIgZW1wdHlPYmplY3QgPSB7fTtcblxue1xuICBPYmplY3QuZnJlZXplKGVtcHR5T2JqZWN0KTtcbn1cbi8qKlxuICogQmFzZSBjbGFzcyBoZWxwZXJzIGZvciB0aGUgdXBkYXRpbmcgc3RhdGUgb2YgYSBjb21wb25lbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHtcbiAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OyAvLyBJZiBhIGNvbXBvbmVudCBoYXMgc3RyaW5nIHJlZnMsIHdlIHdpbGwgYXNzaWduIGEgZGlmZmVyZW50IG9iamVjdCBsYXRlci5cblxuICB0aGlzLnJlZnMgPSBlbXB0eU9iamVjdDsgLy8gV2UgaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCB1cGRhdGVyIGJ1dCB0aGUgcmVhbCBvbmUgZ2V0cyBpbmplY3RlZCBieSB0aGVcbiAgLy8gcmVuZGVyZXIuXG5cbiAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcbn1cblxuQ29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50ID0ge307XG4vKipcbiAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgdG8gbXV0YXRlXG4gKiBzdGF0ZS4gWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGNhbGxzIHRvIGBzZXRTdGF0ZWAgd2lsbCBydW4gc3luY2hyb25vdXNseSxcbiAqIGFzIHRoZXkgbWF5IGV2ZW50dWFsbHkgYmUgYmF0Y2hlZCB0b2dldGhlci4gIFlvdSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbFxuICogY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGNhbGwgdG8gc2V0U3RhdGUgaXMgYWN0dWFsbHlcbiAqIGNvbXBsZXRlZC5cbiAqXG4gKiBXaGVuIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgdG8gc2V0U3RhdGUsIGl0IHdpbGwgYmUgY2FsbGVkIGF0IHNvbWUgcG9pbnQgaW5cbiAqIHRoZSBmdXR1cmUgKG5vdCBzeW5jaHJvbm91c2x5KS4gSXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgdXAgdG8gZGF0ZVxuICogY29tcG9uZW50IGFyZ3VtZW50cyAoc3RhdGUsIHByb3BzLCBjb250ZXh0KS4gVGhlc2UgdmFsdWVzIGNhbiBiZSBkaWZmZXJlbnRcbiAqIGZyb20gdGhpcy4qIGJlY2F1c2UgeW91ciBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGFmdGVyIHJlY2VpdmVQcm9wcyBidXQgYmVmb3JlXG4gKiBzaG91bGRDb21wb25lbnRVcGRhdGUsIGFuZCB0aGlzIG5ldyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHdpbGwgbm90IHlldCBiZVxuICogYXNzaWduZWQgdG8gdGhpcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdHxmdW5jdGlvbn0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSBvciBmdW5jdGlvbiB0b1xuICogICAgICAgIHByb2R1Y2UgbmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIGN1cnJlbnQgc3RhdGUuXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHN0YXRlIGlzIHVwZGF0ZWQuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuXG5Db21wb25lbnQucHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24gKHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBwYXJ0aWFsU3RhdGUgIT09ICdvYmplY3QnICYmIHR5cGVvZiBwYXJ0aWFsU3RhdGUgIT09ICdmdW5jdGlvbicgJiYgcGFydGlhbFN0YXRlICE9IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgJyArICdmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMuJyk7XG4gIH1cblxuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2ssICdzZXRTdGF0ZScpO1xufTtcbi8qKlxuICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gKlxuICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gKlxuICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAqXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqIEBmaW5hbFxuICogQHByb3RlY3RlZFxuICovXG5cblxuQ29tcG9uZW50LnByb3RvdHlwZS5mb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsIGNhbGxiYWNrLCAnZm9yY2VVcGRhdGUnKTtcbn07XG4vKipcbiAqIERlcHJlY2F0ZWQgQVBJcy4gVGhlc2UgQVBJcyB1c2VkIHRvIGV4aXN0IG9uIGNsYXNzaWMgUmVhY3QgY2xhc3NlcyBidXQgc2luY2VcbiAqIHdlIHdvdWxkIGxpa2UgdG8gZGVwcmVjYXRlIHRoZW0sIHdlJ3JlIG5vdCBnb2luZyB0byBtb3ZlIHRoZW0gb3ZlciB0byB0aGlzXG4gKiBtb2Rlcm4gYmFzZSBjbGFzcy4gSW5zdGVhZCwgd2UgZGVmaW5lIGEgZ2V0dGVyIHRoYXQgd2FybnMgaWYgaXQncyBhY2Nlc3NlZC5cbiAqL1xuXG5cbntcbiAgdmFyIGRlcHJlY2F0ZWRBUElzID0ge1xuICAgIGlzTW91bnRlZDogWydpc01vdW50ZWQnLCAnSW5zdGVhZCwgbWFrZSBzdXJlIHRvIGNsZWFuIHVwIHN1YnNjcmlwdGlvbnMgYW5kIHBlbmRpbmcgcmVxdWVzdHMgaW4gJyArICdjb21wb25lbnRXaWxsVW5tb3VudCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4nXSxcbiAgICByZXBsYWNlU3RhdGU6IFsncmVwbGFjZVN0YXRlJywgJ1JlZmFjdG9yIHlvdXIgY29kZSB0byB1c2Ugc2V0U3RhdGUgaW5zdGVhZCAoc2VlICcgKyAnaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zMjM2KS4nXVxuICB9O1xuXG4gIHZhciBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcgPSBmdW5jdGlvbiAobWV0aG9kTmFtZSwgaW5mbykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb21wb25lbnQucHJvdG90eXBlLCBtZXRob2ROYW1lLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2FybignJXMoLi4uKSBpcyBkZXByZWNhdGVkIGluIHBsYWluIEphdmFTY3JpcHQgUmVhY3QgY2xhc3Nlcy4gJXMnLCBpbmZvWzBdLCBpbmZvWzFdKTtcblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGZvciAodmFyIGZuTmFtZSBpbiBkZXByZWNhdGVkQVBJcykge1xuICAgIGlmIChkZXByZWNhdGVkQVBJcy5oYXNPd25Qcm9wZXJ0eShmbk5hbWUpKSB7XG4gICAgICBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcoZm5OYW1lLCBkZXByZWNhdGVkQVBJc1tmbk5hbWVdKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gQ29tcG9uZW50RHVtbXkoKSB7fVxuXG5Db21wb25lbnREdW1teS5wcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuLyoqXG4gKiBDb252ZW5pZW5jZSBjb21wb25lbnQgd2l0aCBkZWZhdWx0IHNoYWxsb3cgZXF1YWxpdHkgY2hlY2sgZm9yIHNDVS5cbiAqL1xuXG5mdW5jdGlvbiBQdXJlQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsgLy8gSWYgYSBjb21wb25lbnQgaGFzIHN0cmluZyByZWZzLCB3ZSB3aWxsIGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgbGF0ZXIuXG5cbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cbnZhciBwdXJlQ29tcG9uZW50UHJvdG90eXBlID0gUHVyZUNvbXBvbmVudC5wcm90b3R5cGUgPSBuZXcgQ29tcG9uZW50RHVtbXkoKTtcbnB1cmVDb21wb25lbnRQcm90b3R5cGUuY29uc3RydWN0b3IgPSBQdXJlQ29tcG9uZW50OyAvLyBBdm9pZCBhbiBleHRyYSBwcm90b3R5cGUganVtcCBmb3IgdGhlc2UgbWV0aG9kcy5cblxuYXNzaWduKHB1cmVDb21wb25lbnRQcm90b3R5cGUsIENvbXBvbmVudC5wcm90b3R5cGUpO1xucHVyZUNvbXBvbmVudFByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCA9IHRydWU7XG5cbi8vIGFuIGltbXV0YWJsZSBvYmplY3Qgd2l0aCBhIHNpbmdsZSBtdXRhYmxlIHZhbHVlXG5mdW5jdGlvbiBjcmVhdGVSZWYoKSB7XG4gIHZhciByZWZPYmplY3QgPSB7XG4gICAgY3VycmVudDogbnVsbFxuICB9O1xuXG4gIHtcbiAgICBPYmplY3Quc2VhbChyZWZPYmplY3QpO1xuICB9XG5cbiAgcmV0dXJuIHJlZk9iamVjdDtcbn1cblxudmFyIGlzQXJyYXlJbXBsID0gQXJyYXkuaXNBcnJheTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuXG5mdW5jdGlvbiBpc0FycmF5KGEpIHtcbiAgcmV0dXJuIGlzQXJyYXlJbXBsKGEpO1xufVxuXG4vKlxuICogVGhlIGAnJyArIHZhbHVlYCBwYXR0ZXJuICh1c2VkIGluIGluIHBlcmYtc2Vuc2l0aXZlIGNvZGUpIHRocm93cyBmb3IgU3ltYm9sXG4gKiBhbmQgVGVtcG9yYWwuKiB0eXBlcy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzIyMDY0LlxuICpcbiAqIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgd2lsbCB0aHJvdyBhbiBlYXNpZXItdG8tdW5kZXJzdGFuZCxcbiAqIGVhc2llci10by1kZWJ1ZyBleGNlcHRpb24gd2l0aCBhIGNsZWFyIGVycm9ycyBtZXNzYWdlIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGVcbiAqIHByb2JsZW0uIChJbnN0ZWFkIG9mIGEgY29uZnVzaW5nIGV4Y2VwdGlvbiB0aHJvd24gaW5zaWRlIHRoZSBpbXBsZW1lbnRhdGlvblxuICogb2YgdGhlIGB2YWx1ZWAgb2JqZWN0KS5cbiAqL1xuLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cbmZ1bmN0aW9uIHR5cGVOYW1lKHZhbHVlKSB7XG4gIHtcbiAgICAvLyB0b1N0cmluZ1RhZyBpcyBuZWVkZWQgZm9yIG5hbWVzcGFjZWQgdHlwZXMgbGlrZSBUZW1wb3JhbC5JbnN0YW50XG4gICAgdmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wudG9TdHJpbmdUYWc7XG4gICAgdmFyIHR5cGUgPSBoYXNUb1N0cmluZ1RhZyAmJiB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddIHx8IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgfHwgJ09iamVjdCc7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cbn0gLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cblxuXG5mdW5jdGlvbiB3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkge1xuICB7XG4gICAgdHJ5IHtcbiAgICAgIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICAvLyBJZiB5b3UgZW5kZWQgdXAgaGVyZSBieSBmb2xsb3dpbmcgYW4gZXhjZXB0aW9uIGNhbGwgc3RhY2ssIGhlcmUncyB3aGF0J3NcbiAgLy8gaGFwcGVuZWQ6IHlvdSBzdXBwbGllZCBhbiBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIFJlYWN0IChhcyBhIHByb3AsIGtleSxcbiAgLy8gRE9NIGF0dHJpYnV0ZSwgQ1NTIHByb3BlcnR5LCBzdHJpbmcgcmVmLCBldGMuKSBhbmQgd2hlbiBSZWFjdCB0cmllZCB0b1xuICAvLyBjb2VyY2UgaXQgdG8gYSBzdHJpbmcgdXNpbmcgYCcnICsgdmFsdWVgLCBhbiBleGNlcHRpb24gd2FzIHRocm93bi5cbiAgLy9cbiAgLy8gVGhlIG1vc3QgY29tbW9uIHR5cGVzIHRoYXQgd2lsbCBjYXVzZSB0aGlzIGV4Y2VwdGlvbiBhcmUgYFN5bWJvbGAgaW5zdGFuY2VzXG4gIC8vIGFuZCBUZW1wb3JhbCBvYmplY3RzIGxpa2UgYFRlbXBvcmFsLkluc3RhbnRgLiBCdXQgYW55IG9iamVjdCB0aGF0IGhhcyBhXG4gIC8vIGB2YWx1ZU9mYCBvciBgW1N5bWJvbC50b1ByaW1pdGl2ZV1gIG1ldGhvZCB0aGF0IHRocm93cyB3aWxsIGFsc28gY2F1c2UgdGhpc1xuICAvLyBleGNlcHRpb24uIChMaWJyYXJ5IGF1dGhvcnMgZG8gdGhpcyB0byBwcmV2ZW50IHVzZXJzIGZyb20gdXNpbmcgYnVpbHQtaW5cbiAgLy8gbnVtZXJpYyBvcGVyYXRvcnMgbGlrZSBgK2Agb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMgbGlrZSBgPj1gIGJlY2F1c2UgY3VzdG9tXG4gIC8vIG1ldGhvZHMgYXJlIG5lZWRlZCB0byBwZXJmb3JtIGFjY3VyYXRlIGFyaXRobWV0aWMgb3IgY29tcGFyaXNvbi4pXG4gIC8vXG4gIC8vIFRvIGZpeCB0aGUgcHJvYmxlbSwgY29lcmNlIHRoaXMgb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZyBiZWZvcmVcbiAgLy8gcGFzc2luZyBpdCB0byBSZWFjdC4gVGhlIG1vc3QgcmVsaWFibGUgd2F5IGlzIHVzdWFsbHkgYFN0cmluZyh2YWx1ZSlgLlxuICAvL1xuICAvLyBUbyBmaW5kIHdoaWNoIHZhbHVlIGlzIHRocm93aW5nLCBjaGVjayB0aGUgYnJvd3NlciBvciBkZWJ1Z2dlciBjb25zb2xlLlxuICAvLyBCZWZvcmUgdGhpcyBleGNlcHRpb24gd2FzIHRocm93biwgdGhlcmUgc2hvdWxkIGJlIGBjb25zb2xlLmVycm9yYCBvdXRwdXRcbiAgLy8gdGhhdCBzaG93cyB0aGUgdHlwZSAoU3ltYm9sLCBUZW1wb3JhbC5QbGFpbkRhdGUsIGV0Yy4pIHRoYXQgY2F1c2VkIHRoZVxuICAvLyBwcm9ibGVtIGFuZCBob3cgdGhhdCB0eXBlIHdhcyB1c2VkOiBrZXksIGF0cnJpYnV0ZSwgaW5wdXQgdmFsdWUgcHJvcCwgZXRjLlxuICAvLyBJbiBtb3N0IGNhc2VzLCB0aGlzIGNvbnNvbGUgb3V0cHV0IGFsc28gc2hvd3MgdGhlIGNvbXBvbmVudCBhbmQgaXRzXG4gIC8vIGFuY2VzdG9yIGNvbXBvbmVudHMgd2hlcmUgdGhlIGV4Y2VwdGlvbiBoYXBwZW5lZC5cbiAgLy9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gIHJldHVybiAnJyArIHZhbHVlO1xufVxuZnVuY3Rpb24gY2hlY2tLZXlTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBrZXkgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZGlzcGxheU5hbWUgPSBvdXRlclR5cGUuZGlzcGxheU5hbWU7XG5cbiAgaWYgKGRpc3BsYXlOYW1lKSB7XG4gICAgcmV0dXJuIGRpc3BsYXlOYW1lO1xuICB9XG5cbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZTtcbn0gLy8gS2VlcCBpbiBzeW5jIHdpdGggcmVhY3QtcmVjb25jaWxlci9nZXRDb21wb25lbnROYW1lRnJvbUZpYmVyXG5cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59IC8vIE5vdGUgdGhhdCB0aGUgcmVjb25jaWxlciBwYWNrYWdlIHNob3VsZCBnZW5lcmFsbHkgcHJlZmVyIHRvIHVzZSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKCkgaW5zdGVhZC5cblxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkge1xuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgLy8gSG9zdCByb290LCB0ZXh0IG5vZGUgb3IganVzdCBpbnZhbGlkIHR5cGUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiB0eXBlLnRhZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoKS4gJyArICdUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcblxuICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZUxpc3QnO1xuXG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgdmFyIG91dGVyTmFtZSA9IHR5cGUuZGlzcGxheU5hbWUgfHwgbnVsbDtcblxuICAgICAgICBpZiAob3V0ZXJOYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG91dGVyTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCAnTWVtbyc7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShpbml0KHBheWxvYWQpKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBSRVNFUlZFRF9QUk9QUyA9IHtcbiAga2V5OiB0cnVlLFxuICByZWY6IHRydWUsXG4gIF9fc2VsZjogdHJ1ZSxcbiAgX19zb3VyY2U6IHRydWVcbn07XG52YXIgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24sIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duLCBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzO1xuXG57XG4gIGRpZFdhcm5BYm91dFN0cmluZ1JlZnMgPSB7fTtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRSZWYoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdyZWYnKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAncmVmJykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5yZWYgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRLZXkoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdrZXknKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAna2V5JykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5rZXkgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBga2V5YCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdrZXknLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdLZXksXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ1JlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICB7XG4gICAgICBpZiAoIXNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXM6IGByZWZgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHdhcm5BYm91dEFjY2Vzc2luZ1JlZi5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ3JlZicsIHtcbiAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ1JlZixcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnJlZiA9PT0gJ3N0cmluZycgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCAmJiBjb25maWcuX19zZWxmICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuc3RhdGVOb2RlICE9PSBjb25maWcuX19zZWxmKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiAnICsgJ1N1cHBvcnQgZm9yIHN0cmluZyByZWZzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiAnICsgJ1RoaXMgY2FzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb24uICcgKyAnV2UgYXNrIHlvdSB0byBtYW51YWxseSBmaXggdGhpcyBjYXNlIGJ5IHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgY29tcG9uZW50TmFtZSwgY29uZmlnLnJlZik7XG5cbiAgICAgICAgZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBSZWFjdCBlbGVtZW50LiBUaGlzIG5vIGxvbmdlciBhZGhlcmVzIHRvXG4gKiB0aGUgY2xhc3MgcGF0dGVybiwgc28gZG8gbm90IHVzZSBuZXcgdG8gY2FsbCBpdC4gQWxzbywgaW5zdGFuY2VvZiBjaGVja1xuICogd2lsbCBub3Qgd29yay4gSW5zdGVhZCB0ZXN0ICQkdHlwZW9mIGZpZWxkIGFnYWluc3QgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIHRvIGNoZWNrXG4gKiBpZiBzb21ldGhpbmcgaXMgYSBSZWFjdCBFbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHsqfSBwcm9wc1xuICogQHBhcmFtIHsqfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gcmVmXG4gKiBAcGFyYW0geyp9IG93bmVyXG4gKiBAcGFyYW0geyp9IHNlbGYgQSAqdGVtcG9yYXJ5KiBoZWxwZXIgdG8gZGV0ZWN0IHBsYWNlcyB3aGVyZSBgdGhpc2AgaXNcbiAqIGRpZmZlcmVudCBmcm9tIHRoZSBgb3duZXJgIHdoZW4gUmVhY3QuY3JlYXRlRWxlbWVudCBpcyBjYWxsZWQsIHNvIHRoYXQgd2VcbiAqIGNhbiB3YXJuLiBXZSB3YW50IHRvIGdldCByaWQgb2Ygb3duZXIgYW5kIHJlcGxhY2Ugc3RyaW5nIGByZWZgcyB3aXRoIGFycm93XG4gKiBmdW5jdGlvbnMsIGFuZCBhcyBsb25nIGFzIGB0aGlzYCBhbmQgb3duZXIgYXJlIHRoZSBzYW1lLCB0aGVyZSB3aWxsIGJlIG5vXG4gKiBjaGFuZ2UgaW4gYmVoYXZpb3IuXG4gKiBAcGFyYW0geyp9IHNvdXJjZSBBbiBhbm5vdGF0aW9uIG9iamVjdCAoYWRkZWQgYnkgYSB0cmFuc3BpbGVyIG9yIG90aGVyd2lzZSlcbiAqIGluZGljYXRpbmcgZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBhbmQvb3Igb3RoZXIgaW5mb3JtYXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG5cbnZhciBSZWFjdEVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKSB7XG4gIHZhciBlbGVtZW50ID0ge1xuICAgIC8vIFRoaXMgdGFnIGFsbG93cyB1cyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGFzIGEgUmVhY3QgRWxlbWVudFxuICAgICQkdHlwZW9mOiBSRUFDVF9FTEVNRU5UX1RZUEUsXG4gICAgLy8gQnVpbHQtaW4gcHJvcGVydGllcyB0aGF0IGJlbG9uZyBvbiB0aGUgZWxlbWVudFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXksXG4gICAgcmVmOiByZWYsXG4gICAgcHJvcHM6IHByb3BzLFxuICAgIC8vIFJlY29yZCB0aGUgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIGVsZW1lbnQuXG4gICAgX293bmVyOiBvd25lclxuICB9O1xuXG4gIHtcbiAgICAvLyBUaGUgdmFsaWRhdGlvbiBmbGFnIGlzIGN1cnJlbnRseSBtdXRhdGl2ZS4gV2UgcHV0IGl0IG9uXG4gICAgLy8gYW4gZXh0ZXJuYWwgYmFja2luZyBzdG9yZSBzbyB0aGF0IHdlIGNhbiBmcmVlemUgdGhlIHdob2xlIG9iamVjdC5cbiAgICAvLyBUaGlzIGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgV2Vha01hcCBvbmNlIHRoZXkgYXJlIGltcGxlbWVudGVkIGluXG4gICAgLy8gY29tbW9ubHkgdXNlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMuXG4gICAgZWxlbWVudC5fc3RvcmUgPSB7fTsgLy8gVG8gbWFrZSBjb21wYXJpbmcgUmVhY3RFbGVtZW50cyBlYXNpZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHdlIG1ha2VcbiAgICAvLyB0aGUgdmFsaWRhdGlvbiBmbGFnIG5vbi1lbnVtZXJhYmxlICh3aGVyZSBwb3NzaWJsZSwgd2hpY2ggc2hvdWxkXG4gICAgLy8gaW5jbHVkZSBldmVyeSBlbnZpcm9ubWVudCB3ZSBydW4gdGVzdHMgaW4pLCBzbyB0aGUgdGVzdCBmcmFtZXdvcmtcbiAgICAvLyBpZ25vcmVzIGl0LlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQuX3N0b3JlLCAndmFsaWRhdGVkJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogZmFsc2VcbiAgICB9KTsgLy8gc2VsZiBhbmQgc291cmNlIGFyZSBERVYgb25seSBwcm9wZXJ0aWVzLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc2VsZicsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzZWxmXG4gICAgfSk7IC8vIFR3byBlbGVtZW50cyBjcmVhdGVkIGluIHR3byBkaWZmZXJlbnQgcGxhY2VzIHNob3VsZCBiZSBjb25zaWRlcmVkXG4gICAgLy8gZXF1YWwgZm9yIHRlc3RpbmcgcHVycG9zZXMgYW5kIHRoZXJlZm9yZSB3ZSBoaWRlIGl0IGZyb20gZW51bWVyYXRpb24uXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zb3VyY2UnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc291cmNlXG4gICAgfSk7XG5cbiAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50LnByb3BzKTtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuLyoqXG4gKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgb2YgdGhlIGdpdmVuIHR5cGUuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2NyZWF0ZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgdmFyIHByb3BOYW1lOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBrZXkgPSBudWxsO1xuICB2YXIgcmVmID0gbnVsbDtcbiAgdmFyIHNlbGYgPSBudWxsO1xuICB2YXIgc291cmNlID0gbnVsbDtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgcmVmID0gY29uZmlnLnJlZjtcblxuICAgICAge1xuICAgICAgICB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAge1xuICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGNvbmZpZy5rZXkpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfVxuXG4gICAgc2VsZiA9IGNvbmZpZy5fX3NlbGYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zZWxmO1xuICAgIHNvdXJjZSA9IGNvbmZpZy5fX3NvdXJjZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbmZpZy5fX3NvdXJjZTsgLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIGEgbmV3IHByb3BzIG9iamVjdFxuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250b1xuICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC5cblxuXG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuXG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICAgIE9iamVjdC5mcmVlemUoY2hpbGRBcnJheSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9IC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuXG5cbiAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7XG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChrZXkgfHwgcmVmKSB7XG4gICAgICB2YXIgZGlzcGxheU5hbWUgPSB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyA/IHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8ICdVbmtub3duJyA6IHR5cGU7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlZikge1xuICAgICAgICBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBSZWFjdEVsZW1lbnQodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCwgcHJvcHMpO1xufVxuZnVuY3Rpb24gY2xvbmVBbmRSZXBsYWNlS2V5KG9sZEVsZW1lbnQsIG5ld0tleSkge1xuICB2YXIgbmV3RWxlbWVudCA9IFJlYWN0RWxlbWVudChvbGRFbGVtZW50LnR5cGUsIG5ld0tleSwgb2xkRWxlbWVudC5yZWYsIG9sZEVsZW1lbnQuX3NlbGYsIG9sZEVsZW1lbnQuX3NvdXJjZSwgb2xkRWxlbWVudC5fb3duZXIsIG9sZEVsZW1lbnQucHJvcHMpO1xuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cbi8qKlxuICogQ2xvbmUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgdXNpbmcgZWxlbWVudCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2Nsb25lZWxlbWVudFxuICovXG5cbmZ1bmN0aW9uIGNsb25lRWxlbWVudChlbGVtZW50LCBjb25maWcsIGNoaWxkcmVuKSB7XG4gIGlmIChlbGVtZW50ID09PSBudWxsIHx8IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlJlYWN0LmNsb25lRWxlbWVudCguLi4pOiBUaGUgYXJndW1lbnQgbXVzdCBiZSBhIFJlYWN0IGVsZW1lbnQsIGJ1dCB5b3UgcGFzc2VkIFwiICsgZWxlbWVudCArIFwiLlwiKTtcbiAgfVxuXG4gIHZhciBwcm9wTmFtZTsgLy8gT3JpZ2luYWwgcHJvcHMgYXJlIGNvcGllZFxuXG4gIHZhciBwcm9wcyA9IGFzc2lnbih7fSwgZWxlbWVudC5wcm9wcyk7IC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcblxuICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gIHZhciByZWYgPSBlbGVtZW50LnJlZjsgLy8gU2VsZiBpcyBwcmVzZXJ2ZWQgc2luY2UgdGhlIG93bmVyIGlzIHByZXNlcnZlZC5cblxuICB2YXIgc2VsZiA9IGVsZW1lbnQuX3NlbGY7IC8vIFNvdXJjZSBpcyBwcmVzZXJ2ZWQgc2luY2UgY2xvbmVFbGVtZW50IGlzIHVubGlrZWx5IHRvIGJlIHRhcmdldGVkIGJ5IGFcbiAgLy8gdHJhbnNwaWxlciwgYW5kIHRoZSBvcmlnaW5hbCBzb3VyY2UgaXMgcHJvYmFibHkgYSBiZXR0ZXIgaW5kaWNhdG9yIG9mIHRoZVxuICAvLyB0cnVlIG93bmVyLlxuXG4gIHZhciBzb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7IC8vIE93bmVyIHdpbGwgYmUgcHJlc2VydmVkLCB1bmxlc3MgcmVmIGlzIG92ZXJyaWRkZW5cblxuICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgLy8gU2lsZW50bHkgc3RlYWwgdGhlIHJlZiBmcm9tIHRoZSBwYXJlbnQuXG4gICAgICByZWYgPSBjb25maWcucmVmO1xuICAgICAgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oY29uZmlnLmtleSk7XG4gICAgICB9XG5cbiAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTtcbiAgICB9IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIG92ZXJyaWRlIGV4aXN0aW5nIHByb3BzXG5cblxuICAgIHZhciBkZWZhdWx0UHJvcHM7XG5cbiAgICBpZiAoZWxlbWVudC50eXBlICYmIGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIGRlZmF1bHRQcm9wcyA9IGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHM7XG4gICAgfVxuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgaWYgKGNvbmZpZ1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvXG4gIC8vIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0LlxuXG5cbiAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7XG5cbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgfVxuXG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9XG5cbiAgcmV0dXJuIFJlYWN0RWxlbWVudChlbGVtZW50LnR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcyk7XG59XG4vKipcbiAqIFZlcmlmaWVzIHRoZSBvYmplY3QgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2lzdmFsaWRlbGVtZW50XG4gKiBAcGFyYW0gez9vYmplY3R9IG9iamVjdFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgb2JqZWN0YCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIEBmaW5hbFxuICovXG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufVxuXG52YXIgU0VQQVJBVE9SID0gJy4nO1xudmFyIFNVQlNFUEFSQVRPUiA9ICc6Jztcbi8qKlxuICogRXNjYXBlIGFuZCB3cmFwIGtleSBzbyBpdCBpcyBzYWZlIHRvIHVzZSBhcyBhIHJlYWN0aWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRvIGJlIGVzY2FwZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBlc2NhcGVkIGtleS5cbiAqL1xuXG5mdW5jdGlvbiBlc2NhcGUoa2V5KSB7XG4gIHZhciBlc2NhcGVSZWdleCA9IC9bPTpdL2c7XG4gIHZhciBlc2NhcGVyTG9va3VwID0ge1xuICAgICc9JzogJz0wJyxcbiAgICAnOic6ICc9MidcbiAgfTtcbiAgdmFyIGVzY2FwZWRTdHJpbmcgPSBrZXkucmVwbGFjZShlc2NhcGVSZWdleCwgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgcmV0dXJuIGVzY2FwZXJMb29rdXBbbWF0Y2hdO1xuICB9KTtcbiAgcmV0dXJuICckJyArIGVzY2FwZWRTdHJpbmc7XG59XG4vKipcbiAqIFRPRE86IFRlc3QgdGhhdCBhIHNpbmdsZSBjaGlsZCBhbmQgYW4gYXJyYXkgd2l0aCBvbmUgaXRlbSBoYXZlIHRoZSBzYW1lIGtleVxuICogcGF0dGVybi5cbiAqL1xuXG5cbnZhciBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7XG52YXIgdXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXggPSAvXFwvKy9nO1xuXG5mdW5jdGlvbiBlc2NhcGVVc2VyUHJvdmlkZWRLZXkodGV4dCkge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlKHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4LCAnJCYvJyk7XG59XG4vKipcbiAqIEdlbmVyYXRlIGEga2V5IHN0cmluZyB0aGF0IGlkZW50aWZpZXMgYSBlbGVtZW50IHdpdGhpbiBhIHNldC5cbiAqXG4gKiBAcGFyYW0geyp9IGVsZW1lbnQgQSBlbGVtZW50IHRoYXQgY291bGQgY29udGFpbiBhIG1hbnVhbCBrZXkuXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggdGhhdCBpcyB1c2VkIGlmIGEgbWFudWFsIGtleSBpcyBub3QgcHJvdmlkZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXRFbGVtZW50S2V5KGVsZW1lbnQsIGluZGV4KSB7XG4gIC8vIERvIHNvbWUgdHlwZWNoZWNraW5nIGhlcmUgc2luY2Ugd2UgY2FsbCB0aGlzIGJsaW5kbHkuIFdlIHdhbnQgdG8gZW5zdXJlXG4gIC8vIHRoYXQgd2UgZG9uJ3QgYmxvY2sgcG90ZW50aWFsIGZ1dHVyZSBFUyBBUElzLlxuICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdvYmplY3QnICYmIGVsZW1lbnQgIT09IG51bGwgJiYgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgIC8vIEV4cGxpY2l0IGtleVxuICAgIHtcbiAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oZWxlbWVudC5rZXkpO1xuICAgIH1cblxuICAgIHJldHVybiBlc2NhcGUoJycgKyBlbGVtZW50LmtleSk7XG4gIH0gLy8gSW1wbGljaXQga2V5IGRldGVybWluZWQgYnkgdGhlIGluZGV4IGluIHRoZSBzZXRcblxuXG4gIHJldHVybiBpbmRleC50b1N0cmluZygzNik7XG59XG5cbmZ1bmN0aW9uIG1hcEludG9BcnJheShjaGlsZHJlbiwgYXJyYXksIGVzY2FwZWRQcmVmaXgsIG5hbWVTb0ZhciwgY2FsbGJhY2spIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgY2hpbGRyZW47XG5cbiAgaWYgKHR5cGUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGUgPT09ICdib29sZWFuJykge1xuICAgIC8vIEFsbCBvZiB0aGUgYWJvdmUgYXJlIHBlcmNlaXZlZCBhcyBudWxsLlxuICAgIGNoaWxkcmVuID0gbnVsbDtcbiAgfVxuXG4gIHZhciBpbnZva2VDYWxsYmFjayA9IGZhbHNlO1xuXG4gIGlmIChjaGlsZHJlbiA9PT0gbnVsbCkge1xuICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBzd2l0Y2ggKGNoaWxkcmVuLiQkdHlwZW9mKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgfVxuICB9XG5cbiAgaWYgKGludm9rZUNhbGxiYWNrKSB7XG4gICAgdmFyIF9jaGlsZCA9IGNoaWxkcmVuO1xuICAgIHZhciBtYXBwZWRDaGlsZCA9IGNhbGxiYWNrKF9jaGlsZCk7IC8vIElmIGl0J3MgdGhlIG9ubHkgY2hpbGQsIHRyZWF0IHRoZSBuYW1lIGFzIGlmIGl0IHdhcyB3cmFwcGVkIGluIGFuIGFycmF5XG4gICAgLy8gc28gdGhhdCBpdCdzIGNvbnNpc3RlbnQgaWYgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBncm93czpcblxuICAgIHZhciBjaGlsZEtleSA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgKyBnZXRFbGVtZW50S2V5KF9jaGlsZCwgMCkgOiBuYW1lU29GYXI7XG5cbiAgICBpZiAoaXNBcnJheShtYXBwZWRDaGlsZCkpIHtcbiAgICAgIHZhciBlc2NhcGVkQ2hpbGRLZXkgPSAnJztcblxuICAgICAgaWYgKGNoaWxkS2V5ICE9IG51bGwpIHtcbiAgICAgICAgZXNjYXBlZENoaWxkS2V5ID0gZXNjYXBlVXNlclByb3ZpZGVkS2V5KGNoaWxkS2V5KSArICcvJztcbiAgICAgIH1cblxuICAgICAgbWFwSW50b0FycmF5KG1hcHBlZENoaWxkLCBhcnJheSwgZXNjYXBlZENoaWxkS2V5LCAnJywgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgcmV0dXJuIGM7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKG1hcHBlZENoaWxkICE9IG51bGwpIHtcbiAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChtYXBwZWRDaGlsZCkpIHtcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRoZSBgaWZgIHN0YXRlbWVudCBoZXJlIHByZXZlbnRzIGF1dG8tZGlzYWJsaW5nIG9mIHRoZSBzYWZlXG4gICAgICAgICAgLy8gY29lcmNpb24gRVNMaW50IHJ1bGUsIHNvIHdlIG11c3QgbWFudWFsbHkgZGlzYWJsZSBpdCBiZWxvdy5cbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIFJlYWN0LlBvcnRhbCBkb2Vzbid0IGhhdmUgYSBrZXlcbiAgICAgICAgICBpZiAobWFwcGVkQ2hpbGQua2V5ICYmICghX2NoaWxkIHx8IF9jaGlsZC5rZXkgIT09IG1hcHBlZENoaWxkLmtleSkpIHtcbiAgICAgICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24obWFwcGVkQ2hpbGQua2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBtYXBwZWRDaGlsZCA9IGNsb25lQW5kUmVwbGFjZUtleShtYXBwZWRDaGlsZCwgLy8gS2VlcCBib3RoIHRoZSAobWFwcGVkKSBhbmQgb2xkIGtleXMgaWYgdGhleSBkaWZmZXIsIGp1c3QgYXNcbiAgICAgICAgLy8gdHJhdmVyc2VBbGxDaGlsZHJlbiB1c2VkIHRvIGRvIGZvciBvYmplY3RzIGFzIGNoaWxkcmVuXG4gICAgICAgIGVzY2FwZWRQcmVmaXggKyAoIC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgUmVhY3QuUG9ydGFsIGRvZXNuJ3QgaGF2ZSBhIGtleVxuICAgICAgICBtYXBwZWRDaGlsZC5rZXkgJiYgKCFfY2hpbGQgfHwgX2NoaWxkLmtleSAhPT0gbWFwcGVkQ2hpbGQua2V5KSA/IC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgZXhpc3RpbmcgZWxlbWVudCdzIGtleSBjYW4gYmUgYSBudW1iZXJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gICAgICAgIGVzY2FwZVVzZXJQcm92aWRlZEtleSgnJyArIG1hcHBlZENoaWxkLmtleSkgKyAnLycgOiAnJykgKyBjaGlsZEtleSk7XG4gICAgICB9XG5cbiAgICAgIGFycmF5LnB1c2gobWFwcGVkQ2hpbGQpO1xuICAgIH1cblxuICAgIHJldHVybiAxO1xuICB9XG5cbiAgdmFyIGNoaWxkO1xuICB2YXIgbmV4dE5hbWU7XG4gIHZhciBzdWJ0cmVlQ291bnQgPSAwOyAvLyBDb3VudCBvZiBjaGlsZHJlbiBmb3VuZCBpbiB0aGUgY3VycmVudCBzdWJ0cmVlLlxuXG4gIHZhciBuZXh0TmFtZVByZWZpeCA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgOiBuYW1lU29GYXIgKyBTVUJTRVBBUkFUT1I7XG5cbiAgaWYgKGlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRFbGVtZW50S2V5KGNoaWxkLCBpKTtcbiAgICAgIHN1YnRyZWVDb3VudCArPSBtYXBJbnRvQXJyYXkoY2hpbGQsIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuZXh0TmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4oY2hpbGRyZW4pO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgaXRlcmFibGVDaGlsZHJlbiA9IGNoaWxkcmVuO1xuXG4gICAgICB7XG4gICAgICAgIC8vIFdhcm4gYWJvdXQgdXNpbmcgTWFwcyBhcyBjaGlsZHJlblxuICAgICAgICBpZiAoaXRlcmF0b3JGbiA9PT0gaXRlcmFibGVDaGlsZHJlbi5lbnRyaWVzKSB7XG4gICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNYXBzKSB7XG4gICAgICAgICAgICB3YXJuKCdVc2luZyBNYXBzIGFzIGNoaWxkcmVuIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnVXNlIGFuIGFycmF5IG9mIGtleWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaWRXYXJuQWJvdXRNYXBzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoaXRlcmFibGVDaGlsZHJlbik7XG4gICAgICB2YXIgc3RlcDtcbiAgICAgIHZhciBpaSA9IDA7XG5cbiAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgY2hpbGQgPSBzdGVwLnZhbHVlO1xuICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0RWxlbWVudEtleShjaGlsZCwgaWkrKyk7XG4gICAgICAgIHN1YnRyZWVDb3VudCArPSBtYXBJbnRvQXJyYXkoY2hpbGQsIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuZXh0TmFtZSwgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgdmFyIGNoaWxkcmVuU3RyaW5nID0gU3RyaW5nKGNoaWxkcmVuKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogXCIgKyAoY2hpbGRyZW5TdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjaGlsZHJlbikuam9pbignLCAnKSArICd9JyA6IGNoaWxkcmVuU3RyaW5nKSArIFwiKS4gXCIgKyAnSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSAnICsgJ2luc3RlYWQuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN1YnRyZWVDb3VudDtcbn1cblxuLyoqXG4gKiBNYXBzIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5tYXBcbiAqXG4gKiBUaGUgcHJvdmlkZWQgbWFwRnVuY3Rpb24oY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZnVuYyBUaGUgbWFwIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgZm9yIG1hcEZ1bmN0aW9uLlxuICogQHJldHVybiB7b2JqZWN0fSBPYmplY3QgY29udGFpbmluZyB0aGUgb3JkZXJlZCBtYXAgb2YgcmVzdWx0cy5cbiAqL1xuZnVuY3Rpb24gbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmMsIGNvbnRleHQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBjb3VudCA9IDA7XG4gIG1hcEludG9BcnJheShjaGlsZHJlbiwgcmVzdWx0LCAnJywgJycsIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBmdW5jLmNhbGwoY29udGV4dCwgY2hpbGQsIGNvdW50KyspO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogQ291bnQgdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzXG4gKiBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmNvdW50XG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4uXG4gKi9cblxuXG5mdW5jdGlvbiBjb3VudENoaWxkcmVuKGNoaWxkcmVuKSB7XG4gIHZhciBuID0gMDtcbiAgbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uICgpIHtcbiAgICBuKys7IC8vIERvbid0IHJldHVybiBhbnl0aGluZ1xuICB9KTtcbiAgcmV0dXJuIG47XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVuZm9yZWFjaFxuICpcbiAqIFRoZSBwcm92aWRlZCBmb3JFYWNoRnVuYyhjaGlsZCwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoXG4gKiBsZWFmIGNoaWxkLlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHtmdW5jdGlvbigqLCBpbnQpfSBmb3JFYWNoRnVuY1xuICogQHBhcmFtIHsqfSBmb3JFYWNoQ29udGV4dCBDb250ZXh0IGZvciBmb3JFYWNoQ29udGV4dC5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaENoaWxkcmVuKGNoaWxkcmVuLCBmb3JFYWNoRnVuYywgZm9yRWFjaENvbnRleHQpIHtcbiAgbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uICgpIHtcbiAgICBmb3JFYWNoRnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBEb24ndCByZXR1cm4gYW55dGhpbmcuXG4gIH0sIGZvckVhY2hDb250ZXh0KTtcbn1cbi8qKlxuICogRmxhdHRlbiBhIGNoaWxkcmVuIG9iamVjdCAodHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gKSBhbmRcbiAqIHJldHVybiBhbiBhcnJheSB3aXRoIGFwcHJvcHJpYXRlbHkgcmUta2V5ZWQgY2hpbGRyZW4uXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVudG9hcnJheVxuICovXG5cblxuZnVuY3Rpb24gdG9BcnJheShjaGlsZHJlbikge1xuICByZXR1cm4gbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZDtcbiAgfSkgfHwgW107XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGluIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiBhbmQgdmVyaWZpZXMgdGhhdCB0aGVyZVxuICogaXMgb25seSBvbmUgY2hpbGQgaW4gdGhlIGNvbGxlY3Rpb24uXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVub25seVxuICpcbiAqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGEgc2luZ2xlIGNoaWxkIGdldHNcbiAqIHBhc3NlZCB3aXRob3V0IGEgd3JhcHBlciwgYnV0IHRoZSBwdXJwb3NlIG9mIHRoaXMgaGVscGVyIGZ1bmN0aW9uIGlzIHRvXG4gKiBhYnN0cmFjdCBhd2F5IHRoZSBwYXJ0aWN1bGFyIHN0cnVjdHVyZSBvZiBjaGlsZHJlbi5cbiAqXG4gKiBAcGFyYW0gez9vYmplY3R9IGNoaWxkcmVuIENoaWxkIGNvbGxlY3Rpb24gc3RydWN0dXJlLlxuICogQHJldHVybiB7UmVhY3RFbGVtZW50fSBUaGUgZmlyc3QgYW5kIG9ubHkgYFJlYWN0RWxlbWVudGAgY29udGFpbmVkIGluIHRoZVxuICogc3RydWN0dXJlLlxuICovXG5cblxuZnVuY3Rpb24gb25seUNoaWxkKGNoaWxkcmVuKSB7XG4gIGlmICghaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC4nKTtcbiAgfVxuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChkZWZhdWx0VmFsdWUpIHtcbiAgLy8gVE9ETzogU2Vjb25kIGFyZ3VtZW50IHVzZWQgdG8gYmUgYW4gb3B0aW9uYWwgYGNhbGN1bGF0ZUNoYW5nZWRCaXRzYFxuICAvLyBmdW5jdGlvbi4gV2FybiB0byByZXNlcnZlIGZvciBmdXR1cmUgdXNlP1xuICB2YXIgY29udGV4dCA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgIC8vIEFzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IG11bHRpcGxlIGNvbmN1cnJlbnQgcmVuZGVyZXJzLCB3ZSBjYXRlZ29yaXplXG4gICAgLy8gc29tZSByZW5kZXJlcnMgYXMgcHJpbWFyeSBhbmQgb3RoZXJzIGFzIHNlY29uZGFyeS4gV2Ugb25seSBleHBlY3RcbiAgICAvLyB0aGVyZSB0byBiZSB0d28gY29uY3VycmVudCByZW5kZXJlcnMgYXQgbW9zdDogUmVhY3QgTmF0aXZlIChwcmltYXJ5KSBhbmRcbiAgICAvLyBGYWJyaWMgKHNlY29uZGFyeSk7IFJlYWN0IERPTSAocHJpbWFyeSkgYW5kIFJlYWN0IEFSVCAoc2Vjb25kYXJ5KS5cbiAgICAvLyBTZWNvbmRhcnkgcmVuZGVyZXJzIHN0b3JlIHRoZWlyIGNvbnRleHQgdmFsdWVzIG9uIHNlcGFyYXRlIGZpZWxkcy5cbiAgICBfY3VycmVudFZhbHVlOiBkZWZhdWx0VmFsdWUsXG4gICAgX2N1cnJlbnRWYWx1ZTI6IGRlZmF1bHRWYWx1ZSxcbiAgICAvLyBVc2VkIHRvIHRyYWNrIGhvdyBtYW55IGNvbmN1cnJlbnQgcmVuZGVyZXJzIHRoaXMgY29udGV4dCBjdXJyZW50bHlcbiAgICAvLyBzdXBwb3J0cyB3aXRoaW4gaW4gYSBzaW5nbGUgcmVuZGVyZXIuIFN1Y2ggYXMgcGFyYWxsZWwgc2VydmVyIHJlbmRlcmluZy5cbiAgICBfdGhyZWFkQ291bnQ6IDAsXG4gICAgLy8gVGhlc2UgYXJlIGNpcmN1bGFyXG4gICAgUHJvdmlkZXI6IG51bGwsXG4gICAgQ29uc3VtZXI6IG51bGwsXG4gICAgLy8gQWRkIHRoZXNlIHRvIHVzZSBzYW1lIGhpZGRlbiBjbGFzcyBpbiBWTSBhcyBTZXJ2ZXJDb250ZXh0XG4gICAgX2RlZmF1bHRWYWx1ZTogbnVsbCxcbiAgICBfZ2xvYmFsTmFtZTogbnVsbFxuICB9O1xuICBjb250ZXh0LlByb3ZpZGVyID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9QUk9WSURFUl9UWVBFLFxuICAgIF9jb250ZXh0OiBjb250ZXh0XG4gIH07XG4gIHZhciBoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycyA9IGZhbHNlO1xuICB2YXIgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIgPSBmYWxzZTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0RGlzcGxheU5hbWVPbkNvbnN1bWVyID0gZmFsc2U7XG5cbiAge1xuICAgIC8vIEEgc2VwYXJhdGUgb2JqZWN0LCBidXQgcHJveGllcyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjb250ZXh0IG9iamVjdCBmb3JcbiAgICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSXQgaGFzIGEgZGlmZmVyZW50ICQkdHlwZW9mLCBzbyB3ZSBjYW4gcHJvcGVybHlcbiAgICAvLyB3YXJuIGZvciB0aGUgaW5jb3JyZWN0IHVzYWdlIG9mIENvbnRleHQgYXMgYSBDb25zdW1lci5cbiAgICB2YXIgQ29uc3VtZXIgPSB7XG4gICAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgICAgX2NvbnRleHQ6IGNvbnRleHRcbiAgICB9OyAvLyAkRmxvd0ZpeE1lOiBGbG93IGNvbXBsYWlucyBhYm91dCBub3Qgc2V0dGluZyBhIHZhbHVlLCB3aGljaCBpcyBpbnRlbnRpb25hbCBoZXJlXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDb25zdW1lciwge1xuICAgICAgUHJvdmlkZXI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlcikge1xuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0LkNvbnN1bWVyLlByb3ZpZGVyPiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LlByb3ZpZGVyPiBpbnN0ZWFkPycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250ZXh0LlByb3ZpZGVyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfUHJvdmlkZXIpIHtcbiAgICAgICAgICBjb250ZXh0LlByb3ZpZGVyID0gX1Byb3ZpZGVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX2N1cnJlbnRWYWx1ZToge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fY3VycmVudFZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gX2N1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF9jdXJyZW50VmFsdWUyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9jdXJyZW50VmFsdWUyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlMikge1xuICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTIgPSBfY3VycmVudFZhbHVlMjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF90aHJlYWRDb3VudDoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fdGhyZWFkQ291bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF90aHJlYWRDb3VudCkge1xuICAgICAgICAgIGNvbnRleHQuX3RocmVhZENvdW50ID0gX3RocmVhZENvdW50O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgQ29uc3VtZXI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycykge1xuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0LkNvbnN1bWVyLkNvbnN1bWVyPiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LkNvbnN1bWVyPiBpbnN0ZWFkPycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250ZXh0LkNvbnN1bWVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGlzcGxheU5hbWU6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuZGlzcGxheU5hbWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKGRpc3BsYXlOYW1lKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lcikge1xuICAgICAgICAgICAgd2FybignU2V0dGluZyBgZGlzcGxheU5hbWVgIG9uIENvbnRleHQuQ29uc3VtZXIgaGFzIG5vIGVmZmVjdC4gJyArIFwiWW91IHNob3VsZCBzZXQgaXQgZGlyZWN0bHkgb24gdGhlIGNvbnRleHQgd2l0aCBDb250ZXh0LmRpc3BsYXlOYW1lID0gJyVzJy5cIiwgZGlzcGxheU5hbWUpO1xuXG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7IC8vICRGbG93Rml4TWU6IEZsb3cgY29tcGxhaW5zIGFib3V0IG1pc3NpbmcgcHJvcGVydGllcyBiZWNhdXNlIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZCBkZWZpbmVQcm9wZXJ0eVxuXG4gICAgY29udGV4dC5Db25zdW1lciA9IENvbnN1bWVyO1xuICB9XG5cbiAge1xuICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IG51bGw7XG4gICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyMiA9IG51bGw7XG4gIH1cblxuICByZXR1cm4gY29udGV4dDtcbn1cblxudmFyIFVuaW5pdGlhbGl6ZWQgPSAtMTtcbnZhciBQZW5kaW5nID0gMDtcbnZhciBSZXNvbHZlZCA9IDE7XG52YXIgUmVqZWN0ZWQgPSAyO1xuXG5mdW5jdGlvbiBsYXp5SW5pdGlhbGl6ZXIocGF5bG9hZCkge1xuICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgdmFyIGN0b3IgPSBwYXlsb2FkLl9yZXN1bHQ7XG4gICAgdmFyIHRoZW5hYmxlID0gY3RvcigpOyAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgIC8vIFRoaXMgbWlnaHQgdGhyb3cgZWl0aGVyIGJlY2F1c2UgaXQncyBtaXNzaW5nIG9yIHRocm93cy4gSWYgc28sIHdlIHRyZWF0IGl0XG4gICAgLy8gYXMgc3RpbGwgdW5pbml0aWFsaXplZCBhbmQgdHJ5IGFnYWluIG5leHQgdGltZS4gV2hpY2ggaXMgdGhlIHNhbWUgYXMgd2hhdFxuICAgIC8vIGhhcHBlbnMgaWYgdGhlIGN0b3Igb3IgYW55IHdyYXBwZXJzIHByb2Nlc3NpbmcgdGhlIGN0b3IgdGhyb3dzLiBUaGlzIG1pZ2h0XG4gICAgLy8gZW5kIHVwIGZpeGluZyBpdCBpZiB0aGUgcmVzb2x1dGlvbiB3YXMgYSBjb25jdXJyZW5jeSBidWcuXG5cbiAgICB0aGVuYWJsZS50aGVuKGZ1bmN0aW9uIChtb2R1bGVPYmplY3QpIHtcbiAgICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFBlbmRpbmcgfHwgcGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgICAgIC8vIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUuXG4gICAgICAgIHZhciByZXNvbHZlZCA9IHBheWxvYWQ7XG4gICAgICAgIHJlc29sdmVkLl9zdGF0dXMgPSBSZXNvbHZlZDtcbiAgICAgICAgcmVzb2x2ZWQuX3Jlc3VsdCA9IG1vZHVsZU9iamVjdDtcbiAgICAgIH1cbiAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFBlbmRpbmcgfHwgcGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgICAgIC8vIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUuXG4gICAgICAgIHZhciByZWplY3RlZCA9IHBheWxvYWQ7XG4gICAgICAgIHJlamVjdGVkLl9zdGF0dXMgPSBSZWplY3RlZDtcbiAgICAgICAgcmVqZWN0ZWQuX3Jlc3VsdCA9IGVycm9yO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgICAgLy8gSW4gY2FzZSwgd2UncmUgc3RpbGwgdW5pbml0aWFsaXplZCwgdGhlbiB3ZSdyZSB3YWl0aW5nIGZvciB0aGUgdGhlbmFibGVcbiAgICAgIC8vIHRvIHJlc29sdmUuIFNldCBpdCBhcyBwZW5kaW5nIGluIHRoZSBtZWFudGltZS5cbiAgICAgIHZhciBwZW5kaW5nID0gcGF5bG9hZDtcbiAgICAgIHBlbmRpbmcuX3N0YXR1cyA9IFBlbmRpbmc7XG4gICAgICBwZW5kaW5nLl9yZXN1bHQgPSB0aGVuYWJsZTtcbiAgICB9XG4gIH1cblxuICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBSZXNvbHZlZCkge1xuICAgIHZhciBtb2R1bGVPYmplY3QgPSBwYXlsb2FkLl9yZXN1bHQ7XG5cbiAgICB7XG4gICAgICBpZiAobW9kdWxlT2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IoJ2xhenk6IEV4cGVjdGVkIHRoZSByZXN1bHQgb2YgYSBkeW5hbWljIGltcCcgKyAnb3J0KCkgY2FsbC4gJyArICdJbnN0ZWFkIHJlY2VpdmVkOiAlc1xcblxcbllvdXIgY29kZSBzaG91bGQgbG9vayBsaWtlOiBcXG4gICcgKyAvLyBCcmVhayB1cCBpbXBvcnRzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICAnY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcCcgKyBcIm9ydCgnLi9NeUNvbXBvbmVudCcpKVxcblxcblwiICsgJ0RpZCB5b3UgYWNjaWRlbnRhbGx5IHB1dCBjdXJseSBicmFjZXMgYXJvdW5kIHRoZSBpbXBvcnQ/JywgbW9kdWxlT2JqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoISgnZGVmYXVsdCcgaW4gbW9kdWxlT2JqZWN0KSkge1xuICAgICAgICBlcnJvcignbGF6eTogRXhwZWN0ZWQgdGhlIHJlc3VsdCBvZiBhIGR5bmFtaWMgaW1wJyArICdvcnQoKSBjYWxsLiAnICsgJ0luc3RlYWQgcmVjZWl2ZWQ6ICVzXFxuXFxuWW91ciBjb2RlIHNob3VsZCBsb29rIGxpa2U6IFxcbiAgJyArIC8vIEJyZWFrIHVwIGltcG9ydHMgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IHBhcnNpbmcgdGhlbSBhcyBkZXBlbmRlbmNpZXMuXG4gICAgICAgICdjb25zdCBNeUNvbXBvbmVudCA9IGxhenkoKCkgPT4gaW1wJyArIFwib3J0KCcuL015Q29tcG9uZW50JykpXCIsIG1vZHVsZU9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZHVsZU9iamVjdC5kZWZhdWx0O1xuICB9IGVsc2Uge1xuICAgIHRocm93IHBheWxvYWQuX3Jlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBsYXp5KGN0b3IpIHtcbiAgdmFyIHBheWxvYWQgPSB7XG4gICAgLy8gV2UgdXNlIHRoZXNlIGZpZWxkcyB0byBzdG9yZSB0aGUgcmVzdWx0LlxuICAgIF9zdGF0dXM6IFVuaW5pdGlhbGl6ZWQsXG4gICAgX3Jlc3VsdDogY3RvclxuICB9O1xuICB2YXIgbGF6eVR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0xBWllfVFlQRSxcbiAgICBfcGF5bG9hZDogcGF5bG9hZCxcbiAgICBfaW5pdDogbGF6eUluaXRpYWxpemVyXG4gIH07XG5cbiAge1xuICAgIC8vIEluIHByb2R1Y3Rpb24sIHRoaXMgd291bGQganVzdCBzZXQgaXQgb24gdGhlIG9iamVjdC5cbiAgICB2YXIgZGVmYXVsdFByb3BzO1xuICAgIHZhciBwcm9wVHlwZXM7IC8vICRGbG93Rml4TWVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGxhenlUeXBlLCB7XG4gICAgICBkZWZhdWx0UHJvcHM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFByb3BzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdEZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgICBlcnJvcignUmVhY3QubGF6eSguLi4pOiBJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIGFzc2lnbiBgZGVmYXVsdFByb3BzYCB0byAnICsgJ2EgbGF6eSBjb21wb25lbnQgaW1wb3J0LiBFaXRoZXIgc3BlY2lmeSB0aGVtIHdoZXJlIHRoZSBjb21wb25lbnQgJyArICdpcyBkZWZpbmVkLCBvciBjcmVhdGUgYSB3cmFwcGluZyBjb21wb25lbnQgYXJvdW5kIGl0LicpO1xuXG4gICAgICAgICAgZGVmYXVsdFByb3BzID0gbmV3RGVmYXVsdFByb3BzOyAvLyBNYXRjaCBwcm9kdWN0aW9uIGJlaGF2aW9yIG1vcmUgY2xvc2VseTpcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdkZWZhdWx0UHJvcHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwcm9wVHlwZXM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcFR5cGVzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdQcm9wVHlwZXMpIHtcbiAgICAgICAgICBlcnJvcignUmVhY3QubGF6eSguLi4pOiBJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIGFzc2lnbiBgcHJvcFR5cGVzYCB0byAnICsgJ2EgbGF6eSBjb21wb25lbnQgaW1wb3J0LiBFaXRoZXIgc3BlY2lmeSB0aGVtIHdoZXJlIHRoZSBjb21wb25lbnQgJyArICdpcyBkZWZpbmVkLCBvciBjcmVhdGUgYSB3cmFwcGluZyBjb21wb25lbnQgYXJvdW5kIGl0LicpO1xuXG4gICAgICAgICAgcHJvcFR5cGVzID0gbmV3UHJvcFR5cGVzOyAvLyBNYXRjaCBwcm9kdWN0aW9uIGJlaGF2aW9yIG1vcmUgY2xvc2VseTpcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdwcm9wVHlwZXMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsYXp5VHlwZTtcbn1cblxuZnVuY3Rpb24gZm9yd2FyZFJlZihyZW5kZXIpIHtcbiAge1xuICAgIGlmIChyZW5kZXIgIT0gbnVsbCAmJiByZW5kZXIuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHJlY2VpdmVkIGEgYG1lbW9gICcgKyAnY29tcG9uZW50LiBJbnN0ZWFkIG9mIGZvcndhcmRSZWYobWVtbyguLi4pKSwgdXNlICcgKyAnbWVtbyhmb3J3YXJkUmVmKC4uLikpLicpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHdhcyBnaXZlbiAlcy4nLCByZW5kZXIgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgcmVuZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJlbmRlci5sZW5ndGggIT09IDAgJiYgcmVuZGVyLmxlbmd0aCAhPT0gMikge1xuICAgICAgICBlcnJvcignZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGFjY2VwdCBleGFjdGx5IHR3byBwYXJhbWV0ZXJzOiBwcm9wcyBhbmQgcmVmLiAlcycsIHJlbmRlci5sZW5ndGggPT09IDEgPyAnRGlkIHlvdSBmb3JnZXQgdG8gdXNlIHRoZSByZWYgcGFyYW1ldGVyPycgOiAnQW55IGFkZGl0aW9uYWwgcGFyYW1ldGVyIHdpbGwgYmUgdW5kZWZpbmVkLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZW5kZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHJlbmRlci5kZWZhdWx0UHJvcHMgIT0gbnVsbCB8fCByZW5kZXIucHJvcFR5cGVzICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVuZGVyIGZ1bmN0aW9ucyBkbyBub3Qgc3VwcG9ydCBwcm9wVHlwZXMgb3IgZGVmYXVsdFByb3BzLiAnICsgJ0RpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgYSBSZWFjdCBjb21wb25lbnQ/Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnRUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgIHJlbmRlcjogcmVuZGVyXG4gIH07XG5cbiAge1xuICAgIHZhciBvd25OYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgJ2Rpc3BsYXlOYW1lJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG93bk5hbWU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBvd25OYW1lID0gbmFtZTsgLy8gVGhlIGlubmVyIGNvbXBvbmVudCBzaG91bGRuJ3QgaW5oZXJpdCB0aGlzIGRpc3BsYXkgbmFtZSBpbiBtb3N0IGNhc2VzLFxuICAgICAgICAvLyBiZWNhdXNlIHRoZSBjb21wb25lbnQgbWF5IGJlIHVzZWQgZWxzZXdoZXJlLlxuICAgICAgICAvLyBCdXQgaXQncyBuaWNlIGZvciBhbm9ueW1vdXMgZnVuY3Rpb25zIHRvIGluaGVyaXQgdGhlIG5hbWUsXG4gICAgICAgIC8vIHNvIHRoYXQgb3VyIGNvbXBvbmVudC1zdGFjayBnZW5lcmF0aW9uIGxvZ2ljIHdpbGwgZGlzcGxheSB0aGVpciBmcmFtZXMuXG4gICAgICAgIC8vIEFuIGFub255bW91cyBmdW5jdGlvbiBnZW5lcmFsbHkgc3VnZ2VzdHMgYSBwYXR0ZXJuIGxpa2U6XG4gICAgICAgIC8vICAgUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4gey4uLn0pO1xuICAgICAgICAvLyBUaGlzIGtpbmQgb2YgaW5uZXIgZnVuY3Rpb24gaXMgbm90IHVzZWQgZWxzZXdoZXJlIHNvIHRoZSBzaWRlIGVmZmVjdCBpcyBva2F5LlxuXG4gICAgICAgIGlmICghcmVuZGVyLm5hbWUgJiYgIXJlbmRlci5kaXNwbGF5TmFtZSkge1xuICAgICAgICAgIHJlbmRlci5kaXNwbGF5TmFtZSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50VHlwZTtcbn1cblxudmFyIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0U7XG5cbntcbiAgUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1vZHVsZS5yZWZlcmVuY2UnKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vdGU6IHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIChlLmcuIGlmIGl0J3MgYSBwb2x5ZmlsbCkuXG5cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IGVuYWJsZURlYnVnVHJhY2luZyAgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCBlbmFibGVMZWdhY3lIaWRkZW4gIHx8IHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8IGVuYWJsZVNjb3BlQVBJICB8fCBlbmFibGVDYWNoZUVsZW1lbnQgIHx8IGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBUaGlzIG5lZWRzIHRvIGluY2x1ZGUgYWxsIHBvc3NpYmxlIG1vZHVsZSByZWZlcmVuY2Ugb2JqZWN0XG4gICAgLy8gdHlwZXMgc3VwcG9ydGVkIGJ5IGFueSBGbGlnaHQgY29uZmlndXJhdGlvbiBhbnl3aGVyZSBzaW5jZVxuICAgIC8vIHdlIGRvbid0IGtub3cgd2hpY2ggRmxpZ2h0IGJ1aWxkIHRoaXMgd2lsbCBlbmQgdXAgYmVpbmcgdXNlZFxuICAgIC8vIHdpdGguXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRSB8fCB0eXBlLmdldE1vZHVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbWVtbyh0eXBlLCBjb21wYXJlKSB7XG4gIHtcbiAgICBpZiAoIWlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSkge1xuICAgICAgZXJyb3IoJ21lbW86IFRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgY29tcG9uZW50LiBJbnN0ZWFkICcgKyAncmVjZWl2ZWQ6ICVzJywgdHlwZSA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiB0eXBlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudFR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX01FTU9fVFlQRSxcbiAgICB0eXBlOiB0eXBlLFxuICAgIGNvbXBhcmU6IGNvbXBhcmUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb21wYXJlXG4gIH07XG5cbiAge1xuICAgIHZhciBvd25OYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgJ2Rpc3BsYXlOYW1lJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG93bk5hbWU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBvd25OYW1lID0gbmFtZTsgLy8gVGhlIGlubmVyIGNvbXBvbmVudCBzaG91bGRuJ3QgaW5oZXJpdCB0aGlzIGRpc3BsYXkgbmFtZSBpbiBtb3N0IGNhc2VzLFxuICAgICAgICAvLyBiZWNhdXNlIHRoZSBjb21wb25lbnQgbWF5IGJlIHVzZWQgZWxzZXdoZXJlLlxuICAgICAgICAvLyBCdXQgaXQncyBuaWNlIGZvciBhbm9ueW1vdXMgZnVuY3Rpb25zIHRvIGluaGVyaXQgdGhlIG5hbWUsXG4gICAgICAgIC8vIHNvIHRoYXQgb3VyIGNvbXBvbmVudC1zdGFjayBnZW5lcmF0aW9uIGxvZ2ljIHdpbGwgZGlzcGxheSB0aGVpciBmcmFtZXMuXG4gICAgICAgIC8vIEFuIGFub255bW91cyBmdW5jdGlvbiBnZW5lcmFsbHkgc3VnZ2VzdHMgYSBwYXR0ZXJuIGxpa2U6XG4gICAgICAgIC8vICAgUmVhY3QubWVtbygocHJvcHMpID0+IHsuLi59KTtcbiAgICAgICAgLy8gVGhpcyBraW5kIG9mIGlubmVyIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGVsc2V3aGVyZSBzbyB0aGUgc2lkZSBlZmZlY3QgaXMgb2theS5cblxuICAgICAgICBpZiAoIXR5cGUubmFtZSAmJiAhdHlwZS5kaXNwbGF5TmFtZSkge1xuICAgICAgICAgIHR5cGUuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFR5cGU7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEaXNwYXRjaGVyKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudDtcblxuICB7XG4gICAgaWYgKGRpc3BhdGNoZXIgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yJyArICcgb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4nICsgJzEuIFlvdSBtaWdodCBoYXZlIG1pc21hdGNoaW5nIHZlcnNpb25zIG9mIFJlYWN0IGFuZCB0aGUgcmVuZGVyZXIgKHN1Y2ggYXMgUmVhY3QgRE9NKVxcbicgKyAnMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbicgKyAnMy4gWW91IG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0IGluIHRoZSBzYW1lIGFwcFxcbicgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uJyk7XG4gICAgfVxuICB9IC8vIFdpbGwgcmVzdWx0IGluIGEgbnVsbCBhY2Nlc3MgZXJyb3IgaWYgYWNjZXNzZWQgb3V0c2lkZSByZW5kZXIgcGhhc2UuIFdlXG4gIC8vIGludGVudGlvbmFsbHkgZG9uJ3QgdGhyb3cgb3VyIG93biBlcnJvciBiZWNhdXNlIHRoaXMgaXMgaW4gYSBob3QgcGF0aC5cbiAgLy8gQWxzbyBoZWxwcyBlbnN1cmUgdGhpcyBpcyBpbmxpbmVkLlxuXG5cbiAgcmV0dXJuIGRpc3BhdGNoZXI7XG59XG5mdW5jdGlvbiB1c2VDb250ZXh0KENvbnRleHQpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuXG4gIHtcbiAgICAvLyBUT0RPOiBhZGQgYSBtb3JlIGdlbmVyaWMgd2FybmluZyBmb3IgaW52YWxpZCB2YWx1ZXMuXG4gICAgaWYgKENvbnRleHQuX2NvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJlYWxDb250ZXh0ID0gQ29udGV4dC5fY29udGV4dDsgLy8gRG9uJ3QgZGVkdXBsaWNhdGUgYmVjYXVzZSB0aGlzIGxlZ2l0aW1hdGVseSBjYXVzZXMgYnVnc1xuICAgICAgLy8gYW5kIG5vYm9keSBzaG91bGQgYmUgdXNpbmcgdGhpcyBpbiBleGlzdGluZyBjb2RlLlxuXG4gICAgICBpZiAocmVhbENvbnRleHQuQ29uc3VtZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LkNvbnN1bWVyKSBpcyBub3Qgc3VwcG9ydGVkLCBtYXkgY2F1c2UgYnVncywgYW5kIHdpbGwgYmUgJyArICdyZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTtcbiAgICAgIH0gZWxzZSBpZiAocmVhbENvbnRleHQuUHJvdmlkZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LlByb3ZpZGVyKSBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlzcGF0Y2hlci51c2VDb250ZXh0KENvbnRleHQpO1xufVxuZnVuY3Rpb24gdXNlU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlU3RhdGUoaW5pdGlhbFN0YXRlKTtcbn1cbmZ1bmN0aW9uIHVzZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG59XG5mdW5jdGlvbiB1c2VSZWYoaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlUmVmKGluaXRpYWxWYWx1ZSk7XG59XG5mdW5jdGlvbiB1c2VFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZU1lbW8oY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlTWVtbyhjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlRGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAge1xuICAgIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgICByZXR1cm4gZGlzcGF0Y2hlci51c2VEZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbik7XG4gIH1cbn1cbmZ1bmN0aW9uIHVzZVRyYW5zaXRpb24oKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlVHJhbnNpdGlvbigpO1xufVxuZnVuY3Rpb24gdXNlRGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZURlZmVycmVkVmFsdWUodmFsdWUpO1xufVxuZnVuY3Rpb24gdXNlSWQoKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSWQoKTtcbn1cbmZ1bmN0aW9uIHVzZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xufVxuXG4vLyBIZWxwZXJzIHRvIHBhdGNoIGNvbnNvbGUubG9ncyB0byBhdm9pZCBsb2dnaW5nIGR1cmluZyBzaWRlLWVmZmVjdCBmcmVlXG4vLyByZXBsYXlpbmcgb24gcmVuZGVyIGZ1bmN0aW9uLiBUaGlzIGN1cnJlbnRseSBvbmx5IHBhdGNoZXMgdGhlIG9iamVjdFxuLy8gbGF6aWx5IHdoaWNoIHdvbid0IGNvdmVyIGlmIHRoZSBsb2cgZnVuY3Rpb24gd2FzIGV4dHJhY3RlZCBlYWdlcmx5LlxuLy8gV2UgY291bGQgYWxzbyBlYWdlcmx5IHBhdGNoIHRoZSBtZXRob2QuXG52YXIgZGlzYWJsZWREZXB0aCA9IDA7XG52YXIgcHJldkxvZztcbnZhciBwcmV2SW5mbztcbnZhciBwcmV2V2FybjtcbnZhciBwcmV2RXJyb3I7XG52YXIgcHJldkdyb3VwO1xudmFyIHByZXZHcm91cENvbGxhcHNlZDtcbnZhciBwcmV2R3JvdXBFbmQ7XG5cbmZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cblxuZGlzYWJsZWRMb2cuX19yZWFjdERpc2FibGVkTG9nID0gdHJ1ZTtcbmZ1bmN0aW9uIGRpc2FibGVMb2dzKCkge1xuICB7XG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICBwcmV2V2FybiA9IGNvbnNvbGUud2FybjtcbiAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkID0gY29uc29sZS5ncm91cENvbGxhcHNlZDtcbiAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTkwOTlcblxuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZyxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgaW5mbzogcHJvcHMsXG4gICAgICAgIGxvZzogcHJvcHMsXG4gICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICBlcnJvcjogcHJvcHMsXG4gICAgICAgIGdyb3VwOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICBncm91cEVuZDogcHJvcHNcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBkaXNhYmxlZERlcHRoKys7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlZW5hYmxlTG9ncygpIHtcbiAge1xuICAgIGRpc2FibGVkRGVwdGgtLTtcblxuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBsb2c6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgaW5mbzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2SW5mb1xuICAgICAgICB9KSxcbiAgICAgICAgd2FybjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2V2FyblxuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkVycm9yXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cENvbGxhcHNlZFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBFbmQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwRW5kXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPCAwKSB7XG4gICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xudmFyIHByZWZpeDtcbmZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBFeHRyYWN0IHRoZSBWTSBzcGVjaWZpYyBwcmVmaXggdXNlZCBieSBlYWNoIGxpbmUuXG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO1xuICAgICAgICBwcmVmaXggPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbiAgICAgIH1cbiAgICB9IC8vIFdlIHVzZSB0aGUgcHJlZml4IHRvIGVuc3VyZSBvdXIgc3RhY2tzIGxpbmUgdXAgd2l0aCBuYXRpdmUgc3RhY2sgZnJhbWVzLlxuXG5cbiAgICByZXR1cm4gJ1xcbicgKyBwcmVmaXggKyBuYW1lO1xuICB9XG59XG52YXIgcmVlbnRyeSA9IGZhbHNlO1xudmFyIGNvbXBvbmVudEZyYW1lQ2FjaGU7XG5cbntcbiAgdmFyIFBvc3NpYmx5V2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcbiAgY29tcG9uZW50RnJhbWVDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gIC8vIElmIHNvbWV0aGluZyBhc2tlZCBmb3IgYSBzdGFjayBpbnNpZGUgYSBmYWtlIHJlbmRlciwgaXQgc2hvdWxkIGdldCBpZ25vcmVkLlxuICBpZiAoICFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7IC8vIFNldCB0aGUgZGlzcGF0Y2hlciBpbiBERVYgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGNhbGwgaW4gdGhlIHJlbmRlciBmdW5jdGlvblxuICAgIC8vIGZvciB3YXJuaW5ncy5cblxuICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gbnVsbDtcbiAgICBkaXNhYmxlTG9ncygpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIHNob3VsZCB0aHJvdy5cbiAgICBpZiAoY29uc3RydWN0KSB7XG4gICAgICAvLyBTb21ldGhpbmcgc2hvdWxkIGJlIHNldHRpbmcgdGhlIHByb3BzIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgIHZhciBGYWtlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfTsgLy8gJEZsb3dGaXhNZVxuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgJ3Byb3BzJywge1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBXZSB1c2UgYSB0aHJvd2luZyBzZXR0ZXIgaW5zdGVhZCBvZiBmcm96ZW4gb3Igbm9uLXdyaXRhYmxlIHByb3BzXG4gICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdvbid0IHRocm93IGluIGEgbm9uLXN0cmljdCBtb2RlIGZ1bmN0aW9uLlxuICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgIC8vIFdlIGNvbnN0cnVjdCBhIGRpZmZlcmVudCBjb250cm9sIGZvciB0aGlzIGNhc2UgdG8gaW5jbHVkZSBhbnkgZXh0cmFcbiAgICAgICAgLy8gZnJhbWVzIGFkZGVkIGJ5IHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChGYWtlLCBbXSk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBmbi5jYWxsKEZha2UucHJvdG90eXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICB9XG5cbiAgICAgIGZuKCk7XG4gICAgfVxuICB9IGNhdGNoIChzYW1wbGUpIHtcbiAgICAvLyBUaGlzIGlzIGlubGluZWQgbWFudWFsbHkgYmVjYXVzZSBjbG9zdXJlIGRvZXNuJ3QgZG8gaXQgZm9yIHVzLlxuICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiB0eXBlb2Ygc2FtcGxlLnN0YWNrID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgZmlyc3QgZnJhbWUgZnJvbSB0aGUgc2FtcGxlIHRoYXQgaXNuJ3QgYWxzbyBpbiB0aGUgY29udHJvbC5cbiAgICAgIC8vIFNraXBwaW5nIG9uZSBmcmFtZSB0aGF0IHdlIGFzc3VtZSBpcyB0aGUgZnJhbWUgdGhhdCBjYWxscyB0aGUgdHdvLlxuICAgICAgdmFyIHNhbXBsZUxpbmVzID0gc2FtcGxlLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBjb250cm9sTGluZXMgPSBjb250cm9sLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBzID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBjID0gY29udHJvbExpbmVzLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChzID49IDEgJiYgYyA+PSAwICYmIHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgLy8gV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBzdGFjayBmcmFtZSB0byBiZSBzaGFyZWQuXG4gICAgICAgIC8vIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgbW9zdCBvbmUuIEhvd2V2ZXIsIHN0YWNrIGZyYW1lcyBtYXkgYmVcbiAgICAgICAgLy8gY3V0IG9mZiBkdWUgdG8gbWF4aW11bSBzdGFjayBsaW1pdHMuIEluIHRoaXMgY2FzZSwgb25lIG1heWJlIGN1dCBvZmZcbiAgICAgICAgLy8gZWFybGllciB0aGFuIHRoZSBvdGhlci4gV2UgYXNzdW1lIHRoYXQgdGhlIHNhbXBsZSBpcyBsb25nZXIgb3IgdGhlIHNhbWVcbiAgICAgICAgLy8gYW5kIHRoZXJlIGZvciBjdXQgb2ZmIGVhcmxpZXIuIFNvIHdlIHNob3VsZCBmaW5kIHRoZSByb290IG1vc3QgZnJhbWUgaW5cbiAgICAgICAgLy8gdGhlIHNhbXBsZSBzb21ld2hlcmUgaW4gdGhlIGNvbnRyb2wuXG4gICAgICAgIGMtLTtcbiAgICAgIH1cblxuICAgICAgZm9yICg7IHMgPj0gMSAmJiBjID49IDA7IHMtLSwgYy0tKSB7XG4gICAgICAgIC8vIE5leHQgd2UgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgd2hpY2ggc2hvdWxkIGJlIHRoZVxuICAgICAgICAvLyBmcmFtZSB0aGF0IGNhbGxlZCBvdXIgc2FtcGxlIGZ1bmN0aW9uIGFuZCB0aGUgY29udHJvbC5cbiAgICAgICAgaWYgKHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAvLyBJbiBWOCwgdGhlIGZpcnN0IGxpbmUgaXMgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBidXQgb3RoZXIgVk1zIGRvbid0LlxuICAgICAgICAgIC8vIElmIHdlJ3JlIGFib3V0IHRvIHJldHVybiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBjb250cm9sIGlzIGFsc28gb24gdGhlIHNhbWVcbiAgICAgICAgICAvLyBsaW5lLCB0aGF0J3MgYSBwcmV0dHkgZ29vZCBpbmRpY2F0b3IgdGhhdCBvdXIgc2FtcGxlIHRocmV3IGF0IHNhbWUgbGluZSBhc1xuICAgICAgICAgIC8vIHRoZSBjb250cm9sLiBJLmUuIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSBzYW1wbGUgZnJhbWUuIFNvIHdlIGlnbm9yZSB0aGlzIHJlc3VsdC5cbiAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IHBhc3NlZCBhIGNsYXNzIHRvIGZ1bmN0aW9uIGNvbXBvbmVudCwgb3Igbm9uLWZ1bmN0aW9uLlxuICAgICAgICAgIGlmIChzICE9PSAxIHx8IGMgIT09IDEpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgcy0tO1xuICAgICAgICAgICAgICBjLS07IC8vIFdlIG1heSBzdGlsbCBoYXZlIHNpbWlsYXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgICAgICAgLy8gVGhlIG5leHQgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgc2hvdWxkIGJlIG91ciBtYXRjaCB0aG91Z2guXG5cbiAgICAgICAgICAgICAgaWYgKGMgPCAwIHx8IHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAgICAgICAvLyBWOCBhZGRzIGEgXCJuZXdcIiBwcmVmaXggZm9yIG5hdGl2ZSBjbGFzc2VzLiBMZXQncyByZW1vdmUgaXQgdG8gbWFrZSBpdCBwcmV0dGllci5cbiAgICAgICAgICAgICAgICB2YXIgX2ZyYW1lID0gJ1xcbicgKyBzYW1wbGVMaW5lc1tzXS5yZXBsYWNlKCcgYXQgbmV3ICcsICcgYXQgJyk7IC8vIElmIG91ciBjb21wb25lbnQgZnJhbWUgaXMgbGFiZWxlZCBcIjxhbm9ueW1vdXM+XCJcbiAgICAgICAgICAgICAgICAvLyBidXQgd2UgaGF2ZSBhIHVzZXItcHJvdmlkZWQgXCJkaXNwbGF5TmFtZVwiXG4gICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGluIHRvIG1ha2UgdGhlIHN0YWNrIG1vcmUgcmVhZGFibGUuXG5cblxuICAgICAgICAgICAgICAgIGlmIChmbi5kaXNwbGF5TmFtZSAmJiBfZnJhbWUuaW5jbHVkZXMoJzxhbm9ueW1vdXM+JykpIHtcbiAgICAgICAgICAgICAgICAgIF9mcmFtZSA9IF9mcmFtZS5yZXBsYWNlKCc8YW5vbnltb3VzPicsIGZuLmRpc3BsYXlOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBfZnJhbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gLy8gUmV0dXJuIHRoZSBsaW5lIHdlIGZvdW5kLlxuXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZyYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChzID49IDEgJiYgYyA+PSAwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICByZWVudHJ5ID0gZmFsc2U7XG5cbiAgICB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTGF6eSBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoaW5pdChwYXlsb2FkKSwgc291cmNlLCBvd25lckZuKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC5cbiAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKGhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLicgKyAnVGhpcyBvZnRlbiBoYXBwZW5zIGJlY2F1c2Ugb2YgdHlwb3Mgc3VjaCBhcyBgUHJvcFR5cGVzLmZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGBQcm9wVHlwZXMuZnVuY2AuJyk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvciQxID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciQxID0gZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSAmJiAhKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzJyArICcgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgbG9jYXRpb24sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yJDEpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IkMS5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvciQxLm1lc3NhZ2VdID0gdHJ1ZTtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCdGYWlsZWQgJXMgdHlwZTogJXMnLCBsb2NhdGlvbiwgZXJyb3IkMS5tZXNzYWdlKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIHNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duO1xuXG57XG4gIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpIHtcbiAgaWYgKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKHNvdXJjZSkge1xuICBpZiAoc291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZmlsZU5hbWUgPSBzb3VyY2UuZmlsZU5hbWUucmVwbGFjZSgvXi4qW1xcXFxcXC9dLywgJycpO1xuICAgIHZhciBsaW5lTnVtYmVyID0gc291cmNlLmxpbmVOdW1iZXI7XG4gICAgcmV0dXJuICdcXG5cXG5DaGVjayB5b3VyIGNvZGUgYXQgJyArIGZpbGVOYW1lICsgJzonICsgbGluZU51bWJlciArICcuJztcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW1Gb3JQcm9wcyhlbGVtZW50UHJvcHMpIHtcbiAgaWYgKGVsZW1lbnRQcm9wcyAhPT0gbnVsbCAmJiBlbGVtZW50UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShlbGVtZW50UHJvcHMuX19zb3VyY2UpO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuLyoqXG4gKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAqIHVwZGF0ZXMuXG4gKi9cblxuXG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICB2YXIgaW5mbyA9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuXG4gIGlmICghaW5mbykge1xuICAgIHZhciBwYXJlbnROYW1lID0gdHlwZW9mIHBhcmVudFR5cGUgPT09ICdzdHJpbmcnID8gcGFyZW50VHlwZSA6IHBhcmVudFR5cGUuZGlzcGxheU5hbWUgfHwgcGFyZW50VHlwZS5uYW1lO1xuXG4gICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgIGluZm8gPSBcIlxcblxcbkNoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPFwiICsgcGFyZW50TmFtZSArIFwiPi5cIjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5mbztcbn1cbi8qKlxuICogV2FybiBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW4gZXhwbGljaXQga2V5IGFzc2lnbmVkIHRvIGl0LlxuICogVGhpcyBlbGVtZW50IGlzIGluIGFuIGFycmF5LiBUaGUgYXJyYXkgY291bGQgZ3JvdyBhbmQgc2hyaW5rIG9yIGJlXG4gKiByZW9yZGVyZWQuIEFsbCBjaGlsZHJlbiB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcmUgcmVxdWlyZWQgdG9cbiAqIGhhdmUgYSBcImtleVwiIHByb3BlcnR5IGFzc2lnbmVkIHRvIGl0LiBFcnJvciBzdGF0dXNlcyBhcmUgY2FjaGVkIHNvIGEgd2FybmluZ1xuICogd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IHRoYXQgcmVxdWlyZXMgYSBrZXkuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgZWxlbWVudCdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUV4cGxpY2l0S2V5KGVsZW1lbnQsIHBhcmVudFR5cGUpIHtcbiAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgfHwgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gIHZhciBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvID0gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKTtcblxuICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dID0gdHJ1ZTsgLy8gVXN1YWxseSB0aGUgY3VycmVudCBvd25lciBpcyB0aGUgb2ZmZW5kZXIsIGJ1dCBpZiBpdCBhY2NlcHRzIGNoaWxkcmVuIGFzIGFcbiAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAvLyBhc3NpZ25pbmcgaXQgYSBrZXkuXG5cbiAgdmFyIGNoaWxkT3duZXIgPSAnJztcblxuICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lciAhPT0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIC8vIEdpdmUgdGhlIGNvbXBvbmVudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGlzIGNoaWxkLlxuICAgIGNoaWxkT3duZXIgPSBcIiBJdCB3YXMgcGFzc2VkIGEgY2hpbGQgZnJvbSBcIiArIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShlbGVtZW50Ll9vd25lci50eXBlKSArIFwiLlwiO1xuICB9XG5cbiAge1xuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCk7XG5cbiAgICBlcnJvcignRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgXCJrZXlcIiBwcm9wLicgKyAnJXMlcyBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dhcm5pbmcta2V5cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLCBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvLCBjaGlsZE93bmVyKTtcblxuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gIH1cbn1cbi8qKlxuICogRW5zdXJlIHRoYXQgZXZlcnkgZWxlbWVudCBlaXRoZXIgaXMgcGFzc2VkIGluIGEgc3RhdGljIGxvY2F0aW9uLCBpbiBhblxuICogYXJyYXkgd2l0aCBhbiBleHBsaWNpdCBrZXlzIHByb3BlcnR5IGRlZmluZWQsIG9yIGluIGFuIG9iamVjdCBsaXRlcmFsXG4gKiB3aXRoIHZhbGlkIGtleSBwcm9wZXJ0eS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3ROb2RlfSBub2RlIFN0YXRpY2FsbHkgcGFzc2VkIGNoaWxkIG9mIGFueSB0eXBlLlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIG5vZGUncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVDaGlsZEtleXMobm9kZSwgcGFyZW50VHlwZSkge1xuICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGlzQXJyYXkobm9kZSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IG5vZGVbaV07XG5cbiAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShjaGlsZCwgcGFyZW50VHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XG4gICAgLy8gVGhpcyBlbGVtZW50IHdhcyBwYXNzZWQgaW4gYSB2YWxpZCBsb2NhdGlvbi5cbiAgICBpZiAobm9kZS5fc3RvcmUpIHtcbiAgICAgIG5vZGUuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgfVxuICB9IGVsc2UgaWYgKG5vZGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obm9kZSk7XG5cbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEVudHJ5IGl0ZXJhdG9ycyB1c2VkIHRvIHByb3ZpZGUgaW1wbGljaXQga2V5cyxcbiAgICAgIC8vIGJ1dCBub3cgd2UgcHJpbnQgYSBzZXBhcmF0ZSB3YXJuaW5nIGZvciB0aGVtIGxhdGVyLlxuICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IG5vZGUuZW50cmllcykge1xuICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobm9kZSk7XG4gICAgICAgIHZhciBzdGVwO1xuXG4gICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoc3RlcC52YWx1ZSwgcGFyZW50VHlwZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdpdmVuIGFuIGVsZW1lbnQsIHZhbGlkYXRlIHRoYXQgaXRzIHByb3BzIGZvbGxvdyB0aGUgcHJvcFR5cGVzIGRlZmluaXRpb24sXG4gKiBwcm92aWRlZCBieSB0aGUgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudFxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCkge1xuICB7XG4gICAgdmFyIHR5cGUgPSBlbGVtZW50LnR5cGU7XG5cbiAgICBpZiAodHlwZSA9PT0gbnVsbCB8fCB0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHByb3BUeXBlcztcblxuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gTm90ZTogTWVtbyBvbmx5IGNoZWNrcyBvdXRlciBwcm9wcyBoZXJlLlxuICAgIC8vIElubmVyIHByb3BzIGFyZSBjaGVja2VkIGluIHRoZSByZWNvbmNpbGVyLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3BUeXBlcykge1xuICAgICAgLy8gSW50ZW50aW9uYWxseSBpbnNpZGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGluaXRpYWxpemVyczpcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuICAgICAgY2hlY2tQcm9wVHlwZXMocHJvcFR5cGVzLCBlbGVtZW50LnByb3BzLCAncHJvcCcsIG5hbWUsIGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAodHlwZS5Qcm9wVHlwZXMgIT09IHVuZGVmaW5lZCAmJiAhcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24pIHtcbiAgICAgIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gdHJ1ZTsgLy8gSW50ZW50aW9uYWxseSBpbnNpZGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGluaXRpYWxpemVyczpcblxuICAgICAgdmFyIF9uYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpO1xuXG4gICAgICBlcnJvcignQ29tcG9uZW50ICVzIGRlY2xhcmVkIGBQcm9wVHlwZXNgIGluc3RlYWQgb2YgYHByb3BUeXBlc2AuIERpZCB5b3UgbWlzc3BlbGwgdGhlIHByb3BlcnR5IGFzc2lnbm1lbnQ/JywgX25hbWUgfHwgJ1Vua25vd24nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHR5cGUuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nICYmICF0eXBlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyBpcyBvbmx5IHVzZWQgb24gY2xhc3NpYyBSZWFjdC5jcmVhdGVDbGFzcyAnICsgJ2RlZmluaXRpb25zLiBVc2UgYSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgYGRlZmF1bHRQcm9wc2AgaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYSBmcmFnbWVudCwgdmFsaWRhdGUgdGhhdCBpdCBjYW4gb25seSBiZSBwcm92aWRlZCB3aXRoIGZyYWdtZW50IHByb3BzXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZnJhZ21lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhmcmFnbWVudCkge1xuICB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmcmFnbWVudC5wcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoa2V5ICE9PSAnY2hpbGRyZW4nICYmIGtleSAhPT0gJ2tleScpIHtcbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgcHJvcCBgJXNgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuICcgKyAnUmVhY3QuRnJhZ21lbnQgY2FuIG9ubHkgaGF2ZSBga2V5YCBhbmQgYGNoaWxkcmVuYCBwcm9wcy4nLCBrZXkpO1xuXG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmcmFnbWVudC5yZWYgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgYHJlZmAgc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4nKTtcblxuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbih0eXBlLCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIHZhbGlkVHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKTsgLy8gV2Ugd2FybiBpbiB0aGlzIGNhc2UgYnV0IGRvbid0IHRocm93LiBXZSBleHBlY3QgdGhlIGVsZW1lbnQgY3JlYXRpb24gdG9cbiAgLy8gc3VjY2VlZCBhbmQgdGhlcmUgd2lsbCBsaWtlbHkgYmUgZXJyb3JzIGluIHJlbmRlci5cblxuICBpZiAoIXZhbGlkVHlwZSkge1xuICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgbmFtZWQgaW1wb3J0cy5cIjtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlSW5mbyA9IGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtRm9yUHJvcHMocHJvcHMpO1xuXG4gICAgaWYgKHNvdXJjZUluZm8pIHtcbiAgICAgIGluZm8gKz0gc291cmNlSW5mbztcbiAgICB9IGVsc2Uge1xuICAgICAgaW5mbyArPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcbiAgICB9XG5cbiAgICB2YXIgdHlwZVN0cmluZztcblxuICAgIGlmICh0eXBlID09PSBudWxsKSB7XG4gICAgICB0eXBlU3RyaW5nID0gJ251bGwnO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheSh0eXBlKSkge1xuICAgICAgdHlwZVN0cmluZyA9ICdhcnJheSc7XG4gICAgfSBlbHNlIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICB0eXBlU3RyaW5nID0gXCI8XCIgKyAoZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgJ1Vua25vd24nKSArIFwiIC8+XCI7XG4gICAgICBpbmZvID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBleHBvcnQgYSBKU1ggbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50Pyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGVTdHJpbmcgPSB0eXBlb2YgdHlwZTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBlcnJvcignUmVhY3QuY3JlYXRlRWxlbWVudDogdHlwZSBpcyBpbnZhbGlkIC0tIGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgJyArICdidWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlICcgKyAnY29tcG9uZW50cykgYnV0IGdvdDogJXMuJXMnLCB0eXBlU3RyaW5nLCBpbmZvKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gVGhlIHJlc3VsdCBjYW4gYmUgbnVsbGlzaCBpZiBhIG1vY2sgb3IgYSBjdXN0b20gZnVuY3Rpb24gaXMgdXNlZC5cbiAgLy8gVE9ETzogRHJvcCB0aGlzIHdoZW4gdGhlc2UgYXJlIG5vIGxvbmdlciBhbGxvd2VkIGFzIHRoZSB0eXBlIGFyZ3VtZW50LlxuXG4gIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfSAvLyBTa2lwIGtleSB3YXJuaW5nIGlmIHRoZSB0eXBlIGlzbid0IHZhbGlkIHNpbmNlIG91ciBrZXkgdmFsaWRhdGlvbiBsb2dpY1xuICAvLyBkb2Vzbid0IGV4cGVjdCBhIG5vbi1zdHJpbmcvZnVuY3Rpb24gdHlwZSBhbmQgY2FuIHRocm93IGNvbmZ1c2luZyBlcnJvcnMuXG4gIC8vIFdlIGRvbid0IHdhbnQgZXhjZXB0aW9uIGJlaGF2aW9yIHRvIGRpZmZlciBiZXR3ZWVuIGRldiBhbmQgcHJvZC5cbiAgLy8gKFJlbmRlcmluZyB3aWxsIHRocm93IHdpdGggYSBoZWxwZnVsIG1lc3NhZ2UgYW5kIGFzIHNvb24gYXMgdGhlIHR5cGUgaXNcbiAgLy8gZml4ZWQsIHRoZSBrZXkgd2FybmluZ3Mgd2lsbCBhcHBlYXIuKVxuXG5cbiAgaWYgKHZhbGlkVHlwZSkge1xuICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIHR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgdmFsaWRhdGVGcmFnbWVudFByb3BzKGVsZW1lbnQpO1xuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG52YXIgZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkgPSBmYWxzZTtcbmZ1bmN0aW9uIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbih0eXBlKSB7XG4gIHZhciB2YWxpZGF0ZWRGYWN0b3J5ID0gY3JlYXRlRWxlbWVudFdpdGhWYWxpZGF0aW9uLmJpbmQobnVsbCwgdHlwZSk7XG4gIHZhbGlkYXRlZEZhY3RvcnkudHlwZSA9IHR5cGU7XG5cbiAge1xuICAgIGlmICghZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkpIHtcbiAgICAgIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5ID0gdHJ1ZTtcblxuICAgICAgd2FybignUmVhY3QuY3JlYXRlRmFjdG9yeSgpIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIENvbnNpZGVyIHVzaW5nIEpTWCAnICsgJ29yIHVzZSBSZWFjdC5jcmVhdGVFbGVtZW50KCkgZGlyZWN0bHkgaW5zdGVhZC4nKTtcbiAgICB9IC8vIExlZ2FjeSBob29rOiByZW1vdmUgaXRcblxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZhbGlkYXRlZEZhY3RvcnksICd0eXBlJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2FybignRmFjdG9yeS50eXBlIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB0aGUgY2xhc3MgZGlyZWN0bHkgJyArICdiZWZvcmUgcGFzc2luZyBpdCB0byBjcmVhdGVGYWN0b3J5LicpO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndHlwZScsIHtcbiAgICAgICAgICB2YWx1ZTogdHlwZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVkRmFjdG9yeTtcbn1cbmZ1bmN0aW9uIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uKGVsZW1lbnQsIHByb3BzLCBjaGlsZHJlbikge1xuICB2YXIgbmV3RWxlbWVudCA9IGNsb25lRWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCBuZXdFbGVtZW50LnR5cGUpO1xuICB9XG5cbiAgdmFsaWRhdGVQcm9wVHlwZXMobmV3RWxlbWVudCk7XG4gIHJldHVybiBuZXdFbGVtZW50O1xufVxuXG5mdW5jdGlvbiBzdGFydFRyYW5zaXRpb24oc2NvcGUsIG9wdGlvbnMpIHtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjtcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IHt9O1xuICB2YXIgY3VycmVudFRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBzY29wZSgpO1xuICB9IGZpbmFsbHkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcblxuICAgIHtcbiAgICAgIGlmIChwcmV2VHJhbnNpdGlvbiA9PT0gbnVsbCAmJiBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycykge1xuICAgICAgICB2YXIgdXBkYXRlZEZpYmVyc0NvdW50ID0gY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuc2l6ZTtcblxuICAgICAgICBpZiAodXBkYXRlZEZpYmVyc0NvdW50ID4gMTApIHtcbiAgICAgICAgICB3YXJuKCdEZXRlY3RlZCBhIGxhcmdlIG51bWJlciBvZiB1cGRhdGVzIGluc2lkZSBzdGFydFRyYW5zaXRpb24uICcgKyAnSWYgdGhpcyBpcyBkdWUgdG8gYSBzdWJzY3JpcHRpb24gcGxlYXNlIHJlLXdyaXRlIGl0IHRvIHVzZSBSZWFjdCBwcm92aWRlZCBob29rcy4gJyArICdPdGhlcndpc2UgY29uY3VycmVudCBtb2RlIGd1YXJhbnRlZXMgYXJlIG9mZiB0aGUgdGFibGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPSBmYWxzZTtcbnZhciBlbnF1ZXVlVGFza0ltcGwgPSBudWxsO1xuZnVuY3Rpb24gZW5xdWV1ZVRhc2sodGFzaykge1xuICBpZiAoZW5xdWV1ZVRhc2tJbXBsID09PSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIHJlYWQgcmVxdWlyZSBvZmYgdGhlIG1vZHVsZSBvYmplY3QgdG8gZ2V0IGFyb3VuZCB0aGUgYnVuZGxlcnMuXG4gICAgICAvLyB3ZSBkb24ndCB3YW50IHRoZW0gdG8gZGV0ZWN0IGEgcmVxdWlyZSBhbmQgYnVuZGxlIGEgTm9kZSBwb2x5ZmlsbC5cbiAgICAgIHZhciByZXF1aXJlU3RyaW5nID0gKCdyZXF1aXJlJyArIE1hdGgucmFuZG9tKCkpLnNsaWNlKDAsIDcpO1xuICAgICAgdmFyIG5vZGVSZXF1aXJlID0gbW9kdWxlICYmIG1vZHVsZVtyZXF1aXJlU3RyaW5nXTsgLy8gYXNzdW1pbmcgd2UncmUgaW4gbm9kZSwgbGV0J3MgdHJ5IHRvIGdldCBub2RlJ3NcbiAgICAgIC8vIHZlcnNpb24gb2Ygc2V0SW1tZWRpYXRlLCBieXBhc3NpbmcgZmFrZSB0aW1lcnMgaWYgYW55LlxuXG4gICAgICBlbnF1ZXVlVGFza0ltcGwgPSBub2RlUmVxdWlyZS5jYWxsKG1vZHVsZSwgJ3RpbWVycycpLnNldEltbWVkaWF0ZTtcbiAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAvLyB3ZSdyZSBpbiBhIGJyb3dzZXJcbiAgICAgIC8vIHdlIGNhbid0IHVzZSByZWd1bGFyIHRpbWVycyBiZWNhdXNlIHRoZXkgbWF5IHN0aWxsIGJlIGZha2VkXG4gICAgICAvLyBzbyB3ZSB0cnkgTWVzc2FnZUNoYW5uZWwrcG9zdE1lc3NhZ2UgaW5zdGVhZFxuICAgICAgZW5xdWV1ZVRhc2tJbXBsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBkaWRXYXJuQWJvdXRNZXNzYWdlQ2hhbm5lbCA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgTWVzc2FnZUNoYW5uZWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGVycm9yKCdUaGlzIGJyb3dzZXIgZG9lcyBub3QgaGF2ZSBhIE1lc3NhZ2VDaGFubmVsIGltcGxlbWVudGF0aW9uLCAnICsgJ3NvIGVucXVldWluZyB0YXNrcyB2aWEgYXdhaXQgYWN0KGFzeW5jICgpID0+IC4uLikgd2lsbCBmYWlsLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMgJyArICdpZiB5b3UgZW5jb3VudGVyIHRoaXMgd2FybmluZy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGNhbGxiYWNrO1xuICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKHVuZGVmaW5lZCk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbnF1ZXVlVGFza0ltcGwodGFzayk7XG59XG5cbnZhciBhY3RTY29wZURlcHRoID0gMDtcbnZhciBkaWRXYXJuTm9Bd2FpdEFjdCA9IGZhbHNlO1xuZnVuY3Rpb24gYWN0KGNhbGxiYWNrKSB7XG4gIHtcbiAgICAvLyBgYWN0YCBjYWxscyBjYW4gYmUgbmVzdGVkLCBzbyB3ZSB0cmFjayB0aGUgZGVwdGguIFRoaXMgcmVwcmVzZW50cyB0aGVcbiAgICAvLyBudW1iZXIgb2YgYGFjdGAgc2NvcGVzIG9uIHRoZSBzdGFjay5cbiAgICB2YXIgcHJldkFjdFNjb3BlRGVwdGggPSBhY3RTY29wZURlcHRoO1xuICAgIGFjdFNjb3BlRGVwdGgrKztcblxuICAgIGlmIChSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBvdXRlcm1vc3QgYGFjdGAgc2NvcGUuIEluaXRpYWxpemUgdGhlIHF1ZXVlLiBUaGUgcmVjb25jaWxlclxuICAgICAgLy8gd2lsbCBkZXRlY3QgdGhlIHF1ZXVlIGFuZCB1c2UgaXQgaW5zdGVhZCBvZiBTY2hlZHVsZXIuXG4gICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gW107XG4gICAgfVxuXG4gICAgdmFyIHByZXZJc0JhdGNoaW5nTGVnYWN5ID0gUmVhY3RDdXJyZW50QWN0UXVldWUuaXNCYXRjaGluZ0xlZ2FjeTtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZWQgdG8gcmVwcm9kdWNlIGJlaGF2aW9yIG9mIGBiYXRjaGVkVXBkYXRlc2AgaW4gbGVnYWN5IG1vZGUuIE9ubHlcbiAgICAgIC8vIHNldCB0byBgdHJ1ZWAgd2hpbGUgdGhlIGdpdmVuIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBub3QgZm9yIHVwZGF0ZXNcbiAgICAgIC8vIHRyaWdnZXJlZCBkdXJpbmcgYW4gYXN5bmMgZXZlbnQsIGJlY2F1c2UgdGhpcyBpcyBob3cgdGhlIGxlZ2FjeVxuICAgICAgLy8gaW1wbGVtZW50YXRpb24gb2YgYGFjdGAgYmVoYXZlZC5cbiAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmlzQmF0Y2hpbmdMZWdhY3kgPSB0cnVlO1xuICAgICAgcmVzdWx0ID0gY2FsbGJhY2soKTsgLy8gUmVwbGljYXRlIGJlaGF2aW9yIG9mIG9yaWdpbmFsIGBhY3RgIGltcGxlbWVudGF0aW9uIGluIGxlZ2FjeSBtb2RlLFxuICAgICAgLy8gd2hpY2ggZmx1c2hlZCB1cGRhdGVzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBzY29wZSBmdW5jdGlvbiBleGl0cywgZXZlblxuICAgICAgLy8gaWYgaXQncyBhbiBhc3luYyBmdW5jdGlvbi5cblxuICAgICAgaWYgKCFwcmV2SXNCYXRjaGluZ0xlZ2FjeSAmJiBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSkge1xuICAgICAgICB2YXIgcXVldWUgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50O1xuXG4gICAgICAgIGlmIChxdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmRpZFNjaGVkdWxlTGVnYWN5VXBkYXRlID0gZmFsc2U7XG4gICAgICAgICAgZmx1c2hBY3RRdWV1ZShxdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmlzQmF0Y2hpbmdMZWdhY3kgPSBwcmV2SXNCYXRjaGluZ0xlZ2FjeTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRoZW5hYmxlUmVzdWx0ID0gcmVzdWx0OyAvLyBUaGUgY2FsbGJhY2sgaXMgYW4gYXN5bmMgZnVuY3Rpb24gKGkuZS4gcmV0dXJuZWQgYSBwcm9taXNlKS4gV2FpdFxuICAgICAgLy8gZm9yIGl0IHRvIHJlc29sdmUgYmVmb3JlIGV4aXRpbmcgdGhlIGN1cnJlbnQgc2NvcGUuXG5cbiAgICAgIHZhciB3YXNBd2FpdGVkID0gZmFsc2U7XG4gICAgICB2YXIgdGhlbmFibGUgPSB7XG4gICAgICAgIHRoZW46IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICB3YXNBd2FpdGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGVuYWJsZVJlc3VsdC50aGVuKGZ1bmN0aW9uIChyZXR1cm5WYWx1ZSkge1xuICAgICAgICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuXG4gICAgICAgICAgICBpZiAoYWN0U2NvcGVEZXB0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAvLyBXZSd2ZSBleGl0ZWQgdGhlIG91dGVybW9zdCBhY3Qgc2NvcGUuIFJlY3Vyc2l2ZWx5IGZsdXNoIHRoZVxuICAgICAgICAgICAgICAvLyBxdWV1ZSB1bnRpbCB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLlxuICAgICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBUaGUgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3IuXG4gICAgICAgICAgICBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCk7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB7XG4gICAgICAgIGlmICghZGlkV2Fybk5vQXdhaXRBY3QgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7fSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXdhc0F3YWl0ZWQpIHtcbiAgICAgICAgICAgICAgZGlkV2Fybk5vQXdhaXRBY3QgPSB0cnVlO1xuXG4gICAgICAgICAgICAgIGVycm9yKCdZb3UgY2FsbGVkIGFjdChhc3luYyAoKSA9PiAuLi4pIHdpdGhvdXQgYXdhaXQuICcgKyAnVGhpcyBjb3VsZCBsZWFkIHRvIHVuZXhwZWN0ZWQgdGVzdGluZyBiZWhhdmlvdXIsICcgKyAnaW50ZXJsZWF2aW5nIG11bHRpcGxlIGFjdCBjYWxscyBhbmQgbWl4aW5nIHRoZWlyICcgKyAnc2NvcGVzLiAnICsgJ1lvdSBzaG91bGQgLSBhd2FpdCBhY3QoYXN5bmMgKCkgPT4gLi4uKTsnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhlbmFibGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXR1cm5WYWx1ZSA9IHJlc3VsdDsgLy8gVGhlIGNhbGxiYWNrIGlzIG5vdCBhbiBhc3luYyBmdW5jdGlvbi4gRXhpdCB0aGUgY3VycmVudCBzY29wZVxuICAgICAgLy8gaW1tZWRpYXRlbHksIHdpdGhvdXQgYXdhaXRpbmcuXG5cbiAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcblxuICAgICAgaWYgKGFjdFNjb3BlRGVwdGggPT09IDApIHtcbiAgICAgICAgLy8gRXhpdGluZyB0aGUgb3V0ZXJtb3N0IGFjdCBzY29wZS4gRmx1c2ggdGhlIHF1ZXVlLlxuICAgICAgICB2YXIgX3F1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDtcblxuICAgICAgICBpZiAoX3F1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgZmx1c2hBY3RRdWV1ZShfcXVldWUpO1xuICAgICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICB9IC8vIFJldHVybiBhIHRoZW5hYmxlLiBJZiB0aGUgdXNlciBhd2FpdHMgaXQsIHdlJ2xsIGZsdXNoIGFnYWluIGluXG4gICAgICAgIC8vIGNhc2UgYWRkaXRpb25hbCB3b3JrIHdhcyBzY2hlZHVsZWQgYnkgYSBtaWNyb3Rhc2suXG5cblxuICAgICAgICB2YXIgX3RoZW5hYmxlID0ge1xuICAgICAgICAgIHRoZW46IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIC8vIENvbmZpcm0gd2UgaGF2ZW4ndCByZS1lbnRlcmVkIGFub3RoZXIgYGFjdGAgc2NvcGUsIGluIGNhc2VcbiAgICAgICAgICAgIC8vIHRoZSB1c2VyIGRvZXMgc29tZXRoaW5nIHdlaXJkIGxpa2UgYXdhaXQgdGhlIHRoZW5hYmxlXG4gICAgICAgICAgICAvLyBtdWx0aXBsZSB0aW1lcy5cbiAgICAgICAgICAgIGlmIChSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZsdXNoIHRoZSBxdWV1ZSB1bnRpbCB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLlxuICAgICAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gW107XG4gICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5Rmx1c2hBc3luY0FjdFdvcmsocmV0dXJuVmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhlbmFibGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTaW5jZSB3ZSdyZSBpbnNpZGUgYSBuZXN0ZWQgYGFjdGAgc2NvcGUsIHRoZSByZXR1cm5lZCB0aGVuYWJsZVxuICAgICAgICAvLyBpbW1lZGlhdGVseSByZXNvbHZlcy4gVGhlIG91dGVyIHNjb3BlIHdpbGwgZmx1c2ggdGhlIHF1ZXVlLlxuICAgICAgICB2YXIgX3RoZW5hYmxlMiA9IHtcbiAgICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhlbmFibGUyO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCkge1xuICB7XG4gICAgaWYgKHByZXZBY3RTY29wZURlcHRoICE9PSBhY3RTY29wZURlcHRoIC0gMSkge1xuICAgICAgZXJyb3IoJ1lvdSBzZWVtIHRvIGhhdmUgb3ZlcmxhcHBpbmcgYWN0KCkgY2FsbHMsIHRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdCZSBzdXJlIHRvIGF3YWl0IHByZXZpb3VzIGFjdCgpIGNhbGxzIGJlZm9yZSBtYWtpbmcgYSBuZXcgb25lLiAnKTtcbiAgICB9XG5cbiAgICBhY3RTY29wZURlcHRoID0gcHJldkFjdFNjb3BlRGVwdGg7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gIHtcbiAgICB2YXIgcXVldWUgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50O1xuXG4gICAgaWYgKHF1ZXVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBmbHVzaEFjdFF1ZXVlKHF1ZXVlKTtcbiAgICAgICAgZW5xdWV1ZVRhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIE5vIGFkZGl0aW9uYWwgd29yayB3YXMgc2NoZWR1bGVkLiBGaW5pc2guXG4gICAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBLZWVwIGZsdXNoaW5nIHdvcmsgdW50aWwgdGhlcmUncyBub25lIGxlZnQuXG4gICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGlzRmx1c2hpbmcgPSBmYWxzZTtcblxuZnVuY3Rpb24gZmx1c2hBY3RRdWV1ZShxdWV1ZSkge1xuICB7XG4gICAgaWYgKCFpc0ZsdXNoaW5nKSB7XG4gICAgICAvLyBQcmV2ZW50IHJlLWVudHJhbmNlLlxuICAgICAgaXNGbHVzaGluZyA9IHRydWU7XG4gICAgICB2YXIgaSA9IDA7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBxdWV1ZVtpXTtcblxuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sodHJ1ZSk7XG4gICAgICAgICAgfSB3aGlsZSAoY2FsbGJhY2sgIT09IG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUubGVuZ3RoID0gMDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJvd3MsIGxlYXZlIHRoZSByZW1haW5pbmcgY2FsbGJhY2tzIG9uIHRoZSBxdWV1ZS5cbiAgICAgICAgcXVldWUgPSBxdWV1ZS5zbGljZShpICsgMSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaXNGbHVzaGluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgY3JlYXRlRWxlbWVudCQxID0gIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbiA7XG52YXIgY2xvbmVFbGVtZW50JDEgPSAgY2xvbmVFbGVtZW50V2l0aFZhbGlkYXRpb24gO1xudmFyIGNyZWF0ZUZhY3RvcnkgPSAgY3JlYXRlRmFjdG9yeVdpdGhWYWxpZGF0aW9uIDtcbnZhciBDaGlsZHJlbiA9IHtcbiAgbWFwOiBtYXBDaGlsZHJlbixcbiAgZm9yRWFjaDogZm9yRWFjaENoaWxkcmVuLFxuICBjb3VudDogY291bnRDaGlsZHJlbixcbiAgdG9BcnJheTogdG9BcnJheSxcbiAgb25seTogb25seUNoaWxkXG59O1xuXG5leHBvcnRzLkNoaWxkcmVuID0gQ2hpbGRyZW47XG5leHBvcnRzLkNvbXBvbmVudCA9IENvbXBvbmVudDtcbmV4cG9ydHMuRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xuZXhwb3J0cy5Qcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG5leHBvcnRzLlB1cmVDb21wb25lbnQgPSBQdXJlQ29tcG9uZW50O1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuZXhwb3J0cy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzO1xuZXhwb3J0cy5jbG9uZUVsZW1lbnQgPSBjbG9uZUVsZW1lbnQkMTtcbmV4cG9ydHMuY3JlYXRlQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ7XG5leHBvcnRzLmNyZWF0ZUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50JDE7XG5leHBvcnRzLmNyZWF0ZUZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5O1xuZXhwb3J0cy5jcmVhdGVSZWYgPSBjcmVhdGVSZWY7XG5leHBvcnRzLmZvcndhcmRSZWYgPSBmb3J3YXJkUmVmO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudCA9IGlzVmFsaWRFbGVtZW50O1xuZXhwb3J0cy5sYXp5ID0gbGF6eTtcbmV4cG9ydHMubWVtbyA9IG1lbW87XG5leHBvcnRzLnN0YXJ0VHJhbnNpdGlvbiA9IHN0YXJ0VHJhbnNpdGlvbjtcbmV4cG9ydHMudW5zdGFibGVfYWN0ID0gYWN0O1xuZXhwb3J0cy51c2VDYWxsYmFjayA9IHVzZUNhbGxiYWNrO1xuZXhwb3J0cy51c2VDb250ZXh0ID0gdXNlQ29udGV4dDtcbmV4cG9ydHMudXNlRGVidWdWYWx1ZSA9IHVzZURlYnVnVmFsdWU7XG5leHBvcnRzLnVzZURlZmVycmVkVmFsdWUgPSB1c2VEZWZlcnJlZFZhbHVlO1xuZXhwb3J0cy51c2VFZmZlY3QgPSB1c2VFZmZlY3Q7XG5leHBvcnRzLnVzZUlkID0gdXNlSWQ7XG5leHBvcnRzLnVzZUltcGVyYXRpdmVIYW5kbGUgPSB1c2VJbXBlcmF0aXZlSGFuZGxlO1xuZXhwb3J0cy51c2VJbnNlcnRpb25FZmZlY3QgPSB1c2VJbnNlcnRpb25FZmZlY3Q7XG5leHBvcnRzLnVzZUxheW91dEVmZmVjdCA9IHVzZUxheW91dEVmZmVjdDtcbmV4cG9ydHMudXNlTWVtbyA9IHVzZU1lbW87XG5leHBvcnRzLnVzZVJlZHVjZXIgPSB1c2VSZWR1Y2VyO1xuZXhwb3J0cy51c2VSZWYgPSB1c2VSZWY7XG5leHBvcnRzLnVzZVN0YXRlID0gdXNlU3RhdGU7XG5leHBvcnRzLnVzZVN5bmNFeHRlcm5hbFN0b3JlID0gdXNlU3luY0V4dGVybmFsU3RvcmU7XG5leHBvcnRzLnVzZVRyYW5zaXRpb24gPSB1c2VUcmFuc2l0aW9uO1xuZXhwb3J0cy52ZXJzaW9uID0gUmVhY3RWZXJzaW9uO1xuICAgICAgICAgIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgXG4gIH0pKCk7XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vZnJvbnRlbmQvLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcz8iKTsKCi8qKiovIH0pLAoKLyoqKi8gIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC9pbmRleC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QvaW5kZXguanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKInVzZSBzdHJpY3QiOwpldmFsKCJcblxuaWYgKGZhbHNlKSB7fSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcyAqLyBcIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFjdC9janMvcmVhY3QuZGV2ZWxvcG1lbnQuanNcIik7XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vZnJvbnRlbmQvLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2luZGV4LmpzPyIpOwoKLyoqKi8gfSksCgovKioqLyAiLi4vLi4vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9janMvc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlwKICAhKioqIC4uLy4uL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvY2pzL3NjaGVkdWxlci5kZXZlbG9wbWVudC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSA9PiB7CgoidXNlIHN0cmljdCI7CmV2YWwoIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHNjaGVkdWxlci5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cblxuXG5pZiAodHJ1ZSkge1xuICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQobmV3IEVycm9yKCkpO1xufVxuICAgICAgICAgIHZhciBlbmFibGVTY2hlZHVsZXJEZWJ1Z2dpbmcgPSBmYWxzZTtcbnZhciBlbmFibGVQcm9maWxpbmcgPSBmYWxzZTtcbnZhciBmcmFtZVlpZWxkTXMgPSA1O1xuXG5mdW5jdGlvbiBwdXNoKGhlYXAsIG5vZGUpIHtcbiAgdmFyIGluZGV4ID0gaGVhcC5sZW5ndGg7XG4gIGhlYXAucHVzaChub2RlKTtcbiAgc2lmdFVwKGhlYXAsIG5vZGUsIGluZGV4KTtcbn1cbmZ1bmN0aW9uIHBlZWsoaGVhcCkge1xuICByZXR1cm4gaGVhcC5sZW5ndGggPT09IDAgPyBudWxsIDogaGVhcFswXTtcbn1cbmZ1bmN0aW9uIHBvcChoZWFwKSB7XG4gIGlmIChoZWFwLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGZpcnN0ID0gaGVhcFswXTtcbiAgdmFyIGxhc3QgPSBoZWFwLnBvcCgpO1xuXG4gIGlmIChsYXN0ICE9PSBmaXJzdCkge1xuICAgIGhlYXBbMF0gPSBsYXN0O1xuICAgIHNpZnREb3duKGhlYXAsIGxhc3QsIDApO1xuICB9XG5cbiAgcmV0dXJuIGZpcnN0O1xufVxuXG5mdW5jdGlvbiBzaWZ0VXAoaGVhcCwgbm9kZSwgaSkge1xuICB2YXIgaW5kZXggPSBpO1xuXG4gIHdoaWxlIChpbmRleCA+IDApIHtcbiAgICB2YXIgcGFyZW50SW5kZXggPSBpbmRleCAtIDEgPj4+IDE7XG4gICAgdmFyIHBhcmVudCA9IGhlYXBbcGFyZW50SW5kZXhdO1xuXG4gICAgaWYgKGNvbXBhcmUocGFyZW50LCBub2RlKSA+IDApIHtcbiAgICAgIC8vIFRoZSBwYXJlbnQgaXMgbGFyZ2VyLiBTd2FwIHBvc2l0aW9ucy5cbiAgICAgIGhlYXBbcGFyZW50SW5kZXhdID0gbm9kZTtcbiAgICAgIGhlYXBbaW5kZXhdID0gcGFyZW50O1xuICAgICAgaW5kZXggPSBwYXJlbnRJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHBhcmVudCBpcyBzbWFsbGVyLiBFeGl0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaWZ0RG93bihoZWFwLCBub2RlLCBpKSB7XG4gIHZhciBpbmRleCA9IGk7XG4gIHZhciBsZW5ndGggPSBoZWFwLmxlbmd0aDtcbiAgdmFyIGhhbGZMZW5ndGggPSBsZW5ndGggPj4+IDE7XG5cbiAgd2hpbGUgKGluZGV4IDwgaGFsZkxlbmd0aCkge1xuICAgIHZhciBsZWZ0SW5kZXggPSAoaW5kZXggKyAxKSAqIDIgLSAxO1xuICAgIHZhciBsZWZ0ID0gaGVhcFtsZWZ0SW5kZXhdO1xuICAgIHZhciByaWdodEluZGV4ID0gbGVmdEluZGV4ICsgMTtcbiAgICB2YXIgcmlnaHQgPSBoZWFwW3JpZ2h0SW5kZXhdOyAvLyBJZiB0aGUgbGVmdCBvciByaWdodCBub2RlIGlzIHNtYWxsZXIsIHN3YXAgd2l0aCB0aGUgc21hbGxlciBvZiB0aG9zZS5cblxuICAgIGlmIChjb21wYXJlKGxlZnQsIG5vZGUpIDwgMCkge1xuICAgICAgaWYgKHJpZ2h0SW5kZXggPCBsZW5ndGggJiYgY29tcGFyZShyaWdodCwgbGVmdCkgPCAwKSB7XG4gICAgICAgIGhlYXBbaW5kZXhdID0gcmlnaHQ7XG4gICAgICAgIGhlYXBbcmlnaHRJbmRleF0gPSBub2RlO1xuICAgICAgICBpbmRleCA9IHJpZ2h0SW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoZWFwW2luZGV4XSA9IGxlZnQ7XG4gICAgICAgIGhlYXBbbGVmdEluZGV4XSA9IG5vZGU7XG4gICAgICAgIGluZGV4ID0gbGVmdEluZGV4O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmlnaHRJbmRleCA8IGxlbmd0aCAmJiBjb21wYXJlKHJpZ2h0LCBub2RlKSA8IDApIHtcbiAgICAgIGhlYXBbaW5kZXhdID0gcmlnaHQ7XG4gICAgICBoZWFwW3JpZ2h0SW5kZXhdID0gbm9kZTtcbiAgICAgIGluZGV4ID0gcmlnaHRJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmVpdGhlciBjaGlsZCBpcyBzbWFsbGVyLiBFeGl0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgLy8gQ29tcGFyZSBzb3J0IGluZGV4IGZpcnN0LCB0aGVuIHRhc2sgaWQuXG4gIHZhciBkaWZmID0gYS5zb3J0SW5kZXggLSBiLnNvcnRJbmRleDtcbiAgcmV0dXJuIGRpZmYgIT09IDAgPyBkaWZmIDogYS5pZCAtIGIuaWQ7XG59XG5cbi8vIFRPRE86IFVzZSBzeW1ib2xzP1xudmFyIEltbWVkaWF0ZVByaW9yaXR5ID0gMTtcbnZhciBVc2VyQmxvY2tpbmdQcmlvcml0eSA9IDI7XG52YXIgTm9ybWFsUHJpb3JpdHkgPSAzO1xudmFyIExvd1ByaW9yaXR5ID0gNDtcbnZhciBJZGxlUHJpb3JpdHkgPSA1O1xuXG5mdW5jdGlvbiBtYXJrVGFza0Vycm9yZWQodGFzaywgbXMpIHtcbn1cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG5cbnZhciBoYXNQZXJmb3JtYW5jZU5vdyA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLm5vdyA9PT0gJ2Z1bmN0aW9uJztcblxuaWYgKGhhc1BlcmZvcm1hbmNlTm93KSB7XG4gIHZhciBsb2NhbFBlcmZvcm1hbmNlID0gcGVyZm9ybWFuY2U7XG5cbiAgZXhwb3J0cy51bnN0YWJsZV9ub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGxvY2FsUGVyZm9ybWFuY2Uubm93KCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgbG9jYWxEYXRlID0gRGF0ZTtcbiAgdmFyIGluaXRpYWxUaW1lID0gbG9jYWxEYXRlLm5vdygpO1xuXG4gIGV4cG9ydHMudW5zdGFibGVfbm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBsb2NhbERhdGUubm93KCkgLSBpbml0aWFsVGltZTtcbiAgfTtcbn0gLy8gTWF4IDMxIGJpdCBpbnRlZ2VyLiBUaGUgbWF4IGludGVnZXIgc2l6ZSBpbiBWOCBmb3IgMzItYml0IHN5c3RlbXMuXG4vLyBNYXRoLnBvdygyLCAzMCkgLSAxXG4vLyAwYjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMVxuXG5cbnZhciBtYXhTaWduZWQzMUJpdEludCA9IDEwNzM3NDE4MjM7IC8vIFRpbWVzIG91dCBpbW1lZGlhdGVseVxuXG52YXIgSU1NRURJQVRFX1BSSU9SSVRZX1RJTUVPVVQgPSAtMTsgLy8gRXZlbnR1YWxseSB0aW1lcyBvdXRcblxudmFyIFVTRVJfQkxPQ0tJTkdfUFJJT1JJVFlfVElNRU9VVCA9IDI1MDtcbnZhciBOT1JNQUxfUFJJT1JJVFlfVElNRU9VVCA9IDUwMDA7XG52YXIgTE9XX1BSSU9SSVRZX1RJTUVPVVQgPSAxMDAwMDsgLy8gTmV2ZXIgdGltZXMgb3V0XG5cbnZhciBJRExFX1BSSU9SSVRZX1RJTUVPVVQgPSBtYXhTaWduZWQzMUJpdEludDsgLy8gVGFza3MgYXJlIHN0b3JlZCBvbiBhIG1pbiBoZWFwXG5cbnZhciB0YXNrUXVldWUgPSBbXTtcbnZhciB0aW1lclF1ZXVlID0gW107IC8vIEluY3JlbWVudGluZyBpZCBjb3VudGVyLiBVc2VkIHRvIG1haW50YWluIGluc2VydGlvbiBvcmRlci5cblxudmFyIHRhc2tJZENvdW50ZXIgPSAxOyAvLyBQYXVzaW5nIHRoZSBzY2hlZHVsZXIgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG52YXIgY3VycmVudFRhc2sgPSBudWxsO1xudmFyIGN1cnJlbnRQcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7IC8vIFRoaXMgaXMgc2V0IHdoaWxlIHBlcmZvcm1pbmcgd29yaywgdG8gcHJldmVudCByZS1lbnRyYW5jZS5cblxudmFyIGlzUGVyZm9ybWluZ1dvcmsgPSBmYWxzZTtcbnZhciBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IGZhbHNlO1xudmFyIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTsgLy8gQ2FwdHVyZSBsb2NhbCByZWZlcmVuY2VzIHRvIG5hdGl2ZSBBUElzLCBpbiBjYXNlIGEgcG9seWZpbGwgb3ZlcnJpZGVzIHRoZW0uXG5cbnZhciBsb2NhbFNldFRpbWVvdXQgPSB0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IHNldFRpbWVvdXQgOiBudWxsO1xudmFyIGxvY2FsQ2xlYXJUaW1lb3V0ID0gdHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IGNsZWFyVGltZW91dCA6IG51bGw7XG52YXIgbG9jYWxTZXRJbW1lZGlhdGUgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJyA/IHNldEltbWVkaWF0ZSA6IG51bGw7IC8vIElFIGFuZCBOb2RlLmpzICsganNkb21cblxudmFyIGlzSW5wdXRQZW5kaW5nID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnNjaGVkdWxpbmcgIT09IHVuZGVmaW5lZCAmJiBuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZyAhPT0gdW5kZWZpbmVkID8gbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcuYmluZChuYXZpZ2F0b3Iuc2NoZWR1bGluZykgOiBudWxsO1xuXG5mdW5jdGlvbiBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKSB7XG4gIC8vIENoZWNrIGZvciB0YXNrcyB0aGF0IGFyZSBubyBsb25nZXIgZGVsYXllZCBhbmQgYWRkIHRoZW0gdG8gdGhlIHF1ZXVlLlxuICB2YXIgdGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuXG4gIHdoaWxlICh0aW1lciAhPT0gbnVsbCkge1xuICAgIGlmICh0aW1lci5jYWxsYmFjayA9PT0gbnVsbCkge1xuICAgICAgLy8gVGltZXIgd2FzIGNhbmNlbGxlZC5cbiAgICAgIHBvcCh0aW1lclF1ZXVlKTtcbiAgICB9IGVsc2UgaWYgKHRpbWVyLnN0YXJ0VGltZSA8PSBjdXJyZW50VGltZSkge1xuICAgICAgLy8gVGltZXIgZmlyZWQuIFRyYW5zZmVyIHRvIHRoZSB0YXNrIHF1ZXVlLlxuICAgICAgcG9wKHRpbWVyUXVldWUpO1xuICAgICAgdGltZXIuc29ydEluZGV4ID0gdGltZXIuZXhwaXJhdGlvblRpbWU7XG4gICAgICBwdXNoKHRhc2tRdWV1ZSwgdGltZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZW1haW5pbmcgdGltZXJzIGFyZSBwZW5kaW5nLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVUaW1lb3V0KGN1cnJlbnRUaW1lKSB7XG4gIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTtcbiAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG5cbiAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCkge1xuICAgIGlmIChwZWVrKHRhc2tRdWV1ZSkgIT09IG51bGwpIHtcbiAgICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGZpcnN0VGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuXG4gICAgICBpZiAoZmlyc3RUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgZmlyc3RUaW1lci5zdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoV29yayhoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSkge1xuXG5cbiAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSBmYWxzZTtcblxuICBpZiAoaXNIb3N0VGltZW91dFNjaGVkdWxlZCkge1xuICAgIC8vIFdlIHNjaGVkdWxlZCBhIHRpbWVvdXQgYnV0IGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZC4gQ2FuY2VsIGl0LlxuICAgIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICBjYW5jZWxIb3N0VGltZW91dCgpO1xuICB9XG5cbiAgaXNQZXJmb3JtaW5nV29yayA9IHRydWU7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcblxuICB0cnkge1xuICAgIGlmIChlbmFibGVQcm9maWxpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB3b3JrTG9vcChoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoY3VycmVudFRhc2sgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuICAgICAgICAgIG1hcmtUYXNrRXJyb3JlZChjdXJyZW50VGFzaywgY3VycmVudFRpbWUpO1xuICAgICAgICAgIGN1cnJlbnRUYXNrLmlzUXVldWVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gY2F0Y2ggaW4gcHJvZCBjb2RlIHBhdGguXG4gICAgICByZXR1cm4gd29ya0xvb3AoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50VGFzayA9IG51bGw7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gICAgaXNQZXJmb3JtaW5nV29yayA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdvcmtMb29wKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKSB7XG4gIHZhciBjdXJyZW50VGltZSA9IGluaXRpYWxUaW1lO1xuICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcbiAgY3VycmVudFRhc2sgPSBwZWVrKHRhc2tRdWV1ZSk7XG5cbiAgd2hpbGUgKGN1cnJlbnRUYXNrICE9PSBudWxsICYmICEoZW5hYmxlU2NoZWR1bGVyRGVidWdnaW5nICkpIHtcbiAgICBpZiAoY3VycmVudFRhc2suZXhwaXJhdGlvblRpbWUgPiBjdXJyZW50VGltZSAmJiAoIWhhc1RpbWVSZW1haW5pbmcgfHwgc2hvdWxkWWllbGRUb0hvc3QoKSkpIHtcbiAgICAgIC8vIFRoaXMgY3VycmVudFRhc2sgaGFzbid0IGV4cGlyZWQsIGFuZCB3ZSd2ZSByZWFjaGVkIHRoZSBkZWFkbGluZS5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBjYWxsYmFjayA9IGN1cnJlbnRUYXNrLmNhbGxiYWNrO1xuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBudWxsO1xuICAgICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBjdXJyZW50VGFzay5wcmlvcml0eUxldmVsO1xuICAgICAgdmFyIGRpZFVzZXJDYWxsYmFja1RpbWVvdXQgPSBjdXJyZW50VGFzay5leHBpcmF0aW9uVGltZSA8PSBjdXJyZW50VGltZTtcblxuICAgICAgdmFyIGNvbnRpbnVhdGlvbkNhbGxiYWNrID0gY2FsbGJhY2soZGlkVXNlckNhbGxiYWNrVGltZW91dCk7XG4gICAgICBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG5cbiAgICAgIGlmICh0eXBlb2YgY29udGludWF0aW9uQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBjb250aW51YXRpb25DYWxsYmFjaztcbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRUYXNrID09PSBwZWVrKHRhc2tRdWV1ZSkpIHtcbiAgICAgICAgICBwb3AodGFza1F1ZXVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9wKHRhc2tRdWV1ZSk7XG4gICAgfVxuXG4gICAgY3VycmVudFRhc2sgPSBwZWVrKHRhc2tRdWV1ZSk7XG4gIH0gLy8gUmV0dXJuIHdoZXRoZXIgdGhlcmUncyBhZGRpdGlvbmFsIHdvcmtcblxuXG4gIGlmIChjdXJyZW50VGFzayAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHZhciBmaXJzdFRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcblxuICAgIGlmIChmaXJzdFRpbWVyICE9PSBudWxsKSB7XG4gICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgZmlyc3RUaW1lci5zdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3J1bldpdGhQcmlvcml0eShwcmlvcml0eUxldmVsLCBldmVudEhhbmRsZXIpIHtcbiAgc3dpdGNoIChwcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgY2FzZSBMb3dQcmlvcml0eTpcbiAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgfVxuXG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmlvcml0eUxldmVsO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGV2ZW50SGFuZGxlcigpO1xuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX25leHQoZXZlbnRIYW5kbGVyKSB7XG4gIHZhciBwcmlvcml0eUxldmVsO1xuXG4gIHN3aXRjaCAoY3VycmVudFByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICAgIC8vIFNoaWZ0IGRvd24gdG8gbm9ybWFsIHByaW9yaXR5XG4gICAgICBwcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBBbnl0aGluZyBsb3dlciB0aGFuIG5vcm1hbCBwcmlvcml0eSBzaG91bGQgcmVtYWluIGF0IHRoZSBjdXJyZW50IGxldmVsLlxuICAgICAgcHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcblxuICB0cnkge1xuICAgIHJldHVybiBldmVudEhhbmRsZXIoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV93cmFwQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgdmFyIHBhcmVudFByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUaGlzIGlzIGEgZm9yayBvZiBydW5XaXRoUHJpb3JpdHksIGlubGluZWQgZm9yIHBlcmZvcm1hbmNlLlxuICAgIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHBhcmVudFByaW9yaXR5TGV2ZWw7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhwcmlvcml0eUxldmVsLCBjYWxsYmFjaywgb3B0aW9ucykge1xuICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuICB2YXIgc3RhcnRUaW1lO1xuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyAhPT0gbnVsbCkge1xuICAgIHZhciBkZWxheSA9IG9wdGlvbnMuZGVsYXk7XG5cbiAgICBpZiAodHlwZW9mIGRlbGF5ID09PSAnbnVtYmVyJyAmJiBkZWxheSA+IDApIHtcbiAgICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lICsgZGVsYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZTtcbiAgfVxuXG4gIHZhciB0aW1lb3V0O1xuXG4gIHN3aXRjaCAocHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gSU1NRURJQVRFX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gVVNFUl9CTE9DS0lOR19QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBJRExFX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgTG93UHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gTE9XX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgZGVmYXVsdDpcbiAgICAgIHRpbWVvdXQgPSBOT1JNQUxfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdmFyIGV4cGlyYXRpb25UaW1lID0gc3RhcnRUaW1lICsgdGltZW91dDtcbiAgdmFyIG5ld1Rhc2sgPSB7XG4gICAgaWQ6IHRhc2tJZENvdW50ZXIrKyxcbiAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgcHJpb3JpdHlMZXZlbDogcHJpb3JpdHlMZXZlbCxcbiAgICBzdGFydFRpbWU6IHN0YXJ0VGltZSxcbiAgICBleHBpcmF0aW9uVGltZTogZXhwaXJhdGlvblRpbWUsXG4gICAgc29ydEluZGV4OiAtMVxuICB9O1xuXG4gIGlmIChzdGFydFRpbWUgPiBjdXJyZW50VGltZSkge1xuICAgIC8vIFRoaXMgaXMgYSBkZWxheWVkIHRhc2suXG4gICAgbmV3VGFzay5zb3J0SW5kZXggPSBzdGFydFRpbWU7XG4gICAgcHVzaCh0aW1lclF1ZXVlLCBuZXdUYXNrKTtcblxuICAgIGlmIChwZWVrKHRhc2tRdWV1ZSkgPT09IG51bGwgJiYgbmV3VGFzayA9PT0gcGVlayh0aW1lclF1ZXVlKSkge1xuICAgICAgLy8gQWxsIHRhc2tzIGFyZSBkZWxheWVkLCBhbmQgdGhpcyBpcyB0aGUgdGFzayB3aXRoIHRoZSBlYXJsaWVzdCBkZWxheS5cbiAgICAgIGlmIChpc0hvc3RUaW1lb3V0U2NoZWR1bGVkKSB7XG4gICAgICAgIC8vIENhbmNlbCBhbiBleGlzdGluZyB0aW1lb3V0LlxuICAgICAgICBjYW5jZWxIb3N0VGltZW91dCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IHRydWU7XG4gICAgICB9IC8vIFNjaGVkdWxlIGEgdGltZW91dC5cblxuXG4gICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgc3RhcnRUaW1lIC0gY3VycmVudFRpbWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXdUYXNrLnNvcnRJbmRleCA9IGV4cGlyYXRpb25UaW1lO1xuICAgIHB1c2godGFza1F1ZXVlLCBuZXdUYXNrKTtcbiAgICAvLyB3YWl0IHVudGlsIHRoZSBuZXh0IHRpbWUgd2UgeWllbGQuXG5cblxuICAgIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgJiYgIWlzUGVyZm9ybWluZ1dvcmspIHtcbiAgICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3VGFzaztcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfcGF1c2VFeGVjdXRpb24oKSB7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uKCkge1xuXG4gIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgJiYgIWlzUGVyZm9ybWluZ1dvcmspIHtcbiAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgcmVxdWVzdEhvc3RDYWxsYmFjayhmbHVzaFdvcmspO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlKCkge1xuICByZXR1cm4gcGVlayh0YXNrUXVldWUpO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9jYW5jZWxDYWxsYmFjayh0YXNrKSB7XG4gIC8vIHJlbW92ZSBmcm9tIHRoZSBxdWV1ZSBiZWNhdXNlIHlvdSBjYW4ndCByZW1vdmUgYXJiaXRyYXJ5IG5vZGVzIGZyb20gYW5cbiAgLy8gYXJyYXkgYmFzZWQgaGVhcCwgb25seSB0aGUgZmlyc3Qgb25lLilcblxuXG4gIHRhc2suY2FsbGJhY2sgPSBudWxsO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCgpIHtcbiAgcmV0dXJuIGN1cnJlbnRQcmlvcml0eUxldmVsO1xufVxuXG52YXIgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSBmYWxzZTtcbnZhciBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBudWxsO1xudmFyIHRhc2tUaW1lb3V0SUQgPSAtMTsgLy8gU2NoZWR1bGVyIHBlcmlvZGljYWxseSB5aWVsZHMgaW4gY2FzZSB0aGVyZSBpcyBvdGhlciB3b3JrIG9uIHRoZSBtYWluXG4vLyB0aHJlYWQsIGxpa2UgdXNlciBldmVudHMuIEJ5IGRlZmF1bHQsIGl0IHlpZWxkcyBtdWx0aXBsZSB0aW1lcyBwZXIgZnJhbWUuXG4vLyBJdCBkb2VzIG5vdCBhdHRlbXB0IHRvIGFsaWduIHdpdGggZnJhbWUgYm91bmRhcmllcywgc2luY2UgbW9zdCB0YXNrcyBkb24ndFxuLy8gbmVlZCB0byBiZSBmcmFtZSBhbGlnbmVkOyBmb3IgdGhvc2UgdGhhdCBkbywgdXNlIHJlcXVlc3RBbmltYXRpb25GcmFtZS5cblxudmFyIGZyYW1lSW50ZXJ2YWwgPSBmcmFtZVlpZWxkTXM7XG52YXIgc3RhcnRUaW1lID0gLTE7XG5cbmZ1bmN0aW9uIHNob3VsZFlpZWxkVG9Ib3N0KCkge1xuICB2YXIgdGltZUVsYXBzZWQgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpIC0gc3RhcnRUaW1lO1xuXG4gIGlmICh0aW1lRWxhcHNlZCA8IGZyYW1lSW50ZXJ2YWwpIHtcbiAgICAvLyBUaGUgbWFpbiB0aHJlYWQgaGFzIG9ubHkgYmVlbiBibG9ja2VkIGZvciBhIHJlYWxseSBzaG9ydCBhbW91bnQgb2YgdGltZTtcbiAgICAvLyBzbWFsbGVyIHRoYW4gYSBzaW5nbGUgZnJhbWUuIERvbid0IHlpZWxkIHlldC5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gVGhlIG1haW4gdGhyZWFkIGhhcyBiZWVuIGJsb2NrZWQgZm9yIGEgbm9uLW5lZ2xpZ2libGUgYW1vdW50IG9mIHRpbWUuIFdlXG5cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdFBhaW50KCkge1xuXG59XG5cbmZ1bmN0aW9uIGZvcmNlRnJhbWVSYXRlKGZwcykge1xuICBpZiAoZnBzIDwgMCB8fCBmcHMgPiAxMjUpIHtcbiAgICAvLyBVc2luZyBjb25zb2xlWydlcnJvciddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcbiAgICBjb25zb2xlWydlcnJvciddKCdmb3JjZUZyYW1lUmF0ZSB0YWtlcyBhIHBvc2l0aXZlIGludCBiZXR3ZWVuIDAgYW5kIDEyNSwgJyArICdmb3JjaW5nIGZyYW1lIHJhdGVzIGhpZ2hlciB0aGFuIDEyNSBmcHMgaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChmcHMgPiAwKSB7XG4gICAgZnJhbWVJbnRlcnZhbCA9IE1hdGguZmxvb3IoMTAwMCAvIGZwcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVzZXQgdGhlIGZyYW1lcmF0ZVxuICAgIGZyYW1lSW50ZXJ2YWwgPSBmcmFtZVlpZWxkTXM7XG4gIH1cbn1cblxudmFyIHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHNjaGVkdWxlZEhvc3RDYWxsYmFjayAhPT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7IC8vIEtlZXAgdHJhY2sgb2YgdGhlIHN0YXJ0IHRpbWUgc28gd2UgY2FuIG1lYXN1cmUgaG93IGxvbmcgdGhlIG1haW4gdGhyZWFkXG4gICAgLy8gaGFzIGJlZW4gYmxvY2tlZC5cblxuICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgIHZhciBoYXNUaW1lUmVtYWluaW5nID0gdHJ1ZTsgLy8gSWYgYSBzY2hlZHVsZXIgdGFzayB0aHJvd3MsIGV4aXQgdGhlIGN1cnJlbnQgYnJvd3NlciB0YXNrIHNvIHRoZVxuICAgIC8vIGVycm9yIGNhbiBiZSBvYnNlcnZlZC5cbiAgICAvL1xuICAgIC8vIEludGVudGlvbmFsbHkgbm90IHVzaW5nIGEgdHJ5LWNhdGNoLCBzaW5jZSB0aGF0IG1ha2VzIHNvbWUgZGVidWdnaW5nXG4gICAgLy8gdGVjaG5pcXVlcyBoYXJkZXIuIEluc3RlYWQsIGlmIGBzY2hlZHVsZWRIb3N0Q2FsbGJhY2tgIGVycm9ycywgdGhlblxuICAgIC8vIGBoYXNNb3JlV29ya2Agd2lsbCByZW1haW4gdHJ1ZSwgYW5kIHdlJ2xsIGNvbnRpbnVlIHRoZSB3b3JrIGxvb3AuXG5cbiAgICB2YXIgaGFzTW9yZVdvcmsgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGhhc01vcmVXb3JrID0gc2NoZWR1bGVkSG9zdENhbGxiYWNrKGhhc1RpbWVSZW1haW5pbmcsIGN1cnJlbnRUaW1lKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGhhc01vcmVXb3JrKSB7XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgbW9yZSB3b3JrLCBzY2hlZHVsZSB0aGUgbmV4dCBtZXNzYWdlIGV2ZW50IGF0IHRoZSBlbmRcbiAgICAgICAgLy8gb2YgdGhlIHByZWNlZGluZyBvbmUuXG4gICAgICAgIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlO1xuICAgICAgICBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlO1xuICB9IC8vIFlpZWxkaW5nIHRvIHRoZSBicm93c2VyIHdpbGwgZ2l2ZSBpdCBhIGNoYW5jZSB0byBwYWludCwgc28gd2UgY2FuXG59O1xuXG52YXIgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmU7XG5cbmlmICh0eXBlb2YgbG9jYWxTZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gTm9kZS5qcyBhbmQgb2xkIElFLlxuICAvLyBUaGVyZSdzIGEgZmV3IHJlYXNvbnMgZm9yIHdoeSB3ZSBwcmVmZXIgc2V0SW1tZWRpYXRlLlxuICAvL1xuICAvLyBVbmxpa2UgTWVzc2FnZUNoYW5uZWwsIGl0IGRvZXNuJ3QgcHJldmVudCBhIE5vZGUuanMgcHJvY2VzcyBmcm9tIGV4aXRpbmcuXG4gIC8vIChFdmVuIHRob3VnaCB0aGlzIGlzIGEgRE9NIGZvcmsgb2YgdGhlIFNjaGVkdWxlciwgeW91IGNvdWxkIGdldCBoZXJlXG4gIC8vIHdpdGggYSBtaXggb2YgTm9kZS5qcyAxNSssIHdoaWNoIGhhcyBhIE1lc3NhZ2VDaGFubmVsLCBhbmQganNkb20uKVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIwNzU2XG4gIC8vXG4gIC8vIEJ1dCBhbHNvLCBpdCBydW5zIGVhcmxpZXIgd2hpY2ggaXMgdGhlIHNlbWFudGljIHdlIHdhbnQuXG4gIC8vIElmIG90aGVyIGJyb3dzZXJzIGV2ZXIgaW1wbGVtZW50IGl0LCBpdCdzIGJldHRlciB0byB1c2UgaXQuXG4gIC8vIEFsdGhvdWdoIGJvdGggb2YgdGhlc2Ugd291bGQgYmUgaW5mZXJpb3IgdG8gbmF0aXZlIHNjaGVkdWxpbmcuXG4gIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lID0gZnVuY3Rpb24gKCkge1xuICAgIGxvY2FsU2V0SW1tZWRpYXRlKHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSk7XG4gIH07XG59IGVsc2UgaWYgKHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy8gRE9NIGFuZCBXb3JrZXIgZW52aXJvbm1lbnRzLlxuICAvLyBXZSBwcmVmZXIgTWVzc2FnZUNoYW5uZWwgYmVjYXVzZSBvZiB0aGUgNG1zIHNldFRpbWVvdXQgY2xhbXBpbmcuXG4gIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gIHZhciBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBwZXJmb3JtV29ya1VudGlsRGVhZGxpbmU7XG5cbiAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcG9ydC5wb3N0TWVzc2FnZShudWxsKTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIFdlIHNob3VsZCBvbmx5IGZhbGxiYWNrIGhlcmUgaW4gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRzLlxuICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsb2NhbFNldFRpbWVvdXQocGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lLCAwKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdEhvc3RDYWxsYmFjayhjYWxsYmFjaykge1xuICBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICBpZiAoIWlzTWVzc2FnZUxvb3BSdW5uaW5nKSB7XG4gICAgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSB0cnVlO1xuICAgIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWVzdEhvc3RUaW1lb3V0KGNhbGxiYWNrLCBtcykge1xuICB0YXNrVGltZW91dElEID0gbG9jYWxTZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBjYWxsYmFjayhleHBvcnRzLnVuc3RhYmxlX25vdygpKTtcbiAgfSwgbXMpO1xufVxuXG5mdW5jdGlvbiBjYW5jZWxIb3N0VGltZW91dCgpIHtcbiAgbG9jYWxDbGVhclRpbWVvdXQodGFza1RpbWVvdXRJRCk7XG4gIHRhc2tUaW1lb3V0SUQgPSAtMTtcbn1cblxudmFyIHVuc3RhYmxlX3JlcXVlc3RQYWludCA9IHJlcXVlc3RQYWludDtcbnZhciB1bnN0YWJsZV9Qcm9maWxpbmcgPSAgbnVsbDtcblxuZXhwb3J0cy51bnN0YWJsZV9JZGxlUHJpb3JpdHkgPSBJZGxlUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5ID0gSW1tZWRpYXRlUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX0xvd1ByaW9yaXR5ID0gTG93UHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5ID0gTm9ybWFsUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX1Byb2ZpbGluZyA9IHVuc3RhYmxlX1Byb2ZpbGluZztcbmV4cG9ydHMudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHkgPSBVc2VyQmxvY2tpbmdQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2sgPSB1bnN0YWJsZV9jYW5jZWxDYWxsYmFjaztcbmV4cG9ydHMudW5zdGFibGVfY29udGludWVFeGVjdXRpb24gPSB1bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbjtcbmV4cG9ydHMudW5zdGFibGVfZm9yY2VGcmFtZVJhdGUgPSBmb3JjZUZyYW1lUmF0ZTtcbmV4cG9ydHMudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSB1bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbDtcbmV4cG9ydHMudW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGUgPSB1bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZTtcbmV4cG9ydHMudW5zdGFibGVfbmV4dCA9IHVuc3RhYmxlX25leHQ7XG5leHBvcnRzLnVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uID0gdW5zdGFibGVfcGF1c2VFeGVjdXRpb247XG5leHBvcnRzLnVuc3RhYmxlX3JlcXVlc3RQYWludCA9IHVuc3RhYmxlX3JlcXVlc3RQYWludDtcbmV4cG9ydHMudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5ID0gdW5zdGFibGVfcnVuV2l0aFByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrID0gdW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaztcbmV4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQgPSBzaG91bGRZaWVsZFRvSG9zdDtcbmV4cG9ydHMudW5zdGFibGVfd3JhcENhbGxiYWNrID0gdW5zdGFibGVfd3JhcENhbGxiYWNrO1xuICAgICAgICAgIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgXG4gIH0pKCk7XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vZnJvbnRlbmQvLi4vLi4vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9janMvc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzPyIpOwoKLyoqKi8gfSksCgovKioqLyAiLi4vLi4vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9pbmRleC5qcyI6Ci8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi4vLi4vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9pbmRleC5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKInVzZSBzdHJpY3QiOwpldmFsKCJcblxuaWYgKGZhbHNlKSB7fSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Nqcy9zY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanMgKi8gXCIuLi8uLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2Nqcy9zY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanNcIik7XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vZnJvbnRlbmQvLi4vLi4vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9pbmRleC5qcz8iKTsKCi8qKiovIH0pLAoKLyoqKi8gIi4va290bGluL2VsaWRlLWZyb250ZW5kLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9rb3RsaW4vZWxpZGUtZnJvbnRlbmQuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpldmFsKCJ2YXIgX19XRUJQQUNLX0FNRF9ERUZJTkVfRkFDVE9SWV9fLCBfX1dFQlBBQ0tfQU1EX0RFRklORV9BUlJBWV9fLCBfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXzsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcbiAgaWYgKHRydWUpXG4gICAgIShfX1dFQlBBQ0tfQU1EX0RFRklORV9BUlJBWV9fID0gW2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18oLyohIHJlYWN0ICovIFwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2luZGV4LmpzXCIpLCBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISByZWFjdC1kb20vY2xpZW50ICovIFwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9jbGllbnQuanNcIiksIF9fd2VicGFja19yZXF1aXJlX18oLyohIC4va290bGluLWtvdGxpbi1zdGRsaWItanMtaXIuanMgKi8gXCIuL2tvdGxpbi9rb3RsaW4ta290bGluLXN0ZGxpYi1qcy1pci5qc1wiKSwgX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9rb3RsaW4td3JhcHBlcnMta290bGluLXJlYWN0LWpzLWlyLmpzICovIFwiLi9rb3RsaW4va290bGluLXdyYXBwZXJzLWtvdGxpbi1yZWFjdC1qcy1pci5qc1wiKSwgX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9rb3RsaW4td3JhcHBlcnMta290bGluLXJlYWN0LWRvbS1qcy1pci5qcyAqLyBcIi4va290bGluL2tvdGxpbi13cmFwcGVycy1rb3RsaW4tcmVhY3QtZG9tLWpzLWlyLmpzXCIpXSwgX19XRUJQQUNLX0FNRF9ERUZJTkVfRkFDVE9SWV9fID0gKGZhY3RvcnkpLFxuXHRcdF9fV0VCUEFDS19BTURfREVGSU5FX1JFU1VMVF9fID0gKHR5cGVvZiBfX1dFQlBBQ0tfQU1EX0RFRklORV9GQUNUT1JZX18gPT09ICdmdW5jdGlvbicgP1xuXHRcdChfX1dFQlBBQ0tfQU1EX0RFRklORV9GQUNUT1JZX18uYXBwbHkoZXhwb3J0cywgX19XRUJQQUNLX0FNRF9ERUZJTkVfQVJSQVlfXykpIDogX19XRUJQQUNLX0FNRF9ERUZJTkVfRkFDVE9SWV9fKSxcblx0XHRfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXyAhPT0gdW5kZWZpbmVkICYmIChtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19BTURfREVGSU5FX1JFU1VMVF9fKSk7XG4gIGVsc2Uge31cbn0odGhpcywgZnVuY3Rpb24gKF8sICRtb2R1bGUkcmVhY3QsICRtb2R1bGUkcmVhY3RfZG9tX2NsaWVudF95NXo1ZXUsIGtvdGxpbl9rb3RsaW4sIGtvdGxpbl9vcmdfamV0YnJhaW5zX2tvdGxpbl93cmFwcGVyc19rb3RsaW5fcmVhY3QsIGtvdGxpbl9vcmdfamV0YnJhaW5zX2tvdGxpbl93cmFwcGVyc19rb3RsaW5fcmVhY3RfZG9tKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgLy9yZWdpb24gYmxvY2s6IGltcG9ydHNcbiAgdmFyIEZyYWdtZW50ID0gJG1vZHVsZSRyZWFjdC5GcmFnbWVudDtcbiAgdmFyIGNyZWF0ZVJvb3QgPSAkbW9kdWxlJHJlYWN0X2RvbV9jbGllbnRfeTV6NWV1LmNyZWF0ZVJvb3Q7XG4gIHZhciBoeWRyYXRlUm9vdCA9ICRtb2R1bGUkcmVhY3RfZG9tX2NsaWVudF95NXo1ZXUuaHlkcmF0ZVJvb3Q7XG4gIHZhciBlbnN1cmVOb3ROdWxsID0ga290bGluX2tvdGxpbi4kXyQuZjtcbiAgdmFyIGNyZWF0ZSA9IGtvdGxpbl9vcmdfamV0YnJhaW5zX2tvdGxpbl93cmFwcGVyc19rb3RsaW5fcmVhY3QuJF8kLmI7XG4gIHZhciBVbml0X2dldEluc3RhbmNlID0ga290bGluX2tvdGxpbi4kXyQuYTtcbiAgdmFyIFJlYWN0SFRNTF9nZXRJbnN0YW5jZSA9IGtvdGxpbl9vcmdfamV0YnJhaW5zX2tvdGxpbl93cmFwcGVyc19rb3RsaW5fcmVhY3RfZG9tLiRfJC5hO1xuICB2YXIgRkMgPSBrb3RsaW5fb3JnX2pldGJyYWluc19rb3RsaW5fd3JhcHBlcnNfa290bGluX3JlYWN0LiRfJC5hO1xuICAvL2VuZHJlZ2lvblxuICAvL3JlZ2lvbiBibG9jazogcHJlLWRlY2xhcmF0aW9uXG4gIC8vZW5kcmVnaW9uXG4gIGZ1bmN0aW9uIG1haW4oKSB7XG4gICAgdmFyIHRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyb290Jyk7XG4gICAgdmFyIHRtcDtcbiAgICBpZiAodGFyZ2V0ID09IG51bGwpIHtcbiAgICAgIHZhciBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBlbnN1cmVOb3ROdWxsKGRvY3VtZW50LmJvZHkpLmFwcGVuZENoaWxkKGMpO1xuICAgICAgdG1wID0gYztcbiAgICB9IGVsc2Uge1xuICAgICAgdG1wID0gdGFyZ2V0O1xuICAgIH1cbiAgICB2YXIgY29udGFpbmVyID0gdG1wO1xuICAgIHZhciB0bXBfMCA9IEZyYWdtZW50O1xuICAgIHZhciBhcHBsaWNhdGlvbiA9IGNyZWF0ZSh0bXBfMCwgbWFpbiRsYW1iZGEoKSk7XG4gICAgaWYgKGNvbnRhaW5lci5oYXNBdHRyaWJ1dGUoJ2RhdGEtc2VydmluZy1tb2RlJykgPyBjb250YWluZXIuZ2V0QXR0cmlidXRlKCdkYXRhLXNlcnZpbmctbW9kZScpID09PSAnc3NyJyA6IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLmxvZygnSHlkcmF0aW5nIGNsaWVudC1zaWRlIChTU1IgZmxhZyBmb3VuZCknKTtcbiAgICAgIGh5ZHJhdGVSb290KGNvbnRhaW5lciwgYXBwbGljYXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygnUmVuZGVyaW5nIGNsaWVudC1zaWRlIChubyBTU1IgZmxhZyknKTtcbiAgICAgIGNyZWF0ZVJvb3QoY29udGFpbmVyKS5yZW5kZXIoYXBwbGljYXRpb24pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBtYWluJGxhbWJkYSRsYW1iZGEoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcyRpbnZva2UpIHtcbiAgICAgICR0aGlzJGludm9rZS5tZXNzYWdlID0gJ0hlbGxvLCBFbGlkZSEgVGhpcyBwYWdlIHdhcyBzZXJ2ZWQgb3ZlciBIeWJyaWQgU1NSLic7XG4gICAgICByZXR1cm4gVW5pdF9nZXRJbnN0YW5jZSgpO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gbWFpbiRsYW1iZGEoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcyRjcmVhdGUpIHtcbiAgICAgIHZhciB0bXAgPSBnZXRfU2FtcGxlQXBwKCk7XG4gICAgICAkdGhpcyRjcmVhdGUudyh0bXAsIG1haW4kbGFtYmRhJGxhbWJkYSgpKTtcbiAgICAgIHJldHVybiBVbml0X2dldEluc3RhbmNlKCk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBnZXRfU2FtcGxlQXBwKCkge1xuICAgIGluaXRfcHJvcGVydGllc19TYW1wbGVBcHBfa3RfYTJrMWE1KCk7XG4gICAgcmV0dXJuIFNhbXBsZUFwcDtcbiAgfVxuICB2YXIgU2FtcGxlQXBwO1xuICBmdW5jdGlvbiBTYW1wbGVBcHAkbGFtYmRhJGxhbWJkYSRsYW1iZGEoJHByb3BzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcyRpbnZva2UpIHtcbiAgICAgICR0aGlzJGludm9rZS52KCRwcm9wcy5tZXNzYWdlKTtcbiAgICAgIHJldHVybiBVbml0X2dldEluc3RhbmNlKCk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBTYW1wbGVBcHAkbGFtYmRhJGxhbWJkYSgkcHJvcHMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzJGludm9rZSkge1xuICAgICAgdmFyIHRtcCRyZXQkMjtcbiAgICAgIHtcbiAgICAgICAgdmFyIHRtcCRyZXQkMTtcbiAgICAgICAge1xuICAgICAgICAgIHZhciB0bXAkcmV0JDA7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdG1wJHJldCQwID0gJ3NhbXBsZS1hcHAtY29udGFpbmVyJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdG1wJHJldCQxID0gdG1wJHJldCQwO1xuICAgICAgICB9XG4gICAgICAgIHRtcCRyZXQkMiA9IHRtcCRyZXQkMTtcbiAgICAgIH1cbiAgICAgICR0aGlzJGludm9rZS5jbGFzc05hbWUgPSB0bXAkcmV0JDI7XG4gICAgICB2YXIgdG1wJHJldCQ2O1xuICAgICAge1xuICAgICAgICB2YXIgdG1wMF9fZ2V0X3N0cm9uZ19fOXc0dzg2ID0gUmVhY3RIVE1MX2dldEluc3RhbmNlKCk7XG4gICAgICAgIHZhciB0bXAkcmV0JDU7XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgdG1wJHJldCQ0O1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciB0bXAkcmV0JDM7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRtcCRyZXQkMyA9ICdzdHJvbmcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG1wJHJldCQ0ID0gdG1wJHJldCQzO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0bXAkcmV0JDUgPSB0bXAkcmV0JDQ7XG4gICAgICAgIH1cbiAgICAgICAgdG1wJHJldCQ2ID0gdG1wJHJldCQ1O1xuICAgICAgfVxuICAgICAgdmFyIHRtcCA9IHRtcCRyZXQkNjtcbiAgICAgICR0aGlzJGludm9rZS53KHRtcCwgU2FtcGxlQXBwJGxhbWJkYSRsYW1iZGEkbGFtYmRhKCRwcm9wcykpO1xuICAgICAgcmV0dXJuIFVuaXRfZ2V0SW5zdGFuY2UoKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIFNhbXBsZUFwcCRsYW1iZGEoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcyRGQywgcHJvcHMpIHtcbiAgICAgIHZhciB0bXAkcmV0JDM7XG4gICAgICB7XG4gICAgICAgIHZhciB0bXAwX19nZXRfZGl2X18yazJvOW0gPSBSZWFjdEhUTUxfZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgdmFyIHRtcCRyZXQkMjtcbiAgICAgICAge1xuICAgICAgICAgIHZhciB0bXAkcmV0JDE7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHRtcCRyZXQkMDtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdG1wJHJldCQwID0gJ2Rpdic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0bXAkcmV0JDEgPSB0bXAkcmV0JDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRtcCRyZXQkMiA9IHRtcCRyZXQkMTtcbiAgICAgICAgfVxuICAgICAgICB0bXAkcmV0JDMgPSB0bXAkcmV0JDI7XG4gICAgICB9XG4gICAgICB2YXIgdG1wID0gdG1wJHJldCQzO1xuICAgICAgJHRoaXMkRkMudyh0bXAsIFNhbXBsZUFwcCRsYW1iZGEkbGFtYmRhKHByb3BzKSk7XG4gICAgICByZXR1cm4gVW5pdF9nZXRJbnN0YW5jZSgpO1xuICAgIH07XG4gIH1cbiAgdmFyIHByb3BlcnRpZXNfaW5pdGlhbGl6ZWRfU2FtcGxlQXBwX2t0X3F2bXcyaDtcbiAgZnVuY3Rpb24gaW5pdF9wcm9wZXJ0aWVzX1NhbXBsZUFwcF9rdF9hMmsxYTUoKSB7XG4gICAgaWYgKHByb3BlcnRpZXNfaW5pdGlhbGl6ZWRfU2FtcGxlQXBwX2t0X3F2bXcyaCkge1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wZXJ0aWVzX2luaXRpYWxpemVkX1NhbXBsZUFwcF9rdF9xdm13MmggPSB0cnVlO1xuICAgICAgU2FtcGxlQXBwID0gRkMoU2FtcGxlQXBwJGxhbWJkYSgpKTtcbiAgICB9XG4gIH1cbiAgbWFpbigpO1xuICByZXR1cm4gXztcbn0pKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZWxpZGUtZnJvbnRlbmQuanMubWFwXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2Zyb250ZW5kLy4va290bGluL2VsaWRlLWZyb250ZW5kLmpzPyIpOwoKLyoqKi8gfSksCgovKioqLyAiLi9rb3RsaW4va290bGluLWtvdGxpbi1zdGRsaWItanMtaXIuanMiOgovKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL2tvdGxpbi9rb3RsaW4ta290bGluLXN0ZGxpYi1qcy1pci5qcyAqKiohCiAgXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHsKCmV2YWwoInZhciBfX1dFQlBBQ0tfQU1EX0RFRklORV9GQUNUT1JZX18sIF9fV0VCUEFDS19BTURfREVGSU5FX0FSUkFZX18sIF9fV0VCUEFDS19BTURfREVGSU5FX1JFU1VMVF9fOyhmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuICBpZiAodHJ1ZSlcbiAgICAhKF9fV0VCUEFDS19BTURfREVGSU5FX0FSUkFZX18gPSBbZXhwb3J0c10sIF9fV0VCUEFDS19BTURfREVGSU5FX0ZBQ1RPUllfXyA9IChmYWN0b3J5KSxcblx0XHRfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXyA9ICh0eXBlb2YgX19XRUJQQUNLX0FNRF9ERUZJTkVfRkFDVE9SWV9fID09PSAnZnVuY3Rpb24nID9cblx0XHQoX19XRUJQQUNLX0FNRF9ERUZJTkVfRkFDVE9SWV9fLmFwcGx5KGV4cG9ydHMsIF9fV0VCUEFDS19BTURfREVGSU5FX0FSUkFZX18pKSA6IF9fV0VCUEFDS19BTURfREVGSU5FX0ZBQ1RPUllfXyksXG5cdFx0X19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX18gIT09IHVuZGVmaW5lZCAmJiAobW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXykpO1xuICBlbHNlIHt9XG59KHRoaXMsIGZ1bmN0aW9uIChfKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgLy9yZWdpb24gYmxvY2s6IHByZS1kZWNsYXJhdGlvblxuICBMb25nLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTnVtYmVyXzAucHJvdG90eXBlKTtcbiAgTG9uZy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMb25nO1xuICBFeGNlcHRpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuICBFeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRXhjZXB0aW9uO1xuICBSdW50aW1lRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXhjZXB0aW9uLnByb3RvdHlwZSk7XG4gIFJ1bnRpbWVFeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUnVudGltZUV4Y2VwdGlvbjtcbiAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoUnVudGltZUV4Y2VwdGlvbi5wcm90b3R5cGUpO1xuICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uO1xuICBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoUnVudGltZUV4Y2VwdGlvbi5wcm90b3R5cGUpO1xuICBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE5vU3VjaEVsZW1lbnRFeGNlcHRpb247XG4gIE51bGxQb2ludGVyRXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoUnVudGltZUV4Y2VwdGlvbi5wcm90b3R5cGUpO1xuICBOdWxsUG9pbnRlckV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbjtcbiAgQ2xhc3NDYXN0RXhjZXB0aW9uLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoUnVudGltZUV4Y2VwdGlvbi5wcm90b3R5cGUpO1xuICBDbGFzc0Nhc3RFeGNlcHRpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2xhc3NDYXN0RXhjZXB0aW9uO1xuICAvL2VuZHJlZ2lvblxuICBmdW5jdGlvbiBpc0VtcHR5KF90aGlzX191OGUzczQpIHtcbiAgICByZXR1cm4gX3RoaXNfX3U4ZTNzNC5sZW5ndGggPT09IDA7XG4gIH1cbiAgZnVuY3Rpb24gc2luZ2xlKF90aGlzX191OGUzczQpIHtcbiAgICB2YXIgdG1wMF9zdWJqZWN0ID0gX3RoaXNfX3U4ZTNzNC5sZW5ndGg7XG4gICAgdmFyIHRtcDtcbiAgICBzd2l0Y2ggKHRtcDBfc3ViamVjdCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICB0aHJvdyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uX2luaXRfJENyZWF0ZSQoJ0FycmF5IGlzIGVtcHR5LicpO1xuICAgICAgY2FzZSAxOlxuICAgICAgICB0bXAgPSBfdGhpc19fdThlM3M0WzBdO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbl9pbml0XyRDcmVhdGUkKCdBcnJheSBoYXMgbW9yZSB0aGFuIG9uZSBlbGVtZW50LicpO1xuICAgIH1cbiAgICByZXR1cm4gdG1wO1xuICB9XG4gIGZ1bmN0aW9uIGNvbnRyYWN0KGJ1aWxkZXIpIHtcbiAgfVxuICBmdW5jdGlvbiBhcHBseShfdGhpc19fdThlM3M0LCBibG9jaykge1xuICAgIHtcbiAgICB9XG4gICAgYmxvY2soX3RoaXNfX3U4ZTNzNCk7XG4gICAgcmV0dXJuIF90aGlzX191OGUzczQ7XG4gIH1cbiAgZnVuY3Rpb24gQ29tcGFyYWJsZSgpIHtcbiAgfVxuICBDb21wYXJhYmxlLiRtZXRhZGF0YSQgPSBpbnRlcmZhY2VNZXRhKCdDb21wYXJhYmxlJyk7XG4gIGZ1bmN0aW9uIE51bWJlcl8wKCkge1xuICB9XG4gIE51bWJlcl8wLiRtZXRhZGF0YSQgPSBjbGFzc01ldGEoJ051bWJlcicpO1xuICBmdW5jdGlvbiBVbml0KCkge1xuICAgIFVuaXRfaW5zdGFuY2UgPSB0aGlzO1xuICB9XG4gIFVuaXQuJG1ldGFkYXRhJCA9IG9iamVjdE1ldGEoJ1VuaXQnKTtcbiAgdmFyIFVuaXRfaW5zdGFuY2U7XG4gIGZ1bmN0aW9uIFVuaXRfZ2V0SW5zdGFuY2UoKSB7XG4gICAgaWYgKFVuaXRfaW5zdGFuY2UgPT0gbnVsbClcbiAgICAgIG5ldyBVbml0KCk7XG4gICAgcmV0dXJuIFVuaXRfaW5zdGFuY2U7XG4gIH1cbiAgZnVuY3Rpb24gYXNEeW5hbWljKF90aGlzX191OGUzczQpIHtcbiAgICByZXR1cm4gX3RoaXNfX3U4ZTNzNDtcbiAgfVxuICBmdW5jdGlvbiB1bnNhZmVDYXN0RHluYW1pYyhfdGhpc19fdThlM3M0KSB7XG4gICAgcmV0dXJuIF90aGlzX191OGUzczQ7XG4gIH1cbiAgZnVuY3Rpb24gdW5zYWZlQ2FzdChfdGhpc19fdThlM3M0KSB7XG4gICAgdmFyIHRtcCRyZXQkMDtcbiAgICB7XG4gICAgICB0bXAkcmV0JDAgPSBfdGhpc19fdThlM3M0O1xuICAgIH1cbiAgICByZXR1cm4gdG1wJHJldCQwO1xuICB9XG4gIGZ1bmN0aW9uIEVudW0oKSB7XG4gIH1cbiAgRW51bS5wcm90b3R5cGUuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5iXzE7XG4gIH07XG4gIEVudW0ucHJvdG90eXBlLmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY18xO1xuICB9O1xuICBFbnVtLnByb3RvdHlwZS5mID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gICAgcmV0dXJuIGNvbXBhcmVUbyh0aGlzLmNfMSwgb3RoZXIuY18xKTtcbiAgfTtcbiAgRW51bS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gICAgcmV0dXJuIHRoaXMgPT09IG90aGVyO1xuICB9O1xuICBFbnVtLnByb3RvdHlwZS5oYXNoQ29kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaWRlbnRpdHlIYXNoQ29kZSh0aGlzKTtcbiAgfTtcbiAgRW51bS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuYl8xO1xuICB9O1xuICBFbnVtLiRtZXRhZGF0YSQgPSBjbGFzc01ldGEoJ0VudW0nLCBbQ29tcGFyYWJsZV0pO1xuICBmdW5jdGlvbiBhcnJheU9mKGVsZW1lbnRzKSB7XG4gICAgdmFyIHRtcCRyZXQkMTtcbiAgICB7XG4gICAgICB2YXIgdG1wJHJldCQwO1xuICAgICAge1xuICAgICAgICB0bXAkcmV0JDAgPSBlbGVtZW50cztcbiAgICAgIH1cbiAgICAgIHRtcCRyZXQkMSA9IHRtcCRyZXQkMDtcbiAgICB9XG4gICAgcmV0dXJuIHRtcCRyZXQkMTtcbiAgfVxuICBmdW5jdGlvbiBjb21wYXJlVG8oYSwgYikge1xuICAgIHZhciB0bXAwX3N1YmplY3QgPSB0eXBlb2YgYTtcbiAgICB2YXIgdG1wO1xuICAgIHN3aXRjaCAodG1wMF9zdWJqZWN0KSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICB2YXIgdG1wXzA7XG4gICAgICAgIGlmICh0eXBlb2YgYiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0bXBfMCA9IGRvdWJsZUNvbXBhcmVUbyhhLCBiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoYiBpbnN0YW5jZW9mIExvbmcpIHtcbiAgICAgICAgICAgIHRtcF8wID0gZG91YmxlQ29tcGFyZVRvKGEsIGIuaSgpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdG1wXzAgPSBwcmltaXRpdmVDb21wYXJlVG8oYSwgYik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdG1wID0gdG1wXzA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICB0bXAgPSBwcmltaXRpdmVDb21wYXJlVG8oYSwgYik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdG1wID0gY29tcGFyZVRvRG9Ob3RJbnRyaW5zaWNpZnkoYSwgYik7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gdG1wO1xuICB9XG4gIGZ1bmN0aW9uIGRvdWJsZUNvbXBhcmVUbyhhLCBiKSB7XG4gICAgdmFyIHRtcDtcbiAgICBpZiAoYSA8IGIpIHtcbiAgICAgIHRtcCA9IC0xO1xuICAgIH0gZWxzZSBpZiAoYSA+IGIpIHtcbiAgICAgIHRtcCA9IDE7XG4gICAgfSBlbHNlIGlmIChhID09PSBiKSB7XG4gICAgICB2YXIgdG1wXzA7XG4gICAgICBpZiAoYSAhPT0gMCkge1xuICAgICAgICB0bXBfMCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgdG1wJHJldCQwO1xuICAgICAgICB7XG4gICAgICAgICAgdG1wJHJldCQwID0gMTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaWEgPSB0bXAkcmV0JDAgLyBhO1xuICAgICAgICB2YXIgdG1wXzE7XG4gICAgICAgIHZhciB0bXAkcmV0JDE7XG4gICAgICAgIHtcbiAgICAgICAgICB0bXAkcmV0JDEgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpYSA9PT0gdG1wJHJldCQxIC8gYikge1xuICAgICAgICAgIHRtcF8xID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaWEgPCAwKSB7XG4gICAgICAgICAgICB0bXBfMSA9IC0xO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0bXBfMSA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRtcF8wID0gdG1wXzE7XG4gICAgICB9XG4gICAgICB0bXAgPSB0bXBfMDtcbiAgICB9IGVsc2UgaWYgKGEgIT09IGEpIHtcbiAgICAgIHRtcCA9IGIgIT09IGIgPyAwIDogMTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG1wID0gLTE7XG4gICAgfVxuICAgIHJldHVybiB0bXA7XG4gIH1cbiAgZnVuY3Rpb24gcHJpbWl0aXZlQ29tcGFyZVRvKGEsIGIpIHtcbiAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDA7XG4gIH1cbiAgZnVuY3Rpb24gY29tcGFyZVRvRG9Ob3RJbnRyaW5zaWNpZnkoYSwgYikge1xuICAgIHJldHVybiBhLmEoYik7XG4gIH1cbiAgZnVuY3Rpb24gaWRlbnRpdHlIYXNoQ29kZShvYmopIHtcbiAgICByZXR1cm4gZ2V0T2JqZWN0SGFzaENvZGUob2JqKTtcbiAgfVxuICBmdW5jdGlvbiBnZXRPYmplY3RIYXNoQ29kZShvYmopIHtcbiAgICBpZiAoIWpzSW4oJ2tvdGxpbkhhc2hDb2RlVmFsdWUkJywgb2JqKSkge1xuICAgICAgdmFyIGhhc2ggPSBqc0JpdHdpc2VPcihNYXRoLnJhbmRvbSgpICogNC4yOTQ5NjcyOTZFOSwgMCk7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IG5ldyBPYmplY3QoKTtcbiAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBoYXNoO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZmFsc2U7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCAna290bGluSGFzaENvZGVWYWx1ZSQnLCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gICAgdmFyIHRtcCRyZXQkMDtcbiAgICB7XG4gICAgICB2YXIgdG1wMF91bnNhZmVDYXN0ID0gb2JqWydrb3RsaW5IYXNoQ29kZVZhbHVlJCddO1xuICAgICAgdG1wJHJldCQwID0gdG1wMF91bnNhZmVDYXN0O1xuICAgIH1cbiAgICByZXR1cm4gdG1wJHJldCQwO1xuICB9XG4gIGZ1bmN0aW9uIGNhcHR1cmVTdGFjayhpbnN0YW5jZSwgY29uc3RydWN0b3JGdW5jdGlvbikge1xuICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSAhPSBudWxsKSB7XG4gICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShpbnN0YW5jZSwgY29uc3RydWN0b3JGdW5jdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0bXAkcmV0JDA7XG4gICAgICB7XG4gICAgICAgIHRtcCRyZXQkMCA9IGluc3RhbmNlO1xuICAgICAgfVxuICAgICAgdG1wJHJldCQwLnN0YWNrID0gKG5ldyBFcnJvcigpKS5zdGFjaztcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZXh0ZW5kVGhyb3dhYmxlKHRoaXNfLCBtZXNzYWdlLCBjYXVzZSkge1xuICAgIEVycm9yLmNhbGwodGhpc18pO1xuICAgIHNldFByb3BlcnRpZXNUb1Rocm93YWJsZUluc3RhbmNlKHRoaXNfLCBtZXNzYWdlLCBjYXVzZSk7XG4gIH1cbiAgZnVuY3Rpb24gc2V0UHJvcGVydGllc1RvVGhyb3dhYmxlSW5zdGFuY2UodGhpc18sIG1lc3NhZ2UsIGNhdXNlKSB7XG4gICAgaWYgKCFoYXNPd25Qcm90b3R5cGVQcm9wZXJ0eSh0aGlzXywgJ21lc3NhZ2UnKSkge1xuICAgICAgdmFyIHRtcDtcbiAgICAgIGlmIChtZXNzYWdlID09IG51bGwpIHtcbiAgICAgICAgdmFyIHRtcF8wO1xuICAgICAgICBpZiAoIShtZXNzYWdlID09PSBudWxsKSkge1xuICAgICAgICAgIHZhciB0bXAwX3NhZmVfcmVjZWl2ZXIgPSBjYXVzZTtcbiAgICAgICAgICB2YXIgdG1wMV9lbHZpc19saHMgPSB0bXAwX3NhZmVfcmVjZWl2ZXIgPT0gbnVsbCA/IG51bGwgOiB0bXAwX3NhZmVfcmVjZWl2ZXIudG9TdHJpbmcoKTtcbiAgICAgICAgICB0bXBfMCA9IHRtcDFfZWx2aXNfbGhzID09IG51bGwgPyB1bmRlZmluZWQgOiB0bXAxX2VsdmlzX2xocztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0bXBfMCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0bXAgPSB0bXBfMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRtcCA9IG1lc3NhZ2U7XG4gICAgICB9XG4gICAgICB0aGlzXy5tZXNzYWdlID0gdG1wO1xuICAgIH1cbiAgICBpZiAoIWhhc093blByb3RvdHlwZVByb3BlcnR5KHRoaXNfLCAnY2F1c2UnKSkge1xuICAgICAgdGhpc18uY2F1c2UgPSBjYXVzZTtcbiAgICB9XG4gICAgdGhpc18ubmFtZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzXykuY29uc3RydWN0b3IubmFtZTtcbiAgfVxuICBmdW5jdGlvbiBoYXNPd25Qcm90b3R5cGVQcm9wZXJ0eShvLCBuYW1lKSB7XG4gICAgdmFyIHRtcCRyZXQkMDtcbiAgICB7XG4gICAgICB2YXIgdG1wMF91bnNhZmVDYXN0ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pLmhhc093blByb3BlcnR5KG5hbWUpO1xuICAgICAgdG1wJHJldCQwID0gdG1wMF91bnNhZmVDYXN0O1xuICAgIH1cbiAgICByZXR1cm4gdG1wJHJldCQwO1xuICB9XG4gIGZ1bmN0aW9uIGVuc3VyZU5vdE51bGwodikge1xuICAgIHZhciB0bXA7XG4gICAgaWYgKHYgPT0gbnVsbCkge1xuICAgICAgVEhST1dfTlBFKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRtcCA9IHY7XG4gICAgfVxuICAgIHJldHVybiB0bXA7XG4gIH1cbiAgZnVuY3Rpb24gVEhST1dfTlBFKCkge1xuICAgIHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uX2luaXRfJENyZWF0ZSQoKTtcbiAgfVxuICBmdW5jdGlvbiBUSFJPV19DQ0UoKSB7XG4gICAgdGhyb3cgQ2xhc3NDYXN0RXhjZXB0aW9uX2luaXRfJENyZWF0ZSQoKTtcbiAgfVxuICBmdW5jdGlvbiBlbXB0eUFycmF5KCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBmdW5jdGlvbiBDb21wYW5pb24oKSB7XG4gICAgQ29tcGFuaW9uX2luc3RhbmNlID0gdGhpcztcbiAgICB0aGlzLmpfMSA9IG5ldyBMb25nKDAsIC0yMTQ3NDgzNjQ4KTtcbiAgICB0aGlzLmtfMSA9IG5ldyBMb25nKC0xLCAyMTQ3NDgzNjQ3KTtcbiAgICB0aGlzLmxfMSA9IDg7XG4gICAgdGhpcy5tXzEgPSA2NDtcbiAgfVxuICBDb21wYW5pb24uJG1ldGFkYXRhJCA9IG9iamVjdE1ldGEoJ0NvbXBhbmlvbicpO1xuICB2YXIgQ29tcGFuaW9uX2luc3RhbmNlO1xuICBmdW5jdGlvbiBDb21wYW5pb25fZ2V0SW5zdGFuY2UoKSB7XG4gICAgaWYgKENvbXBhbmlvbl9pbnN0YW5jZSA9PSBudWxsKVxuICAgICAgbmV3IENvbXBhbmlvbigpO1xuICAgIHJldHVybiBDb21wYW5pb25faW5zdGFuY2U7XG4gIH1cbiAgZnVuY3Rpb24gTG9uZyhsb3csIGhpZ2gpIHtcbiAgICBDb21wYW5pb25fZ2V0SW5zdGFuY2UoKTtcbiAgICBOdW1iZXJfMC5jYWxsKHRoaXMpO1xuICAgIHRoaXMuZ18xID0gbG93O1xuICAgIHRoaXMuaF8xID0gaGlnaDtcbiAgfVxuICBMb25nLnByb3RvdHlwZS5uID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gICAgcmV0dXJuIGNvbXBhcmUodGhpcywgb3RoZXIpO1xuICB9O1xuICBMb25nLnByb3RvdHlwZS5hID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gICAgcmV0dXJuIHRoaXMubihvdGhlciBpbnN0YW5jZW9mIExvbmcgPyBvdGhlciA6IFRIUk9XX0NDRSgpKTtcbiAgfTtcbiAgTG9uZy5wcm90b3R5cGUubyA9IGZ1bmN0aW9uIChvdGhlcikge1xuICAgIHJldHVybiBhZGQodGhpcywgb3RoZXIpO1xuICB9O1xuICBMb25nLnByb3RvdHlwZS5wID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnEoKS5vKG5ldyBMb25nKDEsIDApKTtcbiAgfTtcbiAgTG9uZy5wcm90b3R5cGUucSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IExvbmcofnRoaXMuZ18xLCB+dGhpcy5oXzEpO1xuICB9O1xuICBMb25nLnByb3RvdHlwZS5pID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0b051bWJlcih0aGlzKTtcbiAgfTtcbiAgTG9uZy5wcm90b3R5cGUudmFsdWVPZiA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5pKCk7XG4gIH07XG4gIExvbmcuJG1ldGFkYXRhJCA9IGNsYXNzTWV0YSgnTG9uZycsIFtDb21wYXJhYmxlXSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgTnVtYmVyXzAucHJvdG90eXBlKTtcbiAgdmFyIFpFUk87XG4gIHZhciBPTkU7XG4gIHZhciBORUdfT05FO1xuICB2YXIgTUFYX1ZBTFVFO1xuICB2YXIgTUlOX1ZBTFVFO1xuICB2YXIgVFdPX1BXUl8yNF87XG4gIGZ1bmN0aW9uIGNvbXBhcmUoX3RoaXNfX3U4ZTNzNCwgb3RoZXIpIHtcbiAgICBpbml0X3Byb3BlcnRpZXNfbG9uZ2pzX2t0X3R0azhydigpO1xuICAgIGlmIChlcXVhbHNMb25nKF90aGlzX191OGUzczQsIG90aGVyKSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHZhciB0aGlzTmVnID0gaXNOZWdhdGl2ZShfdGhpc19fdThlM3M0KTtcbiAgICB2YXIgb3RoZXJOZWcgPSBpc05lZ2F0aXZlKG90aGVyKTtcbiAgICByZXR1cm4gKHRoaXNOZWcgPyAhb3RoZXJOZWcgOiBmYWxzZSkgPyAtMSA6ICghdGhpc05lZyA/IG90aGVyTmVnIDogZmFsc2UpID8gMSA6IGlzTmVnYXRpdmUoc3VidHJhY3QoX3RoaXNfX3U4ZTNzNCwgb3RoZXIpKSA/IC0xIDogMTtcbiAgfVxuICBmdW5jdGlvbiBhZGQoX3RoaXNfX3U4ZTNzNCwgb3RoZXIpIHtcbiAgICBpbml0X3Byb3BlcnRpZXNfbG9uZ2pzX2t0X3R0azhydigpO1xuICAgIHZhciBhNDggPSBfdGhpc19fdThlM3M0LmhfMSA+Pj4gMTYgfCAwO1xuICAgIHZhciBhMzIgPSBfdGhpc19fdThlM3M0LmhfMSAmIDY1NTM1O1xuICAgIHZhciBhMTYgPSBfdGhpc19fdThlM3M0LmdfMSA+Pj4gMTYgfCAwO1xuICAgIHZhciBhMDAgPSBfdGhpc19fdThlM3M0LmdfMSAmIDY1NTM1O1xuICAgIHZhciBiNDggPSBvdGhlci5oXzEgPj4+IDE2IHwgMDtcbiAgICB2YXIgYjMyID0gb3RoZXIuaF8xICYgNjU1MzU7XG4gICAgdmFyIGIxNiA9IG90aGVyLmdfMSA+Pj4gMTYgfCAwO1xuICAgIHZhciBiMDAgPSBvdGhlci5nXzEgJiA2NTUzNTtcbiAgICB2YXIgYzQ4ID0gMDtcbiAgICB2YXIgYzMyID0gMDtcbiAgICB2YXIgYzE2ID0gMDtcbiAgICB2YXIgYzAwID0gMDtcbiAgICBjMDAgPSBjMDAgKyAoYTAwICsgYjAwIHwgMCkgfCAwO1xuICAgIGMxNiA9IGMxNiArIChjMDAgPj4+IDE2IHwgMCkgfCAwO1xuICAgIGMwMCA9IGMwMCAmIDY1NTM1O1xuICAgIGMxNiA9IGMxNiArIChhMTYgKyBiMTYgfCAwKSB8IDA7XG4gICAgYzMyID0gYzMyICsgKGMxNiA+Pj4gMTYgfCAwKSB8IDA7XG4gICAgYzE2ID0gYzE2ICYgNjU1MzU7XG4gICAgYzMyID0gYzMyICsgKGEzMiArIGIzMiB8IDApIHwgMDtcbiAgICBjNDggPSBjNDggKyAoYzMyID4+PiAxNiB8IDApIHwgMDtcbiAgICBjMzIgPSBjMzIgJiA2NTUzNTtcbiAgICBjNDggPSBjNDggKyAoYTQ4ICsgYjQ4IHwgMCkgfCAwO1xuICAgIGM0OCA9IGM0OCAmIDY1NTM1O1xuICAgIHJldHVybiBuZXcgTG9uZyhjMTYgPDwgMTYgfCBjMDAsIGM0OCA8PCAxNiB8IGMzMik7XG4gIH1cbiAgZnVuY3Rpb24gc3VidHJhY3QoX3RoaXNfX3U4ZTNzNCwgb3RoZXIpIHtcbiAgICBpbml0X3Byb3BlcnRpZXNfbG9uZ2pzX2t0X3R0azhydigpO1xuICAgIHJldHVybiBhZGQoX3RoaXNfX3U4ZTNzNCwgb3RoZXIucCgpKTtcbiAgfVxuICBmdW5jdGlvbiB0b051bWJlcihfdGhpc19fdThlM3M0KSB7XG4gICAgaW5pdF9wcm9wZXJ0aWVzX2xvbmdqc19rdF90dGs4cnYoKTtcbiAgICByZXR1cm4gX3RoaXNfX3U4ZTNzNC5oXzEgKiA0LjI5NDk2NzI5NkU5ICsgZ2V0TG93Qml0c1Vuc2lnbmVkKF90aGlzX191OGUzczQpO1xuICB9XG4gIGZ1bmN0aW9uIGVxdWFsc0xvbmcoX3RoaXNfX3U4ZTNzNCwgb3RoZXIpIHtcbiAgICBpbml0X3Byb3BlcnRpZXNfbG9uZ2pzX2t0X3R0azhydigpO1xuICAgIHJldHVybiBfdGhpc19fdThlM3M0LmhfMSA9PT0gb3RoZXIuaF8xID8gX3RoaXNfX3U4ZTNzNC5nXzEgPT09IG90aGVyLmdfMSA6IGZhbHNlO1xuICB9XG4gIGZ1bmN0aW9uIGZyb21JbnQodmFsdWUpIHtcbiAgICBpbml0X3Byb3BlcnRpZXNfbG9uZ2pzX2t0X3R0azhydigpO1xuICAgIHJldHVybiBuZXcgTG9uZyh2YWx1ZSwgdmFsdWUgPCAwID8gLTEgOiAwKTtcbiAgfVxuICBmdW5jdGlvbiBpc05lZ2F0aXZlKF90aGlzX191OGUzczQpIHtcbiAgICBpbml0X3Byb3BlcnRpZXNfbG9uZ2pzX2t0X3R0azhydigpO1xuICAgIHJldHVybiBfdGhpc19fdThlM3M0LmhfMSA8IDA7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0TG93Qml0c1Vuc2lnbmVkKF90aGlzX191OGUzczQpIHtcbiAgICBpbml0X3Byb3BlcnRpZXNfbG9uZ2pzX2t0X3R0azhydigpO1xuICAgIHJldHVybiBfdGhpc19fdThlM3M0LmdfMSA+PSAwID8gX3RoaXNfX3U4ZTNzNC5nXzEgOiA0LjI5NDk2NzI5NkU5ICsgX3RoaXNfX3U4ZTNzNC5nXzE7XG4gIH1cbiAgdmFyIHByb3BlcnRpZXNfaW5pdGlhbGl6ZWRfbG9uZ2pzX2t0XzVhanU3dDtcbiAgZnVuY3Rpb24gaW5pdF9wcm9wZXJ0aWVzX2xvbmdqc19rdF90dGs4cnYoKSB7XG4gICAgaWYgKHByb3BlcnRpZXNfaW5pdGlhbGl6ZWRfbG9uZ2pzX2t0XzVhanU3dCkge1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wZXJ0aWVzX2luaXRpYWxpemVkX2xvbmdqc19rdF81YWp1N3QgPSB0cnVlO1xuICAgICAgWkVSTyA9IGZyb21JbnQoMCk7XG4gICAgICBPTkUgPSBmcm9tSW50KDEpO1xuICAgICAgTkVHX09ORSA9IGZyb21JbnQoLTEpO1xuICAgICAgTUFYX1ZBTFVFID0gbmV3IExvbmcoLTEsIDIxNDc0ODM2NDcpO1xuICAgICAgTUlOX1ZBTFVFID0gbmV3IExvbmcoMCwgLTIxNDc0ODM2NDgpO1xuICAgICAgVFdPX1BXUl8yNF8gPSBmcm9tSW50KDE2Nzc3MjE2KTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gY2xhc3NNZXRhKG5hbWUsIGludGVyZmFjZXMsIGFzc29jaWF0ZWRPYmplY3RLZXksIGFzc29jaWF0ZWRPYmplY3RzLCBzdXNwZW5kQXJpdHksIGZhc3RQcm90b3R5cGUpIHtcbiAgICByZXR1cm4gY3JlYXRlTWV0YWRhdGEoJ2NsYXNzJywgbmFtZSwgaW50ZXJmYWNlcywgYXNzb2NpYXRlZE9iamVjdEtleSwgYXNzb2NpYXRlZE9iamVjdHMsIHN1c3BlbmRBcml0eSwgZmFzdFByb3RvdHlwZSk7XG4gIH1cbiAgZnVuY3Rpb24gY3JlYXRlTWV0YWRhdGEoa2luZCwgbmFtZSwgaW50ZXJmYWNlcywgYXNzb2NpYXRlZE9iamVjdEtleSwgYXNzb2NpYXRlZE9iamVjdHMsIHN1c3BlbmRBcml0eSwgZmFzdFByb3RvdHlwZSkge1xuICAgIHJldHVybiB7a2luZDoga2luZCwgc2ltcGxlTmFtZTogbmFtZSwgaW50ZXJmYWNlSWQ6IGtpbmQgPT09ICdpbnRlcmZhY2UnID8gLTEgOiB1bmRlZmluZWQsIGludGVyZmFjZXM6IGludGVyZmFjZXMgfHwgW10sIGFzc29jaWF0ZWRPYmplY3RLZXk6IGFzc29jaWF0ZWRPYmplY3RLZXksIGFzc29jaWF0ZWRPYmplY3RzOiBhc3NvY2lhdGVkT2JqZWN0cywgc3VzcGVuZEFyaXR5OiBzdXNwZW5kQXJpdHksIGZhc3RQcm90b3R5cGU6IGZhc3RQcm90b3R5cGUsICRrQ2xhc3MkOiB1bmRlZmluZWQsIGludGVyZmFjZXNDYWNoZToge2lzQ29tcGxldGU6IGZhc3RQcm90b3R5cGUgPT09IHVuZGVmaW5lZCAmJiAoaW50ZXJmYWNlcyA9PT0gdW5kZWZpbmVkIHx8IGludGVyZmFjZXMubGVuZ3RoID09PSAwKSwgaW1wbGVtZW50SW50ZXJmYWNlTWVtbzoge319fTtcbiAgfVxuICBmdW5jdGlvbiBpbnRlcmZhY2VNZXRhKG5hbWUsIGludGVyZmFjZXMsIGFzc29jaWF0ZWRPYmplY3RLZXksIGFzc29jaWF0ZWRPYmplY3RzLCBzdXNwZW5kQXJpdHkpIHtcbiAgICByZXR1cm4gY3JlYXRlTWV0YWRhdGEoJ2ludGVyZmFjZScsIG5hbWUsIGludGVyZmFjZXMsIGFzc29jaWF0ZWRPYmplY3RLZXksIGFzc29jaWF0ZWRPYmplY3RzLCBzdXNwZW5kQXJpdHksIHVuZGVmaW5lZCk7XG4gIH1cbiAgZnVuY3Rpb24gb2JqZWN0TWV0YShuYW1lLCBpbnRlcmZhY2VzLCBhc3NvY2lhdGVkT2JqZWN0S2V5LCBhc3NvY2lhdGVkT2JqZWN0cywgc3VzcGVuZEFyaXR5LCBmYXN0UHJvdG90eXBlKSB7XG4gICAgcmV0dXJuIGNyZWF0ZU1ldGFkYXRhKCdvYmplY3QnLCBuYW1lLCBpbnRlcmZhY2VzLCBhc3NvY2lhdGVkT2JqZWN0S2V5LCBhc3NvY2lhdGVkT2JqZWN0cywgc3VzcGVuZEFyaXR5LCBmYXN0UHJvdG90eXBlKTtcbiAgfVxuICBmdW5jdGlvbiBFeGNlcHRpb25faW5pdF8kSW5pdCQoJHRoaXMpIHtcbiAgICBleHRlbmRUaHJvd2FibGUoJHRoaXMsIHZvaWQgMSwgdm9pZCAxKTtcbiAgICBFeGNlcHRpb24uY2FsbCgkdGhpcyk7XG4gICAgcmV0dXJuICR0aGlzO1xuICB9XG4gIGZ1bmN0aW9uIEV4Y2VwdGlvbl9pbml0XyRJbml0JF8wKG1lc3NhZ2UsICR0aGlzKSB7XG4gICAgZXh0ZW5kVGhyb3dhYmxlKCR0aGlzLCBtZXNzYWdlLCB2b2lkIDEpO1xuICAgIEV4Y2VwdGlvbi5jYWxsKCR0aGlzKTtcbiAgICByZXR1cm4gJHRoaXM7XG4gIH1cbiAgZnVuY3Rpb24gRXhjZXB0aW9uKCkge1xuICAgIGNhcHR1cmVTdGFjayh0aGlzLCBFeGNlcHRpb24pO1xuICB9XG4gIEV4Y2VwdGlvbi4kbWV0YWRhdGEkID0gY2xhc3NNZXRhKCdFeGNlcHRpb24nLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIEVycm9yLnByb3RvdHlwZSk7XG4gIGZ1bmN0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbl9pbml0XyRJbml0JChtZXNzYWdlLCAkdGhpcykge1xuICAgIFJ1bnRpbWVFeGNlcHRpb25faW5pdF8kSW5pdCRfMChtZXNzYWdlLCAkdGhpcyk7XG4gICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNhbGwoJHRoaXMpO1xuICAgIHJldHVybiAkdGhpcztcbiAgfVxuICBmdW5jdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25faW5pdF8kQ3JlYXRlJChtZXNzYWdlKSB7XG4gICAgdmFyIHRtcCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbl9pbml0XyRJbml0JChtZXNzYWdlLCBPYmplY3QuY3JlYXRlKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5wcm90b3R5cGUpKTtcbiAgICBjYXB0dXJlU3RhY2sodG1wLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25faW5pdF8kQ3JlYXRlJCk7XG4gICAgcmV0dXJuIHRtcDtcbiAgfVxuICBmdW5jdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSB7XG4gICAgY2FwdHVyZVN0YWNrKHRoaXMsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbik7XG4gIH1cbiAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiRtZXRhZGF0YSQgPSBjbGFzc01ldGEoJ0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbicsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgUnVudGltZUV4Y2VwdGlvbi5wcm90b3R5cGUpO1xuICBmdW5jdGlvbiBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uX2luaXRfJEluaXQkKG1lc3NhZ2UsICR0aGlzKSB7XG4gICAgUnVudGltZUV4Y2VwdGlvbl9pbml0XyRJbml0JF8wKG1lc3NhZ2UsICR0aGlzKTtcbiAgICBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLmNhbGwoJHRoaXMpO1xuICAgIHJldHVybiAkdGhpcztcbiAgfVxuICBmdW5jdGlvbiBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uX2luaXRfJENyZWF0ZSQobWVzc2FnZSkge1xuICAgIHZhciB0bXAgPSBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uX2luaXRfJEluaXQkKG1lc3NhZ2UsIE9iamVjdC5jcmVhdGUoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbi5wcm90b3R5cGUpKTtcbiAgICBjYXB0dXJlU3RhY2sodG1wLCBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uX2luaXRfJENyZWF0ZSQpO1xuICAgIHJldHVybiB0bXA7XG4gIH1cbiAgZnVuY3Rpb24gTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHtcbiAgICBjYXB0dXJlU3RhY2sodGhpcywgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbik7XG4gIH1cbiAgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbi4kbWV0YWRhdGEkID0gY2xhc3NNZXRhKCdOb1N1Y2hFbGVtZW50RXhjZXB0aW9uJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBSdW50aW1lRXhjZXB0aW9uLnByb3RvdHlwZSk7XG4gIGZ1bmN0aW9uIFJ1bnRpbWVFeGNlcHRpb25faW5pdF8kSW5pdCQoJHRoaXMpIHtcbiAgICBFeGNlcHRpb25faW5pdF8kSW5pdCQoJHRoaXMpO1xuICAgIFJ1bnRpbWVFeGNlcHRpb24uY2FsbCgkdGhpcyk7XG4gICAgcmV0dXJuICR0aGlzO1xuICB9XG4gIGZ1bmN0aW9uIFJ1bnRpbWVFeGNlcHRpb25faW5pdF8kSW5pdCRfMChtZXNzYWdlLCAkdGhpcykge1xuICAgIEV4Y2VwdGlvbl9pbml0XyRJbml0JF8wKG1lc3NhZ2UsICR0aGlzKTtcbiAgICBSdW50aW1lRXhjZXB0aW9uLmNhbGwoJHRoaXMpO1xuICAgIHJldHVybiAkdGhpcztcbiAgfVxuICBmdW5jdGlvbiBSdW50aW1lRXhjZXB0aW9uKCkge1xuICAgIGNhcHR1cmVTdGFjayh0aGlzLCBSdW50aW1lRXhjZXB0aW9uKTtcbiAgfVxuICBSdW50aW1lRXhjZXB0aW9uLiRtZXRhZGF0YSQgPSBjbGFzc01ldGEoJ1J1bnRpbWVFeGNlcHRpb24nLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIEV4Y2VwdGlvbi5wcm90b3R5cGUpO1xuICBmdW5jdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbl9pbml0XyRJbml0JCgkdGhpcykge1xuICAgIFJ1bnRpbWVFeGNlcHRpb25faW5pdF8kSW5pdCQoJHRoaXMpO1xuICAgIE51bGxQb2ludGVyRXhjZXB0aW9uLmNhbGwoJHRoaXMpO1xuICAgIHJldHVybiAkdGhpcztcbiAgfVxuICBmdW5jdGlvbiBOdWxsUG9pbnRlckV4Y2VwdGlvbl9pbml0XyRDcmVhdGUkKCkge1xuICAgIHZhciB0bXAgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbl9pbml0XyRJbml0JChPYmplY3QuY3JlYXRlKE51bGxQb2ludGVyRXhjZXB0aW9uLnByb3RvdHlwZSkpO1xuICAgIGNhcHR1cmVTdGFjayh0bXAsIE51bGxQb2ludGVyRXhjZXB0aW9uX2luaXRfJENyZWF0ZSQpO1xuICAgIHJldHVybiB0bXA7XG4gIH1cbiAgZnVuY3Rpb24gTnVsbFBvaW50ZXJFeGNlcHRpb24oKSB7XG4gICAgY2FwdHVyZVN0YWNrKHRoaXMsIE51bGxQb2ludGVyRXhjZXB0aW9uKTtcbiAgfVxuICBOdWxsUG9pbnRlckV4Y2VwdGlvbi4kbWV0YWRhdGEkID0gY2xhc3NNZXRhKCdOdWxsUG9pbnRlckV4Y2VwdGlvbicsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgUnVudGltZUV4Y2VwdGlvbi5wcm90b3R5cGUpO1xuICBmdW5jdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb25faW5pdF8kSW5pdCQoJHRoaXMpIHtcbiAgICBSdW50aW1lRXhjZXB0aW9uX2luaXRfJEluaXQkKCR0aGlzKTtcbiAgICBDbGFzc0Nhc3RFeGNlcHRpb24uY2FsbCgkdGhpcyk7XG4gICAgcmV0dXJuICR0aGlzO1xuICB9XG4gIGZ1bmN0aW9uIENsYXNzQ2FzdEV4Y2VwdGlvbl9pbml0XyRDcmVhdGUkKCkge1xuICAgIHZhciB0bXAgPSBDbGFzc0Nhc3RFeGNlcHRpb25faW5pdF8kSW5pdCQoT2JqZWN0LmNyZWF0ZShDbGFzc0Nhc3RFeGNlcHRpb24ucHJvdG90eXBlKSk7XG4gICAgY2FwdHVyZVN0YWNrKHRtcCwgQ2xhc3NDYXN0RXhjZXB0aW9uX2luaXRfJENyZWF0ZSQpO1xuICAgIHJldHVybiB0bXA7XG4gIH1cbiAgZnVuY3Rpb24gQ2xhc3NDYXN0RXhjZXB0aW9uKCkge1xuICAgIGNhcHR1cmVTdGFjayh0aGlzLCBDbGFzc0Nhc3RFeGNlcHRpb24pO1xuICB9XG4gIENsYXNzQ2FzdEV4Y2VwdGlvbi4kbWV0YWRhdGEkID0gY2xhc3NNZXRhKCdDbGFzc0Nhc3RFeGNlcHRpb24nLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFJ1bnRpbWVFeGNlcHRpb24ucHJvdG90eXBlKTtcbiAgZnVuY3Rpb24ganNJbihsaHNfaGFjaywgcmhzX2hhY2spIHtcbiAgICB2YXIgdG1wJHJldCQwO1xuICAgIHtcbiAgICAgIHZhciB0bXAwX3Vuc2FmZUNhc3QgPSBsaHNfaGFjayBpbiByaHNfaGFjaztcbiAgICAgIHRtcCRyZXQkMCA9IHRtcDBfdW5zYWZlQ2FzdDtcbiAgICB9XG4gICAgcmV0dXJuIHRtcCRyZXQkMDtcbiAgfVxuICBmdW5jdGlvbiBqc0JpdHdpc2VPcihsaHNfaGFjaywgcmhzX2hhY2spIHtcbiAgICB2YXIgdG1wJHJldCQwO1xuICAgIHtcbiAgICAgIHZhciB0bXAwX3Vuc2FmZUNhc3QgPSBsaHNfaGFjayB8IHJoc19oYWNrO1xuICAgICAgdG1wJHJldCQwID0gdG1wMF91bnNhZmVDYXN0O1xuICAgIH1cbiAgICByZXR1cm4gdG1wJHJldCQwO1xuICB9XG4gIGZ1bmN0aW9uIGpzVHlwZU9mKHZhbHVlX2hhY2spIHtcbiAgICB2YXIgdG1wJHJldCQwO1xuICAgIHtcbiAgICAgIHZhciB0bXAwX3Vuc2FmZUNhc3QgPSB0eXBlb2YgdmFsdWVfaGFjaztcbiAgICAgIHRtcCRyZXQkMCA9IHRtcDBfdW5zYWZlQ2FzdDtcbiAgICB9XG4gICAgcmV0dXJuIHRtcCRyZXQkMDtcbiAgfVxuICAvL3JlZ2lvbiBibG9jazogZXhwb3J0c1xuICBfLiRfJCA9IF8uJF8kIHx8IHt9O1xuICBfLiRfJC5hID0gVW5pdF9nZXRJbnN0YW5jZTtcbiAgXy4kXyQuYiA9IHNpbmdsZTtcbiAgXy4kXyQuYyA9IGNsYXNzTWV0YTtcbiAgXy4kXyQuZCA9IGludGVyZmFjZU1ldGE7XG4gIF8uJF8kLmUgPSBvYmplY3RNZXRhO1xuICBfLiRfJC5mID0gZW5zdXJlTm90TnVsbDtcbiAgLy9lbmRyZWdpb25cbiAgcmV0dXJuIF87XG59KSk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWtvdGxpbi1rb3RsaW4tc3RkbGliLWpzLWlyLmpzLm1hcFxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9mcm9udGVuZC8uL2tvdGxpbi9rb3RsaW4ta290bGluLXN0ZGxpYi1qcy1pci5qcz8iKTsKCi8qKiovIH0pLAoKLyoqKi8gIi4va290bGluL2tvdGxpbi13cmFwcGVycy1rb3RsaW4tcmVhY3QtZG9tLWpzLWlyLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXAogICEqKiogLi9rb3RsaW4va290bGluLXdyYXBwZXJzLWtvdGxpbi1yZWFjdC1kb20tanMtaXIuanMgKioqIQogIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpldmFsKCJ2YXIgX19XRUJQQUNLX0FNRF9ERUZJTkVfRkFDVE9SWV9fLCBfX1dFQlBBQ0tfQU1EX0RFRklORV9BUlJBWV9fLCBfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXzsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcbiAgaWYgKHRydWUpXG4gICAgIShfX1dFQlBBQ0tfQU1EX0RFRklORV9BUlJBWV9fID0gW2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18oLyohIC4va290bGluLWtvdGxpbi1zdGRsaWItanMtaXIuanMgKi8gXCIuL2tvdGxpbi9rb3RsaW4ta290bGluLXN0ZGxpYi1qcy1pci5qc1wiKV0sIF9fV0VCUEFDS19BTURfREVGSU5FX0ZBQ1RPUllfXyA9IChmYWN0b3J5KSxcblx0XHRfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXyA9ICh0eXBlb2YgX19XRUJQQUNLX0FNRF9ERUZJTkVfRkFDVE9SWV9fID09PSAnZnVuY3Rpb24nID9cblx0XHQoX19XRUJQQUNLX0FNRF9ERUZJTkVfRkFDVE9SWV9fLmFwcGx5KGV4cG9ydHMsIF9fV0VCUEFDS19BTURfREVGSU5FX0FSUkFZX18pKSA6IF9fV0VCUEFDS19BTURfREVGSU5FX0ZBQ1RPUllfXyksXG5cdFx0X19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX18gIT09IHVuZGVmaW5lZCAmJiAobW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXykpO1xuICBlbHNlIHt9XG59KHRoaXMsIGZ1bmN0aW9uIChfLCBrb3RsaW5fa290bGluKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgLy9yZWdpb24gYmxvY2s6IGltcG9ydHNcbiAgdmFyIFVuaXRfZ2V0SW5zdGFuY2UgPSBrb3RsaW5fa290bGluLiRfJC5hO1xuICB2YXIgb2JqZWN0TWV0YSA9IGtvdGxpbl9rb3RsaW4uJF8kLmU7XG4gIC8vZW5kcmVnaW9uXG4gIC8vcmVnaW9uIGJsb2NrOiBwcmUtZGVjbGFyYXRpb25cbiAgLy9lbmRyZWdpb25cbiAgZnVuY3Rpb24gUmVhY3RIVE1MKCkge1xuICAgIFJlYWN0SFRNTF9pbnN0YW5jZSA9IHRoaXM7XG4gIH1cbiAgUmVhY3RIVE1MLnByb3RvdHlwZS54ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0bXAkcmV0JDI7XG4gICAge1xuICAgICAgdmFyIHRtcCRyZXQkMTtcbiAgICAgIHtcbiAgICAgICAgdmFyIHRtcCRyZXQkMDtcbiAgICAgICAge1xuICAgICAgICAgIHRtcCRyZXQkMCA9ICdkaXYnO1xuICAgICAgICB9XG4gICAgICAgIHRtcCRyZXQkMSA9IHRtcCRyZXQkMDtcbiAgICAgIH1cbiAgICAgIHRtcCRyZXQkMiA9IHRtcCRyZXQkMTtcbiAgICB9XG4gICAgcmV0dXJuIHRtcCRyZXQkMjtcbiAgfTtcbiAgUmVhY3RIVE1MLnByb3RvdHlwZS55ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0bXAkcmV0JDI7XG4gICAge1xuICAgICAgdmFyIHRtcCRyZXQkMTtcbiAgICAgIHtcbiAgICAgICAgdmFyIHRtcCRyZXQkMDtcbiAgICAgICAge1xuICAgICAgICAgIHRtcCRyZXQkMCA9ICdzdHJvbmcnO1xuICAgICAgICB9XG4gICAgICAgIHRtcCRyZXQkMSA9IHRtcCRyZXQkMDtcbiAgICAgIH1cbiAgICAgIHRtcCRyZXQkMiA9IHRtcCRyZXQkMTtcbiAgICB9XG4gICAgcmV0dXJuIHRtcCRyZXQkMjtcbiAgfTtcbiAgUmVhY3RIVE1MLiRtZXRhZGF0YSQgPSBvYmplY3RNZXRhKCdSZWFjdEhUTUwnKTtcbiAgdmFyIFJlYWN0SFRNTF9pbnN0YW5jZTtcbiAgZnVuY3Rpb24gUmVhY3RIVE1MX2dldEluc3RhbmNlKCkge1xuICAgIGlmIChSZWFjdEhUTUxfaW5zdGFuY2UgPT0gbnVsbClcbiAgICAgIG5ldyBSZWFjdEhUTUwoKTtcbiAgICByZXR1cm4gUmVhY3RIVE1MX2luc3RhbmNlO1xuICB9XG4gIC8vcmVnaW9uIGJsb2NrOiBleHBvcnRzXG4gIF8uJF8kID0gXy4kXyQgfHwge307XG4gIF8uJF8kLmEgPSBSZWFjdEhUTUxfZ2V0SW5zdGFuY2U7XG4gIC8vZW5kcmVnaW9uXG4gIHJldHVybiBfO1xufSkpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1rb3RsaW4td3JhcHBlcnMta290bGluLXJlYWN0LWRvbS1qcy1pci5qcy5tYXBcblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vZnJvbnRlbmQvLi9rb3RsaW4va290bGluLXdyYXBwZXJzLWtvdGxpbi1yZWFjdC1kb20tanMtaXIuanM/Iik7CgovKioqLyB9KSwKCi8qKiovICIuL2tvdGxpbi9rb3RsaW4td3JhcHBlcnMta290bGluLXJlYWN0LWpzLWlyLmpzIjoKLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcCiAgISoqKiAuL2tvdGxpbi9rb3RsaW4td3JhcHBlcnMta290bGluLXJlYWN0LWpzLWlyLmpzICoqKiEKICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgpldmFsKCJ2YXIgX19XRUJQQUNLX0FNRF9ERUZJTkVfRkFDVE9SWV9fLCBfX1dFQlBBQ0tfQU1EX0RFRklORV9BUlJBWV9fLCBfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXzsoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcbiAgaWYgKHRydWUpXG4gICAgIShfX1dFQlBBQ0tfQU1EX0RFRklORV9BUlJBWV9fID0gW2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18oLyohIHJlYWN0ICovIFwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2luZGV4LmpzXCIpLCBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2tvdGxpbi1rb3RsaW4tc3RkbGliLWpzLWlyLmpzICovIFwiLi9rb3RsaW4va290bGluLWtvdGxpbi1zdGRsaWItanMtaXIuanNcIildLCBfX1dFQlBBQ0tfQU1EX0RFRklORV9GQUNUT1JZX18gPSAoZmFjdG9yeSksXG5cdFx0X19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX18gPSAodHlwZW9mIF9fV0VCUEFDS19BTURfREVGSU5FX0ZBQ1RPUllfXyA9PT0gJ2Z1bmN0aW9uJyA/XG5cdFx0KF9fV0VCUEFDS19BTURfREVGSU5FX0ZBQ1RPUllfXy5hcHBseShleHBvcnRzLCBfX1dFQlBBQ0tfQU1EX0RFRklORV9BUlJBWV9fKSkgOiBfX1dFQlBBQ0tfQU1EX0RFRklORV9GQUNUT1JZX18pLFxuXHRcdF9fV0VCUEFDS19BTURfREVGSU5FX1JFU1VMVF9fICE9PSB1bmRlZmluZWQgJiYgKG1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX18pKTtcbiAgZWxzZSB7fVxufSh0aGlzLCBmdW5jdGlvbiAoXywgJG1vZHVsZSRyZWFjdCwga290bGluX2tvdGxpbikge1xuICAndXNlIHN0cmljdCc7XG4gIC8vcmVnaW9uIGJsb2NrOiBpbXBvcnRzXG4gIHZhciBjcmVhdGVFbGVtZW50ID0gJG1vZHVsZSRyZWFjdC5jcmVhdGVFbGVtZW50O1xuICB2YXIgaXNWYWxpZEVsZW1lbnQgPSAkbW9kdWxlJHJlYWN0LmlzVmFsaWRFbGVtZW50O1xuICB2YXIgRnJhZ21lbnQgPSAkbW9kdWxlJHJlYWN0LkZyYWdtZW50O1xuICB2YXIgVW5pdF9nZXRJbnN0YW5jZSA9IGtvdGxpbl9rb3RsaW4uJF8kLmE7XG4gIHZhciBpbnRlcmZhY2VNZXRhID0ga290bGluX2tvdGxpbi4kXyQuZDtcbiAgdmFyIGNsYXNzTWV0YSA9IGtvdGxpbl9rb3RsaW4uJF8kLmM7XG4gIHZhciBzaW5nbGUgPSBrb3RsaW5fa290bGluLiRfJC5iO1xuICAvL2VuZHJlZ2lvblxuICAvL3JlZ2lvbiBibG9jazogcHJlLWRlY2xhcmF0aW9uXG4gIGZ1bmN0aW9uIGNoaWxkKGVsZW1lbnQpIHtcbiAgICB2YXIgdG1wJHJldCQxO1xuICAgIHtcbiAgICAgIHZhciB0bXAkcmV0JDA7XG4gICAgICB7XG4gICAgICAgIHRtcCRyZXQkMCA9IHRoaXM7XG4gICAgICB9XG4gICAgICB0bXAkcmV0JDEgPSB0bXAkcmV0JDBbZ2V0X0NISUxEUkVOKCldO1xuICAgIH1cbiAgICBpZiAoISh0bXAkcmV0JDEgPT0gbnVsbCkpIHtcbiAgICAgIHZhciB0bXAkcmV0JDQ7XG4gICAgICB7XG4gICAgICAgIHZhciB0bXAkcmV0JDM7XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgdG1wJHJldCQyO1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRtcCRyZXQkMiA9IHRoaXM7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRtcCRyZXQkMyA9IHRtcCRyZXQkMltnZXRfQ0hJTERSRU4oKV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRtcDBfYXNEeW5hbWljID0gdG1wJHJldCQzO1xuICAgICAgICB0bXAkcmV0JDQgPSB0bXAwX2FzRHluYW1pYztcbiAgICAgIH1cbiAgICAgIHRtcCRyZXQkNC5wdXNoKGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB7XG4gICAgICAgIHZhciB0bXAkcmV0JDc7XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgdG1wJHJldCQ2O1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciB0bXAkcmV0JDU7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRtcCRyZXQkNSA9IFtlbGVtZW50XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRtcCRyZXQkNiA9IHRtcCRyZXQkNTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdG1wJHJldCQ3ID0gdG1wJHJldCQ2O1xuICAgICAgICB9XG4gICAgICAgIHZhciB0bXAxX19zZXRfY2hpbGRyZW5fX2VkbzJvdCA9IHRtcCRyZXQkNztcbiAgICAgICAgdmFyIHRtcCRyZXQkODtcbiAgICAgICAge1xuICAgICAgICAgIHRtcCRyZXQkOCA9IHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdG1wJHJldCQ4W2dldF9DSElMRFJFTigpXSA9IHRtcDFfX3NldF9jaGlsZHJlbl9fZWRvMm90O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiB1bmFyeVBsdXMoX3RoaXNfX3U4ZTNzNCkge1xuICAgIHRoaXMudChfdGhpc19fdThlM3M0KTtcbiAgfVxuICBmdW5jdGlvbiB1bmFyeVBsdXNfMChfdGhpc19fdThlM3M0KSB7XG4gICAgdmFyIHRtcCRyZXQkMjtcbiAgICB7XG4gICAgICB2YXIgdG1wJHJldCQxO1xuICAgICAge1xuICAgICAgICB2YXIgdG1wJHJldCQwO1xuICAgICAgICB7XG4gICAgICAgICAgdG1wJHJldCQwID0gX3RoaXNfX3U4ZTNzNDtcbiAgICAgICAgfVxuICAgICAgICB0bXAkcmV0JDEgPSB0bXAkcmV0JDA7XG4gICAgICB9XG4gICAgICB0bXAkcmV0JDIgPSB0bXAkcmV0JDE7XG4gICAgfVxuICAgIHRoaXMudSh0bXAkcmV0JDIpO1xuICB9XG4gIGZ1bmN0aW9uIGludm9rZShfdGhpc19fdThlM3M0LCBibG9jaykge1xuICAgIHRoaXMudShjcmVhdGUoX3RoaXNfX3U4ZTNzNCwgYmxvY2spKTtcbiAgfVxuICAvL2VuZHJlZ2lvblxuICBmdW5jdGlvbiBnZXRfQ0hJTERSRU4oKSB7XG4gICAgaW5pdF9wcm9wZXJ0aWVzX0NoaWxkcmVuQnVpbGRlcl9rdF83eXJra28oKTtcbiAgICByZXR1cm4gQ0hJTERSRU47XG4gIH1cbiAgdmFyIENISUxEUkVOO1xuICBmdW5jdGlvbiBDaGlsZHJlbkJ1aWxkZXIoKSB7XG4gIH1cbiAgQ2hpbGRyZW5CdWlsZGVyLiRtZXRhZGF0YSQgPSBpbnRlcmZhY2VNZXRhKCdDaGlsZHJlbkJ1aWxkZXInKTtcbiAgZnVuY3Rpb24gY3JlYXRlQ2hpbGRyZW5CdWlsZGVyKCkge1xuICAgIGluaXRfcHJvcGVydGllc19DaGlsZHJlbkJ1aWxkZXJfa3RfN3lya2tvKCk7XG4gICAgcmV0dXJuIG5ldyBDaGlsZHJlbkJ1aWxkZXJJbXBsKCk7XG4gIH1cbiAgZnVuY3Rpb24gc2V0X2NoaWxkcmVuKF90aGlzX191OGUzczQsIHZhbHVlKSB7XG4gICAgaW5pdF9wcm9wZXJ0aWVzX0NoaWxkcmVuQnVpbGRlcl9rdF83eXJra28oKTtcbiAgICB2YXIgdG1wJHJldCQwO1xuICAgIHtcbiAgICAgIHRtcCRyZXQkMCA9IF90aGlzX191OGUzczQ7XG4gICAgfVxuICAgIHRtcCRyZXQkMFtnZXRfQ0hJTERSRU4oKV0gPSB2YWx1ZTtcbiAgfVxuICBmdW5jdGlvbiBnZXRfY2hpbGRyZW4oX3RoaXNfX3U4ZTNzNCkge1xuICAgIGluaXRfcHJvcGVydGllc19DaGlsZHJlbkJ1aWxkZXJfa3RfN3lya2tvKCk7XG4gICAgdmFyIHRtcCRyZXQkMDtcbiAgICB7XG4gICAgICB0bXAkcmV0JDAgPSBfdGhpc19fdThlM3M0O1xuICAgIH1cbiAgICByZXR1cm4gdG1wJHJldCQwW2dldF9DSElMRFJFTigpXTtcbiAgfVxuICBmdW5jdGlvbiBDaGlsZHJlbkJ1aWxkZXJJbXBsKCkge1xuICB9XG4gIENoaWxkcmVuQnVpbGRlckltcGwuJG1ldGFkYXRhJCA9IGNsYXNzTWV0YSgnQ2hpbGRyZW5CdWlsZGVySW1wbCcsIFtDaGlsZHJlbkJ1aWxkZXJdKTtcbiAgdmFyIHByb3BlcnRpZXNfaW5pdGlhbGl6ZWRfQ2hpbGRyZW5CdWlsZGVyX2t0X2dieTJ6MDtcbiAgZnVuY3Rpb24gaW5pdF9wcm9wZXJ0aWVzX0NoaWxkcmVuQnVpbGRlcl9rdF83eXJra28oKSB7XG4gICAgaWYgKHByb3BlcnRpZXNfaW5pdGlhbGl6ZWRfQ2hpbGRyZW5CdWlsZGVyX2t0X2dieTJ6MCkge1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wZXJ0aWVzX2luaXRpYWxpemVkX0NoaWxkcmVuQnVpbGRlcl9rdF9nYnkyejAgPSB0cnVlO1xuICAgICAgQ0hJTERSRU4gPSBTeW1ib2woJ0BAY2hpbGRyZW4nKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gRkMoYmxvY2spIHtcbiAgICB2YXIgY29tcG9uZW50ID0gRkMkbGFtYmRhKGJsb2NrKTtcbiAgICB2YXIgdG1wJHJldCQxO1xuICAgIHtcbiAgICAgIHZhciB0bXAkcmV0JDA7XG4gICAgICB7XG4gICAgICAgIHRtcCRyZXQkMCA9IGNvbXBvbmVudDtcbiAgICAgIH1cbiAgICAgIHRtcCRyZXQkMSA9IHRtcCRyZXQkMDtcbiAgICB9XG4gICAgcmV0dXJuIHRtcCRyZXQkMTtcbiAgfVxuICBmdW5jdGlvbiBGQyRsYW1iZGEkbGFtYmRhKCRibG9jaywgJHByb3BzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcyRjcmVhdGVFbGVtZW50T3JOdWxsKSB7XG4gICAgICAkYmxvY2soJHRoaXMkY3JlYXRlRWxlbWVudE9yTnVsbCwgJHByb3BzKTtcbiAgICAgIHJldHVybiBVbml0X2dldEluc3RhbmNlKCk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBGQyRsYW1iZGEoJGJsb2NrKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChwcm9wcykge1xuICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnRPck51bGwoRkMkbGFtYmRhJGxhbWJkYSgkYmxvY2ssIHByb3BzKSk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBjcmVhdGUoX3RoaXNfX3U4ZTNzNCwgYmxvY2spIHtcbiAgICB2YXIgYnVpbGRlciA9IGNyZWF0ZUNoaWxkcmVuQnVpbGRlcigpO1xuICAgIHZhciB0bXAkcmV0JDI7XG4gICAge1xuICAgICAgdmFyIHRtcCRyZXQkMTtcbiAgICAgIHtcbiAgICAgICAgdmFyIHRtcCRyZXQkMDtcbiAgICAgICAge1xuICAgICAgICAgIHRtcCRyZXQkMCA9IGJ1aWxkZXI7XG4gICAgICAgIH1cbiAgICAgICAgdG1wJHJldCQxID0gdG1wJHJldCQwO1xuICAgICAgfVxuICAgICAgdmFyIHRtcDBfYXBwbHkgPSB0bXAkcmV0JDE7XG4gICAgICB7XG4gICAgICB9XG4gICAgICBibG9jayh0bXAwX2FwcGx5KTtcbiAgICAgIHRtcCRyZXQkMiA9IHRtcDBfYXBwbHk7XG4gICAgfVxuICAgIHZhciBwcm9wcyA9IHRtcCRyZXQkMjtcbiAgICB2YXIgdG1wJHJldCQ0O1xuICAgIHtcbiAgICAgIHZhciB0bXAkcmV0JDM7XG4gICAgICB7XG4gICAgICAgIHRtcCRyZXQkMyA9IGJ1aWxkZXI7XG4gICAgICB9XG4gICAgICB0bXAkcmV0JDQgPSB0bXAkcmV0JDNbZ2V0X0NISUxEUkVOKCldO1xuICAgIH1cbiAgICB2YXIgdG1wMF9lbHZpc19saHMgPSB0bXAkcmV0JDQ7XG4gICAgdmFyIHRtcDtcbiAgICBpZiAodG1wMF9lbHZpc19saHMgPT0gbnVsbCkge1xuICAgICAgdmFyIHRtcCRyZXQkNTtcbiAgICAgIHtcbiAgICAgICAgdG1wJHJldCQ1ID0gW107XG4gICAgICB9XG4gICAgICB0bXAgPSB0bXAkcmV0JDU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRtcCA9IHRtcDBfZWx2aXNfbGhzO1xuICAgIH1cbiAgICB2YXIgY2hpbGRyZW4gPSB0bXA7XG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQuYXBwbHkobnVsbCwgW190aGlzX191OGUzczQsIHByb3BzXS5jb25jYXQoW10uc2xpY2UuY2FsbChjaGlsZHJlbi5zbGljZSgpKSkpO1xuICB9XG4gIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRPck51bGwoYmxvY2spIHtcbiAgICB2YXIgdG1wJHJldCQyO1xuICAgIHtcbiAgICAgIHZhciB0bXAkcmV0JDA7XG4gICAgICB7XG4gICAgICAgIHZhciB0bXAwX2FwcGx5ID0gY3JlYXRlQ2hpbGRyZW5CdWlsZGVyKCk7XG4gICAgICAgIHtcbiAgICAgICAgfVxuICAgICAgICBibG9jayh0bXAwX2FwcGx5KTtcbiAgICAgICAgdG1wJHJldCQwID0gdG1wMF9hcHBseTtcbiAgICAgIH1cbiAgICAgIHZhciB0bXAxX19nZXRfY2hpbGRyZW5fXzFrcnI4MSA9IHRtcCRyZXQkMDtcbiAgICAgIHZhciB0bXAkcmV0JDE7XG4gICAgICB7XG4gICAgICAgIHRtcCRyZXQkMSA9IHRtcDFfX2dldF9jaGlsZHJlbl9fMWtycjgxO1xuICAgICAgfVxuICAgICAgdG1wJHJldCQyID0gdG1wJHJldCQxW2dldF9DSElMRFJFTigpXTtcbiAgICB9XG4gICAgdmFyIHRtcDBfZWx2aXNfbGhzID0gdG1wJHJldCQyO1xuICAgIHZhciB0bXA7XG4gICAgaWYgKHRtcDBfZWx2aXNfbGhzID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0bXAgPSB0bXAwX2VsdmlzX2xocztcbiAgICB9XG4gICAgdmFyIGNoaWxkcmVuID0gdG1wO1xuICAgIHZhciB0bXAkcmV0JDM7XG4gICAge1xuICAgICAgdG1wJHJldCQzID0gY2hpbGRyZW4ubGVuZ3RoID09PSAwO1xuICAgIH1cbiAgICBpZiAodG1wJHJldCQzKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIHRtcDFfZWx2aXNfbGhzID0gc2luZ2xlKGNoaWxkcmVuKTtcbiAgICAgIHZhciB0bXBfMDtcbiAgICAgIGlmICh0bXAxX2VsdmlzX2xocyA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG1wXzAgPSB0bXAxX2VsdmlzX2xocztcbiAgICAgIH1cbiAgICAgIHZhciBjaGlsZCA9IHRtcF8wO1xuICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICB2YXIgdG1wJHJldCQ1O1xuICAgICAgICB7XG4gICAgICAgICAgdmFyIHRtcCRyZXQkNDtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0bXAkcmV0JDQgPSBjaGlsZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdG1wJHJldCQ1ID0gdG1wJHJldCQ0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0bXAkcmV0JDU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVFbGVtZW50LmFwcGx5KG51bGwsIFtGcmFnbWVudCwgdm9pZCAxXS5jb25jYXQoW10uc2xpY2UuY2FsbChjaGlsZHJlbi5zbGljZSgpKSkpO1xuICB9XG4gIC8vcmVnaW9uIGJsb2NrOiBwb3N0LWRlY2xhcmF0aW9uXG4gIENoaWxkcmVuQnVpbGRlckltcGwucHJvdG90eXBlLnUgPSB1bmFyeVBsdXM7XG4gIENoaWxkcmVuQnVpbGRlckltcGwucHJvdG90eXBlLnYgPSB1bmFyeVBsdXNfMDtcbiAgQ2hpbGRyZW5CdWlsZGVySW1wbC5wcm90b3R5cGUudCA9IGNoaWxkO1xuICBDaGlsZHJlbkJ1aWxkZXJJbXBsLnByb3RvdHlwZS53ID0gaW52b2tlO1xuICAvL2VuZHJlZ2lvblxuICAvL3JlZ2lvbiBibG9jazogZXhwb3J0c1xuICBfLiRfJCA9IF8uJF8kIHx8IHt9O1xuICBfLiRfJC5hID0gRkM7XG4gIF8uJF8kLmIgPSBjcmVhdGU7XG4gIC8vZW5kcmVnaW9uXG4gIHJldHVybiBfO1xufSkpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1rb3RsaW4td3JhcHBlcnMta290bGluLXJlYWN0LWpzLWlyLmpzLm1hcFxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9mcm9udGVuZC8uL2tvdGxpbi9rb3RsaW4td3JhcHBlcnMta290bGluLXJlYWN0LWpzLWlyLmpzPyIpOwoKLyoqKi8gfSkKCi8qKioqKiovIAl9KTsKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKi8gCS8vIFRoZSBtb2R1bGUgY2FjaGUKLyoqKioqKi8gCXZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTsKLyoqKioqKi8gCQovKioqKioqLyAJLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KLyoqKioqKi8gCWZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHsKLyoqKioqKi8gCQkvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGUKLyoqKioqKi8gCQl2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTsKLyoqKioqKi8gCQlpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHsKLyoqKioqKi8gCQkJcmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzOwovKioqKioqLyAJCX0KLyoqKioqKi8gCQkvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQovKioqKioqLyAJCXZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0gewovKioqKioqLyAJCQlpZDogbW9kdWxlSWQsCi8qKioqKiovIAkJCWxvYWRlZDogZmFsc2UsCi8qKioqKiovIAkJCWV4cG9ydHM6IHt9Ci8qKioqKiovIAkJfTsKLyoqKioqKi8gCQovKioqKioqLyAJCS8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvbgovKioqKioqLyAJCV9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pOwovKioqKioqLyAJCi8qKioqKiovIAkJLy8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZAovKioqKioqLyAJCW1vZHVsZS5sb2FkZWQgPSB0cnVlOwovKioqKioqLyAJCi8qKioqKiovIAkJLy8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGUKLyoqKioqKi8gCQlyZXR1cm4gbW9kdWxlLmV4cG9ydHM7Ci8qKioqKiovIAl9Ci8qKioqKiovIAkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKi8gCS8qIHdlYnBhY2svcnVudGltZS9ub2RlIG1vZHVsZSBkZWNvcmF0b3IgKi8KLyoqKioqKi8gCSgoKSA9PiB7Ci8qKioqKiovIAkJX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSAobW9kdWxlKSA9PiB7Ci8qKioqKiovIAkJCW1vZHVsZS5wYXRocyA9IFtdOwovKioqKioqLyAJCQlpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107Ci8qKioqKiovIAkJCXJldHVybiBtb2R1bGU7Ci8qKioqKiovIAkJfTsKLyoqKioqKi8gCX0pKCk7Ci8qKioqKiovIAkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKi8gCQovKioqKioqLyAJLy8gc3RhcnR1cAovKioqKioqLyAJLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzCi8qKioqKiovIAkvLyBUaGlzIGVudHJ5IG1vZHVsZSBpcyByZWZlcmVuY2VkIGJ5IG90aGVyIG1vZHVsZXMgc28gaXQgY2FuJ3QgYmUgaW5saW5lZAovKioqKioqLyAJdmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuL2tvdGxpbi9lbGlkZS1mcm9udGVuZC5qcyIpOwovKioqKioqLyAJCi8qKioqKiovIAlyZXR1cm4gX193ZWJwYWNrX2V4cG9ydHNfXzsKLyoqKioqKi8gfSkoKQo7Cn0pOw==", + "integrity": [ + { + "hash": "SHA256", + "salt": "", + "fingerprint": "RzcGqZL74v6e3j3g9TU7x2Zk37AFy4Q8Y2hMy2NoqUw=" + } + ] + }, + "size": "1206049", + "integrity": [] + }, + { + "compression": "BROTLI", + "data": { + "raw": "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", + "integrity": [] + }, + "size": "202007", + "integrity": [ + { + "hash": "SHA256", + "salt": "", + "fingerprint": "EHotbPdiw9x+qmb8yfej4aKO2DBCBcmKmLKb+ni3u6g=" + } + ] + }, + { + "compression": "DEFLATE", + "data": { + "raw": "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", + "integrity": [] + }, + "size": "266017", + "integrity": [ + { + "hash": "SHA256", + "salt": "", + "fingerprint": "6mwesEtkawcvApIb34f1Nu4ghLcIFgm1i/S9FrRkJeI=" + } + ] + }, + { + "compression": "GZIP", + "data": { + "raw": "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", + "integrity": [] + }, + "size": "266029", + "integrity": [ + { + "hash": "SHA256", + "salt": "", + "fingerprint": "KQw7x95v0GbCjHDpoZPJTeJ/VNvWrU4Uwv6F/Hb0G/k=" + } + ] + } + ] + } + ] +} diff --git a/buf.work.yaml b/buf.work.yaml index 832147cab4..1878b341be 100644 --- a/buf.work.yaml +++ b/buf.work.yaml @@ -1,4 +1,3 @@ version: v1 directories: - proto - diff --git a/build.gradle.kts b/build.gradle.kts index 58e1068d1e..a7b6b74931 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,22 +1,18 @@ @file:Suppress( "UnstableApiUsage", "unused", - "UNUSED_VARIABLE", "DSL_SCOPE_VIOLATION", ) import java.util.Properties plugins { - kotlin("plugin.allopen") version libs.versions.kotlin.sdk.get() apply false - kotlin("plugin.serialization") version libs.versions.kotlin.sdk.get() apply false id("project-report") - alias(libs.plugins.dokka) - alias(libs.plugins.detekt) + id("org.sonarqube") + id("org.jetbrains.kotlinx.kover") + id("io.gitlab.arturbosch.detekt") alias(libs.plugins.qodana) alias(libs.plugins.ktlint) - alias(libs.plugins.sonar) - alias(libs.plugins.versionCheck) alias(libs.plugins.doctor) jacoco signing @@ -42,27 +38,13 @@ props.load(file(if (project.hasProperty("elide.ci") && project.properties["elide "local.properties" }).inputStream()) +val isCI = project.hasProperty("elide.ci") && project.properties["elide.ci"] == "true" + val javaLanguageVersion = project.properties["versions.java.language"] as String val kotlinLanguageVersion = project.properties["versions.kotlin.language"] as String val ecmaVersion = project.properties["versions.ecma.language"] as String -tasks.dokkaHtmlMultiModule.configure { - outputDirectory.set(buildDir.resolve("docs/kotlin/html")) -} - -tasks.dokkaGfmMultiModule.configure { - outputDirectory.set(buildDir.resolve("docs/kotlin/gfm")) -} - -tasks.create("docs") { - dependsOn(listOf( - "dokkaHtmlMultiModule", - "dokkaGfmMultiModule", - ":packages:graalvm:dokkaJavadoc", - ":packages:rpc-jvm:dokkaJavadoc", - ":packages:server:dokkaJavadoc", - )) -} +val buildDocs by properties buildscript { repositories { @@ -72,6 +54,7 @@ buildscript { maven("https://plugins.gradle.org/m2/") } dependencies { + classpath("org.jetbrains.dokka:dokka-gradle-plugin:${libs.versions.dokka.get()}") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${libs.versions.kotlin.sdk.get()}") if (project.hasProperty("elide.pluginMode") && project.properties["elide.pluginMode"] == "repository") { classpath("dev.elide.buildtools:plugin:${project.properties["elide.pluginVersion"] as String}") @@ -100,11 +83,14 @@ sonarqube { property("sonar.dynamicAnalysis", "reuseReports") property("sonar.junit.reportsPath", "build/reports/") property("sonar.java.coveragePlugin", "jacoco") - property("sonar.jacoco.reportPath", "build/jacoco/test.exec") property("sonar.sourceEncoding", "UTF-8") + property("sonar.coverage.jacoco.xmlReportPaths", "$buildDir/reports/kover/merged/xml/report.xml") } } +val dokkaVersion = libs.versions.dokka.get() +val mermaidDokka = "0.4.1" + subprojects { val name = this.name @@ -112,28 +98,65 @@ subprojects { plugin("io.gitlab.arturbosch.detekt") plugin("org.jlleitschuh.gradle.ktlint") plugin("org.sonarqube") + + if (buildDocs == "true") { + plugin("org.jetbrains.dokka") + } + } + + if (buildDocs == "true") { + val dokkaPlugin by configurations + dependencies { + dokkaPlugin("org.jetbrains.dokka:versioning-plugin:$dokkaVersion") + dokkaPlugin("org.jetbrains.dokka:templating-plugin:$dokkaVersion") + dokkaPlugin("org.jetbrains.dokka:kotlin-as-java-plugin:$dokkaVersion") +// dokkaPlugin("com.glureau:html-mermaid-dokka-plugin:$mermaidDokka") + } } sonarqube { - if (name != "base" && name != "test" && name != "model") { - properties { - property("sonar.sources", "src/main/kotlin") - property("sonar.tests", "src/test/kotlin") - property("sonar.jacoco.reportPath", "build/jacoco/test.exec") - } - } else { - properties { - property("sonar.sources", "src/commonMain/kotlin,src/jvmMain/kotlin,src/jsMain/kotlin,src/nativeMain/kotlin") - property("sonar.tests", "src/commonTest/kotlin,src/jvmTest/kotlin,src/jsTest/kotlin,src/nativeTest/kotlin") + properties { + if (!Elide.noTestModules.contains(name)) { + when { + // pure Java/Kotlin coverage + Elide.serverModules.contains(name) -> { + property("sonar.sources", "src/main/kotlin") + property("sonar.tests", "src/test/kotlin") + property("sonar.java.binaries", "$buildDir/classes/kotlin/main") + property("sonar.coverage.jacoco.xmlReportPaths", listOf( + "$buildDir/reports/jacoco/testCodeCoverageReport/testCodeCoverageReport.xml", + "$buildDir/reports/jacoco/testCodeCoverageReport/jacocoTestReport.xml", + "$buildDir/reports/jacoco/test/jacocoTestReport.xml", + "$buildDir/reports/kover/xml/report.xml", + )) + } + + // KotlinJS coverage via Kover + Elide.frontendModules.contains(name) -> { + property("sonar.sources", "src/main/kotlin") + property("sonar.tests", "src/test/kotlin") + property("sonar.coverage.jacoco.xmlReportPaths", "$buildDir/reports/kover/xml/report.xml") + } + + // Kotlin MPP coverage via Kover + Elide.multiplatformModules.contains(name) -> { + property("sonar.sources", "src/commonMain/kotlin,src/jvmMain/kotlin,src/jsMain/kotlin,src/nativeMain/kotlin") + property("sonar.tests", "src/commonTest/kotlin,src/jvmTest/kotlin,src/jsTest/kotlin,src/nativeTest/kotlin") + property("sonar.java.binaries", "$buildDir/classes/kotlin/jvm/main") + property("sonar.coverage.jacoco.xmlReportPaths", listOf( + "$buildDir/reports/kover/xml/report.xml", + )) + } + } } } } ktlint { debug.set(false) - verbose.set(true) + verbose.set(false) android.set(false) - outputToConsole.set(true) + outputToConsole.set(false) ignoreFailures.set(true) enableExperimentalRules.set(true) filter { @@ -144,10 +167,25 @@ subprojects { } detekt { + parallel = true ignoreFailures = true config = rootProject.files("config/detekt/detekt.yml") } + val detektMerge by tasks.registering(io.gitlab.arturbosch.detekt.report.ReportMergeTask::class) { + output.set(rootProject.buildDir.resolve("reports/detekt/elide.sarif")) + } + + plugins.withType(io.gitlab.arturbosch.detekt.DetektPlugin::class) { + tasks.withType(io.gitlab.arturbosch.detekt.Detekt::class) detekt@{ + finalizedBy(detektMerge) + reports.sarif.required.set(true) + detektMerge.configure { + input.from(this@detekt.sarifReportFile) // or .sarifReportFile + } + } + } + afterEvaluate { if (tasks.findByName("check") != null) { tasks.getByName("check") { @@ -177,31 +215,6 @@ allprojects { mavenCentral() google() } - tasks.withType().configureEach { - sourceCompatibility = javaLanguageVersion - targetCompatibility = javaLanguageVersion - } - tasks.withType().configureEach { - kotlinOptions { - apiVersion = kotlinLanguageVersion - languageVersion = kotlinLanguageVersion - } - } - tasks.withType().configureEach { - kotlinOptions { - apiVersion = kotlinLanguageVersion - languageVersion = kotlinLanguageVersion - jvmTarget = javaLanguageVersion - javaParameters = true - } - } - tasks.withType().configureEach { - kotlinOptions { - apiVersion = kotlinLanguageVersion - languageVersion = kotlinLanguageVersion - target = ecmaVersion - } - } } tasks.register("resolveAndLockAll") { @@ -242,7 +255,55 @@ if (tasks.findByName("resolveAllDependencies") == null) { } } +koverMerged { + enable() + + xmlReport { + onCheck.set(isCI) + } + + htmlReport { + onCheck.set(isCI) + } +} + +tasks.register("samples") { + description = "Build and test all built-in code samples, in the `samples` path and with Knit." + + dependsOn( + "buildSamples", + "testSamples", + "nativeTestSamples", + ) +} + +tasks.register("buildSamples") { + description = "Assemble all sample code." + + Elide.samplesList.forEach { + dependsOn("$it:assemble") + } +} + +tasks.register("testSamples") { + description = "Run all tests for sample code." + + Elide.samplesList.forEach { + dependsOn("$it:test") + } +} + +tasks.register("nativeTestSamples") { + description = "Run native (GraalVM) tests for sample code." + + Elide.samplesList.forEach { + dependsOn("$it:nativeTest") + } +} + tasks.register("reports") { + description = "Build all reports." + dependsOn( ":dependencyReport", ":htmlDependencyReport", @@ -259,3 +320,32 @@ tasks.register("preMerge") { ":check", ) } + +afterEvaluate { + tasks.named("koverMergedReport") { + Elide.multiplatformModules.plus( + Elide.serverModules + ).plus( + Elide.frontendModules + ).forEach { + dependsOn(":packages:$it:koverXmlReport") + } + } +} + +if (buildDocs == "true") { + tasks.named("dokkaHtmlMultiModule", org.jetbrains.dokka.gradle.DokkaMultiModuleTask::class).configure { + includes.from("README.md") + outputDirectory.set(buildDir.resolve("docs/kotlin/html")) + } + + tasks.create("docs") { + dependsOn(listOf( + "dokkaHtmlMultiModule", + "dokkaGfmMultiModule", + ":packages:graalvm:dokkaJavadoc", + ":packages:rpc-jvm:dokkaJavadoc", + ":packages:server:dokkaJavadoc", + )) + } +} diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index c7638d5542..ed01166bd8 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -1,9 +1,16 @@ +@file:Suppress( + "DSL_SCOPE_VIOLATION", +) + val kotlinVersion = "1.7.21" plugins { `kotlin-dsl` + `kotlin-dsl-precompiled-script-plugins` } +val buildDocs by properties + repositories { maven("https://maven-central.storage-download.googleapis.com/maven2/") mavenCentral() @@ -13,5 +20,22 @@ repositories { dependencies { api(kotlin("gradle-plugin")) + implementation(libs.plugin.graalvm) + implementation(libs.plugin.docker) + implementation(libs.plugin.detekt) + implementation(libs.plugin.kover) + implementation(libs.plugin.micronaut) + implementation(libs.plugin.sonar) + implementation(libs.plugin.spotless) + implementation(libs.plugin.testLogger) + implementation(libs.plugin.versionCheck) + implementation(libs.plugin.kotlin.allopen) + implementation(libs.plugin.kotlin.noarg) + implementation(libs.plugin.kotlinx.atomicfu) + implementation(libs.plugin.kotlinx.serialization) + implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location)) implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") + if (buildDocs == "true") { + implementation(libs.plugin.dokka) + } } diff --git a/buildSrc/gradle.properties b/buildSrc/gradle.properties new file mode 100644 index 0000000000..1e759eb87b --- /dev/null +++ b/buildSrc/gradle.properties @@ -0,0 +1,30 @@ +# Settings Elide +buildDocs = false +elide.buildMode = dev +elide.strict = true +elide.pluginMode = repository +elide.stamp = false +elide.atomicFu = false +elide.lockDeps = false +elide.graalvm.variant = COMMUNITY +elide.vm.inspect = false +elide.kotlin.k2 = false +publishMainHostLock = false + +org.gradle.parallel = true +org.gradle.caching = true +org.gradle.configureondemand = true +org.gradle.jvmargs = -XX:MaxMetaspaceSize=1024m -XX:+UseParallelGC -Xmx2g + +# Settings: Kotlin +kotlin.code.style = official +kotlin.js.compiler = both +kotlin.js.generate.executable.default = false +kotlin.parallel.tasks.in.project = true +kotlin.build.report.output = build_scan +kotlin.incremental = true +kotlin.incremental.useClasspathSnapshot = true +kotlin.mpp.stability.nowarn = true +kotlin.mpp.enableCInteropCommonization = true +kotlin.mpp.enableCompatibilityMetadataVariant = true +kotlin.native.binary.memoryModel = experimental diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts new file mode 100644 index 0000000000..9ec80afd72 --- /dev/null +++ b/buildSrc/settings.gradle.kts @@ -0,0 +1,10 @@ + +dependencyResolutionManagement { + versionCatalogs { + create("libs") { + from(files("../gradle/elide.versions.toml")) + } + } +} + +rootProject.name = "elideBuild" diff --git a/buildSrc/src/main/kotlin/Elide.kt b/buildSrc/src/main/kotlin/Elide.kt new file mode 100644 index 0000000000..a72d3a3d64 --- /dev/null +++ b/buildSrc/src/main/kotlin/Elide.kt @@ -0,0 +1,116 @@ + +/** Static library configuration values. */ +object Elide { + /** Name of the library. */ + const val name = "elide" + + /** Major release version for Elide. */ + const val track = "v3" + + /** Major library version. */ + const val majorVersion = "1.0" + + /** Major library version tag. */ + const val versionTag = "alpha1" + + /** Revision value for the library. */ + const val revision = 33 + + /** Version string for the library. */ + const val version = "$majorVersion-$track-$versionTag-rc$revision" + + /** Latest plugin version. */ + const val pluginVersion = "1.0.0-beta12" + + /** Maven group shared by Elide artifacts. */ + const val group = "dev.elide" + + /** Compiler args to include in all Kotlin targets. */ + val compilerArgs = listOf( + "-progressive", + "-Xcontext-receivers", + ) + + /** Compiler args to include in Kotlin JVM targets. */ + val jvmCompilerArgs = compilerArgs.plus(listOf( + "-no-stdlib", + "-Xjvm-default=all", + )) + + /** Compiler args to include in Kotlin JS targets. */ + val jsCompilerArgs = compilerArgs.plus(listOf( + "-Xgenerate-dts", + )) + + /** Compiler args to include in Kotlin MPP targets. */ + val mppCompilerArgs = compilerArgs + + /** Compiler args to include in Kotlin JVM targets which use `kapt`. */ + val kaptCompilerArgs = compilerArgs.plus(listOf( + "-no-stdlib", + "-Xallow-unstable-dependencies", + "-Xemit-jvm-type-annotations", + "-Xjvm-default=all", + )) + + /** Kotlin SDK and platform version. */ + const val kotlinSdk = "1.7.21" + + /** Kotlin language version. */ + const val kotlinLanguage = "1.7" + + /** Sample code modules. */ + val samplesList = listOf( + ":samples:server:hellocss", + ":samples:server:helloworld", + ":samples:fullstack:basic:server", + ":samples:fullstack:react:server", + ":samples:fullstack:ssr:server", + ":samples:fullstack:react-ssr:server", + ) + + /** Kotlin MPP modules. */ + val multiplatformModules = listOf( + "base", + "model", + "test", + ) + + /** Server-side only modules. */ + val serverModules = listOf( + "graalvm", + "server", + "rpc-jvm", + "ssg", + ) + + /** Browser-side only modules. */ + val frontendModules = listOf( + "frontend", + "graalvm-js", + "graalvm-react", + "rpc-js", + ) + + /** Modules which should not be reported on for testing.. */ + val noTestModules = listOf( + "bom", + "platform", + "proto", + "packages", + "processor", + "reports", + "bundler", + "samples", + "site", + "ssg", + "docs", + "model", + "benchmarks", + "frontend", + "graalvm-js", + "graalvm-react", + "rpc-js", + "test", + ) +} diff --git a/buildSrc/src/main/kotlin/Java9Modularity.kt b/buildSrc/src/main/kotlin/Java9Modularity.kt new file mode 100644 index 0000000000..19a7d9494a --- /dev/null +++ b/buildSrc/src/main/kotlin/Java9Modularity.kt @@ -0,0 +1,108 @@ +/* + * Copyright 2017-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +import org.gradle.api.* +import org.gradle.api.tasks.bundling.* +import org.gradle.api.tasks.compile.* +import org.gradle.kotlin.dsl.* +import org.jetbrains.kotlin.gradle.dsl.* +import org.jetbrains.kotlin.gradle.plugin.mpp.* +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.* +import org.jetbrains.kotlin.gradle.targets.jvm.* +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import java.io.* + +object Java9Modularity { + + @JvmStatic + @JvmOverloads + fun Project.configureJava9ModuleInfo(multiRelease: Boolean = true) { + val kotlin = extensions.findByType() ?: return + val jvmTargets = kotlin.targets.filter { it is KotlinJvmTarget || it is KotlinWithJavaTarget<*> } + if (jvmTargets.isEmpty()) { + logger.warn("No Kotlin JVM targets found, can't configure compilation of module-info!") + } + jvmTargets.forEach { target -> + val artifactTask = tasks.getByName(target.artifactsTaskName) { + if (multiRelease) { + manifest { + attributes("Multi-Release" to true) + } + } + } + + target.compilations.forEach { compilation -> + val compileKotlinTask = compilation.compileKotlinTask as KotlinCompile + val defaultSourceSet = compilation.defaultSourceSet + + // derive the names of the source set and compile module task + val sourceSetName = defaultSourceSet.name + "Module" + val compileModuleTaskName = compileKotlinTask.name + "Module" + + kotlin.sourceSets.create(sourceSetName) { + val sourceFile = this.kotlin.find { it.name == "module-info.java" } + val targetFile = compileKotlinTask.destinationDirectory.file("../module-info.class").get().asFile + + // only configure the compilation if necessary + if (sourceFile != null) { + // the default source set depends on this new source set + defaultSourceSet.dependsOn(this) + + // register a new compile module task + val compileModuleTask = registerCompileModuleTask(compileModuleTaskName, compileKotlinTask, sourceFile, targetFile) + + // add the resulting module descriptor to this target's artifact + artifactTask.dependsOn(compileModuleTask) + artifactTask.from(targetFile) { + if (multiRelease) { + into("META-INF/versions/9/") + } + } + } else { + logger.info("No module-info.java file found in ${this.kotlin.srcDirs}, can't configure compilation of module-info!") + // remove the source set to prevent Gradle warnings + kotlin.sourceSets.remove(this) + } + } + } + } + } + + private fun Project.registerCompileModuleTask(taskName: String, compileTask: KotlinCompile, sourceFile: File, targetFile: File) = + tasks.register(taskName, JavaCompile::class) { + // Also add the module-info.java source file to the Kotlin compile task; + // the Kotlin compiler will parse and check module dependencies, + // but it currently won't compile to a module-info.class file. + compileTask.source(sourceFile) + + + // Configure the module compile task. + dependsOn(compileTask) + source(sourceFile) + outputs.file(targetFile) + classpath = files() + destinationDirectory.set(compileTask.destinationDirectory) + sourceCompatibility = JavaVersion.VERSION_1_9.toString() + targetCompatibility = JavaVersion.VERSION_1_9.toString() + + doFirst { + // Provide the module path to the compiler instead of using a classpath. + // The module path should be the same as the classpath of the compiler. + options.compilerArgs = listOf( + "--release", "9", + "--module-path", compileTask.libraries.asPath, + "-Xlint:-requires-transitive-automatic" + ) + } + + doLast { + // Move the compiled file out of the Kotlin compile task's destination dir, + // so it won't disturb Gradle's caching mechanisms. + val compiledFile = destinationDirectory.file(targetFile.name).get().asFile + targetFile.parentFile.mkdirs() + compiledFile.renameTo(targetFile) + } + } +} diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index ed2ab97363..651532bf38 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -1,6 +1,30 @@ /** Declares common build script versions. */ object Versions { + /** Kotlin version. */ const val kotlin = "1.7.21" + + /** Micronaut version. */ + const val micronaut = "3.7.3" + + /** Ant/JUnit version. */ const val antJUnit = "1.10.12" + + /** Static Netty version. */ + const val netty = "4.1.85.Final" + + /** Protocol Buffers version. */ + const val protobuf = "3.21.2" + + /** Guava version. */ + const val guava = "31.1-jre" + + /** gRPC version. */ + const val grpc = "1.50.2" + + /** GraalVM version. */ + const val graalvm = "22.3.0" + + /** GraalVM Reachability Metadata version. */ + const val graalvmMetadata = "0.2.4" } diff --git a/buildSrc/src/main/kotlin/dev.elide.build.core.gradle.kts b/buildSrc/src/main/kotlin/dev.elide.build.core.gradle.kts new file mode 100644 index 0000000000..dc0d3e23d9 --- /dev/null +++ b/buildSrc/src/main/kotlin/dev.elide.build.core.gradle.kts @@ -0,0 +1,147 @@ +import java.net.URI + +plugins { + `maven-publish` + distribution + signing + idea + + id("com.adarshr.test-logger") + id("com.github.ben-manes.versions") + id("com.diffplug.spotless") + id("io.gitlab.arturbosch.detekt") + id("org.sonarqube") +} + + +// Dependencies: Locking +// --------------------- +// Produces sealed dependency locks for each module. +dependencyLocking { + ignoredDependencies.addAll(listOf( + "org.jetbrains.kotlinx:atomicfu*", + "org.jetbrains.kotlinx:kotlinx-serialization*", + )) +} + +tasks.register("resolveAndLockAll") { + doFirst { + require(gradle.startParameter.isWriteDependencyLocks) + } + doLast { + configurations.filter { + // Add any custom filtering on the configurations to be resolved + it.isCanBeResolved + }.forEach { it.resolve() } + } +} + +// Dependencies: Conflicts +// ----------------------- +// Establishes a strict conflict policy for dependencies. +configurations.all { + resolutionStrategy { + // fail eagerly on version conflict (includes transitive dependencies) + failOnVersionConflict() + + // prefer modules that are part of this build + preferProjectModules() + + if (name.contains("detached")) { + disableDependencyVerification() + } + } +} + +// Artifacts: Signing +// ------------------ +// If so directed, make sure to sign outgoing artifacts. +signing { + if (project.hasProperty("enableSigning") && project.properties["enableSigning"] == "true") { + sign(configurations.archives.get()) + sign(publishing.publications) + } +} + +// Artifacts: Publishing +// --------------------- +// Settings for publishing library artifacts to Maven repositories. +publishing { + repositories { + maven { + name = "elide" + url = URI.create(project.properties["elide.publish.repo.maven"] as String) + + if (project.hasProperty("elide.publish.repo.maven.auth")) { + credentials { + username = (project.properties["elide.publish.repo.maven.username"] as? String + ?: System.getenv("PUBLISH_USER"))?.ifBlank { null } + password = (project.properties["elide.publish.repo.maven.password"] as? String + ?: System.getenv("PUBLISH_TOKEN"))?.ifBlank { null } + } + } + } + } + + publications.withType { + pom { + name.set("Elide") + description.set("Polyglot application framework") + url.set("https://github.com/elide-dev/v3") + + licenses { + license { + name.set("Properity License") + url.set("https://github.com/elide-dev/v3/blob/v3/LICENSE") + } + } + developers { + developer { + id.set("sgammon") + name.set("Sam Gammon") + email.set("samuel.gammon@gmail.com") + } + } + scm { + url.set("https://github.com/elide-dev/v3") + } + } + } +} + +// Tasks: Test +// ----------- +// Settings for testsuite execution. +tasks.withType().configureEach { + maxParallelForks = 4 +} + +// Tasks: Tar +// ---------- +// Configure tasks which produce tarballs (improves caching/hermeticity). +tasks.withType().configureEach { + isReproducibleFileOrder = true + isPreserveFileTimestamps = false +} + +// Tasks: Zip +// ---------- +// Configure tasks which produce zip archives (improves caching/hermeticity). +tasks.withType().configureEach { + isReproducibleFileOrder = true + isPreserveFileTimestamps = false +} + +// Plugin: Test Logger +// ------------------- +// Configure test logging. +testlogger { + theme = com.adarshr.gradle.testlogger.theme.ThemeType.MOCHA_PARALLEL + showExceptions = true + showFailed = true + showPassed = true + showSkipped = true + showFailedStandardStreams = true + showFullStackTraces = true + slowThreshold = 30000L +} diff --git a/buildSrc/src/main/kotlin/dev.elide.build.docker.gradle.kts b/buildSrc/src/main/kotlin/dev.elide.build.docker.gradle.kts new file mode 100644 index 0000000000..2fb9fccd5b --- /dev/null +++ b/buildSrc/src/main/kotlin/dev.elide.build.docker.gradle.kts @@ -0,0 +1,22 @@ +plugins { + kotlin("jvm") + id("io.micronaut.docker") +} + +// Compiler: Docker +// ---------------- +// Configure Docker compiler. +docker { + if (project.hasProperty("elide.ci") && (project.properties["elide.ci"] as String) == "true") { + val creds = System.getenv("GOOGLE_APPLICATION_CREDENTIALS") + if (creds?.isNotBlank() == true) { + registryCredentials { + url.set("https://us-docker.pkg.dev") + username.set("_json_key") + password.set(file(creds).readText()) + } + } else error( + "Failed to resolve Docker credentials for CI" + ) + } +} diff --git a/buildSrc/src/main/kotlin/dev.elide.build.js.gradle.kts b/buildSrc/src/main/kotlin/dev.elide.build.js.gradle.kts new file mode 100644 index 0000000000..4d40c9e8c8 --- /dev/null +++ b/buildSrc/src/main/kotlin/dev.elide.build.js.gradle.kts @@ -0,0 +1,66 @@ +import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile +import org.jetbrains.kotlin.gradle.tasks.KotlinCompileCommon + +plugins { + kotlin("js") + kotlin("kapt") + kotlin("plugin.serialization") + id("org.jetbrains.kotlinx.kover") + id("dev.elide.build.core") +} + +val kotlinLanguageVersion = project.properties["versions.kotlin.language"] as String +val strictMode = project.properties["versions.java.language"] as String == "true" + +// Compiler: Kotlin +// ---------------- +// Settings for compiling Kotlin to JavaScript. +kotlin { + js(IR) { + browser() + } + + publishing { + publications { + create("main") { + groupId = "dev.elide" + artifactId = project.name + version = rootProject.version as String + + from(components["kotlin"]) + } + } + } +} + +// Tool: Kover +// ----------- +// Settings for Kotlin coverage. +kover { + xmlReport { + onCheck.set(true) + } +} + +// Sources: Kotlin +// --------------- +// Shared configuration for Kotlin language and compiler. +kotlin { + sourceSets.all { + languageSettings.apply { + apiVersion = kotlinLanguageVersion + languageVersion = kotlinLanguageVersion + progressiveMode = true + optIn("kotlin.ExperimentalUnsignedTypes") + } + } +} + +tasks.withType().configureEach { + kotlinOptions.apply { + apiVersion = kotlinLanguageVersion + languageVersion = kotlinLanguageVersion + freeCompilerArgs = Elide.jsCompilerArgs + allWarningsAsErrors = strictMode + } +} diff --git a/buildSrc/src/main/kotlin/dev.elide.build.js.node.gradle.kts b/buildSrc/src/main/kotlin/dev.elide.build.js.node.gradle.kts new file mode 100644 index 0000000000..73141d0039 --- /dev/null +++ b/buildSrc/src/main/kotlin/dev.elide.build.js.node.gradle.kts @@ -0,0 +1,66 @@ +import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile +import org.jetbrains.kotlin.gradle.tasks.KotlinCompileCommon + +plugins { + kotlin("js") + kotlin("kapt") + kotlin("plugin.serialization") + id("org.jetbrains.kotlinx.kover") + id("dev.elide.build.core") +} + +val kotlinLanguageVersion = project.properties["versions.kotlin.language"] as String +val strictMode = project.properties["versions.java.language"] as String == "true" + +// Compiler: Kotlin +// ---------------- +// Settings for compiling Kotlin to JavaScript. +kotlin { + js(IR) { + nodejs() + } + + publishing { + publications { + create("main") { + groupId = "dev.elide" + artifactId = project.name + version = rootProject.version as String + + from(components["kotlin"]) + } + } + } +} + +// Tool: Kover +// ----------- +// Settings for Kotlin coverage. +kover { + xmlReport { + onCheck.set(true) + } +} + +// Sources: Kotlin +// --------------- +// Shared configuration for Kotlin language and compiler. +kotlin { + sourceSets.all { + languageSettings.apply { + apiVersion = kotlinLanguageVersion + languageVersion = kotlinLanguageVersion + progressiveMode = true + optIn("kotlin.ExperimentalUnsignedTypes") + } + } +} + +tasks.withType().configureEach { + kotlinOptions.apply { + apiVersion = kotlinLanguageVersion + languageVersion = kotlinLanguageVersion + freeCompilerArgs = Elide.jsCompilerArgs + allWarningsAsErrors = strictMode + } +} diff --git a/buildSrc/src/main/kotlin/dev.elide.build.jvm.gradle.kts b/buildSrc/src/main/kotlin/dev.elide.build.jvm.gradle.kts new file mode 100644 index 0000000000..cd983fc168 --- /dev/null +++ b/buildSrc/src/main/kotlin/dev.elide.build.jvm.gradle.kts @@ -0,0 +1,160 @@ +@file:Suppress( + "UnstableApiUsage", + "unused", + "UNUSED_VARIABLE", + "DSL_SCOPE_VIOLATION", +) + +plugins { + java + jacoco + `jvm-test-suite` + `maven-publish` + + id("dev.elide.build.core") + id("dev.elide.build.kotlin") +} + +val javaLanguageVersion = project.properties["versions.java.language"] as String +val ecmaVersion = project.properties["versions.ecma.language"] as String +val strictMode = project.properties["versions.java.language"] as String == "true" +val buildDocs = project.properties["buildDocs"] as String == "true" + +// Compiler: Kotlin +// ---------------- +// Override with JVM-specific (non-kapt) arguments. +tasks.withType().configureEach { + kotlinOptions { + apiVersion = Elide.kotlinLanguage + languageVersion = Elide.kotlinLanguage + jvmTarget = javaLanguageVersion + javaParameters = true + freeCompilerArgs = Elide.jvmCompilerArgs + allWarningsAsErrors = strictMode + incremental = true + } +} + +// JVM: Testing +// ------------ +// JVM test suite configuration. +testing { + suites { + val test by getting(JvmTestSuite::class) { + useJUnitJupiter() + } + } +} + +// Tasks: Javadoc Jar +// ------------------ +// Build Javadocs from Dokka. +val javadocJar by tasks.creating(Jar::class) { + archiveClassifier.set("javadoc") + isPreserveFileTimestamps = false + isReproducibleFileOrder = true + + if (buildDocs) { + from(tasks.named("dokkaJavadoc")) + } +} + +// Compiler: Java +// -------------- +// Configure Java compiler. +java { + withSourcesJar() + if (buildDocs) { + withJavadocJar() + } + + toolchain { + languageVersion.set(JavaLanguageVersion.of((project.properties["versions.java.language"] as String))) + vendor.set(JvmVendorSpec.GRAAL_VM) + if (project.hasProperty("elide.graalvm.variant")) { + val variant = project.property("elide.graalvm.variant") as String + if (variant != "COMMUNITY") { + vendor.set(JvmVendorSpec.matching(when (variant.trim()) { + "ENTERPRISE" -> "Oracle" + else -> "GraalVM Community" + })) + } + } + } +} + +tasks.withType().configureEach { + sourceCompatibility = javaLanguageVersion + targetCompatibility = javaLanguageVersion + options.isFork = true + options.isIncremental = true +} + +tasks.withType().configureEach { + isFailOnError = false +} + +// Artifacts: Publishing +// --------------------- +// Settings for publishing library artifacts to Maven repositories. +publishing { + publications.withType { + artifact(tasks.named("sourcesJar")) + if (buildDocs) { + artifact(tasks.named("javadocJar")) + } + } +} + +// Tasks: Binary Jar +// ----------------- +// Configure manifest attributes present for all Elide libraries. +tasks.jar { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + + manifest { + attributes(mapOf( + "Elide-Version" to Elide.version, + )) + } +} + +tasks.withType().configureEach { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} + +// Tasks: Artifacts +// ---------------- +// Mounts configured module artifacts. +tasks { + artifacts { + add("archives", tasks.named("sourcesJar")) + if (buildDocs) { + add("archives", javadocJar) + } + } +} + +// Tasks: Jacoco Report +// -------------------- +// Configures settings for the Jacoco reporting step. +tasks.jacocoTestReport { + dependsOn(tasks.test) + + reports { + xml.required.set(true) + } + + classDirectories.setFrom( + files(classDirectories.files.map { + fileTree(it) { + exclude( + "**/generated/**", + "**/com/**", + "**/grpc/gateway/**", + "**/tools/elide/**", + ) + } + }) + ) +} diff --git a/buildSrc/src/main/kotlin/dev.elide.build.jvm.kapt.gradle.kts b/buildSrc/src/main/kotlin/dev.elide.build.jvm.kapt.gradle.kts new file mode 100644 index 0000000000..682a1f8ac8 --- /dev/null +++ b/buildSrc/src/main/kotlin/dev.elide.build.jvm.kapt.gradle.kts @@ -0,0 +1,160 @@ +@file:Suppress( + "UnstableApiUsage", + "unused", + "UNUSED_VARIABLE", + "DSL_SCOPE_VIOLATION", +) + +plugins { + java + jacoco + `jvm-test-suite` + `maven-publish` + + kotlin("kapt") + id("dev.elide.build.core") + id("dev.elide.build.kotlin") +} + +val javaLanguageVersion = project.properties["versions.java.language"] as String +val ecmaVersion = project.properties["versions.ecma.language"] as String +val strictMode = project.properties["versions.java.language"] as String == "true" +val buildDocs = project.properties["buildDocs"] as String == "true" + +// Compiler: Kotlin +// ---------------- +// Override with JVM-specific (non-kapt) arguments. +tasks.withType().configureEach { + kotlinOptions { + apiVersion = Elide.kotlinLanguage + languageVersion = Elide.kotlinLanguage + jvmTarget = javaLanguageVersion + javaParameters = true + freeCompilerArgs = Elide.kaptCompilerArgs // intentionally eliminates `-Xuse-K2`, which is unsupported by `kapt` + allWarningsAsErrors = strictMode + incremental = true + } +} + +// Compiler: `kapt` +// ---------------- +// Configure Kotlin annotation processing. +kapt { + useBuildCache = true + includeCompileClasspath = false + strictMode = true +} + +// JVM: Testing +// ------------ +// JVM test suite configuration. +testing { + suites { + val test by getting(JvmTestSuite::class) { + useJUnitJupiter() + } + } +} + +// Compiler: Java +// -------------- +// Configure Java compiler. +java { + withSourcesJar() + withJavadocJar() + + toolchain { + languageVersion.set(JavaLanguageVersion.of((project.properties["versions.java.language"] as String))) + vendor.set(JvmVendorSpec.GRAAL_VM) + if (project.hasProperty("elide.graalvm.variant")) { + val variant = project.property("elide.graalvm.variant") as String + if (variant != "COMMUNITY") { + vendor.set(JvmVendorSpec.matching(when (variant.trim()) { + "ENTERPRISE" -> "Oracle" + else -> "GraalVM Community" + })) + } + } + } +} + +tasks.withType().configureEach { + sourceCompatibility = javaLanguageVersion + targetCompatibility = javaLanguageVersion + options.isFork = true + options.isIncremental = true +} + +tasks.withType().configureEach { + isFailOnError = false +} + +// Artifacts: Publishing +// --------------------- +// Settings for publishing library artifacts to Maven repositories. +publishing { + publications.withType { + artifact(tasks.named("sourcesJar")) + if (buildDocs) { + artifact(tasks.named("javadocJar")) + } + } +} + +// Tasks: Javadoc Jar +// ------------------ +// Build Javadocs from Dokka. +val javadocJar = tasks.named("javadocJar") { + if (buildDocs) { + from(tasks.named("dokkaJavadoc")) + } +} + +// Tasks: Binary Jar +// ----------------- +// Configure manifest attributes present for all Elide libraries. +tasks.jar { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + + manifest { + attributes(mapOf( + "Elide-Version" to Elide.version, + )) + } +} + +// Tasks: Artifacts +// ---------------- +// Mounts configured module artifacts. +tasks { + artifacts { + add("archives", tasks.named("sourcesJar")) + if (buildDocs) { + add("archives", javadocJar) + } + } +} + +// Tasks: Jacoco Report +// -------------------- +// Configures settings for the Jacoco reporting step. +tasks.jacocoTestReport { + dependsOn(tasks.test) + + reports { + xml.required.set(true) + } + + classDirectories.setFrom( + files(classDirectories.files.map { + fileTree(it) { + exclude( + "**/generated/**", + "**/com/**", + "**/grpc/gateway/**", + "**/tools/elide/**", + ) + } + }) + ) +} diff --git a/buildSrc/src/main/kotlin/dev.elide.build.kotlin.atomicfu.gradle.kts b/buildSrc/src/main/kotlin/dev.elide.build.kotlin.atomicfu.gradle.kts new file mode 100644 index 0000000000..51964ae245 --- /dev/null +++ b/buildSrc/src/main/kotlin/dev.elide.build.kotlin.atomicfu.gradle.kts @@ -0,0 +1,13 @@ +plugins { + id("kotlinx-atomicfu") +} + +val enableAtomicFu = project.properties["elide.atomicFu"] as String == "true" + +if (enableAtomicFu) { + atomicfu { + transformJs = true + transformJvm = true + jvmVariant = "VH" // `VarHandle` + } +} diff --git a/buildSrc/src/main/kotlin/dev.elide.build.kotlin.gradle.kts b/buildSrc/src/main/kotlin/dev.elide.build.kotlin.gradle.kts new file mode 100644 index 0000000000..ec875b7ca1 --- /dev/null +++ b/buildSrc/src/main/kotlin/dev.elide.build.kotlin.gradle.kts @@ -0,0 +1,67 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + publishing + + kotlin("jvm") + kotlin("plugin.allopen") + kotlin("plugin.noarg") + id("org.jetbrains.kotlinx.kover") + id("dev.elide.build.core") +} + +val strictMode = project.properties["versions.java.language"] as String == "true" +val enableK2 = project.properties["elide.kotlin.k2"] as String == "true" +val javaLanguageVersion = project.properties["versions.java.language"] as String +val kotlinLanguageVersion = project.properties["versions.kotlin.language"] as String + +// Compiler: Kotlin +// ---------------- +// Configure Kotlin compile runs for MPP, JS, and JVM. +tasks.withType().configureEach { + kotlinOptions { + apiVersion = Elide.kotlinLanguage + languageVersion = Elide.kotlinLanguage + jvmTarget = javaLanguageVersion + javaParameters = true + freeCompilerArgs = Elide.kaptCompilerArgs + allWarningsAsErrors = strictMode + incremental = true + } +} + +kotlin { + jvmToolchain { + languageVersion.set(JavaLanguageVersion.of((project.properties["versions.java.language"] as String))) + } + + sourceSets.all { + languageSettings.apply { + apiVersion = kotlinLanguageVersion + languageVersion = kotlinLanguageVersion + progressiveMode = true + optIn("kotlin.ExperimentalUnsignedTypes") + } + } + + publishing { + publications { + create("main") { + groupId = "dev.elide" + artifactId = project.name + version = rootProject.version as String + + from(components["kotlin"]) + } + } + } +} + +// Tool: Kover +// ----------- +// Settings for Kotlin coverage. +kover { + xmlReport { + onCheck.set(true) + } +} diff --git a/buildSrc/src/main/kotlin/dev.elide.build.multiplatform.gradle.kts b/buildSrc/src/main/kotlin/dev.elide.build.multiplatform.gradle.kts new file mode 100644 index 0000000000..9646df41a4 --- /dev/null +++ b/buildSrc/src/main/kotlin/dev.elide.build.multiplatform.gradle.kts @@ -0,0 +1,110 @@ +@file:Suppress( + "UNUSED_VARIABLE", +) + +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.jetbrains.kotlin.gradle.tasks.KotlinCompileCommon + +plugins { + kotlin("multiplatform") + kotlin("plugin.serialization") + id("dev.elide.build.core") + id("org.jetbrains.kotlinx.kover") +} + +val javaLanguageVersion = project.properties["versions.java.language"] as String +val kotlinLanguageVersion = project.properties["versions.kotlin.language"] as String +val ecmaVersion = project.properties["versions.ecma.language"] as String +val strictMode = project.properties["versions.java.language"] as String == "true" +val enableK2 = project.properties["elide.kotlin.k2"] as String == "true" + +kover { + xmlReport { + onCheck.set( + project.hasProperty("elide.ci") && project.properties["elide.ci"] == "true" + ) + } +} + +kotlin { + jvm { + testRuns["test"].executionTask.configure { + useJUnitPlatform() + } + } + + js(IR) { + browser { + commonWebpackConfig { + cssSupport { + enabled = true + } + } + } + } + + if (project.hasProperty("publishMainHostLock") && project.properties["publishMainHostLock"] == "true") { + val publicationsFromMainHost = + listOf(jvm(), js()).map { it.name } + "kotlinMultiplatform" + + publishing { + publications { + matching { it.name in publicationsFromMainHost }.all { + val targetPublication = this@all + tasks.withType() + .matching { it.publication == targetPublication } + .configureEach { onlyIf { findProperty("isMainHost") == "true" } } + } + } + } + } + + val hostOs = System.getProperty("os.name") + val isMingwX64 = hostOs.startsWith("Windows") + val nativeTarget = when { + hostOs == "Mac OS X" -> macosX64("native") + hostOs == "Linux" -> linuxX64("native") + isMingwX64 -> mingwX64("native") + else -> throw GradleException("Host OS is not supported in Kotlin/Native.") + } + + sourceSets.all { + languageSettings.apply { + apiVersion = kotlinLanguageVersion + languageVersion = kotlinLanguageVersion + progressiveMode = true + optIn("kotlin.ExperimentalUnsignedTypes") + } + } +} + +tasks.withType().configureEach { + sourceCompatibility = javaLanguageVersion + targetCompatibility = javaLanguageVersion + options.isFork = true + options.isIncremental = true +} + +tasks.withType().configureEach { + kotlinOptions { + apiVersion = kotlinLanguageVersion + languageVersion = kotlinLanguageVersion + freeCompilerArgs = Elide.mppCompilerArgs + allWarningsAsErrors = strictMode + useK2 = enableK2 + incremental = true + } +} + +tasks.withType().configureEach { + kotlinOptions { + apiVersion = kotlinLanguageVersion + languageVersion = kotlinLanguageVersion + jvmTarget = javaLanguageVersion + freeCompilerArgs = Elide.mppCompilerArgs + javaParameters = true + allWarningsAsErrors = strictMode + useK2 = enableK2 + incremental = true + } +} diff --git a/buildSrc/src/main/kotlin/dev.elide.build.native.app.gradle.kts b/buildSrc/src/main/kotlin/dev.elide.build.native.app.gradle.kts new file mode 100644 index 0000000000..256ec91bd6 --- /dev/null +++ b/buildSrc/src/main/kotlin/dev.elide.build.native.app.gradle.kts @@ -0,0 +1,83 @@ + +plugins { + `java-library` + kotlin("plugin.serialization") + id("org.graalvm.buildtools.native") + id("dev.elide.build.jvm.kapt") +} + + +graalvmNative { + testSupport.set(true) + + metadataRepository { + enabled.set(true) + version.set(Versions.graalvmMetadata) + } + + agent { + defaultMode.set("standard") + builtinCallerFilter.set(true) + builtinHeuristicFilter.set(true) + enableExperimentalPredefinedClasses.set(false) + enableExperimentalUnsafeAllocationTracing.set(false) + trackReflectionMetadata.set(true) + enabled.set(true) + + modes { + standard {} + } + metadataCopy { + inputTaskNames.add("test") + outputDirectories.add("src/main/resources/META-INF/native-image") + mergeWithExisting.set(true) + } + } + + binaries { + named("main") { + fallback.set(false) + buildArgs.addAll(listOf( + "--language:js", + "--language:regex", + "--enable-all-security-services", + "-Dpolyglot.image-build-time.PreinitializeContexts=js", + )) + + javaLauncher.set(javaToolchains.launcherFor { + languageVersion.set(JavaLanguageVersion.of((project.properties["versions.java.language"] as String))) + if (project.hasProperty("elide.graalvm.variant")) { + val variant = project.property("elide.graalvm.variant") as String + if (variant != "COMMUNITY") { + vendor.set(JvmVendorSpec.matching(when (variant.trim()) { + "ENTERPRISE" -> "Oracle" + else -> "GraalVM Community" + })) + } + } + }) + } + + named("test") { + buildArgs.addAll(listOf( + "--language:js", + "--language:regex", + "--enable-all-security-services", + "-Dpolyglot.image-build-time.PreinitializeContexts=js", + )) + + javaLauncher.set(javaToolchains.launcherFor { + languageVersion.set(JavaLanguageVersion.of((project.properties["versions.java.language"] as String))) + if (project.hasProperty("elide.graalvm.variant")) { + val variant = project.property("elide.graalvm.variant") as String + if (variant != "COMMUNITY") { + vendor.set(JvmVendorSpec.matching(when (variant.trim()) { + "ENTERPRISE" -> "Oracle" + else -> "GraalVM Community" + })) + } + } + }) + } + } +} diff --git a/buildSrc/src/main/kotlin/dev.elide.build.native.lib.gradle.kts b/buildSrc/src/main/kotlin/dev.elide.build.native.lib.gradle.kts new file mode 100644 index 0000000000..f474d78deb --- /dev/null +++ b/buildSrc/src/main/kotlin/dev.elide.build.native.lib.gradle.kts @@ -0,0 +1,81 @@ + +plugins { + `java-library` + kotlin("plugin.serialization") + id("org.graalvm.buildtools.native") + id("dev.elide.build.jvm.kapt") +} + + +graalvmNative { + testSupport.set(true) + + metadataRepository { + enabled.set(true) + version.set(Versions.graalvmMetadata) + } + + agent { + defaultMode.set("standard") + builtinCallerFilter.set(true) + builtinHeuristicFilter.set(true) + enableExperimentalPredefinedClasses.set(false) + enableExperimentalUnsafeAllocationTracing.set(false) + trackReflectionMetadata.set(true) + enabled.set(true) + + modes { + standard {} + } + metadataCopy { + inputTaskNames.add("test") + outputDirectories.add("src/main/resources/META-INF/native-image") + mergeWithExisting.set(true) + } + } + + binaries { + named("main") { + sharedLibrary.set(true) + + javaLauncher.set(javaToolchains.launcherFor { + languageVersion.set(JavaLanguageVersion.of((project.properties["versions.java.language"] as String))) + if (project.hasProperty("elide.graalvm.variant")) { + val variant = project.property("elide.graalvm.variant") as String + if (variant != "COMMUNITY") { + vendor.set(JvmVendorSpec.matching(when (variant.trim()) { + "ENTERPRISE" -> "Oracle" + else -> "GraalVM Community" + })) + } + } + }) + } + + named("test") { + buildArgs.addAll(listOf( + "--language:js", + "--language:regex", + "--enable-all-security-services", + "-Dpolyglot.image-build-time.PreinitializeContexts=js", + )) + + javaLauncher.set(javaToolchains.launcherFor { + languageVersion.set(JavaLanguageVersion.of((project.properties["versions.java.language"] as String))) + if (project.hasProperty("elide.graalvm.variant")) { + val variant = project.property("elide.graalvm.variant") as String + if (variant != "COMMUNITY") { + vendor.set(JvmVendorSpec.matching(when (variant.trim()) { + "ENTERPRISE" -> "Oracle" + else -> "GraalVM Community" + })) + } + } + }) + } + } +} + +tasks.named("jar") { + from("collectReachabilityMetadata") +} diff --git a/buildSrc/src/main/kotlin/dev.elide.build.samples.backend.gradle.kts b/buildSrc/src/main/kotlin/dev.elide.build.samples.backend.gradle.kts new file mode 100644 index 0000000000..090af1e41e --- /dev/null +++ b/buildSrc/src/main/kotlin/dev.elide.build.samples.backend.gradle.kts @@ -0,0 +1,53 @@ + +plugins { + id("io.micronaut.application") + id("io.micronaut.aot") + id("io.micronaut.graalvm") + id("io.micronaut.docker") + id("dev.elide.build.jvm.kapt") + id("dev.elide.build.docker") +} + +tasks.withType { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} + +tasks.withType{ + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} + +tasks.named("dockerfile") { + baseImage("${project.properties["elide.publish.repo.docker.tools"]}/base:latest") +} + +tasks.named("optimizedDockerfile") { + baseImage("${project.properties["elide.publish.repo.docker.tools"]}/runtime/jvm17") +} + +tasks.named("dockerfileNative") { + graalImage.set("${project.properties["elide.publish.repo.docker.tools"]}/builder:latest") + baseImage("${project.properties["elide.publish.repo.docker.tools"]}/runtime/native:latest") + args("-H:+StaticExecutableWithDynamicLibC") +} + +tasks.named("optimizedDockerfileNative") { + graalImage.set("${project.properties["elide.publish.repo.docker.tools"]}/builder:latest") + baseImage("${project.properties["elide.publish.repo.docker.tools"]}/runtime/native:latest") + args("-H:+StaticExecutableWithDynamicLibC") +} + +tasks.named("run") { + val argsList = ArrayList() + jvmArgs(listOf( + "-Delide.dev=true", + )) + if (project.hasProperty("elide.vm.inspect") && project.properties["elide.vm.inspect"] == "true") { + argsList.add("--elide.vm.inspect=true") + } else { + argsList.add("--elide.vm.inspect=false") + } + @Suppress("SpreadOperator") + args( + *argsList.toTypedArray() + ) +} diff --git a/buildSrc/src/main/kotlin/dev.elide.build.samples.frontend.gradle.kts b/buildSrc/src/main/kotlin/dev.elide.build.samples.frontend.gradle.kts new file mode 100644 index 0000000000..ebf9477d77 --- /dev/null +++ b/buildSrc/src/main/kotlin/dev.elide.build.samples.frontend.gradle.kts @@ -0,0 +1,4 @@ + +plugins { + id("dev.elide.build.js") +} diff --git a/buildSrc/src/main/kotlin/dev.elide.build.samples.multiplatform.gradle.kts b/buildSrc/src/main/kotlin/dev.elide.build.samples.multiplatform.gradle.kts new file mode 100644 index 0000000000..656b9221d7 --- /dev/null +++ b/buildSrc/src/main/kotlin/dev.elide.build.samples.multiplatform.gradle.kts @@ -0,0 +1,4 @@ + +plugins { + id("dev.elide.build.multiplatform") +} diff --git a/buildSrc/src/main/kotlin/dev.elide.build.site.backend.gradle.kts b/buildSrc/src/main/kotlin/dev.elide.build.site.backend.gradle.kts new file mode 100644 index 0000000000..c3a65970a1 --- /dev/null +++ b/buildSrc/src/main/kotlin/dev.elide.build.site.backend.gradle.kts @@ -0,0 +1,10 @@ + +plugins { + id("io.micronaut.application") + id("io.micronaut.aot") + id("io.micronaut.graalvm") + id("io.micronaut.docker") + id("dev.elide.build.jvm.kapt") + id("dev.elide.build.docker") + id("dev.elide.build.samples.backend") +} diff --git a/buildSrc/src/main/kotlin/dev.elide.build.site.frontend.gradle.kts b/buildSrc/src/main/kotlin/dev.elide.build.site.frontend.gradle.kts new file mode 100644 index 0000000000..79e68f7749 --- /dev/null +++ b/buildSrc/src/main/kotlin/dev.elide.build.site.frontend.gradle.kts @@ -0,0 +1,4 @@ + +plugins { + id("dev.elide.build.samples.frontend") +} diff --git a/buildSrc/src/main/kotlin/dev.elide.build.tool.gradle.kts b/buildSrc/src/main/kotlin/dev.elide.build.tool.gradle.kts new file mode 100644 index 0000000000..c7bfcc2bba --- /dev/null +++ b/buildSrc/src/main/kotlin/dev.elide.build.tool.gradle.kts @@ -0,0 +1,13 @@ + +plugins { + java + jacoco + application + `jvm-test-suite` + + kotlin("jvm") + kotlin("plugin.serialization") + id("dev.elide.build.core") + id("dev.elide.build.kotlin") + id("dev.elide.build.jvm.kapt") +} diff --git a/config/detekt/detekt.yml b/config/detekt/detekt.yml index 8115cbcf10..4e58a67778 100644 --- a/config/detekt/detekt.yml +++ b/config/detekt/detekt.yml @@ -11,12 +11,12 @@ config: validation: true warningsAsErrors: false # when writing own rules with new properties, exclude the property path e.g.: 'my_rule_set,.*>.*>[my_property]' - excludes: '' + excludes: "" processors: active: true exclude: - - 'DetektProgressListener' + - "DetektProgressListener" # - 'KtFileCountProcessor' # - 'PackageCountProcessor' # - 'ClassCountProcessor' @@ -33,11 +33,11 @@ processors: console-reports: active: true exclude: - - 'ProjectStatisticsReport' - - 'ComplexityReport' - - 'NotificationReport' - - 'FindingsReport' - - 'FileBasedFindingsReport' + - "ProjectStatisticsReport" + - "ComplexityReport" + - "NotificationReport" + - "FindingsReport" + - "FileBasedFindingsReport" # - 'LiteFindingsReport' output-reports: @@ -51,7 +51,7 @@ comments: active: true AbsentOrWrongFileLicense: active: false - licenseTemplateFile: 'license.template' + licenseTemplateFile: "license.template" licenseTemplateIsRegex: false CommentOverPrivateFunction: active: false @@ -69,17 +69,41 @@ comments: allowParamOnConstructorProperties: false UndocumentedPublicClass: active: false - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] + excludes: + [ + "**/test/**", + "**/androidTest/**", + "**/commonTest/**", + "**/jvmTest/**", + "**/jsTest/**", + "**/iosTest/**", + ] searchInNestedClass: true searchInInnerClass: true searchInInnerObject: true searchInInnerInterface: true UndocumentedPublicFunction: active: false - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] + excludes: + [ + "**/test/**", + "**/androidTest/**", + "**/commonTest/**", + "**/jvmTest/**", + "**/jsTest/**", + "**/iosTest/**", + ] UndocumentedPublicProperty: active: false - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] + excludes: + [ + "**/test/**", + "**/androidTest/**", + "**/commonTest/**", + "**/jvmTest/**", + "**/jsTest/**", + "**/iosTest/**", + ] complexity: active: true @@ -98,15 +122,15 @@ complexity: ignoreSimpleWhenEntries: false ignoreNestingFunctions: false nestingFunctions: - - 'also' - - 'apply' - - 'forEach' - - 'isNotNull' - - 'ifNull' - - 'let' - - 'run' - - 'use' - - 'with' + - "also" + - "apply" + - "forEach" + - "isNotNull" + - "ifNull" + - "let" + - "run" + - "use" + - "with" LabeledExpression: active: false ignoredLabels: [] @@ -137,14 +161,30 @@ complexity: active: false StringLiteralDuplication: active: false - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] + excludes: + [ + "**/test/**", + "**/androidTest/**", + "**/commonTest/**", + "**/jvmTest/**", + "**/jsTest/**", + "**/iosTest/**", + ] threshold: 3 ignoreAnnotation: true excludeStringsWithLessThan5Characters: true - ignoreStringsRegex: '$^' + ignoreStringsRegex: "$^" TooManyFunctions: active: true - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] + excludes: + [ + "**/test/**", + "**/androidTest/**", + "**/commonTest/**", + "**/jvmTest/**", + "**/jsTest/**", + "**/iosTest/**", + ] thresholdInFiles: 11 thresholdInClasses: 11 thresholdInInterfaces: 11 @@ -161,9 +201,9 @@ coroutines: InjectDispatcher: active: false dispatcherNames: - - 'IO' - - 'Default' - - 'Unconfined' + - "IO" + - "Default" + - "Unconfined" RedundantSuspendModifier: active: false SleepInsteadOfDelay: @@ -177,7 +217,7 @@ empty-blocks: active: true EmptyCatchBlock: active: true - allowedExceptionNameRegex: '_|(ignore|expected).*' + allowedExceptionNameRegex: "_|(ignore|expected).*" EmptyClassBlock: active: true EmptyDefaultConstructor: @@ -213,13 +253,21 @@ exceptions: ExceptionRaisedInUnexpectedLocation: active: true methodNames: - - 'equals' - - 'finalize' - - 'hashCode' - - 'toString' + - "equals" + - "finalize" + - "hashCode" + - "toString" InstanceOfCheckForException: active: false - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] + excludes: + [ + "**/test/**", + "**/androidTest/**", + "**/commonTest/**", + "**/jvmTest/**", + "**/jsTest/**", + "**/iosTest/**", + ] NotImplementedDeclaration: active: false ObjectExtendsThrowable: @@ -234,69 +282,85 @@ exceptions: SwallowedException: active: true ignoredExceptionTypes: - - 'InterruptedException' - - 'MalformedURLException' - - 'NumberFormatException' - - 'ParseException' - allowedExceptionNameRegex: '_|(ignore|expected).*' + - "InterruptedException" + - "MalformedURLException" + - "NumberFormatException" + - "ParseException" + allowedExceptionNameRegex: "_|(ignore|expected).*" ThrowingExceptionFromFinally: active: true ThrowingExceptionInMain: active: false ThrowingExceptionsWithoutMessageOrCause: active: true - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] + excludes: + [ + "**/test/**", + "**/androidTest/**", + "**/commonTest/**", + "**/jvmTest/**", + "**/jsTest/**", + "**/iosTest/**", + ] exceptions: - - 'ArrayIndexOutOfBoundsException' - - 'Exception' - - 'IllegalArgumentException' - - 'IllegalMonitorStateException' - - 'IllegalStateException' - - 'IndexOutOfBoundsException' - - 'NullPointerException' - - 'RuntimeException' - - 'Throwable' + - "ArrayIndexOutOfBoundsException" + - "Exception" + - "IllegalArgumentException" + - "IllegalMonitorStateException" + - "IllegalStateException" + - "IndexOutOfBoundsException" + - "NullPointerException" + - "RuntimeException" + - "Throwable" ThrowingNewInstanceOfSameException: active: true TooGenericExceptionCaught: active: true - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] + excludes: + [ + "**/test/**", + "**/androidTest/**", + "**/commonTest/**", + "**/jvmTest/**", + "**/jsTest/**", + "**/iosTest/**", + ] exceptionNames: - - 'ArrayIndexOutOfBoundsException' - - 'Error' - - 'Exception' - - 'IllegalMonitorStateException' - - 'IndexOutOfBoundsException' - - 'NullPointerException' - - 'RuntimeException' - - 'Throwable' - allowedExceptionNameRegex: '_|(ignore|expected).*' + - "ArrayIndexOutOfBoundsException" + - "Error" + - "Exception" + - "IllegalMonitorStateException" + - "IndexOutOfBoundsException" + - "NullPointerException" + - "RuntimeException" + - "Throwable" + allowedExceptionNameRegex: "_|(ignore|expected).*" TooGenericExceptionThrown: active: true exceptionNames: - - 'Error' - - 'Exception' - - 'RuntimeException' - - 'Throwable' + - "Error" + - "Exception" + - "RuntimeException" + - "Throwable" naming: active: true BooleanPropertyNaming: active: false - allowedPattern: '^(is|has|are)' + allowedPattern: "^(is|has|are)" ignoreOverridden: true ClassNaming: active: true - classPattern: '[A-Z][a-zA-Z0-9]*' + classPattern: "[A-Z][a-zA-Z0-9]*" ConstructorParameterNaming: active: true - parameterPattern: '[a-z][A-Za-z0-9]*' - privateParameterPattern: '[a-z][A-Za-z0-9]*' - excludeClassPattern: '$^' + parameterPattern: "[a-z][A-Za-z0-9]*" + privateParameterPattern: "[a-z][A-Za-z0-9]*" + excludeClassPattern: "$^" ignoreOverridden: true EnumNaming: active: true - enumEntryPattern: '[A-Z][_a-zA-Z0-9]*' + enumEntryPattern: "[A-Z][_a-zA-Z0-9]*" ForbiddenClassName: active: false forbiddenName: [] @@ -308,22 +372,30 @@ naming: minimumFunctionNameLength: 3 FunctionNaming: active: true - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] - functionPattern: '[a-z][a-zA-Z0-9]*' - excludeClassPattern: '$^' + excludes: + [ + "**/test/**", + "**/androidTest/**", + "**/commonTest/**", + "**/jvmTest/**", + "**/jsTest/**", + "**/iosTest/**", + ] + functionPattern: "[a-z][a-zA-Z0-9]*" + excludeClassPattern: "$^" ignoreOverridden: true FunctionParameterNaming: active: true - parameterPattern: '[a-z][A-Za-z0-9]*' - excludeClassPattern: '$^' + parameterPattern: "[a-z][A-Za-z0-9]*" + excludeClassPattern: "$^" ignoreOverridden: true InvalidPackageDeclaration: active: false - rootPackage: '' + rootPackage: "" requireRootInDeclaration: false LambdaParameterNaming: active: false - parameterPattern: '[a-z][A-Za-z0-9]*|_' + parameterPattern: "[a-z][A-Za-z0-9]*|_" MatchingDeclarationName: active: true mustBeFirst: true @@ -336,17 +408,17 @@ naming: active: false ObjectPropertyNaming: active: true - constantPattern: '[A-Za-z][_A-Za-z0-9]*' - propertyPattern: '[A-Za-z][_A-Za-z0-9]*' - privatePropertyPattern: '(_)?[A-Za-z][_A-Za-z0-9]*' + constantPattern: "[A-Za-z][_A-Za-z0-9]*" + propertyPattern: "[A-Za-z][_A-Za-z0-9]*" + privatePropertyPattern: "(_)?[A-Za-z][_A-Za-z0-9]*" PackageNaming: active: true packagePattern: '[a-z]+(\.[a-z][A-Za-z0-9]*)*' TopLevelPropertyNaming: active: true - constantPattern: '[A-Z][_A-Z0-9]*' - propertyPattern: '[A-Za-z][_A-Za-z0-9]*' - privatePropertyPattern: '_?[A-Za-z][_A-Za-z0-9]*' + constantPattern: "[A-Z][_A-Z0-9]*" + propertyPattern: "[A-Za-z][_A-Za-z0-9]*" + privatePropertyPattern: "_?[A-Za-z][_A-Za-z0-9]*" VariableMaxLength: active: false maximumVariableNameLength: 64 @@ -355,9 +427,9 @@ naming: minimumVariableNameLength: 1 VariableNaming: active: true - variablePattern: '[a-z][A-Za-z0-9]*' - privateVariablePattern: '(_)?[a-z][A-Za-z0-9]*' - excludeClassPattern: '$^' + variablePattern: "[a-z][A-Za-z0-9]*" + privateVariablePattern: "(_)?[a-z][A-Za-z0-9]*" + excludeClassPattern: "$^" ignoreOverridden: true performance: @@ -366,10 +438,26 @@ performance: active: true ForEachOnRange: active: true - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] + excludes: + [ + "**/test/**", + "**/androidTest/**", + "**/commonTest/**", + "**/jvmTest/**", + "**/jsTest/**", + "**/iosTest/**", + ] SpreadOperator: active: true - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] + excludes: + [ + "**/test/**", + "**/androidTest/**", + "**/commonTest/**", + "**/jvmTest/**", + "**/jsTest/**", + "**/iosTest/**", + ] UnnecessaryTemporaryInstantiation: active: true @@ -378,7 +466,7 @@ potential-bugs: AvoidReferentialEquality: active: false forbiddenTypePatterns: - - 'kotlin.String' + - "kotlin.String" CastToNullableType: active: false Deprecation: @@ -388,14 +476,14 @@ potential-bugs: DoubleMutabilityForCollection: active: false mutableTypes: - - 'kotlin.collections.MutableList' - - 'kotlin.collections.MutableMap' - - 'kotlin.collections.MutableSet' - - 'java.util.ArrayList' - - 'java.util.LinkedHashSet' - - 'java.util.HashSet' - - 'java.util.LinkedHashMap' - - 'java.util.HashMap' + - "kotlin.collections.MutableList" + - "kotlin.collections.MutableMap" + - "kotlin.collections.MutableSet" + - "java.util.ArrayList" + - "java.util.LinkedHashSet" + - "java.util.HashSet" + - "java.util.LinkedHashMap" + - "java.util.HashMap" DuplicateCaseInWhenExpression: active: true ElseCaseInsteadOfExhaustiveWhen: @@ -414,10 +502,10 @@ potential-bugs: active: false restrictToAnnotatedMethods: true returnValueAnnotations: - - '*.CheckResult' - - '*.CheckReturnValue' + - "*.CheckResult" + - "*.CheckReturnValue" ignoreReturnValueAnnotations: - - '*.CanIgnoreReturnValue' + - "*.CanIgnoreReturnValue" ignoreFunctionCall: [] ImplicitDefaultLocale: active: true @@ -432,13 +520,21 @@ potential-bugs: active: true LateinitUsage: active: false - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] - ignoreOnClassesPattern: '' + excludes: + [ + "**/test/**", + "**/androidTest/**", + "**/commonTest/**", + "**/jvmTest/**", + "**/jsTest/**", + "**/iosTest/**", + ] + ignoreOnClassesPattern: "" MapGetWithNotNullAssertionOperator: active: false MissingPackageDeclaration: active: false - excludes: ['**/*.kts'] + excludes: ["**/*.kts"] MissingWhenCase: active: true allowElseExpression: true @@ -460,7 +556,15 @@ potential-bugs: active: true UnsafeCallOnNullableType: active: true - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] + excludes: + [ + "**/test/**", + "**/androidTest/**", + "**/commonTest/**", + "**/jvmTest/**", + "**/jsTest/**", + "**/iosTest/**", + ] UnsafeCast: active: true UnusedUnaryOperator: @@ -480,7 +584,7 @@ style: active: false DataClassContainsFunctions: active: false - conversionFunctionPrefix: 'to' + conversionFunctionPrefix: "to" DataClassShouldBeImmutable: active: false DestructuringDeclarationWithTooManyEntries: @@ -500,26 +604,26 @@ style: ForbiddenComment: active: true values: - - 'FIXME:' - - 'STOPSHIP:' - - 'TODO:' - allowedPatterns: '' - customMessage: '' + - "FIXME:" + - "STOPSHIP:" + - "TODO:" + allowedPatterns: "" + customMessage: "" ForbiddenImport: active: false imports: [] - forbiddenPatterns: '' + forbiddenPatterns: "" ForbiddenMethodCall: active: false methods: - - 'kotlin.io.print' - - 'kotlin.io.println' + - "kotlin.io.print" + - "kotlin.io.println" ForbiddenPublicDataClass: active: true - excludes: ['**'] + excludes: ["**"] ignorePackages: - - '*.internal' - - '*.internal.*' + - "*.internal" + - "*.internal.*" ForbiddenVoid: active: false ignoreOverridden: false @@ -528,24 +632,32 @@ style: active: true ignoreOverridableFunction: true ignoreActualFunction: true - excludedFunctions: '' + excludedFunctions: "" LibraryCodeMustSpecifyReturnType: active: true - excludes: ['**'] + excludes: ["**"] LibraryEntitiesShouldNotBePublic: active: true - excludes: ['**'] + excludes: ["**"] LoopWithTooManyJumpStatements: active: true maxJumpCount: 1 MagicNumber: active: true - excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] + excludes: + [ + "**/test/**", + "**/androidTest/**", + "**/commonTest/**", + "**/jvmTest/**", + "**/jsTest/**", + "**/iosTest/**", + ] ignoreNumbers: - - '-1' - - '0' - - '1' - - '2' + - "-1" + - "0" + - "1" + - "2" ignoreHashCodeFunction: true ignorePropertyDeclaration: false ignoreLocalVariableDeclaration: false @@ -599,7 +711,7 @@ style: ReturnCount: active: true max: 2 - excludedFunctions: 'equals' + excludedFunctions: "equals" excludeLabeled: false excludeReturnFromLambda: true excludeGuardClauses: false @@ -643,7 +755,7 @@ style: active: true UnusedPrivateMember: active: true - allowedNames: '(_|ignored|expected|serialVersionUID)' + allowedNames: "(_|ignored|expected|serialVersionUID)" UseAnyOrNoneInsteadOfFind: active: false UseArrayLiteralsInAnnotations: diff --git a/creative/logo-wide.psd b/creative/logo-wide.psd new file mode 100644 index 0000000000..da36d92154 Binary files /dev/null and b/creative/logo-wide.psd differ diff --git a/creative/logo/logo-v1-d-1200.png b/creative/logo/logo-v1-d-1200.png new file mode 100644 index 0000000000..f653c8b6d8 Binary files /dev/null and b/creative/logo/logo-v1-d-1200.png differ diff --git a/creative/logo/logo-wide-1200-tx.png b/creative/logo/logo-wide-1200-tx.png new file mode 100644 index 0000000000..a322cd4512 Binary files /dev/null and b/creative/logo/logo-wide-1200-tx.png differ diff --git a/creative/logo/logo-wide-1200-w.png b/creative/logo/logo-wide-1200-w.png new file mode 100644 index 0000000000..9e7d2bc384 Binary files /dev/null and b/creative/logo/logo-wide-1200-w.png differ diff --git a/creative/logo/original/dark/1x/dark.png b/creative/logo/original/dark/1x/dark.png new file mode 100644 index 0000000000..2578413a7c Binary files /dev/null and b/creative/logo/original/dark/1x/dark.png differ diff --git a/creative/logo/original/dark/2x/dark.jpg b/creative/logo/original/dark/2x/dark.jpg new file mode 100644 index 0000000000..731164121b Binary files /dev/null and b/creative/logo/original/dark/2x/dark.jpg differ diff --git a/creative/logo/original/dark/PDF/dark.pdf b/creative/logo/original/dark/PDF/dark.pdf new file mode 100644 index 0000000000..c2a031a9cc Binary files /dev/null and b/creative/logo/original/dark/PDF/dark.pdf differ diff --git a/creative/logo/original/dark/SVG/dark.svg b/creative/logo/original/dark/SVG/dark.svg new file mode 100644 index 0000000000..d855d252e6 --- /dev/null +++ b/creative/logo/original/dark/SVG/dark.svg @@ -0,0 +1 @@ +Asset 2LIDE \ No newline at end of file diff --git a/creative/logo/original/light/1x/light.png b/creative/logo/original/light/1x/light.png new file mode 100644 index 0000000000..371b469089 Binary files /dev/null and b/creative/logo/original/light/1x/light.png differ diff --git a/creative/logo/original/light/2x/light.jpg b/creative/logo/original/light/2x/light.jpg new file mode 100644 index 0000000000..9193467802 Binary files /dev/null and b/creative/logo/original/light/2x/light.jpg differ diff --git a/creative/logo/original/light/PDF/light.pdf b/creative/logo/original/light/PDF/light.pdf new file mode 100644 index 0000000000..c2970b1b07 Binary files /dev/null and b/creative/logo/original/light/PDF/light.pdf differ diff --git a/creative/logo/original/light/SVG/light.svg b/creative/logo/original/light/SVG/light.svg new file mode 100644 index 0000000000..36b38a5cf8 --- /dev/null +++ b/creative/logo/original/light/SVG/light.svg @@ -0,0 +1 @@ +Asset 1LIDE \ No newline at end of file diff --git a/creative/logo/original/tx/SVG/light.svg b/creative/logo/original/tx/SVG/light.svg new file mode 100644 index 0000000000..6321df7eba --- /dev/null +++ b/creative/logo/original/tx/SVG/light.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LIDE + + + diff --git a/gradle-ci.properties b/gradle-ci.properties index dccff257d8..020e4fcf5e 100644 --- a/gradle-ci.properties +++ b/gradle-ci.properties @@ -1,46 +1,47 @@ -## Settings: Build -elide.ci=true -buildSamples=false -buildPlugins=false -enableSigning=false -elide.buildMode=dev -elide.pluginVersion=1.0.0-beta8 -elide.pluginMode=repository -elide.lockDeps=false -elide.stamp=false -elide.graalvm.variant=COMMUNITY -elide.vm.inspect=false -publishMainHostLock=false +# # Settings: Build +elide.ci = true +buildSamples = false +buildPlugins = false +enableSigning = false +elide.buildMode = dev +elide.pluginVersion = 1.0.0-beta8 +elide.pluginMode = repository +elide.lockDeps = false +elide.stamp = false +elide.graalvm.variant = COMMUNITY +elide.vm.inspect = false +publishMainHostLock = false -elide.publish.repo.maven=gcs://elide-snapshots/repository/v3 -elide.publish.repo.docker.tools=us-docker.pkg.dev/elide-fw/tools -elide.publish.repo.docker.samples=us-docker.pkg.dev/elide-fw/samples +elide.publish.repo.maven = gcs://elide-snapshots/repository/v3 +elide.publish.repo.docker.tools = us-docker.pkg.dev/elide-fw/tools +elide.publish.repo.docker.samples = us-docker.pkg.dev/elide-fw/samples -org.gradle.java.installations.fromEnv=JAVA_HOME,GRAALVM_HOME -org.gradle.java.installations.paths=/usr/lib/jvm/zulu11,/usr/lib/gvm +org.gradle.java.installations.fromEnv = JAVA_HOME,GRAALVM_HOME +org.gradle.java.installations.paths = /usr/lib/jvm/zulu11,/usr/lib/gvm -elide.samples.docker.base.native=us-docker.pkg.dev/elide-fw/tools/runtime/native:latest +elide.samples.docker.base.native = us-docker.pkg.\ + dev/elide-fw/tools/runtime/native:latest -## Settings: Gradle -org.gradle.parallel=true -org.gradle.caching=true -org.gradle.configureondemand=true -org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=1024m +# # Settings: Gradle +org.gradle.parallel = true +org.gradle.caching = true +org.gradle.configureondemand = true +org.gradle.jvmargs = -Xmx4096m -XX:MaxMetaspaceSize=1024m -## Settings: Languages -versions.java.language=11 -versions.ecma.language=v5 -versions.kotlin.sdk=1.7.21 -versions.kotlin.language=1.7 +# # Settings: Languages +versions.java.language = 11 +versions.ecma.language = v5 +versions.kotlin.sdk = 1.7.21 +versions.kotlin.language = 1.7 -## Settings: Kotlin -kotlin.code.style=official -kotlin.js.compiler=both -kotlin.js.generate.executable.default=false -kotlin.parallel.tasks.in.project=true -kotlin.build.report.output=build_scan -kotlin.incremental=true -kotlin.incremental.useClasspathSnapshot=true -kotlin.mpp.stability.nowarn=true -kotlin.mpp.enableCInteropCommonization=true -kotlin.mpp.enableCompatibilityMetadataVariant=true +# # Settings: Kotlin +kotlin.code.style = official +kotlin.js.compiler = both +kotlin.js.generate.executable.default = false +kotlin.parallel.tasks.in.project = true +kotlin.build.report.output = build_scan +kotlin.incremental = true +kotlin.incremental.useClasspathSnapshot = true +kotlin.mpp.stability.nowarn = true +kotlin.mpp.enableCInteropCommonization = true +kotlin.mpp.enableCompatibilityMetadataVariant = true diff --git a/gradle.properties b/gradle.properties index e63a003337..c15ed1bd65 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,43 +1,58 @@ -## Settings: Build -buildSamples=true -buildPlugins=false -enableSigning=false -elide.buildMode=dev -elide.pluginVersion=1.0.0-beta8 -elide.pluginMode=repository -elide.stamp=false -elide.lockDeps=false -elide.graalvm.variant=COMMUNITY -elide.vm.inspect=false -publishMainHostLock=false +# Settings: Build +buildSamples = true +buildPlugins = false +buildDocs = false +enableSigning = false +elide.buildMode = dev +elide.strict = true +elide.pluginVersion = 1.0.0-beta12 +elide.pluginMode = repository +elide.stamp = false +elide.atomicFu = false +elide.lockDeps = false +elide.graalvm.variant = COMMUNITY +elide.vm.inspect = false +elide.kotlin.k2 = false +publishMainHostLock = false -elide.publish.repo.maven=gcs://elide-snapshots/repository/v3 -elide.publish.repo.docker.tools=us-docker.pkg.dev/elide-fw/tools -elide.publish.repo.docker.samples=us-docker.pkg.dev/elide-fw/samples +elide.publish.repo.maven = gcs://elide-snapshots/repository/v3 +elide.publish.repo.docker.tools = us-docker.pkg.dev/elide-fw/tools +elide.publish.repo.docker.samples = us-docker.pkg.dev/elide-fw/samples -elide.samples.docker.base.native=us-docker.pkg.dev/elide-fw/tools/runtime/native:latest +elide.samples.docker.base.native = us-docker.pkg.\ + dev/elide-fw/tools/runtime/native:latest -## Settings: Gradle -org.gradle.parallel=true -org.gradle.caching=true -org.gradle.configureondemand=true -org.gradle.jvmargs=-XX:MaxMetaspaceSize=1024m -XX:+UseParallelGC -Xmx2g +# Settings: Gradle +org.gradle.parallel = true +org.gradle.caching = true +org.gradle.configureondemand = true +org.gradle.jvmargs = -XX:MaxMetaspaceSize=1024m -XX:+UseParallelGC -Xmx3g -## Settings: Languages -versions.java.language=11 -versions.ecma.language=v5 -versions.kotlin.sdk=1.7.21 -versions.kotlin.language=1.7 +# Settings: Languages +versions.java.language = 11 +versions.ecma.language = v5 +versions.kotlin.sdk = 1.7.21 +versions.kotlin.language = 1.7 -## Settings: Kotlin -kotlin.code.style=official -kotlin.js.compiler=both -kotlin.js.generate.executable.default=false -kotlin.parallel.tasks.in.project=true -kotlin.build.report.output=build_scan -kotlin.incremental=true -kotlin.incremental.useClasspathSnapshot=true -kotlin.mpp.stability.nowarn=true -kotlin.mpp.enableCInteropCommonization=true -kotlin.mpp.enableCompatibilityMetadataVariant=true -kotlin.native.binary.memoryModel=experimental +# Settings: Libraries +micronautVersion = 3.7.3 + +# Settings: Kotlin +kotlin.code.style = official +kotlin.js.compiler = both +kotlin.js.generate.executable.default = false +kotlin.parallel.tasks.in.project = true +kotlin.build.report.output = build_scan +kotlin.incremental = true +kotlin.incremental.useClasspathSnapshot = true +kotlin.mpp.stability.nowarn = true +kotlin.mpp.enableCInteropCommonization = true +kotlin.mpp.enableCompatibilityMetadataVariant = true +kotlin.native.binary.memoryModel = experimental + +# Settings: KApt & KSP +ksp.incremental = true +ksp.incremental.intermodule = true +kapt.incremental.apt = true +kapt.classloaders.cache.size = 5 +kapt.include.compile.classpath = false diff --git a/gradle/elide.versions.toml b/gradle/elide.versions.toml index 2f6da33100..f8eb08759e 100644 --- a/gradle/elide.versions.toml +++ b/gradle/elide.versions.toml @@ -1,18 +1,22 @@ [versions] kotlin_sdk = "1.7.21" kotlin_language = "1.7" +ksp = "1.7.20-1.0.8" +koin = "3.2.2" +koin_ksp = "1.0.3" graalvm = "22.3.0" -graalvm_sdk = "22.2.0.1" -graalvm_metadata = "0.1.0" +graalvm_sdk = "22.3.0" +graalvm_metadata = "0.2.4" +graalvm_plugin = "0.9.17" node = "18.0.1" react = "18.2.0" -protobuf = "3.20.1" -grpc_java = "1.46.0" +protobuf = "3.21.2" +grpc_java = "1.50.2" grpc_kotlin = "1.3.0" grpc_web = "1.3.1" testcontainers = "1.17.5" -netty = "4.1.84.Final" -netty_tcnative = "2.0.46.Final" +netty = "4.1.85.Final" +netty_tcnative = "2.0.54.Final" dekorate = "3.1.1" micronaut_lib = "3.7.3" micronaut_aot = "1.1.1" @@ -22,7 +26,7 @@ micronaut_grpc = "3.3.1" micronaut_graphql = "3.2.0" micronaut_gcp = "4.6.0" micronaut_test = "3.7.0" -micronaut_plugin = "3.6.3" +micronaut_plugin = "3.6.4" micronaut_redis = "5.3.0" micronaut_email = "1.4.0" micronaut_cache = "3.5.0" @@ -46,9 +50,9 @@ kotlinx_collections = "0.3.5" kotlinx_datetime = "0.4.0" kotlinx_html = "0.8.0" kotlinx_serialization = "1.4.1" -kotlinx_atomicfu_plugin = "0.18.2" +atomicfu = "0.18.5" kotlinx_benchmark = "0.4.4" -detekt = "1.20.0" +detekt = "1.22.0-RC3" dokka = "1.7.20" ktlint = "0.47.1" lettuce = "6.2.0.RELEASE" @@ -59,7 +63,7 @@ pluginProtobuf = "0.9.1" versionCheck = "0.43.0" sonar = "3.5.0.2730" truth = "1.1.3" -soy = "2022-03-07" # next: "2022-07-20" +soy = "2022-03-07" # next: "2022-07-20" closure = "v20221004" closure_stylesheets = "1.5.0" picocli = "4.7.0" @@ -71,17 +75,18 @@ jakarta_persistence = "3.1.0" jakarta_annotation_api = "2.1.1" javax_persistence = "2.2" javax_annotations = "1.3.2" -jsoup = "1.15.2" +jsoup = "1.15.3" junit_jupiter = "5.9.1" logback = "1.2.11" docker_plugin = "7.4.0" node_plugin = "3.5.0" gauth_plugin = "2.2.0" +kotest = "5.5.4" kotest_plugin = "0.8.18" testLoggerPlugin = "3.2.0" -kotlin_uuid = "0.5.0" +kotlin_uuid = "0.6.0" guava = "31.1-jre" -gax = "2.19.4" +gax = "2.19.5" kotlinxWrappers = "pre.422" kotlinx_wrappers_browser = "0.0.1-pre.422" kotlinx_wrappers_css = "1.0.0-pre.422" @@ -102,18 +107,18 @@ kotlinx_wrappers_tanstack_react_table = "8.5.22-pre.422" kotlinx_wrappers_tanstack_react_virtual = "3.0.0-pre.422" kotlinx_wrappers_tanstack_table_core = "8.5.22-pre.422" kotlinx_wrappers_tanstack_virtual_core = "3.0.0-pre.422" -npm_esbuild = "0.15.11" +npm_esbuild = "0.15.14" npm_prepack = "0.2.54" npm_buffer = "6.0.3" npm_stream = "4.2.0" npm_types_protobuf = "3.15.6" -npm_grpcweb = "1.4.1" +npm_grpcweb = "1.4.2" npm_lit = "2.4.0" npm_litHtml = "2.4.0" npm_litElement = "3.2.2" npm_lit_localize = "0.11.4" npm_lit_localizeTools = "0.6.5" -npm_lit_labs_analyzer = "0.3.0" +npm_lit_labs_analyzer = "0.4.0" npm_lit_labs_context = "0.1.3" npm_lit_labs_motion = "1.0.3" npm_lit_labs_react = "1.0.9" @@ -134,7 +139,9 @@ jib = "3.3.1" commons_compress = "1.22" commons_csv = "1.9.0" brotli4j = "1.8.0" -projectreactor = "2020.0.24" +projectreactor = "2022.0.0" +projectreactor_core = "3.5.0" +projectreactor_netty = "1.1.0" bouncycastle = "1.70" tink = "1.7.0" conscrypt = "2.5.2" @@ -150,30 +157,33 @@ micronaut_liquibase = "5.4.1" sqlcommenter = "2.1.1-elide" jackson = "2.13.3" jsr310 = "2.9.8" +spotless = "6.11.0" micronaut_xml = "3.1.0" [plugins] +ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } doctor = { id = "com.osacky.doctor", version.ref = "doctor_plugin" } -detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt"} -ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlintGradle"} +detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } +ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlintGradle" } +graalvm = { id = "org.graalvm.buildtools.native", version.ref = "graalvm_plugin" } qodana = { id = "org.jetbrains.qodana", version.ref = "qodanaGradle" } -kotlin_jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin_sdk"} -kotlin_js = { id = "org.jetbrains.kotlin.js", version.ref = "kotlin_sdk"} -kotlin_multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin_sdk"} -kotlin_kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin_sdk"} -kotlin_plugin_jpa = { id = "org.jetbrains.kotlin.plugin.jpa", version.ref = "kotlin_sdk"} -kotlin_plugin_noarg = { id = "org.jetbrains.kotlin.plugin.noarg", version.ref = "kotlin_sdk"} +kotlin_jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin_sdk" } +kotlin_js = { id = "org.jetbrains.kotlin.js", version.ref = "kotlin_sdk" } +kotlin_multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin_sdk" } +kotlin_kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin_sdk" } +kotlin_plugin_jpa = { id = "org.jetbrains.kotlin.plugin.jpa", version.ref = "kotlin_sdk" } +kotlin_plugin_noarg = { id = "org.jetbrains.kotlin.plugin.noarg", version.ref = "kotlin_sdk" } kotlin_plugin_allopen = { id = "org.jetbrains.kotlin.plugin.allopen", version.ref = "kotlin_sdk" } kotlin_plugin_dataframe = { id = "org.jetbrains.kotlin.plugin.dataframe", version.ref = "kotlin_dataframe" } -kotlinx_plugin_atomicfu = { id = "org.jetbrains.kotlin.plugin.atomicfu", version.ref = "kotlin_sdk" } +kotlin_plugin_atomicfu = { id = "org.jetbrains.kotlin.plugin.atomicfu", version.ref = "kotlin_sdk" } kotlinx_plugin_knit = { id = "org.jetbrains.kotlinx.knit", version.ref = "kotlin_knit" } kotlinx_plugin_benchmark = { id = "org.jetbrains.kotlinx.benchmark", version.ref = "kotlinx_benchmark" } dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" } sonar = { id = "org.sonarqube", version.ref = "sonar" } kover = { id = "org.jetbrains.kotlinx.kover", version.ref = "kover" } protobuf = { id = "com.google.protobuf", version.ref = "pluginProtobuf" } -pluginPublish = { id = "com.gradle.plugin-publish", version.ref = "pluginPublish"} -versionCheck = { id = "com.github.ben-manes.versions", version.ref = "versionCheck"} +pluginPublish = { id = "com.gradle.plugin-publish", version.ref = "pluginPublish" } +versionCheck = { id = "com.github.ben-manes.versions", version.ref = "versionCheck" } artifactRegistry = { id = "com.google.cloud.artifactregistry.gradle-plugin", version.ref = "gauth_plugin" } testLogger = { id = "com.adarshr.test-logger", version.ref = "testLoggerPlugin" } micronaut_library = { id = "io.micronaut.library", version.ref = "micronaut_plugin" } @@ -199,6 +209,8 @@ protobuf_java = { group = "com.google.protobuf", name = "protobuf-java", version protobuf_util = { group = "com.google.protobuf", name = "protobuf-java-util", version.ref = "protobuf" } protobuf_kotlin = { group = "com.google.protobuf", name = "protobuf-kotlin", version.ref = "protobuf" } kotlinx_atomicfu = { group = "org.jetbrains.kotlin", name = "atomicfu", version.ref = "kotlin_sdk" } +kotlinx_atomicfu_linux_x64 = { group = "org.jetbrains.kotlinx", name = "atomicfu-linuxx64", version.ref = "atomicfu" } +kotlinx_atomicfu_macos_x64 = { group = "org.jetbrains.kotlinx", name = "atomicfu-macosx64", version.ref = "atomicfu" } kotlinx_benchmark_runtime = { group = "org.jetbrains.kotlinx", name = "kotlinx-benchmark-runtime", version.ref = "kotlinx_benchmark" } kotlinx_coroutines_core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "kotlinx_coroutines" } kotlinx_coroutines_core_js = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core-js", version.ref = "kotlinx_coroutines" } @@ -210,6 +222,8 @@ kotlinx_coroutines_guava = { group = "org.jetbrains.kotlinx", name = "kotlinx-co kotlinx_coroutines_reactive = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-reactive", version.ref = "kotlinx_coroutines" } kotlinx_collections_immutable = { group = "org.jetbrains.kotlinx", name = "kotlinx-collections-immutable", version.ref = "kotlinx_collections" } kotlinx_datetime = { group = "org.jetbrains.kotlinx", name = "kotlinx-datetime", version.ref = "kotlinx_datetime" } +kotlinx_html = { group = "org.jetbrains.kotlinx", name = "kotlinx-html", version.ref = "kotlinx_html" } +kotlinx_html_js = { group = "org.jetbrains.kotlinx", name = "kotlinx-html-js", version.ref = "kotlinx_html" } kotlinx_html_jvm = { group = "org.jetbrains.kotlinx", name = "kotlinx-html-jvm", version.ref = "kotlinx_html" } kotlinx_serialization_core = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-core", version.ref = "kotlinx_serialization" } kotlinx_serialization_core_js = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-core-js", version.ref = "kotlinx_serialization" } @@ -222,6 +236,7 @@ kotlinx_serialization_protobuf_js = { group = "org.jetbrains.kotlinx", name = "k kotlinx_serialization_protobuf_jvm = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-protobuf-jvm", version.ref = "kotlinx_serialization" } kotlinx_serialization_properties = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-properties", version.ref = "kotlinx_serialization" } kotlinx_serialization_properties_jvm = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-properties-jvm", version.ref = "kotlinx_serialization" } +ksp = { group = "com.google.devtools.ksp", name = "symbol-processing-api", version.ref = "ksp" } hibernate_core = { group = "org.hibernate", name = "hibernate-core", version.ref = "hibernate" } hibernate_hikaricp = { group = "org.hibernate", name = "hibernate-hikaricp", version.ref = "hibernate" } hibernate_graalvm = { group = "org.hibernate", name = "hibernate-graalvm", version.ref = "hibernate" } @@ -253,10 +268,11 @@ lz4 = { group = "net.jpountz.lz4", name = "lz4", version.ref = "lz4" } guava = { group = "com.google.guava", name = "guava", version.ref = "guava" } graalvm_sdk = { group = "org.graalvm.sdk", name = "graal-sdk", version.ref = "graalvm_sdk" } micronaut_aop = { group = "io.micronaut", name = "micronaut-aop", version.ref = "micronaut_lib" } +micronaut_bom = { group = "io.micronaut", name = "micronaut-bom", version.ref = "micronaut_lib" } micronaut_aws_sdk_v2 = { group = "io.micronaut.aws", name = "micronaut-aws-sdk-v2", version.ref = "micronaut_aws" } micronaut_context = { group = "io.micronaut", name = "micronaut-context", version.ref = "micronaut_lib" } micronaut_graal = { group = "io.micronaut", name = "micronaut-graal", version.ref = "micronaut_lib" } -micronaut_graphql = { group = "io.micronaut.graphql", name = "micronaut-graphql", version.ref = "micronaut_graphql" } +micronaut_graphql = { group = "io.micronaut.graphql", name = "micronaut-graphql", version.ref = "micronaut_graphql" } micronaut_data_processor = { group = "io.micronaut.data", name = "micronaut-data-processor", version.ref = "micronaut_data" } micronaut_data_document_processor = { group = "io.micronaut.data", name = "micronaut-data-document-processor", version.ref = "micronaut_data" } micronaut_data_tx = { group = "io.micronaut.data", name = "micronaut-data-tx", version.ref = "micronaut_data" } @@ -386,9 +402,10 @@ brotli_native_windows_amd64 = { group = "com.aayushatharva.brotli4j", name = "na commons_compress = { group = "org.apache.commons", name = "commons-compress", version.ref = "commons_compress" } commons_csv = { group = "org.apache.commons", name = "commons-csv", version.ref = "commons_csv" } projectreactor_bom = { group = "io.projectreactor", name = "reactor-bom", version.ref = "projectreactor" } -reactor_core = { group = "io.projectreactor", name = "reactor-core" } -reactor_netty_core = { group = "io.projectreactor.netty", name = "reactor-netty-core" } -reactor_netty_http = { group = "io.projectreactor.netty", name = "reactor-netty-http" } +reactor_core = { group = "io.projectreactor", name = "reactor-core", version.ref = "projectreactor_core" } +reactor_netty = { group = "io.projectreactor.netty", name = "reactor-netty", version.ref = "projectreactor_netty" } +reactor_netty_core = { group = "io.projectreactor.netty", name = "reactor-netty-core", version.ref = "projectreactor_netty" } +reactor_netty_http = { group = "io.projectreactor.netty", name = "reactor-netty-http", version.ref = "projectreactor_netty" } bouncycastle = { group = "org.bouncycastle", name = "bcprov-jdk15on", version.ref = "bouncycastle" } bouncycastle_tls = { group = "org.bouncycastle", name = "bctls-jdk15on", version.ref = "bouncycastle" } bouncycastle_pkix = { group = "org.bouncycastle", name = "bcpkix-jdk15on", version.ref = "bouncycastle" } @@ -415,3 +432,44 @@ testcontainers_core = { group = "org.testcontainers", name = "testcontainers", v testcontainers_bom = { group = "org.testcontainers", name = "testcontainers-bom", version.ref = "testcontainers" } testcontainers_postgres = { group = "org.testcontainers", name = "postgresql", version.ref = "testcontainers" } testcontainers_gcloud = { group = "org.testcontainers", name = "gcloud", version.ref = "testcontainers" } +koin_core = { group = "io.insert-koin", name = "koin-core", version.ref = "koin" } +koin_annotations = { group = "io.insert-koin", name = "koin-annotations", version.ref = "koin_ksp" } +koin_test = { group = "io.insert-koin", name = "koin-test", version.ref = "koin" } +koint_ksp = { group = "io.insert-koin", name = "koin-ksp-compiler", version.ref = "koin_ksp" } +koin_test_junit4 = { group = "io.insert-koin", name = "koin-test-junit4", version.ref = "koin" } +koin_test_junit5 = { group = "io.insert-koin", name = "koin-test-junit5", version.ref = "koin" } +## Plugin Aliases +plugin_versionCheck = { group = "com.github.ben-manes", name = "gradle-versions-plugin", version.ref = "versionCheck" } +plugin_testLogger = { group = "com.adarshr", name = "gradle-test-logger-plugin", version.ref = "testLoggerPlugin" } +plugin_detekt = { group = "io.gitlab.arturbosch.detekt", name = "detekt-gradle-plugin", version.ref = "detekt" } +plugin_dokka = { group = "org.jetbrains.dokka", name = "dokka-gradle-plugin", version.ref = "dokka" } +plugin_docker = { group = "io.micronaut.gradle", name = "micronaut-docker-plugin", version.ref = "micronaut_plugin" } +plugin_micronaut = { group = "io.micronaut.gradle", name = "micronaut-gradle-plugin", version.ref = "micronaut_plugin" } +plugin_kover = { group = "org.jetbrains.kotlinx", name = "kover", version.ref = "kover" } +plugin_spotless = { group = "com.diffplug.spotless", name = "spotless-plugin-gradle", version.ref = "spotless" } +plugin_sonar = { group = "org.sonarsource.scanner.gradle", name = "sonarqube-gradle-plugin", version.ref = "sonar" } +plugin_kotlin_allopen = { group = "org.jetbrains.kotlin", name = "kotlin-allopen", version.ref = "kotlin_sdk" } +plugin_kotlin_noarg = { group = "org.jetbrains.kotlin", name = "kotlin-noarg", version.ref = "kotlin_sdk" } +plugin_kotlinx_atomicfu = { group = "org.jetbrains.kotlinx", name = "atomicfu-gradle-plugin", version.ref = "atomicfu" } +plugin_kotlinx_serialization = { group = "org.jetbrains.kotlin", name = "kotlin-serialization", version.ref = "kotlin_sdk" } +plugin_graalvm = { group = "org.graalvm.buildtools.native", name = "org.graalvm.buildtools.native.gradle.plugin", version.ref = "graalvm_plugin" } + +[bundles] +kotlinx_coroutines_jvm = [ + "kotlinx_coroutines_core", + "kotlinx_coroutines_jdk8", + "kotlinx_coroutines_jdk9", + "kotlinx_coroutines_slf4j" +] +kotlinx_serialization = [ + "kotlinx_serialization_core", + "kotlinx_serialization_json", + "kotlinx_serialization_protobuf", + "kotlinx_serialization_properties" +] +kotlinx_atomicfu = [ + "kotlinx_atomicfu", + "kotlinx_atomicfu_linux_x64", + "kotlinx_atomicfu_macos_x64" +] +koin = ["koin_core", "koin_annotations"] diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ae04661ee7..91677aab66 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists +distributionBase = GRADLE_USER_HOME +distributionPath = wrapper/dists +distributionUrl = https://services.gradle.org/distributions/gradle-7.5.1-bin.zip +zipStoreBase = GRADLE_USER_HOME +zipStorePath = wrapper/dists diff --git a/gradlew b/gradlew index a69d9cb6c2..dadd4ddd1b 100755 --- a/gradlew +++ b/gradlew @@ -69,18 +69,18 @@ app_path=$0 # Need this for daisy-chained symlinks. while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac + ls=$(ls -ld "$app_path") + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit +APP_HOME=$(cd "${APP_HOME:-./}" && pwd -P) || exit APP_NAME="Gradle" APP_BASE_NAME=${0##*/} @@ -91,15 +91,15 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum -warn () { - echo "$*" +warn() { + echo "$*" } >&2 -die () { - echo - echo "$*" - echo - exit 1 +die() { + echo + echo "$*" + echo + exit 1 } >&2 # OS specific support (must be 'true' or 'false'). @@ -107,51 +107,52 @@ cygwin=false msys=false darwin=false nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; +case "$(uname)" in #( + CYGWIN*) cygwin=true ;; #( + Darwin*) darwin=true ;; #( + MSYS* | MINGW*) msys=true ;; #( + NONSTOP*) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - # Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME +if [ -n "$JAVA_HOME" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ]; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME Please set the JAVA_HOME variable in your environment to match the location of your Java installation." - fi + fi else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + JAVACMD=java + which java > /dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi # Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac +if ! "$cygwin" && ! "$darwin" && ! "$nonstop"; then + case $MAX_FD in #( + max*) + MAX_FD=$(ulimit -H -n) \ + || warn "Could not query maximum file descriptor limit" + ;; + esac + case $MAX_FD in #( + '' | soft) : ;; #( + *) + ulimit -n "$MAX_FD" \ + || warn "Could not set maximum file descriptor limit to $MAX_FD" + ;; + esac fi # Collect all arguments for the java command, stacking in reverse order: @@ -163,34 +164,36 @@ fi # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done +if "$cygwin" || "$msys"; then + APP_HOME=$(cygpath --path --mixed "$APP_HOME") + CLASSPATH=$(cygpath --path --mixed "$CLASSPATH") + + JAVACMD=$(cygpath --unix "$JAVACMD") + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg; do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) + t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] + ;; #( + *) false ;; + esac + then + arg=$(cygpath --path --ignore --mixed "$arg") + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done fi # Collect all arguments for the java command; @@ -200,15 +203,14 @@ fi # * put everything else in single quotes, so that it's not re-expanded. set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" # Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" +if ! command -v xargs > /dev/null 2>&1; then + die "xargs is not available" fi # Use "xargs" to parse quoted args. @@ -231,10 +233,10 @@ fi # eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" \ + | xargs -n1 \ + | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' \ + | tr '\n' ' ' +)" '"$@"' exec "$JAVACMD" "$@" diff --git a/images/README.md b/images/README.md index 44b8899565..3df5fd2f82 100644 --- a/images/README.md +++ b/images/README.md @@ -1,2 +1 @@ - -*Base images for use with Docker.* +_Base images for use with Docker._ diff --git a/images/base-alpine/Dockerfile b/images/base-alpine/Dockerfile index b1a22e225a..6297037a29 100644 --- a/images/base-alpine/Dockerfile +++ b/images/base-alpine/Dockerfile @@ -1,4 +1,3 @@ - ARG ALPINE_VERSION=3.16.0 ARG ALPINE_ARCH=amd64 ARG ALPINE_HASH=sha256:4ff3ca91275773af45cb4b0834e12b7eb47d1c18f770a0b151381cd227f4c253 @@ -16,5 +15,5 @@ LABEL org.opencontainers.image.source=https://github.com/elide-dev/v3/blob/v3/im RUN apk add --no-cache --update musl ENV LC_CTYPE=en_US.UTF-8 \ - LC_ALL=en_US.UTF-8 \ - PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/gvm/bin:/sbin:/bin + LC_ALL=en_US.UTF-8 \ + PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/gvm/bin:/sbin:/bin diff --git a/images/base-alpine/cloudbuild.yaml b/images/base-alpine/cloudbuild.yaml index 98684ca752..1702befd65 100644 --- a/images/base-alpine/cloudbuild.yaml +++ b/images/base-alpine/cloudbuild.yaml @@ -1,6 +1,6 @@ steps: - - name: 'gcr.io/cloud-builders/docker' - args: ['build', '-t', 'us-docker.pkg.dev/elide-fw/tools/base/alpine', '.'] -images: ['us-docker.pkg.dev/elide-fw/tools/base/alpine'] + - name: "gcr.io/cloud-builders/docker" + args: ["build", "-t", "us-docker.pkg.dev/elide-fw/tools/base/alpine", "."] +images: ["us-docker.pkg.dev/elide-fw/tools/base/alpine"] options: logging: CLOUD_LOGGING_ONLY diff --git a/images/base/Dockerfile b/images/base/Dockerfile index 0dd2ab7805..d87d09a79e 100644 --- a/images/base/Dockerfile +++ b/images/base/Dockerfile @@ -1,4 +1,3 @@ - ARG UBUNTU_VERSION=20.04 ARG UBUNTU_ARCH=amd64 ARG UBUNTU_HASH=sha256:b2339eee806d44d6a8adc0a790f824fb71f03366dd754d400316ae5a7e3ece3e @@ -14,14 +13,14 @@ LABEL org.opencontainers.image.base.name=ubuntu:${UBUNTU_VERSION} LABEL org.opencontainers.image.source=https://github.com/elide-dev/v3/blob/v3/images/base/Dockerfile RUN apt-get update \ - && apt-get -y upgrade \ - && DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends \ - libc6 \ - zlib1g \ - && apt-get remove perl \ - && apt-get autoremove \ - && rm -rf /var/lib/apt/lists/*; + && apt-get -y upgrade \ + && DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends \ + libc6 \ + zlib1g \ + && apt-get remove perl \ + && apt-get autoremove \ + && rm -rf /var/lib/apt/lists/* ENV LC_CTYPE=en_US.UTF-8 \ - LC_ALL=en_US.UTF-8 \ - PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/gvm/bin:/sbin:/bin + LC_ALL=en_US.UTF-8 \ + PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/gvm/bin:/sbin:/bin diff --git a/images/base/cloudbuild.yaml b/images/base/cloudbuild.yaml index daab500756..bff415017d 100644 --- a/images/base/cloudbuild.yaml +++ b/images/base/cloudbuild.yaml @@ -1,6 +1,6 @@ steps: - - name: 'gcr.io/cloud-builders/docker' - args: ['build', '-t', 'us-docker.pkg.dev/elide-fw/tools/base', '.'] -images: ['us-docker.pkg.dev/elide-fw/tools/base'] + - name: "gcr.io/cloud-builders/docker" + args: ["build", "-t", "us-docker.pkg.dev/elide-fw/tools/base", "."] +images: ["us-docker.pkg.dev/elide-fw/tools/base"] options: logging: CLOUD_LOGGING_ONLY diff --git a/images/builder/Dockerfile b/images/builder/Dockerfile index 741099d95e..af75c12d89 100644 --- a/images/builder/Dockerfile +++ b/images/builder/Dockerfile @@ -1,4 +1,3 @@ - ARG BASE_IMAGE=gvm17 ARG BASE_VERSION=":latest" ARG BASE_ARCH="amd64" @@ -14,184 +13,189 @@ ARG KOTLIN_VERSION=1.7.0 ARG GRADLE_DIST=bin RUN echo "Building Elide builder image..." \ - && set -eux \ - && apt-get update \ - && apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9 \ - && DEBIAN_FRONTEND=noninteractive apt-get install -y \ - apt-transport-https \ - autoconf \ - automake \ - autotools-dev \ - bash \ - build-essential \ - ca-certificates \ - clang \ - curl \ - g++ \ - gcc \ - git \ - gnupg \ - libc6-dev \ - libpng-dev \ - libtool \ - make \ - pkg-config \ - qt5-default \ - software-properties-common \ - tar \ - time \ - unzip \ - wget \ - zlib1g \ - && cd ~ \ - && echo "Installing Go..."; \ - arch="$(dpkg --print-architecture)"; arch="${arch##*-}"; \ - url=; \ - case "${arch}" in \ - 'amd64') \ - url='https://dl.google.com/go/go1.18.3.linux-amd64.tar.gz'; \ - sha256='956f8507b302ab0bb747613695cdae10af99bbd39a90cae522b7c0302cc27245'; \ - ;; \ - 'armel') \ - export GOARCH='arm' GOARM='5' GOOS='linux'; \ - ;; \ - 'armhf') \ - url='https://dl.google.com/go/go1.18.3.linux-armv6l.tar.gz'; \ - sha256='b8f0b5db24114388d5dcba7ca0698510ea05228b0402fcbeb0881f74ae9cb83b'; \ - ;; \ - 'arm64') \ - url='https://dl.google.com/go/go1.18.3.linux-arm64.tar.gz'; \ - sha256='beacbe1441bee4d7978b900136d1d6a71d150f0a9bb77e9d50c822065623a35a'; \ - ;; \ - 'i386') \ - url='https://dl.google.com/go/go1.18.3.linux-386.tar.gz'; \ - sha256='72b73da021397a3a1ce182c19d2a890a5346bfe80885d9dd7d1ff04ce6597938'; \ - ;; \ - 'mips64el') \ - export GOARCH='mips64le' GOOS='linux'; \ - ;; \ - 'ppc64el') \ - url='https://dl.google.com/go/go1.18.3.linux-ppc64le.tar.gz'; \ - sha256='5d42bd252e7af9f854df92e46bb2e88be7b2fb310cc937c0fe091afd8c4f2016'; \ - ;; \ - 's390x') \ - url='https://dl.google.com/go/go1.18.3.linux-s390x.tar.gz'; \ - sha256='ebb4efddec5bbd22bdd9c87137cb3dd59e874b5dfcf93d00bef351c60d2c7401'; \ - ;; \ - *) echo >&2 "error: unsupported architecture '$arch' (likely packaging update needed)"; exit 1 ;; \ - esac; \ - build=; \ - if [ -z "$url" ]; then \ - # https://github.com/golang/go/issues/38536#issuecomment-616897960 - build=1; \ - url='https://dl.google.com/go/go1.18.3.src.tar.gz'; \ - sha256='0012386ddcbb5f3350e407c679923811dbd283fcdc421724931614a842ecbc2d'; \ - echo >&2; \ - echo >&2 "warning: current architecture ($arch) does not have a compatible Go binary release; will be building from source"; \ - echo >&2; \ - fi; \ - \ - wget -O go.tgz.asc "$url.asc"; \ - wget -O go.tgz "$url" --progress=dot:giga; \ - echo "$sha256 *go.tgz" | sha256sum -c -; \ - \ - # https://github.com/golang/go/issues/14739#issuecomment-324767697 - GNUPGHOME="$(mktemp -d)"; export GNUPGHOME; \ - # https://www.google.com/linuxrepositories/ - gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 'EB4C 1BFD 4F04 2F6D DDCC EC91 7721 F63B D38B 4796'; \ - # let's also fetch the specific subkey of that key explicitly that we expect "go.tgz.asc" to be signed by, just to make sure we definitely have it - gpg --batch --keyserver keyserver.ubuntu.com --recv-keys '2F52 8D36 D67B 69ED F998 D857 78BD 6547 3CB3 BD13'; \ - gpg --batch --verify go.tgz.asc go.tgz; \ - gpgconf --kill all; \ - rm -rf "$GNUPGHOME" go.tgz.asc; \ - \ - tar -C /usr/local -xzf go.tgz; \ - rm go.tgz; \ - \ - if [ -n "$build" ]; then \ - savedAptMark="$(apt-mark showmanual)"; \ - apt-get update; \ - apt-get install -y --no-install-recommends golang-go; \ - \ - export GOCACHE='/tmp/gocache'; \ - \ - ( \ - cd /usr/local/go/src; \ - # set GOROOT_BOOTSTRAP + GOHOST* such that we can build Go successfully - export GOROOT_BOOTSTRAP="$(go env GOROOT)" GOHOSTOS="$GOOS" GOHOSTARCH="$GOARCH"; \ - ./make.bash; \ - ); \ - \ - apt-mark auto '.*' > /dev/null; \ - apt-mark manual $savedAptMark > /dev/null; \ - apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ - rm -rf /var/lib/apt/lists/*; \ - \ - # remove a few intermediate / bootstrapping files the official binary release tarballs do not contain - rm -rf \ - /usr/local/go/pkg/*/cmd \ - /usr/local/go/pkg/bootstrap \ - /usr/local/go/pkg/obj \ - /usr/local/go/pkg/tool/*/api \ - /usr/local/go/pkg/tool/*/go_bootstrap \ - /usr/local/go/src/cmd/dist/dist \ - "$GOCACHE" \ - ; \ - fi; \ - \ - /usr/local/go/bin/go version \ - && echo "Installing NodeJS (v$NODE_VERSION / Yarn $YARN_VERSION)..." \ - && curl -sL "https://deb.nodesource.com/setup_$NODE_VERSION.x" | bash - \ - && DEBIAN_FRONTEND=noninteractive apt-get install -y nodejs \ - && npm install -g "yarn@$YARN_VERSION" \ - && cd /opt \ - && echo "Installing Docker..." \ - && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg \ - && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ + && set -eux \ + && apt-get update \ + && apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9 \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y \ + apt-transport-https \ + autoconf \ + automake \ + autotools-dev \ + bash \ + build-essential \ + ca-certificates \ + clang \ + curl \ + g++ \ + gcc \ + git \ + gnupg \ + libc6-dev \ + libpng-dev \ + libtool \ + make \ + pkg-config \ + qt5-default \ + software-properties-common \ + tar \ + time \ + unzip \ + wget \ + zlib1g \ + && cd ~ \ + && echo "Installing Go..." +arch="$(dpkg --print-architecture)" +arch="${arch##*-}" +url= +case "${arch}" in + 'amd64') + url='https://dl.google.com/go/go1.18.3.linux-amd64.tar.gz' + sha256='956f8507b302ab0bb747613695cdae10af99bbd39a90cae522b7c0302cc27245' + ;; + 'armel') + export GOARCH='arm' GOARM='5' GOOS='linux' + ;; + 'armhf') + url='https://dl.google.com/go/go1.18.3.linux-armv6l.tar.gz' + sha256='b8f0b5db24114388d5dcba7ca0698510ea05228b0402fcbeb0881f74ae9cb83b' + ;; + 'arm64') + url='https://dl.google.com/go/go1.18.3.linux-arm64.tar.gz' + sha256='beacbe1441bee4d7978b900136d1d6a71d150f0a9bb77e9d50c822065623a35a' + ;; + 'i386') + url='https://dl.google.com/go/go1.18.3.linux-386.tar.gz' + sha256='72b73da021397a3a1ce182c19d2a890a5346bfe80885d9dd7d1ff04ce6597938' + ;; + 'mips64el') + export GOARCH='mips64le' GOOS='linux' + ;; + 'ppc64el') + url='https://dl.google.com/go/go1.18.3.linux-ppc64le.tar.gz' + sha256='5d42bd252e7af9f854df92e46bb2e88be7b2fb310cc937c0fe091afd8c4f2016' + ;; + 's390x') + url='https://dl.google.com/go/go1.18.3.linux-s390x.tar.gz' + sha256='ebb4efddec5bbd22bdd9c87137cb3dd59e874b5dfcf93d00bef351c60d2c7401' + ;; + *) + echo >&2 "error: unsupported architecture '$arch' (likely packaging update needed)" + exit 1 + ;; +esac +build= +if [ -z "$url" ]; then + # https://github.com/golang/go/issues/38536#issuecomment-616897960 + build=1 + url='https://dl.google.com/go/go1.18.3.src.tar.gz' + sha256='0012386ddcbb5f3350e407c679923811dbd283fcdc421724931614a842ecbc2d' + echo >&2 + echo >&2 "warning: current architecture ($arch) does not have a compatible Go binary release; will be building from source" + echo >&2 +fi + +wget -O go.tgz.asc "$url.asc" +wget -O go.tgz "$url" --progress=dot:giga +echo "$sha256 *go.tgz" | sha256sum -c - + +# https://github.com/golang/go/issues/14739#issuecomment-324767697 +GNUPGHOME="$(mktemp -d)" +export GNUPGHOME +# https://www.google.com/linuxrepositories/ +gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 'EB4C 1BFD 4F04 2F6D DDCC EC91 7721 F63B D38B 4796' +# let's also fetch the specific subkey of that key explicitly that we expect "go.tgz.asc" to be signed by, just to make sure we definitely have it +gpg --batch --keyserver keyserver.ubuntu.com --recv-keys '2F52 8D36 D67B 69ED F998 D857 78BD 6547 3CB3 BD13' +gpg --batch --verify go.tgz.asc go.tgz +gpgconf --kill all +rm -rf "$GNUPGHOME" go.tgz.asc + +tar -C /usr/local -xzf go.tgz +rm go.tgz + +if [ -n "$build" ]; then + savedAptMark="$(apt-mark showmanual)" + apt-get update + apt-get install -y --no-install-recommends golang-go + + export GOCACHE='/tmp/gocache' + + ( + cd /usr/local/go/src + # set GOROOT_BOOTSTRAP + GOHOST* such that we can build Go successfully + export GOROOT_BOOTSTRAP="$(go env GOROOT)" GOHOSTOS="$GOOS" GOHOSTARCH="$GOARCH" + ./make.bash + ) + + apt-mark auto '.*' > /dev/null + apt-mark manual $savedAptMark > /dev/null + apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false + rm -rf /var/lib/apt/lists/* + + # remove a few intermediate / bootstrapping files the official binary release tarballs do not contain + rm -rf \ + /usr/local/go/pkg/*/cmd \ + /usr/local/go/pkg/bootstrap \ + /usr/local/go/pkg/obj \ + /usr/local/go/pkg/tool/*/api \ + /usr/local/go/pkg/tool/*/go_bootstrap \ + /usr/local/go/src/cmd/dist/dist \ + "$GOCACHE" \ + ; +fi + +/usr/local/go/bin/go version \ + && echo "Installing NodeJS (v$NODE_VERSION / Yarn $YARN_VERSION)..." \ + && curl -sL "https://deb.nodesource.com/setup_$NODE_VERSION.x" | bash - \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y nodejs \ + && npm install -g "yarn@$YARN_VERSION" \ + && cd /opt \ + && echo "Installing Docker..." \ + && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg \ + && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null \ - && apt-get update \ - && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends docker-ce docker-ce-cli containerd.io \ - && echo "Installing Gradle..." \ - && mkdir -p /opt/gradle \ - && cd /opt/gradle \ - && wget -q "https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-$GRADLE_DIST.zip" \ - && unzip gradle*.zip \ - && ls -d */ | sed 's/\/*$//g' | xargs -I{} mv {} gradle \ - && rm gradle*.zip \ - && echo "Installing Kotlin..." \ - && mkdir -p /opt/kotlin \ - && cd /opt/kotlin \ - && wget -q "https://github.com/JetBrains/kotlin/releases/download/v$KOTLIN_VERSION/kotlin-compiler-$KOTLIN_VERSION.zip" \ - && unzip *kotlin*.zip \ - && rm *kotlin*.zip \ - && echo "Installing Chrome..." \ - && wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \ - && apt install -y ./google-chrome-stable_current_amd64.deb \ - && rm -f google-chrome-stable_current_amd64.deb \ - && apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A040830F7FAC5991 \ - && echo "Installing Bazelisk..." \ - && curl -LO "https://github.com/bazelbuild/bazelisk/releases/download/v1.11.0/bazelisk-linux-amd64" \ - && mv bazelisk-linux-amd64 "/usr/bin/bazel" \ - && chmod +x /usr/bin/bazel \ - && ln -s /usr/bin/bazel /usr/bin/bazelisk \ - && echo "Installing Google Cloud SDK..." \ - && mkdir -p /var/lib/gcloud \ - && cd /var/lib/gcloud \ - && curl https://sdk.cloud.google.com > install_gcloud.sh \ - && bash install_gcloud.sh --disable-prompts --install-dir=/var/lib/gcloud \ - && rm -fv install_gcloud.sh \ - && cd ~ \ - && /var/lib/gcloud/google-cloud-sdk/bin/gcloud auth configure-docker us-docker.pkg.dev \ - && rm -rf /var/lib/apt/lists/* \ - && export GOPATH="/go" \ - && mkdir -p "$GOPATH/src" "$GOPATH/bin" \ - && chmod -R 777 "$GOPATH" \ - && echo "Builder image ready."; + && apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends docker-ce docker-ce-cli containerd.io \ + && echo "Installing Gradle..." \ + && mkdir -p /opt/gradle \ + && cd /opt/gradle \ + && wget -q "https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-$GRADLE_DIST.zip" \ + && unzip gradle*.zip \ + && ls -d */ | sed 's/\/*$//g' | xargs -I{} mv {} gradle \ + && rm gradle*.zip \ + && echo "Installing Kotlin..." \ + && mkdir -p /opt/kotlin \ + && cd /opt/kotlin \ + && wget -q "https://github.com/JetBrains/kotlin/releases/download/v$KOTLIN_VERSION/kotlin-compiler-$KOTLIN_VERSION.zip" \ + && unzip *kotlin*.zip \ + && rm *kotlin*.zip \ + && echo "Installing Chrome..." \ + && wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \ + && apt install -y ./google-chrome-stable_current_amd64.deb \ + && rm -f google-chrome-stable_current_amd64.deb \ + && apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A040830F7FAC5991 \ + && echo "Installing Bazelisk..." \ + && curl -LO "https://github.com/bazelbuild/bazelisk/releases/download/v1.11.0/bazelisk-linux-amd64" \ + && mv bazelisk-linux-amd64 "/usr/bin/bazel" \ + && chmod +x /usr/bin/bazel \ + && ln -s /usr/bin/bazel /usr/bin/bazelisk \ + && echo "Installing Google Cloud SDK..." \ + && mkdir -p /var/lib/gcloud \ + && cd /var/lib/gcloud \ + && curl https://sdk.cloud.google.com > install_gcloud.sh \ + && bash install_gcloud.sh --disable-prompts --install-dir=/var/lib/gcloud \ + && rm -fv install_gcloud.sh \ + && cd ~ \ + && /var/lib/gcloud/google-cloud-sdk/bin/gcloud auth configure-docker us-docker.pkg.dev \ + && rm -rf /var/lib/apt/lists/* \ + && export GOPATH="/go" \ + && mkdir -p "$GOPATH/src" "$GOPATH/bin" \ + && chmod -R 777 "$GOPATH" \ + && echo "Builder image ready." ENV GRADLE_HOME="/opt/gradle" \ - KOTLIN_HOME="/opt/kotlinc" \ - JAVA_HOME="/usr/lib/jvm/zulu17" \ - GRAALVM_HOME="/usr/lib/gvm" \ - GOPATH="/go" \ - QTWEBENGINE_DISABLE_SANDBOX="1" \ - PATH="$GRADLE_HOME/bin:$KOTLIN_HOME/bin:$GOPATH/bin:/usr/local/go/bin:/var/lib/gcloud/google-cloud-sdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/gvm/bin:/sbin:/bin" + KOTLIN_HOME="/opt/kotlinc" \ + JAVA_HOME="/usr/lib/jvm/zulu17" \ + GRAALVM_HOME="/usr/lib/gvm" \ + GOPATH="/go" \ + QTWEBENGINE_DISABLE_SANDBOX="1" \ + PATH="$GRADLE_HOME/bin:$KOTLIN_HOME/bin:$GOPATH/bin:/usr/local/go/bin:/var/lib/gcloud/google-cloud-sdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/gvm/bin:/sbin:/bin" diff --git a/images/builder/cloudbuild.yaml b/images/builder/cloudbuild.yaml index cdfa7c91c0..743a4aa8c9 100644 --- a/images/builder/cloudbuild.yaml +++ b/images/builder/cloudbuild.yaml @@ -1,6 +1,6 @@ steps: - - name: 'gcr.io/cloud-builders/docker' - args: ['build', '-t', 'us-docker.pkg.dev/elide-fw/tools/builder', '.'] -images: ['us-docker.pkg.dev/elide-fw/tools/builder'] + - name: "gcr.io/cloud-builders/docker" + args: ["build", "-t", "us-docker.pkg.dev/elide-fw/tools/builder", "."] +images: ["us-docker.pkg.dev/elide-fw/tools/builder"] options: logging: CLOUD_LOGGING_ONLY diff --git a/images/codespace/Dockerfile b/images/codespace/Dockerfile index 52e05df066..1325bebd7a 100644 --- a/images/codespace/Dockerfile +++ b/images/codespace/Dockerfile @@ -1,4 +1,3 @@ - ARG BASE_ARCH="amd64" FROM --platform=linux/${BASE_ARCH} mcr.microsoft.com/vscode/devcontainers/base:ubuntu-20.04 @@ -23,275 +22,280 @@ ARG GRAAL_ARCH=amd64 ARG JAVA_VERSION=java17 RUN apt-get update \ - && apt-get -y upgrade \ - && DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends \ - ca-certificates \ - curl \ - git \ - gnupg \ - libc-dev \ - && apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9 \ - && curl -O https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb \ - && apt-get install ./zulu-repo_1.0.0-3_all.deb \ - && rm -fv /zulu-repo_1.0.0-3_all.deb \ - && apt-get update \ - && apt-get install -y zulu17-jdk wget tar \ - && set -eux \ - && apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9 \ - && DEBIAN_FRONTEND=noninteractive apt-get install -y \ - apt-transport-https \ - autoconf \ - automake \ - autotools-dev \ - bash \ - build-essential \ - ca-certificates \ - clang \ - curl \ - g++ \ - gcc \ - git \ - gnupg \ - libc6-dev \ - libpng-dev \ - libtool \ - make \ - pkg-config \ - qt5-default \ - software-properties-common \ - tar \ - time \ - cron \ - htop \ - jq \ - lcov \ - logrotate \ - lsb-release \ - sudo \ - fakeroot \ - multitail \ - python2 \ - python2-dev \ - python3 \ - python3-dev \ - python3-pip \ - python3-wheel \ - python3-venv \ - python3-setuptools \ - rsyslog \ - tree \ - tmux \ - vim \ - unzip \ - wget \ - zlib1g \ - && cd ~ \ - && echo "Installing Go..."; \ - arch="$(dpkg --print-architecture)"; arch="${arch##*-}"; \ - url=; \ - case "${arch}" in \ - 'amd64') \ - url='https://dl.google.com/go/go1.18.3.linux-amd64.tar.gz'; \ - sha256='956f8507b302ab0bb747613695cdae10af99bbd39a90cae522b7c0302cc27245'; \ - ;; \ - 'armel') \ - export GOARCH='arm' GOARM='5' GOOS='linux'; \ - ;; \ - 'armhf') \ - url='https://dl.google.com/go/go1.18.3.linux-armv6l.tar.gz'; \ - sha256='b8f0b5db24114388d5dcba7ca0698510ea05228b0402fcbeb0881f74ae9cb83b'; \ - ;; \ - 'arm64') \ - url='https://dl.google.com/go/go1.18.3.linux-arm64.tar.gz'; \ - sha256='beacbe1441bee4d7978b900136d1d6a71d150f0a9bb77e9d50c822065623a35a'; \ - ;; \ - 'i386') \ - url='https://dl.google.com/go/go1.18.3.linux-386.tar.gz'; \ - sha256='72b73da021397a3a1ce182c19d2a890a5346bfe80885d9dd7d1ff04ce6597938'; \ - ;; \ - 'mips64el') \ - export GOARCH='mips64le' GOOS='linux'; \ - ;; \ - 'ppc64el') \ - url='https://dl.google.com/go/go1.18.3.linux-ppc64le.tar.gz'; \ - sha256='5d42bd252e7af9f854df92e46bb2e88be7b2fb310cc937c0fe091afd8c4f2016'; \ - ;; \ - 's390x') \ - url='https://dl.google.com/go/go1.18.3.linux-s390x.tar.gz'; \ - sha256='ebb4efddec5bbd22bdd9c87137cb3dd59e874b5dfcf93d00bef351c60d2c7401'; \ - ;; \ - *) echo >&2 "error: unsupported architecture '$arch' (likely packaging update needed)"; exit 1 ;; \ - esac; \ - build=; \ - if [ -z "$url" ]; then \ - # https://github.com/golang/go/issues/38536#issuecomment-616897960 - build=1; \ - url='https://dl.google.com/go/go1.18.3.src.tar.gz'; \ - sha256='0012386ddcbb5f3350e407c679923811dbd283fcdc421724931614a842ecbc2d'; \ - echo >&2; \ - echo >&2 "warning: current architecture ($arch) does not have a compatible Go binary release; will be building from source"; \ - echo >&2; \ - fi; \ - \ - wget -O go.tgz.asc "$url.asc"; \ - wget -O go.tgz "$url" --progress=dot:giga; \ - echo "$sha256 *go.tgz" | sha256sum -c -; \ - \ - # https://github.com/golang/go/issues/14739#issuecomment-324767697 - GNUPGHOME="$(mktemp -d)"; export GNUPGHOME; \ - # https://www.google.com/linuxrepositories/ - gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 'EB4C 1BFD 4F04 2F6D DDCC EC91 7721 F63B D38B 4796'; \ - # let's also fetch the specific subkey of that key explicitly that we expect "go.tgz.asc" to be signed by, just to make sure we definitely have it - gpg --batch --keyserver keyserver.ubuntu.com --recv-keys '2F52 8D36 D67B 69ED F998 D857 78BD 6547 3CB3 BD13'; \ - gpg --batch --verify go.tgz.asc go.tgz; \ - gpgconf --kill all; \ - rm -rf "$GNUPGHOME" go.tgz.asc; \ - \ - tar -C /usr/local -xzf go.tgz; \ - rm go.tgz; \ - \ - if [ -n "$build" ]; then \ - savedAptMark="$(apt-mark showmanual)"; \ - apt-get update; \ - apt-get install -y --no-install-recommends golang-go; \ - \ - export GOCACHE='/tmp/gocache'; \ - \ - ( \ - cd /usr/local/go/src; \ - # set GOROOT_BOOTSTRAP + GOHOST* such that we can build Go successfully - export GOROOT_BOOTSTRAP="$(go env GOROOT)" GOHOSTOS="$GOOS" GOHOSTARCH="$GOARCH"; \ - ./make.bash; \ - ); \ - \ - apt-mark auto '.*' > /dev/null; \ - apt-mark manual $savedAptMark > /dev/null; \ - apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ - rm -rf /var/lib/apt/lists/*; \ - \ - # remove a few intermediate / bootstrapping files the official binary release tarballs do not contain - rm -rf \ - /usr/local/go/pkg/*/cmd \ - /usr/local/go/pkg/bootstrap \ - /usr/local/go/pkg/obj \ - /usr/local/go/pkg/tool/*/api \ - /usr/local/go/pkg/tool/*/go_bootstrap \ - /usr/local/go/src/cmd/dist/dist \ - "$GOCACHE" \ - ; \ - fi; \ - \ - /usr/local/go/bin/go version \ - && echo "Installing NodeJS (v$NODE_VERSION / Yarn $YARN_VERSION)..." \ - && curl -sL "https://deb.nodesource.com/setup_$NODE_VERSION.x" | bash - \ - && DEBIAN_FRONTEND=noninteractive apt-get install -y nodejs \ - && npm install -g "yarn@$YARN_VERSION" \ - && echo "Installing Gradle..." \ - && mkdir -p /opt/gradle \ - && cd /opt/gradle \ - && wget -q "https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-$GRADLE_DIST.zip" \ - && unzip gradle*.zip \ - && ls -d */ | sed 's/\/*$//g' | xargs -I{} mv {} gradle \ - && rm gradle*.zip \ - && echo "Installing Kotlin..." \ - && mkdir -p /opt/kotlin \ - && cd /opt/kotlin \ - && wget -q "https://github.com/JetBrains/kotlin/releases/download/v$KOTLIN_VERSION/kotlin-compiler-$KOTLIN_VERSION.zip" \ - && unzip *kotlin*.zip \ - && rm *kotlin*.zip \ - && echo "Installing Chrome..." \ - && wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \ - && apt install -y ./google-chrome-stable_current_amd64.deb \ - && rm -f google-chrome-stable_current_amd64.deb \ - && apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A040830F7FAC5991 \ - && echo "Installing Bazelisk..." \ - && curl -LO "https://github.com/bazelbuild/bazelisk/releases/download/v1.11.0/bazelisk-linux-amd64" \ - && mv bazelisk-linux-amd64 "/usr/bin/bazel" \ - && chmod +x /usr/bin/bazel \ - && ln -s /usr/bin/bazel /usr/bin/bazelisk \ - && echo "Installing Google Cloud SDK..." \ - && mkdir -p /var/lib/gcloud \ - && cd /var/lib/gcloud \ - && curl https://sdk.cloud.google.com > install_gcloud.sh \ - && bash install_gcloud.sh --disable-prompts --install-dir=/var/lib/gcloud \ - && rm -fv install_gcloud.sh \ - && cd ~ \ - && /var/lib/gcloud/google-cloud-sdk/bin/gcloud auth configure-docker us-docker.pkg.dev \ - && export GOPATH="/go" \ - && mkdir -p "$GOPATH/src" "$GOPATH/bin" \ - && chmod -R 777 "$GOPATH" \ - && mkdir -p /tmp/gvm \ - && cd /tmp/gvm \ - && export GRAAL_DOWNLOAD_URL="https://github.com/graalvm/graalvm-$GRAAL_EDITION-builds/releases/download/vm-$GRAAL_VERSION/graalvm-$GRAAL_EDITION-$JAVA_VERSION-linux-$GRAAL_ARCH-$GRAAL_VERSION.tar.gz" \ - && echo "GraalVM Download URL: $GRAAL_DOWNLOAD_URL" \ - && curl --progress-bar -SL "$GRAAL_DOWNLOAD_URL" > ./graalvm.tar.gz \ - && curl --progress-bar -sSL "$GRAAL_DOWNLOAD_URL.sha256" > ./graalvm.tar.gz.sha256 \ - && ls -la ./graalvm.tar.gz ./graalvm.tar.gz.sha256 \ - && echo "Downloaded checksum for GraalVM: $(cat ./graalvm.tar.gz.sha256)" \ - && echo "$(cat ./graalvm.tar.gz.sha256) graalvm.tar.gz" | sha256sum --check --status \ - && tar -xzvf ./graalvm.tar.gz \ - && mv "./graalvm-$GRAAL_EDITION-$JAVA_VERSION-$GRAAL_VERSION" /usr/lib/gvm \ - && rm -f ./graalvm.tar.gz \ - && cd / \ - && rm -fr /tmp/gvm \ - && export JAVA_HOME=/usr/lib/gvm \ - GRAALVM_HOME=/usr/lib/gvm \ - PATH=/usr/lib/gvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ - && echo "Installing GraalVM modules..." \ - && $GRAALVM_HOME/bin/gu install native-image espresso \ - && rm -rf /var/lib/apt/lists/* \ - && echo "Setting up Debian-based codespace..." \ - && yes | unminimize 2>&1 \ - && echo "Installing updates and dev packages..." \ - && groupadd engineering \ - && useradd -g engineering -m dev \ - && usermod -aG sudo dev \ - && mkdir -p /home/dev \ - && chown dev:engineering /home/dev \ - && echo "dev ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers \ - && echo "%engineering ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers \ - && echo "$DEV_USER ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers \ - && echo "%dev ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers \ - && chsh -s /bin/zsh "$DEV_USER" \ - && echo "Build tools ready."; + && apt-get -y upgrade \ + && DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends \ + ca-certificates \ + curl \ + git \ + gnupg \ + libc-dev \ + && apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9 \ + && curl -O https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb \ + && apt-get install ./zulu-repo_1.0.0-3_all.deb \ + && rm -fv /zulu-repo_1.0.0-3_all.deb \ + && apt-get update \ + && apt-get install -y zulu17-jdk wget tar \ + && set -eux \ + && apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9 \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y \ + apt-transport-https \ + autoconf \ + automake \ + autotools-dev \ + bash \ + build-essential \ + ca-certificates \ + clang \ + curl \ + g++ \ + gcc \ + git \ + gnupg \ + libc6-dev \ + libpng-dev \ + libtool \ + make \ + pkg-config \ + qt5-default \ + software-properties-common \ + tar \ + time \ + cron \ + htop \ + jq \ + lcov \ + logrotate \ + lsb-release \ + sudo \ + fakeroot \ + multitail \ + python2 \ + python2-dev \ + python3 \ + python3-dev \ + python3-pip \ + python3-wheel \ + python3-venv \ + python3-setuptools \ + rsyslog \ + tree \ + tmux \ + vim \ + unzip \ + wget \ + zlib1g \ + && cd ~ \ + && echo "Installing Go..." +arch="$(dpkg --print-architecture)" +arch="${arch##*-}" +url= +case "${arch}" in + 'amd64') + url='https://dl.google.com/go/go1.18.3.linux-amd64.tar.gz' + sha256='956f8507b302ab0bb747613695cdae10af99bbd39a90cae522b7c0302cc27245' + ;; + 'armel') + export GOARCH='arm' GOARM='5' GOOS='linux' + ;; + 'armhf') + url='https://dl.google.com/go/go1.18.3.linux-armv6l.tar.gz' + sha256='b8f0b5db24114388d5dcba7ca0698510ea05228b0402fcbeb0881f74ae9cb83b' + ;; + 'arm64') + url='https://dl.google.com/go/go1.18.3.linux-arm64.tar.gz' + sha256='beacbe1441bee4d7978b900136d1d6a71d150f0a9bb77e9d50c822065623a35a' + ;; + 'i386') + url='https://dl.google.com/go/go1.18.3.linux-386.tar.gz' + sha256='72b73da021397a3a1ce182c19d2a890a5346bfe80885d9dd7d1ff04ce6597938' + ;; + 'mips64el') + export GOARCH='mips64le' GOOS='linux' + ;; + 'ppc64el') + url='https://dl.google.com/go/go1.18.3.linux-ppc64le.tar.gz' + sha256='5d42bd252e7af9f854df92e46bb2e88be7b2fb310cc937c0fe091afd8c4f2016' + ;; + 's390x') + url='https://dl.google.com/go/go1.18.3.linux-s390x.tar.gz' + sha256='ebb4efddec5bbd22bdd9c87137cb3dd59e874b5dfcf93d00bef351c60d2c7401' + ;; + *) + echo >&2 "error: unsupported architecture '$arch' (likely packaging update needed)" + exit 1 + ;; +esac +build= +if [ -z "$url" ]; then + # https://github.com/golang/go/issues/38536#issuecomment-616897960 + build=1 + url='https://dl.google.com/go/go1.18.3.src.tar.gz' + sha256='0012386ddcbb5f3350e407c679923811dbd283fcdc421724931614a842ecbc2d' + echo >&2 + echo >&2 "warning: current architecture ($arch) does not have a compatible Go binary release; will be building from source" + echo >&2 +fi + +wget -O go.tgz.asc "$url.asc" +wget -O go.tgz "$url" --progress=dot:giga +echo "$sha256 *go.tgz" | sha256sum -c - + +# https://github.com/golang/go/issues/14739#issuecomment-324767697 +GNUPGHOME="$(mktemp -d)" +export GNUPGHOME +# https://www.google.com/linuxrepositories/ +gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 'EB4C 1BFD 4F04 2F6D DDCC EC91 7721 F63B D38B 4796' +# let's also fetch the specific subkey of that key explicitly that we expect "go.tgz.asc" to be signed by, just to make sure we definitely have it +gpg --batch --keyserver keyserver.ubuntu.com --recv-keys '2F52 8D36 D67B 69ED F998 D857 78BD 6547 3CB3 BD13' +gpg --batch --verify go.tgz.asc go.tgz +gpgconf --kill all +rm -rf "$GNUPGHOME" go.tgz.asc + +tar -C /usr/local -xzf go.tgz +rm go.tgz + +if [ -n "$build" ]; then + savedAptMark="$(apt-mark showmanual)" + apt-get update + apt-get install -y --no-install-recommends golang-go + + export GOCACHE='/tmp/gocache' + + ( + cd /usr/local/go/src + # set GOROOT_BOOTSTRAP + GOHOST* such that we can build Go successfully + export GOROOT_BOOTSTRAP="$(go env GOROOT)" GOHOSTOS="$GOOS" GOHOSTARCH="$GOARCH" + ./make.bash + ) + + apt-mark auto '.*' > /dev/null + apt-mark manual $savedAptMark > /dev/null + apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false + rm -rf /var/lib/apt/lists/* + + # remove a few intermediate / bootstrapping files the official binary release tarballs do not contain + rm -rf \ + /usr/local/go/pkg/*/cmd \ + /usr/local/go/pkg/bootstrap \ + /usr/local/go/pkg/obj \ + /usr/local/go/pkg/tool/*/api \ + /usr/local/go/pkg/tool/*/go_bootstrap \ + /usr/local/go/src/cmd/dist/dist \ + "$GOCACHE" \ + ; +fi + +/usr/local/go/bin/go version \ + && echo "Installing NodeJS (v$NODE_VERSION / Yarn $YARN_VERSION)..." \ + && curl -sL "https://deb.nodesource.com/setup_$NODE_VERSION.x" | bash - \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y nodejs \ + && npm install -g "yarn@$YARN_VERSION" \ + && echo "Installing Gradle..." \ + && mkdir -p /opt/gradle \ + && cd /opt/gradle \ + && wget -q "https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-$GRADLE_DIST.zip" \ + && unzip gradle*.zip \ + && ls -d */ | sed 's/\/*$//g' | xargs -I{} mv {} gradle \ + && rm gradle*.zip \ + && echo "Installing Kotlin..." \ + && mkdir -p /opt/kotlin \ + && cd /opt/kotlin \ + && wget -q "https://github.com/JetBrains/kotlin/releases/download/v$KOTLIN_VERSION/kotlin-compiler-$KOTLIN_VERSION.zip" \ + && unzip *kotlin*.zip \ + && rm *kotlin*.zip \ + && echo "Installing Chrome..." \ + && wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \ + && apt install -y ./google-chrome-stable_current_amd64.deb \ + && rm -f google-chrome-stable_current_amd64.deb \ + && apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A040830F7FAC5991 \ + && echo "Installing Bazelisk..." \ + && curl -LO "https://github.com/bazelbuild/bazelisk/releases/download/v1.11.0/bazelisk-linux-amd64" \ + && mv bazelisk-linux-amd64 "/usr/bin/bazel" \ + && chmod +x /usr/bin/bazel \ + && ln -s /usr/bin/bazel /usr/bin/bazelisk \ + && echo "Installing Google Cloud SDK..." \ + && mkdir -p /var/lib/gcloud \ + && cd /var/lib/gcloud \ + && curl https://sdk.cloud.google.com > install_gcloud.sh \ + && bash install_gcloud.sh --disable-prompts --install-dir=/var/lib/gcloud \ + && rm -fv install_gcloud.sh \ + && cd ~ \ + && /var/lib/gcloud/google-cloud-sdk/bin/gcloud auth configure-docker us-docker.pkg.dev \ + && export GOPATH="/go" \ + && mkdir -p "$GOPATH/src" "$GOPATH/bin" \ + && chmod -R 777 "$GOPATH" \ + && mkdir -p /tmp/gvm \ + && cd /tmp/gvm \ + && export GRAAL_DOWNLOAD_URL="https://github.com/graalvm/graalvm-$GRAAL_EDITION-builds/releases/download/vm-$GRAAL_VERSION/graalvm-$GRAAL_EDITION-$JAVA_VERSION-linux-$GRAAL_ARCH-$GRAAL_VERSION.tar.gz" \ + && echo "GraalVM Download URL: $GRAAL_DOWNLOAD_URL" \ + && curl --progress-bar -SL "$GRAAL_DOWNLOAD_URL" > ./graalvm.tar.gz \ + && curl --progress-bar -sSL "$GRAAL_DOWNLOAD_URL.sha256" > ./graalvm.tar.gz.sha256 \ + && ls -la ./graalvm.tar.gz ./graalvm.tar.gz.sha256 \ + && echo "Downloaded checksum for GraalVM: $(cat ./graalvm.tar.gz.sha256)" \ + && echo "$(cat ./graalvm.tar.gz.sha256) graalvm.tar.gz" | sha256sum --check --status \ + && tar -xzvf ./graalvm.tar.gz \ + && mv "./graalvm-$GRAAL_EDITION-$JAVA_VERSION-$GRAAL_VERSION" /usr/lib/gvm \ + && rm -f ./graalvm.tar.gz \ + && cd / \ + && rm -fr /tmp/gvm \ + && export JAVA_HOME=/usr/lib/gvm \ + GRAALVM_HOME=/usr/lib/gvm \ + PATH=/usr/lib/gvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ + && echo "Installing GraalVM modules..." \ + && $GRAALVM_HOME/bin/gu install native-image espresso \ + && rm -rf /var/lib/apt/lists/* \ + && echo "Setting up Debian-based codespace..." \ + && yes | unminimize 2>&1 \ + && echo "Installing updates and dev packages..." \ + && groupadd engineering \ + && useradd -g engineering -m dev \ + && usermod -aG sudo dev \ + && mkdir -p /home/dev \ + && chown dev:engineering /home/dev \ + && echo "dev ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers \ + && echo "%engineering ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers \ + && echo "$DEV_USER ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers \ + && echo "%dev ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers \ + && chsh -s /bin/zsh "$DEV_USER" \ + && echo "Build tools ready." ENV GRADLE_HOME="/opt/gradle" \ - KOTLIN_HOME="/opt/kotlinc" \ - JAVA_HOME="/usr/lib/jvm/zulu17" \ - GRAALVM_HOME="/usr/lib/gvm" \ - GOPATH="/go" \ - QTWEBENGINE_DISABLE_SANDBOX="1" \ - PATH="$GRADLE_HOME/bin:$KOTLIN_HOME/bin:$GOPATH/bin:/home/$DEV_USER/bin:/usr/local/go/bin:/var/lib/gcloud/google-cloud-sdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/gvm/bin:/sbin:/bin" \ - EDITOR=code \ - SHELL=zsh \ - LANG=en_US.UTF-8 \ - LC_CTYPE=en_US.UTF-8 \ - LC_ALL=en_US.UTF-8 \ - TZ=America/Los_Angeles \ - DOCKER_BUILDKIT=1 \ - ELIDE_TEST_LOCAL=true + KOTLIN_HOME="/opt/kotlinc" \ + JAVA_HOME="/usr/lib/jvm/zulu17" \ + GRAALVM_HOME="/usr/lib/gvm" \ + GOPATH="/go" \ + QTWEBENGINE_DISABLE_SANDBOX="1" \ + PATH="$GRADLE_HOME/bin:$KOTLIN_HOME/bin:$GOPATH/bin:/home/$DEV_USER/bin:/usr/local/go/bin:/var/lib/gcloud/google-cloud-sdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/gvm/bin:/sbin:/bin" \ + EDITOR=code \ + SHELL=zsh \ + LANG=en_US.UTF-8 \ + LC_CTYPE=en_US.UTF-8 \ + LC_ALL=en_US.UTF-8 \ + TZ=America/Los_Angeles \ + DOCKER_BUILDKIT=1 \ + ELIDE_TEST_LOCAL=true COPY alias /home/$DEV_USER/.alias RUN sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" \ - && echo "source ~/.profile" >> ~/.zshrc \ - && go install github.com/bazelbuild/buildtools/buildifier@latest \ - && go install github.com/bazelbuild/buildtools/buildozer@latest \ - && go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest \ - && go install github.com/fullstorydev/grpcui/cmd/grpcui@latest \ - && go install github.com/bazelbuild/bazelisk@latest \ - && rm -rf /var/lib/apt/lists/* \ - && mkdir -p /home/dev/bin \ - && curl -o /home/dev/bin/ibazel "https://github.com/bazelbuild/bazel-watcher/releases/download/$IBAZEL_VERSION/ibazel_linux_amd64" \ - && yes Y | gcloud components install kubectl \ - && echo "Codespace image ready." + && echo "source ~/.profile" >> ~/.zshrc \ + && go install github.com/bazelbuild/buildtools/buildifier@latest \ + && go install github.com/bazelbuild/buildtools/buildozer@latest \ + && go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest \ + && go install github.com/fullstorydev/grpcui/cmd/grpcui@latest \ + && go install github.com/bazelbuild/bazelisk@latest \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /home/dev/bin \ + && curl -o /home/dev/bin/ibazel "https://github.com/bazelbuild/bazel-watcher/releases/download/$IBAZEL_VERSION/ibazel_linux_amd64" \ + && yes Y | gcloud components install kubectl \ + && echo "Codespace image ready." COPY zshrc /home/$DEV_USER/.zshrc USER ${DEV_USER} WORKDIR /home/${DEV_USER} -RUN BUF_PREFIX="/usr/local" && \ - BUF_VERSION="1.6.0" && \ - curl -sSL \ - "https://github.com/bufbuild/buf/releases/download/v${BUF_VERSION}/buf-$(uname -s)-$(uname -m).tar.gz" | \ - tar -xvzf - -C "${BUF_PREFIX}" --strip-components 1 +RUN BUF_PREFIX="/usr/local" \ + && BUF_VERSION="1.6.0" \ + && curl -sSL \ + "https://github.com/bufbuild/buf/releases/download/v${BUF_VERSION}/buf-$(uname -s)-$(uname -m).tar.gz" \ + | tar -xvzf - -C "${BUF_PREFIX}" --strip-components 1 diff --git a/images/codespace/cloudbuild.yaml b/images/codespace/cloudbuild.yaml index 5f05a65443..555d3cf6bd 100644 --- a/images/codespace/cloudbuild.yaml +++ b/images/codespace/cloudbuild.yaml @@ -1,6 +1,6 @@ steps: - - name: 'gcr.io/cloud-builders/docker' - args: ['build', '-t', 'us-docker.pkg.dev/elide-fw/tools/codespace', '.'] -images: ['us-docker.pkg.dev/elide-fw/tools/codespace'] + - name: "gcr.io/cloud-builders/docker" + args: ["build", "-t", "us-docker.pkg.dev/elide-fw/tools/codespace", "."] +images: ["us-docker.pkg.dev/elide-fw/tools/codespace"] options: logging: CLOUD_LOGGING_ONLY diff --git a/images/codespace/library-scripts/common-debian.sh b/images/codespace/library-scripts/common-debian.sh index 955c2fceca..9364c8fc8a 100644 --- a/images/codespace/library-scripts/common-debian.sh +++ b/images/codespace/library-scripts/common-debian.sh @@ -22,8 +22,8 @@ SCRIPT_DIR="$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)" MARKER_FILE="/usr/local/etc/vscode-dev-containers/common" if [ "$(id -u)" -ne 0 ]; then - echo -e 'Script must be run as root. Use sudo, su, or add "USER root" to your Dockerfile before running this script.' - exit 1 + echo -e 'Script must be run as root. Use sudo, su, or add "USER root" to your Dockerfile before running this script.' + exit 1 fi # Ensure that login shells get the correct path if the user updated the PATH using ENV. @@ -33,48 +33,47 @@ chmod +x /etc/profile.d/00-restore-env.sh # If in automatic mode, determine if a user already exists, if not use vscode if [ "${USERNAME}" = "auto" ] || [ "${USERNAME}" = "automatic" ]; then - USERNAME="" - POSSIBLE_USERS=("vscode" "node" "codespace" "$(awk -v val=1000 -F ":" '$3==val{print $1}' /etc/passwd)") - for CURRENT_USER in ${POSSIBLE_USERS[@]}; do - if id -u ${CURRENT_USER} > /dev/null 2>&1; then - USERNAME=${CURRENT_USER} - break - fi - done - if [ "${USERNAME}" = "" ]; then - USERNAME=vscode + USERNAME="" + POSSIBLE_USERS=("vscode" "node" "codespace" "$(awk -v val=1000 -F ":" '$3==val{print $1}' /etc/passwd)") + for CURRENT_USER in ${POSSIBLE_USERS[@]}; do + if id -u ${CURRENT_USER} > /dev/null 2>&1; then + USERNAME=${CURRENT_USER} + break fi + done + if [ "${USERNAME}" = "" ]; then + USERNAME=vscode + fi elif [ "${USERNAME}" = "none" ]; then - USERNAME=root - USER_UID=0 - USER_GID=0 + USERNAME=root + USER_UID=0 + USER_GID=0 fi # Load markers to see which steps have already run if [ -f "${MARKER_FILE}" ]; then - echo "Marker file found:" - cat "${MARKER_FILE}" - source "${MARKER_FILE}" + echo "Marker file found:" + cat "${MARKER_FILE}" + source "${MARKER_FILE}" fi # Ensure apt is in non-interactive to avoid prompts export DEBIAN_FRONTEND=noninteractive # Function to call apt-get if needed -apt_get_update_if_needed() -{ - if [ ! -d "/var/lib/apt/lists" ] || [ "$(ls /var/lib/apt/lists/ | wc -l)" = "0" ]; then - echo "Running apt-get update..." - apt-get update - else - echo "Skipping apt-get update." - fi +apt_get_update_if_needed() { + if [ ! -d "/var/lib/apt/lists" ] || [ "$(ls /var/lib/apt/lists/ | wc -l)" = "0" ]; then + echo "Running apt-get update..." + apt-get update + else + echo "Skipping apt-get update." + fi } # Run install apt-utils to avoid debconf warning then verify presence of other common developer tools and dependencies if [ "${PACKAGES_ALREADY_INSTALLED}" != "true" ]; then - package_list="apt-utils \ + package_list="apt-utils \ openssh-client \ gnupg2 \ dirmngr \ @@ -114,123 +113,124 @@ if [ "${PACKAGES_ALREADY_INSTALLED}" != "true" ]; then manpages-dev \ init-system-helpers" - # Needed for adding manpages-posix and manpages-posix-dev which are non-free packages in Debian - if [ "${ADD_NON_FREE_PACKAGES}" = "true" ]; then - # Bring in variables from /etc/os-release like VERSION_CODENAME - . /etc/os-release - sed -i -E "s/deb http:\/\/(deb|httpredir)\.debian\.org\/debian ${VERSION_CODENAME} main/deb http:\/\/\1\.debian\.org\/debian ${VERSION_CODENAME} main contrib non-free/" /etc/apt/sources.list - sed -i -E "s/deb-src http:\/\/(deb|httredir)\.debian\.org\/debian ${VERSION_CODENAME} main/deb http:\/\/\1\.debian\.org\/debian ${VERSION_CODENAME} main contrib non-free/" /etc/apt/sources.list - sed -i -E "s/deb http:\/\/(deb|httpredir)\.debian\.org\/debian ${VERSION_CODENAME}-updates main/deb http:\/\/\1\.debian\.org\/debian ${VERSION_CODENAME}-updates main contrib non-free/" /etc/apt/sources.list - sed -i -E "s/deb-src http:\/\/(deb|httpredir)\.debian\.org\/debian ${VERSION_CODENAME}-updates main/deb http:\/\/\1\.debian\.org\/debian ${VERSION_CODENAME}-updates main contrib non-free/" /etc/apt/sources.list - sed -i "s/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}\/updates main/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}\/updates main contrib non-free/" /etc/apt/sources.list - sed -i "s/deb-src http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}\/updates main/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}\/updates main contrib non-free/" /etc/apt/sources.list - sed -i "s/deb http:\/\/deb\.debian\.org\/debian ${VERSION_CODENAME}-backports main/deb http:\/\/deb\.debian\.org\/debian ${VERSION_CODENAME}-backports main contrib non-free/" /etc/apt/sources.list - sed -i "s/deb-src http:\/\/deb\.debian\.org\/debian ${VERSION_CODENAME}-backports main/deb http:\/\/deb\.debian\.org\/debian ${VERSION_CODENAME}-backports main contrib non-free/" /etc/apt/sources.list - # Handle bullseye location for security https://www.debian.org/releases/bullseye/amd64/release-notes/ch-information.en.html - sed -i "s/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}-security main/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}-security main contrib non-free/" /etc/apt/sources.list - sed -i "s/deb-src http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}-security main/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}-security main contrib non-free/" /etc/apt/sources.list - echo "Running apt-get update..." - apt-get update - package_list="${package_list} manpages-posix manpages-posix-dev" - else - apt_get_update_if_needed - fi - - # Install libssl1.1 if available - if [[ ! -z $(apt-cache --names-only search ^libssl1.1$) ]]; then - package_list="${package_list} libssl1.1" - fi - - # Install appropriate version of libssl1.0.x if available - libssl_package=$(dpkg-query -f '${db:Status-Abbrev}\t${binary:Package}\n' -W 'libssl1\.0\.?' 2>&1 || echo '') - if [ "$(echo "$LIlibssl_packageBSSL" | grep -o 'libssl1\.0\.[0-9]:' | uniq | sort | wc -l)" -eq 0 ]; then - if [[ ! -z $(apt-cache --names-only search ^libssl1.0.2$) ]]; then - # Debian 9 - package_list="${package_list} libssl1.0.2" - elif [[ ! -z $(apt-cache --names-only search ^libssl1.0.0$) ]]; then - # Ubuntu 18.04, 16.04, earlier - package_list="${package_list} libssl1.0.0" - fi + # Needed for adding manpages-posix and manpages-posix-dev which are non-free packages in Debian + if [ "${ADD_NON_FREE_PACKAGES}" = "true" ]; then + # Bring in variables from /etc/os-release like VERSION_CODENAME + . /etc/os-release + sed -i -E "s/deb http:\/\/(deb|httpredir)\.debian\.org\/debian ${VERSION_CODENAME} main/deb http:\/\/\1\.debian\.org\/debian ${VERSION_CODENAME} main contrib non-free/" /etc/apt/sources.list + sed -i -E "s/deb-src http:\/\/(deb|httredir)\.debian\.org\/debian ${VERSION_CODENAME} main/deb http:\/\/\1\.debian\.org\/debian ${VERSION_CODENAME} main contrib non-free/" /etc/apt/sources.list + sed -i -E "s/deb http:\/\/(deb|httpredir)\.debian\.org\/debian ${VERSION_CODENAME}-updates main/deb http:\/\/\1\.debian\.org\/debian ${VERSION_CODENAME}-updates main contrib non-free/" /etc/apt/sources.list + sed -i -E "s/deb-src http:\/\/(deb|httpredir)\.debian\.org\/debian ${VERSION_CODENAME}-updates main/deb http:\/\/\1\.debian\.org\/debian ${VERSION_CODENAME}-updates main contrib non-free/" /etc/apt/sources.list + sed -i "s/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}\/updates main/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}\/updates main contrib non-free/" /etc/apt/sources.list + sed -i "s/deb-src http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}\/updates main/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}\/updates main contrib non-free/" /etc/apt/sources.list + sed -i "s/deb http:\/\/deb\.debian\.org\/debian ${VERSION_CODENAME}-backports main/deb http:\/\/deb\.debian\.org\/debian ${VERSION_CODENAME}-backports main contrib non-free/" /etc/apt/sources.list + sed -i "s/deb-src http:\/\/deb\.debian\.org\/debian ${VERSION_CODENAME}-backports main/deb http:\/\/deb\.debian\.org\/debian ${VERSION_CODENAME}-backports main contrib non-free/" /etc/apt/sources.list + # Handle bullseye location for security https://www.debian.org/releases/bullseye/amd64/release-notes/ch-information.en.html + sed -i "s/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}-security main/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}-security main contrib non-free/" /etc/apt/sources.list + sed -i "s/deb-src http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}-security main/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}-security main contrib non-free/" /etc/apt/sources.list + echo "Running apt-get update..." + apt-get update + package_list="${package_list} manpages-posix manpages-posix-dev" + else + apt_get_update_if_needed + fi + + # Install libssl1.1 if available + if [[ ! -z $(apt-cache --names-only search ^libssl1.1$) ]]; then + package_list="${package_list} libssl1.1" + fi + + # Install appropriate version of libssl1.0.x if available + libssl_package=$(dpkg-query -f '${db:Status-Abbrev}\t${binary:Package}\n' -W 'libssl1\.0\.?' 2>&1 || echo '') + if [ "$(echo "$LIlibssl_packageBSSL" | grep -o 'libssl1\.0\.[0-9]:' | uniq | sort | wc -l)" -eq 0 ]; then + if [[ ! -z $(apt-cache --names-only search ^libssl1.0.2$) ]]; then + # Debian 9 + package_list="${package_list} libssl1.0.2" + elif [[ ! -z $(apt-cache --names-only search ^libssl1.0.0$) ]]; then + # Ubuntu 18.04, 16.04, earlier + package_list="${package_list} libssl1.0.0" fi + fi - echo "Packages to verify are installed: ${package_list}" - apt-get -y install --no-install-recommends ${package_list} 2> >( grep -v 'debconf: delaying package configuration, since apt-utils is not installed' >&2 ) + echo "Packages to verify are installed: ${package_list}" + apt-get -y install --no-install-recommends ${package_list} 2> >(grep -v 'debconf: delaying package configuration, since apt-utils is not installed' >&2) - # Install git if not already installed (may be more recent than distro version) - if ! type git > /dev/null 2>&1; then - apt-get -y install --no-install-recommends git - fi + # Install git if not already installed (may be more recent than distro version) + if ! type git > /dev/null 2>&1; then + apt-get -y install --no-install-recommends git + fi - PACKAGES_ALREADY_INSTALLED="true" + PACKAGES_ALREADY_INSTALLED="true" fi # Get to latest versions of all packages if [ "${UPGRADE_PACKAGES}" = "true" ]; then - apt_get_update_if_needed - apt-get -y upgrade --no-install-recommends - apt-get autoremove -y + apt_get_update_if_needed + apt-get -y upgrade --no-install-recommends + apt-get autoremove -y fi # Ensure at least the en_US.UTF-8 UTF-8 locale is available. # Common need for both applications and things like the agnoster ZSH theme. if [ "${LOCALE_ALREADY_SET}" != "true" ] && ! grep -o -E '^\s*en_US.UTF-8\s+UTF-8' /etc/locale.gen > /dev/null; then - echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen - locale-gen - LOCALE_ALREADY_SET="true" + echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen + locale-gen + LOCALE_ALREADY_SET="true" fi # Create or update a non-root user to match UID/GID. group_name="${USERNAME}" if id -u ${USERNAME} > /dev/null 2>&1; then - # User exists, update if needed - if [ "${USER_GID}" != "automatic" ] && [ "$USER_GID" != "$(id -g $USERNAME)" ]; then - group_name="$(id -gn $USERNAME)" - groupmod --gid $USER_GID ${group_name} - usermod --gid $USER_GID $USERNAME - fi - if [ "${USER_UID}" != "automatic" ] && [ "$USER_UID" != "$(id -u $USERNAME)" ]; then - usermod --uid $USER_UID $USERNAME - fi + # User exists, update if needed + if [ "${USER_GID}" != "automatic" ] && [ "$USER_GID" != "$(id -g $USERNAME)" ]; then + group_name="$(id -gn $USERNAME)" + groupmod --gid $USER_GID ${group_name} + usermod --gid $USER_GID $USERNAME + fi + if [ "${USER_UID}" != "automatic" ] && [ "$USER_UID" != "$(id -u $USERNAME)" ]; then + usermod --uid $USER_UID $USERNAME + fi else - # Create user - if [ "${USER_GID}" = "automatic" ]; then - groupadd $USERNAME - else - groupadd --gid $USER_GID $USERNAME - fi - if [ "${USER_UID}" = "automatic" ]; then - useradd -s /bin/bash --gid $USERNAME -m $USERNAME - else - useradd -s /bin/bash --uid $USER_UID --gid $USERNAME -m $USERNAME - fi + # Create user + if [ "${USER_GID}" = "automatic" ]; then + groupadd $USERNAME + else + groupadd --gid $USER_GID $USERNAME + fi + if [ "${USER_UID}" = "automatic" ]; then + useradd -s /bin/bash --gid $USERNAME -m $USERNAME + else + useradd -s /bin/bash --uid $USER_UID --gid $USERNAME -m $USERNAME + fi fi # Add add sudo support for non-root user if [ "${USERNAME}" != "root" ] && [ "${EXISTING_NON_ROOT_USER}" != "${USERNAME}" ]; then - echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME - chmod 0440 /etc/sudoers.d/$USERNAME - EXISTING_NON_ROOT_USER="${USERNAME}" + echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME + chmod 0440 /etc/sudoers.d/$USERNAME + EXISTING_NON_ROOT_USER="${USERNAME}" fi # ** Shell customization section ** if [ "${USERNAME}" = "root" ]; then - user_rc_path="/root" + user_rc_path="/root" else - user_rc_path="/home/${USERNAME}" + user_rc_path="/home/${USERNAME}" fi # Restore user .bashrc defaults from skeleton file if it doesn't exist or is empty -if [ ! -f "${user_rc_path}/.bashrc" ] || [ ! -s "${user_rc_path}/.bashrc" ] ; then - cp /etc/skel/.bashrc "${user_rc_path}/.bashrc" +if [ ! -f "${user_rc_path}/.bashrc" ] || [ ! -s "${user_rc_path}/.bashrc" ]; then + cp /etc/skel/.bashrc "${user_rc_path}/.bashrc" fi # Restore user .profile defaults from skeleton file if it doesn't exist or is empty -if [ ! -f "${user_rc_path}/.profile" ] || [ ! -s "${user_rc_path}/.profile" ] ; then - cp /etc/skel/.profile "${user_rc_path}/.profile" +if [ ! -f "${user_rc_path}/.profile" ] || [ ! -s "${user_rc_path}/.profile" ]; then + cp /etc/skel/.profile "${user_rc_path}/.profile" fi # .bashrc/.zshrc snippet -rc_snippet="$(cat << 'EOF' +rc_snippet="$( + cat << 'EOF' if [ -z "${USER}" ]; then export USER=$(whoami); fi if [[ "${PATH}" != *"$HOME/.local/bin"* ]]; then export PATH="${PATH}:$HOME/.local/bin"; fi @@ -295,8 +295,9 @@ EOF chmod +x /usr/local/bin/systemctl # Codespaces bash and OMZ themes - partly inspired by https://github.com/ohmyzsh/ohmyzsh/blob/master/themes/robbyrussell.zsh-theme -codespaces_bash="$(cat \ -<<'EOF' +codespaces_bash="$( + cat \ + << 'EOF' # Codespaces bash prompt theme __bash_prompt() { @@ -324,8 +325,9 @@ __bash_prompt EOF )" -codespaces_zsh="$(cat \ -<<'EOF' +codespaces_zsh="$( + cat \ + << 'EOF' # Codespaces zsh prompt theme __zsh_prompt() { local prompt_username @@ -351,61 +353,62 @@ EOF # Add RC snippet and custom bash prompt if [ "${RC_SNIPPET_ALREADY_ADDED}" != "true" ]; then - echo "${rc_snippet}" >> /etc/bash.bashrc - echo "${codespaces_bash}" >> "${user_rc_path}/.bashrc" - echo 'export PROMPT_DIRTRIM=4' >> "${user_rc_path}/.bashrc" - if [ "${USERNAME}" != "root" ]; then - echo "${codespaces_bash}" >> "/root/.bashrc" - echo 'export PROMPT_DIRTRIM=4' >> "/root/.bashrc" - fi - chown ${USERNAME}:${group_name} "${user_rc_path}/.bashrc" - RC_SNIPPET_ALREADY_ADDED="true" + echo "${rc_snippet}" >> /etc/bash.bashrc + echo "${codespaces_bash}" >> "${user_rc_path}/.bashrc" + echo 'export PROMPT_DIRTRIM=4' >> "${user_rc_path}/.bashrc" + if [ "${USERNAME}" != "root" ]; then + echo "${codespaces_bash}" >> "/root/.bashrc" + echo 'export PROMPT_DIRTRIM=4' >> "/root/.bashrc" + fi + chown ${USERNAME}:${group_name} "${user_rc_path}/.bashrc" + RC_SNIPPET_ALREADY_ADDED="true" fi # Optionally install and configure zsh and Oh My Zsh! if [ "${INSTALL_ZSH}" = "true" ]; then - if ! type zsh > /dev/null 2>&1; then - apt_get_update_if_needed - apt-get install -y zsh - fi - if [ "${ZSH_ALREADY_INSTALLED}" != "true" ]; then - echo "${rc_snippet}" >> /etc/zsh/zshrc - ZSH_ALREADY_INSTALLED="true" - fi - - # Adapted, simplified inline Oh My Zsh! install steps that adds, defaults to a codespaces theme. - # See https://github.com/ohmyzsh/ohmyzsh/blob/master/tools/install.sh for official script. - oh_my_install_dir="${user_rc_path}/.oh-my-zsh" - if [ ! -d "${oh_my_install_dir}" ] && [ "${INSTALL_OH_MYS}" = "true" ]; then - template_path="${oh_my_install_dir}/templates/zshrc.zsh-template" - user_rc_file="${user_rc_path}/.zshrc" - umask g-w,o-w - mkdir -p ${oh_my_install_dir} - git clone --depth=1 \ - -c core.eol=lf \ - -c core.autocrlf=false \ - -c fsck.zeroPaddedFilemode=ignore \ - -c fetch.fsck.zeroPaddedFilemode=ignore \ - -c receive.fsck.zeroPaddedFilemode=ignore \ - "https://github.com/ohmyzsh/ohmyzsh" "${oh_my_install_dir}" 2>&1 - echo -e "$(cat "${template_path}")\nDISABLE_AUTO_UPDATE=true\nDISABLE_UPDATE_PROMPT=true" > ${user_rc_file} - sed -i -e 's/ZSH_THEME=.*/ZSH_THEME="codespaces"/g' ${user_rc_file} - - mkdir -p ${oh_my_install_dir}/custom/themes - echo "${codespaces_zsh}" > "${oh_my_install_dir}/custom/themes/codespaces.zsh-theme" - # Shrink git while still enabling updates - cd "${oh_my_install_dir}" - git repack -a -d -f --depth=1 --window=1 - # Copy to non-root user if one is specified - if [ "${USERNAME}" != "root" ]; then - cp -rf "${user_rc_file}" "${oh_my_install_dir}" /root - chown -R ${USERNAME}:${group_name} "${user_rc_path}" - fi + if ! type zsh > /dev/null 2>&1; then + apt_get_update_if_needed + apt-get install -y zsh + fi + if [ "${ZSH_ALREADY_INSTALLED}" != "true" ]; then + echo "${rc_snippet}" >> /etc/zsh/zshrc + ZSH_ALREADY_INSTALLED="true" + fi + + # Adapted, simplified inline Oh My Zsh! install steps that adds, defaults to a codespaces theme. + # See https://github.com/ohmyzsh/ohmyzsh/blob/master/tools/install.sh for official script. + oh_my_install_dir="${user_rc_path}/.oh-my-zsh" + if [ ! -d "${oh_my_install_dir}" ] && [ "${INSTALL_OH_MYS}" = "true" ]; then + template_path="${oh_my_install_dir}/templates/zshrc.zsh-template" + user_rc_file="${user_rc_path}/.zshrc" + umask g-w,o-w + mkdir -p ${oh_my_install_dir} + git clone --depth=1 \ + -c core.eol=lf \ + -c core.autocrlf=false \ + -c fsck.zeroPaddedFilemode=ignore \ + -c fetch.fsck.zeroPaddedFilemode=ignore \ + -c receive.fsck.zeroPaddedFilemode=ignore \ + "https://github.com/ohmyzsh/ohmyzsh" "${oh_my_install_dir}" 2>&1 + echo -e "$(cat "${template_path}")\nDISABLE_AUTO_UPDATE=true\nDISABLE_UPDATE_PROMPT=true" > ${user_rc_file} + sed -i -e 's/ZSH_THEME=.*/ZSH_THEME="codespaces"/g' ${user_rc_file} + + mkdir -p ${oh_my_install_dir}/custom/themes + echo "${codespaces_zsh}" > "${oh_my_install_dir}/custom/themes/codespaces.zsh-theme" + # Shrink git while still enabling updates + cd "${oh_my_install_dir}" + git repack -a -d -f --depth=1 --window=1 + # Copy to non-root user if one is specified + if [ "${USERNAME}" != "root" ]; then + cp -rf "${user_rc_file}" "${oh_my_install_dir}" /root + chown -R ${USERNAME}:${group_name} "${user_rc_path}" fi + fi fi # Persist image metadata info, script if meta.env found in same directory -meta_info_script="$(cat << 'EOF' +meta_info_script="$( + cat << 'EOF' #!/bin/sh . /usr/local/etc/vscode-dev-containers/meta.env @@ -436,10 +439,10 @@ echo EOF )" if [ -f "${SCRIPT_DIR}/meta.env" ]; then - mkdir -p /usr/local/etc/vscode-dev-containers/ - cp -f "${SCRIPT_DIR}/meta.env" /usr/local/etc/vscode-dev-containers/meta.env - echo "${meta_info_script}" > /usr/local/bin/devcontainer-info - chmod +x /usr/local/bin/devcontainer-info + mkdir -p /usr/local/etc/vscode-dev-containers/ + cp -f "${SCRIPT_DIR}/meta.env" /usr/local/etc/vscode-dev-containers/meta.env + echo "${meta_info_script}" > /usr/local/bin/devcontainer-info + chmod +x /usr/local/bin/devcontainer-info fi # Write marker file diff --git a/images/codespace/library-scripts/docker-debian.sh b/images/codespace/library-scripts/docker-debian.sh index 2e0aa84233..6c8f8ed721 100644 --- a/images/codespace/library-scripts/docker-debian.sh +++ b/images/codespace/library-scripts/docker-debian.sh @@ -23,93 +23,92 @@ DOCKER_LICENSED_ARCHIVE_VERSION_CODENAMES="buster bullseye bionic focal hirsute set -e if [ "$(id -u)" -ne 0 ]; then - echo -e 'Script must be run as root. Use sudo, su, or add "USER root" to your Dockerfile before running this script.' - exit 1 + echo -e 'Script must be run as root. Use sudo, su, or add "USER root" to your Dockerfile before running this script.' + exit 1 fi # Determine the appropriate non-root user if [ "${USERNAME}" = "auto" ] || [ "${USERNAME}" = "automatic" ]; then - USERNAME="" - POSSIBLE_USERS=("vscode" "node" "codespace" "$(awk -v val=1000 -F ":" '$3==val{print $1}' /etc/passwd)") - for CURRENT_USER in ${POSSIBLE_USERS[@]}; do - if id -u ${CURRENT_USER} > /dev/null 2>&1; then - USERNAME=${CURRENT_USER} - break - fi - done - if [ "${USERNAME}" = "" ]; then - USERNAME=root + USERNAME="" + POSSIBLE_USERS=("vscode" "node" "codespace" "$(awk -v val=1000 -F ":" '$3==val{print $1}' /etc/passwd)") + for CURRENT_USER in ${POSSIBLE_USERS[@]}; do + if id -u ${CURRENT_USER} > /dev/null 2>&1; then + USERNAME=${CURRENT_USER} + break fi -elif [ "${USERNAME}" = "none" ] || ! id -u ${USERNAME} > /dev/null 2>&1; then + done + if [ "${USERNAME}" = "" ]; then USERNAME=root + fi +elif [ "${USERNAME}" = "none" ] || ! id -u ${USERNAME} > /dev/null 2>&1; then + USERNAME=root fi # Get central common setting get_common_setting() { - if [ "${common_settings_file_loaded}" != "true" ]; then - curl -sfL "https://aka.ms/vscode-dev-containers/script-library/settings.env" 2>/dev/null -o /tmp/vsdc-settings.env || echo "Could not download settings file. Skipping." - common_settings_file_loaded=true - fi - if [ -f "/tmp/vsdc-settings.env" ]; then - local multi_line="" - if [ "$2" = "true" ]; then multi_line="-z"; fi - local result="$(grep ${multi_line} -oP "$1=\"?\K[^\"]+" /tmp/vsdc-settings.env | tr -d '\0')" - if [ ! -z "${result}" ]; then declare -g $1="${result}"; fi - fi - echo "$1=${!1}" + if [ "${common_settings_file_loaded}" != "true" ]; then + curl -sfL "https://aka.ms/vscode-dev-containers/script-library/settings.env" -o /tmp/vsdc-settings.env 2> /dev/null || echo "Could not download settings file. Skipping." + common_settings_file_loaded=true + fi + if [ -f "/tmp/vsdc-settings.env" ]; then + local multi_line="" + if [ "$2" = "true" ]; then multi_line="-z"; fi + local result="$(grep ${multi_line} -oP "$1=\"?\K[^\"]+" /tmp/vsdc-settings.env | tr -d '\0')" + if [ ! -z "${result}" ]; then declare -g $1="${result}"; fi + fi + echo "$1=${!1}" } # Function to run apt-get if needed -apt_get_update_if_needed() -{ - if [ ! -d "/var/lib/apt/lists" ] || [ "$(ls /var/lib/apt/lists/ | wc -l)" = "0" ]; then - echo "Running apt-get update..." - apt-get update - else - echo "Skipping apt-get update." - fi +apt_get_update_if_needed() { + if [ ! -d "/var/lib/apt/lists" ] || [ "$(ls /var/lib/apt/lists/ | wc -l)" = "0" ]; then + echo "Running apt-get update..." + apt-get update + else + echo "Skipping apt-get update." + fi } # Checks if packages are installed and installs them if not check_packages() { - if ! dpkg -s "$@" > /dev/null 2>&1; then - apt_get_update_if_needed - apt-get -y install --no-install-recommends "$@" - fi + if ! dpkg -s "$@" > /dev/null 2>&1; then + apt_get_update_if_needed + apt-get -y install --no-install-recommends "$@" + fi } # Figure out correct version of a three part version number is not passed find_version_from_git_tags() { - local variable_name=$1 - local requested_version=${!variable_name} - if [ "${requested_version}" = "none" ]; then return; fi - local repository=$2 - local prefix=${3:-"tags/v"} - local separator=${4:-"."} - local last_part_optional=${5:-"false"} - if [ "$(echo "${requested_version}" | grep -o "." | wc -l)" != "2" ]; then - local escaped_separator=${separator//./\\.} - local last_part - if [ "${last_part_optional}" = "true" ]; then - last_part="(${escaped_separator}[0-9]+)?" - else - last_part="${escaped_separator}[0-9]+" - fi - local regex="${prefix}\\K[0-9]+${escaped_separator}[0-9]+${last_part}$" - local version_list="$(git ls-remote --tags ${repository} | grep -oP "${regex}" | tr -d ' ' | tr "${separator}" "." | sort -rV)" - if [ "${requested_version}" = "latest" ] || [ "${requested_version}" = "current" ] || [ "${requested_version}" = "lts" ]; then - declare -g ${variable_name}="$(echo "${version_list}" | head -n 1)" - else - set +e - declare -g ${variable_name}="$(echo "${version_list}" | grep -E -m 1 "^${requested_version//./\\.}([\\.\\s]|$)")" - set -e - fi + local variable_name=$1 + local requested_version=${!variable_name} + if [ "${requested_version}" = "none" ]; then return; fi + local repository=$2 + local prefix=${3:-"tags/v"} + local separator=${4:-"."} + local last_part_optional=${5:-"false"} + if [ "$(echo "${requested_version}" | grep -o "." | wc -l)" != "2" ]; then + local escaped_separator=${separator//./\\.} + local last_part + if [ "${last_part_optional}" = "true" ]; then + last_part="(${escaped_separator}[0-9]+)?" + else + last_part="${escaped_separator}[0-9]+" fi - if [ -z "${!variable_name}" ] || ! echo "${version_list}" | grep "^${!variable_name//./\\.}$" > /dev/null 2>&1; then - echo -e "Invalid ${variable_name} value: ${requested_version}\nValid values:\n${version_list}" >&2 - exit 1 + local regex="${prefix}\\K[0-9]+${escaped_separator}[0-9]+${last_part}$" + local version_list="$(git ls-remote --tags ${repository} | grep -oP "${regex}" | tr -d ' ' | tr "${separator}" "." | sort -rV)" + if [ "${requested_version}" = "latest" ] || [ "${requested_version}" = "current" ] || [ "${requested_version}" = "lts" ]; then + declare -g ${variable_name}="$(echo "${version_list}" | head -n 1)" + else + set +e + declare -g ${variable_name}="$(echo "${version_list}" | grep -E -m 1 "^${requested_version//./\\.}([\\.\\s]|$)")" + set -e fi - echo "${variable_name}=${!variable_name}" + fi + if [ -z "${!variable_name}" ] || ! echo "${version_list}" | grep "^${!variable_name//./\\.}$" > /dev/null 2>&1; then + echo -e "Invalid ${variable_name} value: ${requested_version}\nValid values:\n${version_list}" >&2 + exit 1 + fi + echo "${variable_name}=${!variable_name}" } # Ensure apt is in non-interactive to avoid prompts @@ -118,8 +117,8 @@ export DEBIAN_FRONTEND=noninteractive # Install dependencies check_packages apt-transport-https curl ca-certificates gnupg2 dirmngr if ! type git > /dev/null 2>&1; then - apt_get_update_if_needed - apt-get -y install git + apt_get_update_if_needed + apt-get -y install git fi # Source /etc/os-release to get OS info @@ -129,40 +128,40 @@ architecture="$(dpkg --print-architecture)" # Check if distro is suppported if [ "${USE_MOBY}" = "true" ]; then - # 'get_common_setting' allows attribute to be updated remotely - get_common_setting DOCKER_MOBY_ARCHIVE_VERSION_CODENAMES - if [[ "${DOCKER_MOBY_ARCHIVE_VERSION_CODENAMES}" != *"${VERSION_CODENAME}"* ]]; then - err "Unsupported distribution version '${VERSION_CODENAME}'. To resolve, either: (1) set feature option '\"moby\": false' , or (2) choose a compatible OS distribution" - err "Support distributions include: ${DOCKER_MOBY_ARCHIVE_VERSION_CODENAMES}" - exit 1 - fi - echo "Distro codename '${VERSION_CODENAME}' matched filter '${DOCKER_MOBY_ARCHIVE_VERSION_CODENAMES}'" + # 'get_common_setting' allows attribute to be updated remotely + get_common_setting DOCKER_MOBY_ARCHIVE_VERSION_CODENAMES + if [[ "${DOCKER_MOBY_ARCHIVE_VERSION_CODENAMES}" != *"${VERSION_CODENAME}"* ]]; then + err "Unsupported distribution version '${VERSION_CODENAME}'. To resolve, either: (1) set feature option '\"moby\": false' , or (2) choose a compatible OS distribution" + err "Support distributions include: ${DOCKER_MOBY_ARCHIVE_VERSION_CODENAMES}" + exit 1 + fi + echo "Distro codename '${VERSION_CODENAME}' matched filter '${DOCKER_MOBY_ARCHIVE_VERSION_CODENAMES}'" else - get_common_setting DOCKER_LICENSED_ARCHIVE_VERSION_CODENAMES - if [[ "${DOCKER_LICENSED_ARCHIVE_VERSION_CODENAMES}" != *"${VERSION_CODENAME}"* ]]; then - err "Unsupported distribution version '${VERSION_CODENAME}'. To resolve, please choose a compatible OS distribution" - err "Support distributions include: ${DOCKER_LICENSED_ARCHIVE_VERSION_CODENAMES}" - exit 1 - fi - echo "Distro codename '${VERSION_CODENAME}' matched filter '${DOCKER_LICENSED_ARCHIVE_VERSION_CODENAMES}'" + get_common_setting DOCKER_LICENSED_ARCHIVE_VERSION_CODENAMES + if [[ "${DOCKER_LICENSED_ARCHIVE_VERSION_CODENAMES}" != *"${VERSION_CODENAME}"* ]]; then + err "Unsupported distribution version '${VERSION_CODENAME}'. To resolve, please choose a compatible OS distribution" + err "Support distributions include: ${DOCKER_LICENSED_ARCHIVE_VERSION_CODENAMES}" + exit 1 + fi + echo "Distro codename '${VERSION_CODENAME}' matched filter '${DOCKER_LICENSED_ARCHIVE_VERSION_CODENAMES}'" fi # Set up the necessary apt repos (either Microsoft's or Docker's) if [ "${USE_MOBY}" = "true" ]; then - cli_package_name="moby-cli" + cli_package_name="moby-cli" - # Import key safely and import Microsoft apt repo - get_common_setting MICROSOFT_GPG_KEYS_URI - curl -sSL ${MICROSOFT_GPG_KEYS_URI} | gpg --dearmor > /usr/share/keyrings/microsoft-archive-keyring.gpg - echo "deb [arch=${architecture} signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/microsoft-${ID}-${VERSION_CODENAME}-prod ${VERSION_CODENAME} main" > /etc/apt/sources.list.d/microsoft.list + # Import key safely and import Microsoft apt repo + get_common_setting MICROSOFT_GPG_KEYS_URI + curl -sSL ${MICROSOFT_GPG_KEYS_URI} | gpg --dearmor > /usr/share/keyrings/microsoft-archive-keyring.gpg + echo "deb [arch=${architecture} signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/microsoft-${ID}-${VERSION_CODENAME}-prod ${VERSION_CODENAME} main" > /etc/apt/sources.list.d/microsoft.list else - # Name of proprietary engine package - cli_package_name="docker-ce-cli" + # Name of proprietary engine package + cli_package_name="docker-ce-cli" - # Import key safely and import Docker apt repo - curl -fsSL https://download.docker.com/linux/${ID}/gpg | gpg --dearmor > /usr/share/keyrings/docker-archive-keyring.gpg - echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/${ID} ${VERSION_CODENAME} stable" > /etc/apt/sources.list.d/docker.list + # Import key safely and import Docker apt repo + curl -fsSL https://download.docker.com/linux/${ID}/gpg | gpg --dearmor > /usr/share/keyrings/docker-archive-keyring.gpg + echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/${ID} ${VERSION_CODENAME} stable" > /etc/apt/sources.list.d/docker.list fi # Refresh apt lists @@ -170,116 +169,116 @@ apt-get update # Soft version matching for CLI if [ "${DOCKER_VERSION}" = "latest" ] || [ "${DOCKER_VERSION}" = "lts" ] || [ "${DOCKER_VERSION}" = "stable" ]; then - # Empty, meaning grab whatever "latest" is in apt repo - cli_version_suffix="" + # Empty, meaning grab whatever "latest" is in apt repo + cli_version_suffix="" else - # Fetch a valid version from the apt-cache (eg: the Microsoft repo appends +azure, breakfix, etc...) - docker_version_dot_escaped="${DOCKER_VERSION//./\\.}" - docker_version_dot_plus_escaped="${docker_version_dot_escaped//+/\\+}" - # Regex needs to handle debian package version number format: https://www.systutorials.com/docs/linux/man/5-deb-version/ - docker_version_regex="^(.+:)?${docker_version_dot_plus_escaped}([\\.\\+ ~:-]|$)" - set +e # Don't exit if finding version fails - will handle gracefully - cli_version_suffix="=$(apt-cache madison ${cli_package_name} | awk -F"|" '{print $2}' | sed -e 's/^[ \t]*//' | grep -E -m 1 "${docker_version_regex}")" - set -e - if [ -z "${cli_version_suffix}" ] || [ "${cli_version_suffix}" = "=" ]; then - echo "(!) No full or partial Docker / Moby version match found for \"${DOCKER_VERSION}\" on OS ${ID} ${VERSION_CODENAME} (${architecture}). Available versions:" - apt-cache madison ${cli_package_name} | awk -F"|" '{print $2}' | grep -oP '^(.+:)?\K.+' - exit 1 - fi - echo "cli_version_suffix ${cli_version_suffix}" + # Fetch a valid version from the apt-cache (eg: the Microsoft repo appends +azure, breakfix, etc...) + docker_version_dot_escaped="${DOCKER_VERSION//./\\.}" + docker_version_dot_plus_escaped="${docker_version_dot_escaped//+/\\+}" + # Regex needs to handle debian package version number format: https://www.systutorials.com/docs/linux/man/5-deb-version/ + docker_version_regex="^(.+:)?${docker_version_dot_plus_escaped}([\\.\\+ ~:-]|$)" + set +e # Don't exit if finding version fails - will handle gracefully + cli_version_suffix="=$(apt-cache madison ${cli_package_name} | awk -F"|" '{print $2}' | sed -e 's/^[ \t]*//' | grep -E -m 1 "${docker_version_regex}")" + set -e + if [ -z "${cli_version_suffix}" ] || [ "${cli_version_suffix}" = "=" ]; then + echo "(!) No full or partial Docker / Moby version match found for \"${DOCKER_VERSION}\" on OS ${ID} ${VERSION_CODENAME} (${architecture}). Available versions:" + apt-cache madison ${cli_package_name} | awk -F"|" '{print $2}' | grep -oP '^(.+:)?\K.+' + exit 1 + fi + echo "cli_version_suffix ${cli_version_suffix}" fi # Install Docker / Moby CLI if not already installed if type docker > /dev/null 2>&1; then - echo "Docker / Moby CLI already installed." + echo "Docker / Moby CLI already installed." else - if [ "${USE_MOBY}" = "true" ]; then - apt-get -y install --no-install-recommends moby-cli${cli_version_suffix} moby-buildx - apt-get -y install --no-install-recommends moby-compose || echo "(*) Package moby-compose (Docker Compose v2) not available for OS ${ID} ${VERSION_CODENAME} (${architecture}). Skipping." - else - apt-get -y install --no-install-recommends docker-ce-cli${cli_version_suffix} - fi + if [ "${USE_MOBY}" = "true" ]; then + apt-get -y install --no-install-recommends moby-cli${cli_version_suffix} moby-buildx + apt-get -y install --no-install-recommends moby-compose || echo "(*) Package moby-compose (Docker Compose v2) not available for OS ${ID} ${VERSION_CODENAME} (${architecture}). Skipping." + else + apt-get -y install --no-install-recommends docker-ce-cli${cli_version_suffix} + fi fi # Install Docker Compose if not already installed and is on a supported architecture if type docker-compose > /dev/null 2>&1; then - echo "Docker Compose already installed." + echo "Docker Compose already installed." else - TARGET_COMPOSE_ARCH="$(uname -m)" - if [ "${TARGET_COMPOSE_ARCH}" = "amd64" ]; then - TARGET_COMPOSE_ARCH="x86_64" + TARGET_COMPOSE_ARCH="$(uname -m)" + if [ "${TARGET_COMPOSE_ARCH}" = "amd64" ]; then + TARGET_COMPOSE_ARCH="x86_64" + fi + if [ "${TARGET_COMPOSE_ARCH}" != "x86_64" ]; then + # Use pip to get a version that runns on this architecture + if ! dpkg -s python3-minimal python3-pip libffi-dev python3-venv > /dev/null 2>&1; then + apt_get_update_if_needed + apt-get -y install python3-minimal python3-pip libffi-dev python3-venv fi - if [ "${TARGET_COMPOSE_ARCH}" != "x86_64" ]; then - # Use pip to get a version that runns on this architecture - if ! dpkg -s python3-minimal python3-pip libffi-dev python3-venv > /dev/null 2>&1; then - apt_get_update_if_needed - apt-get -y install python3-minimal python3-pip libffi-dev python3-venv - fi - export PIPX_HOME=/usr/local/pipx - mkdir -p ${PIPX_HOME} - export PIPX_BIN_DIR=/usr/local/bin - export PYTHONUSERBASE=/tmp/pip-tmp - export PIP_CACHE_DIR=/tmp/pip-tmp/cache - pipx_bin=pipx - if ! type pipx > /dev/null 2>&1; then - pip3 install --disable-pip-version-check --no-cache-dir --user pipx - pipx_bin=/tmp/pip-tmp/bin/pipx - fi - ${pipx_bin} install --pip-args '--no-cache-dir --force-reinstall' docker-compose - rm -rf /tmp/pip-tmp - else - compose_v1_version="1" - find_version_from_git_tags compose_v1_version "https://github.com/docker/compose" "tags/" - echo "(*) Installing docker-compose ${compose_v1_version}..." - curl -fsSL "https://github.com/docker/compose/releases/download/${compose_v1_version}/docker-compose-Linux-x86_64" -o /usr/local/bin/docker-compose - chmod +x /usr/local/bin/docker-compose + export PIPX_HOME=/usr/local/pipx + mkdir -p ${PIPX_HOME} + export PIPX_BIN_DIR=/usr/local/bin + export PYTHONUSERBASE=/tmp/pip-tmp + export PIP_CACHE_DIR=/tmp/pip-tmp/cache + pipx_bin=pipx + if ! type pipx > /dev/null 2>&1; then + pip3 install --disable-pip-version-check --no-cache-dir --user pipx + pipx_bin=/tmp/pip-tmp/bin/pipx fi + ${pipx_bin} install --pip-args '--no-cache-dir --force-reinstall' docker-compose + rm -rf /tmp/pip-tmp + else + compose_v1_version="1" + find_version_from_git_tags compose_v1_version "https://github.com/docker/compose" "tags/" + echo "(*) Installing docker-compose ${compose_v1_version}..." + curl -fsSL "https://github.com/docker/compose/releases/download/${compose_v1_version}/docker-compose-Linux-x86_64" -o /usr/local/bin/docker-compose + chmod +x /usr/local/bin/docker-compose + fi fi # Install docker-compose switch if not already installed - https://github.com/docker/compose-switch#manual-installation current_v1_compose_path="$(which docker-compose)" target_v1_compose_path="$(dirname "${current_v1_compose_path}")/docker-compose-v1" if ! type compose-switch > /dev/null 2>&1; then - echo "(*) Installing compose-switch..." - compose_switch_version="latest" - find_version_from_git_tags compose_switch_version "https://github.com/docker/compose-switch" - curl -fsSL "https://github.com/docker/compose-switch/releases/download/v${compose_switch_version}/docker-compose-linux-${architecture}" -o /usr/local/bin/compose-switch - chmod +x /usr/local/bin/compose-switch - # TODO: Verify checksum once available: https://github.com/docker/compose-switch/issues/11 - - # Setup v1 CLI as alternative in addition to compose-switch (which maps to v2) - mv "${current_v1_compose_path}" "${target_v1_compose_path}" - update-alternatives --install /usr/local/bin/docker-compose docker-compose /usr/local/bin/compose-switch 99 - update-alternatives --install /usr/local/bin/docker-compose docker-compose "${target_v1_compose_path}" 1 + echo "(*) Installing compose-switch..." + compose_switch_version="latest" + find_version_from_git_tags compose_switch_version "https://github.com/docker/compose-switch" + curl -fsSL "https://github.com/docker/compose-switch/releases/download/v${compose_switch_version}/docker-compose-linux-${architecture}" -o /usr/local/bin/compose-switch + chmod +x /usr/local/bin/compose-switch + # TODO: Verify checksum once available: https://github.com/docker/compose-switch/issues/11 + + # Setup v1 CLI as alternative in addition to compose-switch (which maps to v2) + mv "${current_v1_compose_path}" "${target_v1_compose_path}" + update-alternatives --install /usr/local/bin/docker-compose docker-compose /usr/local/bin/compose-switch 99 + update-alternatives --install /usr/local/bin/docker-compose docker-compose "${target_v1_compose_path}" 1 fi if [ "${DOCKER_DASH_COMPOSE_VERSION}" = "v1" ]; then - update-alternatives --set docker-compose "${target_v1_compose_path}" + update-alternatives --set docker-compose "${target_v1_compose_path}" else - update-alternatives --set docker-compose /usr/local/bin/compose-switch + update-alternatives --set docker-compose /usr/local/bin/compose-switch fi # If init file already exists, exit if [ -f "/usr/local/share/docker-init.sh" ]; then - exit 0 + exit 0 fi echo "docker-init doesnt exist, adding..." # By default, make the source and target sockets the same if [ "${SOURCE_SOCKET}" != "${TARGET_SOCKET}" ]; then - touch "${SOURCE_SOCKET}" - ln -s "${SOURCE_SOCKET}" "${TARGET_SOCKET}" + touch "${SOURCE_SOCKET}" + ln -s "${SOURCE_SOCKET}" "${TARGET_SOCKET}" fi # Add a stub if not adding non-root user access, user is root if [ "${ENABLE_NONROOT_DOCKER}" = "false" ] || [ "${USERNAME}" = "root" ]; then - echo -e '#!/usr/bin/env bash\nexec "$@"' > /usr/local/share/docker-init.sh - chmod +x /usr/local/share/docker-init.sh - exit 0 + echo -e '#!/usr/bin/env bash\nexec "$@"' > /usr/local/share/docker-init.sh + chmod +x /usr/local/share/docker-init.sh + exit 0 fi # Setup a docker group in the event the docker socket's group is not root if ! grep -qE '^docker:' /etc/group; then - groupadd --system docker + groupadd --system docker fi usermod -aG docker "${USERNAME}" DOCKER_GID="$(grep -oP '^docker:x:\K[^:]+' /etc/group)" @@ -287,11 +286,11 @@ DOCKER_GID="$(grep -oP '^docker:x:\K[^:]+' /etc/group)" # If enabling non-root access and specified user is found, setup socat and add script chown -h "${USERNAME}":root "${TARGET_SOCKET}" if ! dpkg -s socat > /dev/null 2>&1; then - apt_get_update_if_needed - apt-get -y install socat + apt_get_update_if_needed + apt-get -y install socat fi tee /usr/local/share/docker-init.sh > /dev/null \ -<< EOF + << EOF #!/usr/bin/env bash #------------------------------------------------------------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. diff --git a/images/codespace/library-scripts/meta.env b/images/codespace/library-scripts/meta.env index e1ac910656..9e5433682e 100644 --- a/images/codespace/library-scripts/meta.env +++ b/images/codespace/library-scripts/meta.env @@ -1 +1 @@ -VERSION='dev' \ No newline at end of file +VERSION='dev' diff --git a/images/gvm11/Dockerfile b/images/gvm11/Dockerfile index a02e39246c..2f502a56c6 100644 --- a/images/gvm11/Dockerfile +++ b/images/gvm11/Dockerfile @@ -1,4 +1,3 @@ - ARG ARCH=amd64 ARG BASE_VERSION=":latest" ARG BASE_HASH="@sha256:81f00103fe7cb5ecf6e2516a19220eaf537b78b99bdab2d50ff204fedddad899" @@ -11,36 +10,36 @@ ARG GRAAL_ARCH=amd64 ARG JAVA_VERSION=java11 RUN apt-get update \ - && apt-get -y upgrade \ - && DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends \ - ca-certificates \ - curl \ - git \ - gnupg \ - libc-dev \ - && mkdir -p /tmp/gvm \ - && cd /tmp/gvm \ - && export GRAAL_DOWNLOAD_URL="https://github.com/graalvm/graalvm-$GRAAL_EDITION-builds/releases/download/vm-$GRAAL_VERSION/graalvm-$GRAAL_EDITION-$JAVA_VERSION-linux-$GRAAL_ARCH-$GRAAL_VERSION.tar.gz" \ - && echo "GraalVM Download URL: $GRAAL_DOWNLOAD_URL" \ - && curl --progress-bar -SL "$GRAAL_DOWNLOAD_URL" > ./graalvm.tar.gz \ - && curl --progress-bar -sSL "$GRAAL_DOWNLOAD_URL.sha256" > ./graalvm.tar.gz.sha256 \ - && ls -la ./graalvm.tar.gz ./graalvm.tar.gz.sha256 \ - && echo "Downloaded checksum for GraalVM: $(cat ./graalvm.tar.gz.sha256)" \ - && echo "$(cat ./graalvm.tar.gz.sha256) graalvm.tar.gz" | sha256sum --check --status \ - && tar -xzvf ./graalvm.tar.gz \ - && mv "./graalvm-$GRAAL_EDITION-$JAVA_VERSION-$GRAAL_VERSION" /usr/lib/gvm \ - && rm -f ./graalvm.tar.gz \ - && cd / \ - && rm -fr /tmp/gvm \ - && export JAVA_HOME=/usr/lib/gvm \ - GRAALVM_HOME=/usr/lib/gvm \ - PATH=/usr/lib/gvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ - && echo "Installing GraalVM modules..." \ - && $GRAALVM_HOME/bin/gu install native-image espresso \ - && rm -rf /var/lib/apt/lists/*; + && apt-get -y upgrade \ + && DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends \ + ca-certificates \ + curl \ + git \ + gnupg \ + libc-dev \ + && mkdir -p /tmp/gvm \ + && cd /tmp/gvm \ + && export GRAAL_DOWNLOAD_URL="https://github.com/graalvm/graalvm-$GRAAL_EDITION-builds/releases/download/vm-$GRAAL_VERSION/graalvm-$GRAAL_EDITION-$JAVA_VERSION-linux-$GRAAL_ARCH-$GRAAL_VERSION.tar.gz" \ + && echo "GraalVM Download URL: $GRAAL_DOWNLOAD_URL" \ + && curl --progress-bar -SL "$GRAAL_DOWNLOAD_URL" > ./graalvm.tar.gz \ + && curl --progress-bar -sSL "$GRAAL_DOWNLOAD_URL.sha256" > ./graalvm.tar.gz.sha256 \ + && ls -la ./graalvm.tar.gz ./graalvm.tar.gz.sha256 \ + && echo "Downloaded checksum for GraalVM: $(cat ./graalvm.tar.gz.sha256)" \ + && echo "$(cat ./graalvm.tar.gz.sha256) graalvm.tar.gz" | sha256sum --check --status \ + && tar -xzvf ./graalvm.tar.gz \ + && mv "./graalvm-$GRAAL_EDITION-$JAVA_VERSION-$GRAAL_VERSION" /usr/lib/gvm \ + && rm -f ./graalvm.tar.gz \ + && cd / \ + && rm -fr /tmp/gvm \ + && export JAVA_HOME=/usr/lib/gvm \ + GRAALVM_HOME=/usr/lib/gvm \ + PATH=/usr/lib/gvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ + && echo "Installing GraalVM modules..." \ + && $GRAALVM_HOME/bin/gu install native-image espresso \ + && rm -rf /var/lib/apt/lists/* ENV JAVA_HOME=/usr/lib/gvm \ - GRAALVM_HOME=/usr/lib/gvm \ - LC_CTYPE=en_US.UTF-8 \ - LC_ALL=en_US.UTF-8 \ - PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/gvm/bin:/sbin:/bin + GRAALVM_HOME=/usr/lib/gvm \ + LC_CTYPE=en_US.UTF-8 \ + LC_ALL=en_US.UTF-8 \ + PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/gvm/bin:/sbin:/bin diff --git a/images/gvm11/cloudbuild.yaml b/images/gvm11/cloudbuild.yaml index 3cd2ff3dcc..9fe6398e31 100644 --- a/images/gvm11/cloudbuild.yaml +++ b/images/gvm11/cloudbuild.yaml @@ -1,6 +1,6 @@ steps: - - name: 'gcr.io/cloud-builders/docker' - args: ['build', '-t', 'us-docker.pkg.dev/elide-fw/tools/gvm11', '.'] -images: ['us-docker.pkg.dev/elide-fw/tools/gvm11'] + - name: "gcr.io/cloud-builders/docker" + args: ["build", "-t", "us-docker.pkg.dev/elide-fw/tools/gvm11", "."] +images: ["us-docker.pkg.dev/elide-fw/tools/gvm11"] options: logging: CLOUD_LOGGING_ONLY diff --git a/images/gvm17/Dockerfile b/images/gvm17/Dockerfile index eff8ba25ce..5f6787b2a7 100644 --- a/images/gvm17/Dockerfile +++ b/images/gvm17/Dockerfile @@ -1,4 +1,3 @@ - ARG ARCH=amd64 ARG BASE_VERSION=":latest" ARG BASE_HASH="@sha256:05364d23784cc14cd3dbcf66fcfe3213cbe3ee96b6a31b5a40c0d13a10a4c017" @@ -11,36 +10,36 @@ ARG GRAAL_ARCH=amd64 ARG JAVA_VERSION=java17 RUN apt-get update \ - && apt-get -y upgrade \ - && DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends \ - ca-certificates \ - curl \ - git \ - gnupg \ - libc-dev \ - && mkdir -p /tmp/gvm \ - && cd /tmp/gvm \ - && export GRAAL_DOWNLOAD_URL="https://github.com/graalvm/graalvm-$GRAAL_EDITION-builds/releases/download/vm-$GRAAL_VERSION/graalvm-$GRAAL_EDITION-$JAVA_VERSION-linux-$GRAAL_ARCH-$GRAAL_VERSION.tar.gz" \ - && echo "GraalVM Download URL: $GRAAL_DOWNLOAD_URL" \ - && curl --progress-bar -SL "$GRAAL_DOWNLOAD_URL" > ./graalvm.tar.gz \ - && curl --progress-bar -sSL "$GRAAL_DOWNLOAD_URL.sha256" > ./graalvm.tar.gz.sha256 \ - && ls -la ./graalvm.tar.gz ./graalvm.tar.gz.sha256 \ - && echo "Downloaded checksum for GraalVM: $(cat ./graalvm.tar.gz.sha256)" \ - && echo "$(cat ./graalvm.tar.gz.sha256) graalvm.tar.gz" | sha256sum --check --status \ - && tar -xzvf ./graalvm.tar.gz \ - && mv "./graalvm-$GRAAL_EDITION-$JAVA_VERSION-$GRAAL_VERSION" /usr/lib/gvm \ - && rm -f ./graalvm.tar.gz \ - && cd / \ - && rm -fr /tmp/gvm \ - && export JAVA_HOME=/usr/lib/gvm \ - GRAALVM_HOME=/usr/lib/gvm \ - PATH=/usr/lib/gvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ - && echo "Installing GraalVM modules..." \ - && $GRAALVM_HOME/bin/gu install native-image espresso \ - && rm -rf /var/lib/apt/lists/*; + && apt-get -y upgrade \ + && DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends \ + ca-certificates \ + curl \ + git \ + gnupg \ + libc-dev \ + && mkdir -p /tmp/gvm \ + && cd /tmp/gvm \ + && export GRAAL_DOWNLOAD_URL="https://github.com/graalvm/graalvm-$GRAAL_EDITION-builds/releases/download/vm-$GRAAL_VERSION/graalvm-$GRAAL_EDITION-$JAVA_VERSION-linux-$GRAAL_ARCH-$GRAAL_VERSION.tar.gz" \ + && echo "GraalVM Download URL: $GRAAL_DOWNLOAD_URL" \ + && curl --progress-bar -SL "$GRAAL_DOWNLOAD_URL" > ./graalvm.tar.gz \ + && curl --progress-bar -sSL "$GRAAL_DOWNLOAD_URL.sha256" > ./graalvm.tar.gz.sha256 \ + && ls -la ./graalvm.tar.gz ./graalvm.tar.gz.sha256 \ + && echo "Downloaded checksum for GraalVM: $(cat ./graalvm.tar.gz.sha256)" \ + && echo "$(cat ./graalvm.tar.gz.sha256) graalvm.tar.gz" | sha256sum --check --status \ + && tar -xzvf ./graalvm.tar.gz \ + && mv "./graalvm-$GRAAL_EDITION-$JAVA_VERSION-$GRAAL_VERSION" /usr/lib/gvm \ + && rm -f ./graalvm.tar.gz \ + && cd / \ + && rm -fr /tmp/gvm \ + && export JAVA_HOME=/usr/lib/gvm \ + GRAALVM_HOME=/usr/lib/gvm \ + PATH=/usr/lib/gvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ + && echo "Installing GraalVM modules..." \ + && $GRAALVM_HOME/bin/gu install native-image espresso \ + && rm -rf /var/lib/apt/lists/* ENV JAVA_HOME=/usr/lib/gvm \ - GRAALVM_HOME=/usr/lib/gvm \ - LC_CTYPE=en_US.UTF-8 \ - LC_ALL=en_US.UTF-8 \ - PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/gvm/bin:/sbin:/bin + GRAALVM_HOME=/usr/lib/gvm \ + LC_CTYPE=en_US.UTF-8 \ + LC_ALL=en_US.UTF-8 \ + PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/gvm/bin:/sbin:/bin diff --git a/images/gvm17/cloudbuild.yaml b/images/gvm17/cloudbuild.yaml index 48d8449aef..bbed79d207 100644 --- a/images/gvm17/cloudbuild.yaml +++ b/images/gvm17/cloudbuild.yaml @@ -1,6 +1,6 @@ steps: - - name: 'gcr.io/cloud-builders/docker' - args: ['build', '-t', 'us-docker.pkg.dev/elide-fw/tools/gvm17', '.'] -images: ['us-docker.pkg.dev/elide-fw/tools/gvm17'] + - name: "gcr.io/cloud-builders/docker" + args: ["build", "-t", "us-docker.pkg.dev/elide-fw/tools/gvm17", "."] +images: ["us-docker.pkg.dev/elide-fw/tools/gvm17"] options: logging: CLOUD_LOGGING_ONLY diff --git a/images/jdk11/Dockerfile b/images/jdk11/Dockerfile index 8b6630b83e..e93524cfc9 100644 --- a/images/jdk11/Dockerfile +++ b/images/jdk11/Dockerfile @@ -1,4 +1,3 @@ - ARG ARCH=amd64 ARG BASE_VERSION=":latest" ARG BASE_HASH="@sha256:060b119fb2bf0f65fe5d1927c238516562638bdd2bc581d06de4d0c5443bad72" @@ -8,23 +7,23 @@ FROM --platform=linux/${ARCH} us-docker.pkg.dev/elide-fw/tools/base${BASE_VERSIO ARG JAVA_VERSION=java11 RUN apt-get update \ - && apt-get -y upgrade \ - && DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends \ - ca-certificates \ - curl \ - git \ - gnupg \ - libc-dev \ - && apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9 \ - && curl -O https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb \ - && apt-get install ./zulu-repo_1.0.0-3_all.deb \ - && rm -fv /zulu-repo_1.0.0-3_all.deb \ - && apt-get update \ - && apt-get install -y zulu11-jdk wget tar \ - && rm -rf /var/lib/apt/lists/* \ - && echo "JDK image ready."; + && apt-get -y upgrade \ + && DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends \ + ca-certificates \ + curl \ + git \ + gnupg \ + libc-dev \ + && apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9 \ + && curl -O https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb \ + && apt-get install ./zulu-repo_1.0.0-3_all.deb \ + && rm -fv /zulu-repo_1.0.0-3_all.deb \ + && apt-get update \ + && apt-get install -y zulu11-jdk wget tar \ + && rm -rf /var/lib/apt/lists/* \ + && echo "JDK image ready." ENV LC_CTYPE=en_US.UTF-8 \ - LC_ALL=en_US.UTF-8 \ - JAVA_HOME="/usr/lib/jvm/zulu11" \ - PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin + LC_ALL=en_US.UTF-8 \ + JAVA_HOME="/usr/lib/jvm/zulu11" \ + PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin diff --git a/images/jdk11/cloudbuild.yaml b/images/jdk11/cloudbuild.yaml index 513c6c93a1..68d10484f9 100644 --- a/images/jdk11/cloudbuild.yaml +++ b/images/jdk11/cloudbuild.yaml @@ -1,6 +1,6 @@ steps: - - name: 'gcr.io/cloud-builders/docker' - args: ['build', '-t', 'us-docker.pkg.dev/elide-fw/tools/jdk11', '.'] -images: ['us-docker.pkg.dev/elide-fw/tools/jdk11'] + - name: "gcr.io/cloud-builders/docker" + args: ["build", "-t", "us-docker.pkg.dev/elide-fw/tools/jdk11", "."] +images: ["us-docker.pkg.dev/elide-fw/tools/jdk11"] options: logging: CLOUD_LOGGING_ONLY diff --git a/images/jdk17/Dockerfile b/images/jdk17/Dockerfile index 7bf647e6f2..f6d5c8d1fc 100644 --- a/images/jdk17/Dockerfile +++ b/images/jdk17/Dockerfile @@ -1,4 +1,3 @@ - ARG ARCH=amd64 ARG BASE_VERSION=":latest" ARG BASE_HASH="@sha256:060b119fb2bf0f65fe5d1927c238516562638bdd2bc581d06de4d0c5443bad72" @@ -8,23 +7,23 @@ FROM --platform=linux/${ARCH} us-docker.pkg.dev/elide-fw/tools/base${BASE_VERSIO ARG JAVA_VERSION=java17 RUN apt-get update \ - && apt-get -y upgrade \ - && DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends \ - ca-certificates \ - curl \ - git \ - gnupg \ - libc-dev \ - && apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9 \ - && curl -O https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb \ - && apt-get install ./zulu-repo_1.0.0-3_all.deb \ - && rm -fv /zulu-repo_1.0.0-3_all.deb \ - && apt-get update \ - && apt-get install -y zulu17-jdk wget tar \ - && rm -rf /var/lib/apt/lists/* \ - && echo "JDK image ready."; + && apt-get -y upgrade \ + && DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends \ + ca-certificates \ + curl \ + git \ + gnupg \ + libc-dev \ + && apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9 \ + && curl -O https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb \ + && apt-get install ./zulu-repo_1.0.0-3_all.deb \ + && rm -fv /zulu-repo_1.0.0-3_all.deb \ + && apt-get update \ + && apt-get install -y zulu17-jdk wget tar \ + && rm -rf /var/lib/apt/lists/* \ + && echo "JDK image ready." ENV LC_CTYPE=en_US.UTF-8 \ - LC_ALL=en_US.UTF-8 \ - JAVA_HOME="/usr/lib/jvm/zulu17" \ - PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin + LC_ALL=en_US.UTF-8 \ + JAVA_HOME="/usr/lib/jvm/zulu17" \ + PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin diff --git a/images/jdk17/cloudbuild.yaml b/images/jdk17/cloudbuild.yaml index 726dffdf1e..cd1c61a39c 100644 --- a/images/jdk17/cloudbuild.yaml +++ b/images/jdk17/cloudbuild.yaml @@ -1,6 +1,6 @@ steps: - - name: 'gcr.io/cloud-builders/docker' - args: ['build', '-t', 'us-docker.pkg.dev/elide-fw/tools/jdk17', '.'] -images: ['us-docker.pkg.dev/elide-fw/tools/jdk17'] + - name: "gcr.io/cloud-builders/docker" + args: ["build", "-t", "us-docker.pkg.dev/elide-fw/tools/jdk17", "."] +images: ["us-docker.pkg.dev/elide-fw/tools/jdk17"] options: logging: CLOUD_LOGGING_ONLY diff --git a/images/native-alpine/Dockerfile b/images/native-alpine/Dockerfile index c1c82fed84..13cd3a442c 100644 --- a/images/native-alpine/Dockerfile +++ b/images/native-alpine/Dockerfile @@ -1,4 +1,3 @@ - ARG BASE_VERSION=1.34.1-musl ARG BASE_ARCH=amd64 ARG BASE_HASH="@sha256:b874122327392296299b39325645c731339b545ba1c2550851a19974edbc5e80" diff --git a/images/native-alpine/cloudbuild.yaml b/images/native-alpine/cloudbuild.yaml index 327493ab37..c5a7d82366 100644 --- a/images/native-alpine/cloudbuild.yaml +++ b/images/native-alpine/cloudbuild.yaml @@ -1,6 +1,12 @@ steps: - - name: 'gcr.io/cloud-builders/docker' - args: ['build', '-t', 'us-docker.pkg.dev/elide-fw/tools/runtime/native/alpine', '.'] -images: ['us-docker.pkg.dev/elide-fw/tools/runtime/native/alpine'] + - name: "gcr.io/cloud-builders/docker" + args: + [ + "build", + "-t", + "us-docker.pkg.dev/elide-fw/tools/runtime/native/alpine", + ".", + ] +images: ["us-docker.pkg.dev/elide-fw/tools/runtime/native/alpine"] options: logging: CLOUD_LOGGING_ONLY diff --git a/images/native/Dockerfile b/images/native/Dockerfile index 9371e7ebcf..e22e503cc9 100644 --- a/images/native/Dockerfile +++ b/images/native/Dockerfile @@ -1,4 +1,3 @@ - ARG BASE_ARCH=amd64 FROM --platform=linux/${BASE_ARCH} debian@sha256:aeecadc41628dd0a5fdb10866481f932f3ec4f29b0fa5b987db9091cd24e85a7 diff --git a/images/native/cloudbuild.yaml b/images/native/cloudbuild.yaml index 2a50e1e886..69fce7cc56 100644 --- a/images/native/cloudbuild.yaml +++ b/images/native/cloudbuild.yaml @@ -1,6 +1,7 @@ steps: - - name: 'gcr.io/cloud-builders/docker' - args: ['build', '-t', 'us-docker.pkg.dev/elide-fw/tools/runtime/native', '.'] -images: ['us-docker.pkg.dev/elide-fw/tools/runtime/native'] + - name: "gcr.io/cloud-builders/docker" + args: + ["build", "-t", "us-docker.pkg.dev/elide-fw/tools/runtime/native", "."] +images: ["us-docker.pkg.dev/elide-fw/tools/runtime/native"] options: logging: CLOUD_LOGGING_ONLY diff --git a/images/qodana-jvm/Dockerfile b/images/qodana-jvm/Dockerfile index d78813185f..424c802acd 100644 --- a/images/qodana-jvm/Dockerfile +++ b/images/qodana-jvm/Dockerfile @@ -1,4 +1,3 @@ - FROM --platform=amd64 us-docker.pkg.dev/elide-fw/tools/jdk17 AS jvm17 FROM --platform=amd64 jetbrains/qodana-jvm:2022.1-eap@sha256:fc913039837ba34ee8ce516c91d14331693ff62332db4445f6b5f48d7e5e769f diff --git a/images/qodana-jvm/cloudbuild.yaml b/images/qodana-jvm/cloudbuild.yaml index 8c046fdc15..88dffe2cb0 100644 --- a/images/qodana-jvm/cloudbuild.yaml +++ b/images/qodana-jvm/cloudbuild.yaml @@ -1,6 +1,6 @@ steps: - - name: 'gcr.io/cloud-builders/docker' - args: ['build', '-t', 'us-docker.pkg.dev/elide-fw/tools/qodana', '.'] -images: ['us-docker.pkg.dev/elide-fw/tools/qodana'] + - name: "gcr.io/cloud-builders/docker" + args: ["build", "-t", "us-docker.pkg.dev/elide-fw/tools/qodana", "."] +images: ["us-docker.pkg.dev/elide-fw/tools/qodana"] options: logging: CLOUD_LOGGING_ONLY diff --git a/images/runtime-jvm11/Dockerfile b/images/runtime-jvm11/Dockerfile index 56bdb61e0c..61227f3392 100644 --- a/images/runtime-jvm11/Dockerfile +++ b/images/runtime-jvm11/Dockerfile @@ -1,4 +1,3 @@ - ARG BASE_IMAGE=base ARG BASE_VERSION=":latest" ARG BASE_ARCH="amd64" @@ -12,32 +11,32 @@ ARG GRAAL_ARCH=amd64 ARG JAVA_VERSION=java11 RUN apt-get update \ - && apt-get -y upgrade \ - && DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends \ - ca-certificates \ - curl \ - libc-dev \ - && mkdir -p /tmp/gvm \ - && cd /tmp/gvm \ - && export GRAAL_DOWNLOAD_URL="https://github.com/graalvm/graalvm-$GRAAL_EDITION-builds/releases/download/vm-$GRAAL_VERSION/graalvm-$GRAAL_EDITION-$JAVA_VERSION-linux-$GRAAL_ARCH-$GRAAL_VERSION.tar.gz" \ - && echo "GraalVM Download URL: $GRAAL_DOWNLOAD_URL" \ - && curl --progress-bar -SL "$GRAAL_DOWNLOAD_URL" > ./graalvm.tar.gz \ - && curl --progress-bar -sSL "$GRAAL_DOWNLOAD_URL.sha256" > ./graalvm.tar.gz.sha256 \ - && ls -la ./graalvm.tar.gz ./graalvm.tar.gz.sha256 \ - && echo "Downloaded checksum for GraalVM: $(cat ./graalvm.tar.gz.sha256)" \ - && echo "$(cat ./graalvm.tar.gz.sha256) graalvm.tar.gz" | sha256sum --check --status \ - && tar -xzvf ./graalvm.tar.gz \ - && mv "./graalvm-$GRAAL_EDITION-$JAVA_VERSION-$GRAAL_VERSION" /usr/lib/gvm \ - && rm ./graalvm.tar.gz ./graalvm.tar.gz.sha256 \ - && cd / \ - && rm -fr /tmp/gvm \ - && export JAVA_HOME=/usr/lib/gvm \ - GRAALVM_HOME=/usr/lib/gvm \ - PATH=/usr/lib/gvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ - && echo "Installing GraalVM modules..." \ - && $GRAALVM_HOME/bin/gu install espresso \ - && rm -rf /var/lib/apt/lists/*; + && apt-get -y upgrade \ + && DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends \ + ca-certificates \ + curl \ + libc-dev \ + && mkdir -p /tmp/gvm \ + && cd /tmp/gvm \ + && export GRAAL_DOWNLOAD_URL="https://github.com/graalvm/graalvm-$GRAAL_EDITION-builds/releases/download/vm-$GRAAL_VERSION/graalvm-$GRAAL_EDITION-$JAVA_VERSION-linux-$GRAAL_ARCH-$GRAAL_VERSION.tar.gz" \ + && echo "GraalVM Download URL: $GRAAL_DOWNLOAD_URL" \ + && curl --progress-bar -SL "$GRAAL_DOWNLOAD_URL" > ./graalvm.tar.gz \ + && curl --progress-bar -sSL "$GRAAL_DOWNLOAD_URL.sha256" > ./graalvm.tar.gz.sha256 \ + && ls -la ./graalvm.tar.gz ./graalvm.tar.gz.sha256 \ + && echo "Downloaded checksum for GraalVM: $(cat ./graalvm.tar.gz.sha256)" \ + && echo "$(cat ./graalvm.tar.gz.sha256) graalvm.tar.gz" | sha256sum --check --status \ + && tar -xzvf ./graalvm.tar.gz \ + && mv "./graalvm-$GRAAL_EDITION-$JAVA_VERSION-$GRAAL_VERSION" /usr/lib/gvm \ + && rm ./graalvm.tar.gz ./graalvm.tar.gz.sha256 \ + && cd / \ + && rm -fr /tmp/gvm \ + && export JAVA_HOME=/usr/lib/gvm \ + GRAALVM_HOME=/usr/lib/gvm \ + PATH=/usr/lib/gvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ + && echo "Installing GraalVM modules..." \ + && $GRAALVM_HOME/bin/gu install espresso \ + && rm -rf /var/lib/apt/lists/* ENV JAVA_HOME=/usr/lib/gvm \ - GRAALVM_HOME=/usr/lib/gvm \ - PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/gvm/bin:/sbin:/bin + GRAALVM_HOME=/usr/lib/gvm \ + PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/gvm/bin:/sbin:/bin diff --git a/images/runtime-jvm11/cloudbuild.yaml b/images/runtime-jvm11/cloudbuild.yaml index 5a3f76c86b..69de91eb91 100644 --- a/images/runtime-jvm11/cloudbuild.yaml +++ b/images/runtime-jvm11/cloudbuild.yaml @@ -1,6 +1,6 @@ steps: - - name: 'gcr.io/cloud-builders/docker' - args: ['build', '-t', 'us-docker.pkg.dev/elide-fw/tools/runtime/jvm11', '.'] -images: ['us-docker.pkg.dev/elide-fw/tools/runtime/jvm11'] + - name: "gcr.io/cloud-builders/docker" + args: ["build", "-t", "us-docker.pkg.dev/elide-fw/tools/runtime/jvm11", "."] +images: ["us-docker.pkg.dev/elide-fw/tools/runtime/jvm11"] options: logging: CLOUD_LOGGING_ONLY diff --git a/images/runtime-jvm17/Dockerfile b/images/runtime-jvm17/Dockerfile index 97b63cfc30..62aa7b1fe6 100644 --- a/images/runtime-jvm17/Dockerfile +++ b/images/runtime-jvm17/Dockerfile @@ -1,4 +1,3 @@ - ARG BASE_IMAGE=base ARG BASE_VERSION=":latest" ARG BASE_ARCH="amd64" @@ -12,32 +11,32 @@ ARG GRAAL_ARCH=amd64 ARG JAVA_VERSION=java17 RUN apt-get update \ - && apt-get -y upgrade \ - && DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends \ - ca-certificates \ - curl \ - libc-dev \ - && mkdir -p /tmp/gvm \ - && cd /tmp/gvm \ - && export GRAAL_DOWNLOAD_URL="https://github.com/graalvm/graalvm-$GRAAL_EDITION-builds/releases/download/vm-$GRAAL_VERSION/graalvm-$GRAAL_EDITION-$JAVA_VERSION-linux-$GRAAL_ARCH-$GRAAL_VERSION.tar.gz" \ - && echo "GraalVM Download URL: $GRAAL_DOWNLOAD_URL" \ - && curl --progress-bar -SL "$GRAAL_DOWNLOAD_URL" > ./graalvm.tar.gz \ - && curl --progress-bar -sSL "$GRAAL_DOWNLOAD_URL.sha256" > ./graalvm.tar.gz.sha256 \ - && ls -la ./graalvm.tar.gz ./graalvm.tar.gz.sha256 \ - && echo "Downloaded checksum for GraalVM: $(cat ./graalvm.tar.gz.sha256)" \ - && echo "$(cat ./graalvm.tar.gz.sha256) graalvm.tar.gz" | sha256sum --check --status \ - && tar -xzvf ./graalvm.tar.gz \ - && mv "./graalvm-$GRAAL_EDITION-$JAVA_VERSION-$GRAAL_VERSION" /usr/lib/gvm \ - && rm ./graalvm.tar.gz ./graalvm.tar.gz.sha256 \ - && cd / \ - && rm -fr /tmp/gvm \ - && export JAVA_HOME=/usr/lib/gvm \ - GRAALVM_HOME=/usr/lib/gvm \ - PATH=/usr/lib/gvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ - && echo "Installing GraalVM modules..." \ - && $GRAALVM_HOME/bin/gu install espresso \ - && rm -rf /var/lib/apt/lists/*; + && apt-get -y upgrade \ + && DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends \ + ca-certificates \ + curl \ + libc-dev \ + && mkdir -p /tmp/gvm \ + && cd /tmp/gvm \ + && export GRAAL_DOWNLOAD_URL="https://github.com/graalvm/graalvm-$GRAAL_EDITION-builds/releases/download/vm-$GRAAL_VERSION/graalvm-$GRAAL_EDITION-$JAVA_VERSION-linux-$GRAAL_ARCH-$GRAAL_VERSION.tar.gz" \ + && echo "GraalVM Download URL: $GRAAL_DOWNLOAD_URL" \ + && curl --progress-bar -SL "$GRAAL_DOWNLOAD_URL" > ./graalvm.tar.gz \ + && curl --progress-bar -sSL "$GRAAL_DOWNLOAD_URL.sha256" > ./graalvm.tar.gz.sha256 \ + && ls -la ./graalvm.tar.gz ./graalvm.tar.gz.sha256 \ + && echo "Downloaded checksum for GraalVM: $(cat ./graalvm.tar.gz.sha256)" \ + && echo "$(cat ./graalvm.tar.gz.sha256) graalvm.tar.gz" | sha256sum --check --status \ + && tar -xzvf ./graalvm.tar.gz \ + && mv "./graalvm-$GRAAL_EDITION-$JAVA_VERSION-$GRAAL_VERSION" /usr/lib/gvm \ + && rm ./graalvm.tar.gz ./graalvm.tar.gz.sha256 \ + && cd / \ + && rm -fr /tmp/gvm \ + && export JAVA_HOME=/usr/lib/gvm \ + GRAALVM_HOME=/usr/lib/gvm \ + PATH=/usr/lib/gvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ + && echo "Installing GraalVM modules..." \ + && $GRAALVM_HOME/bin/gu install espresso \ + && rm -rf /var/lib/apt/lists/* ENV JAVA_HOME=/usr/lib/gvm \ - GRAALVM_HOME=/usr/lib/gvm \ - PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/gvm/bin:/sbin:/bin + GRAALVM_HOME=/usr/lib/gvm \ + PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/gvm/bin:/sbin:/bin diff --git a/images/runtime-jvm17/cloudbuild.yaml b/images/runtime-jvm17/cloudbuild.yaml index beb60da50a..c9e4805145 100644 --- a/images/runtime-jvm17/cloudbuild.yaml +++ b/images/runtime-jvm17/cloudbuild.yaml @@ -1,6 +1,6 @@ steps: - - name: 'gcr.io/cloud-builders/docker' - args: ['build', '-t', 'us-docker.pkg.dev/elide-fw/tools/runtime/jvm17', '.'] -images: ['us-docker.pkg.dev/elide-fw/tools/runtime/jvm17'] + - name: "gcr.io/cloud-builders/docker" + args: ["build", "-t", "us-docker.pkg.dev/elide-fw/tools/runtime/jvm17", "."] +images: ["us-docker.pkg.dev/elide-fw/tools/runtime/jvm17"] options: logging: CLOUD_LOGGING_ONLY diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock new file mode 100644 index 0000000000..dd64a75399 --- /dev/null +++ b/kotlin-js-store/yarn.lock @@ -0,0 +1,3712 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.20.0": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.1.tgz#f2e6ef7790d8c8dbf03d379502dcc246dcce0b30" + integrity sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ== + +"@babel/core@^7.0.0": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.2.tgz#8dc9b1620a673f92d3624bd926dc49a52cf25b92" + integrity sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.2" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-module-transforms" "^7.20.2" + "@babel/helpers" "^7.20.1" + "@babel/parser" "^7.20.2" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.1" + "@babel/types" "^7.20.2" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@^7.0.0", "@babel/generator@^7.20.1", "@babel/generator@^7.20.2": + version "7.20.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.4.tgz#4d9f8f0c30be75fd90a0562099a26e5839602ab8" + integrity sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA== + dependencies: + "@babel/types" "^7.20.2" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" + integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== + dependencies: + "@babel/compat-data" "^7.20.0" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + semver "^6.3.0" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== + dependencies: + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" + integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.1" + "@babel/types" "^7.20.2" + +"@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helpers@^7.20.1": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.1.tgz#2ab7a0fcb0a03b5bf76629196ed63c2d7311f4c9" + integrity sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg== + dependencies: + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.1" + "@babel/types" "^7.20.0" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/node@^7.0.0": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/node/-/node-7.20.2.tgz#9422926a5ccffa559b96fea1d0fbc9c5af8369bc" + integrity sha512-s4zKG8fccCpqXEXxSkzE8vAREefRneatdGfNQDPqikTTpQmWF4Bt1OTZ9r8GghKJSeNEgRJwbI5ZSmGBQLvAEQ== + dependencies: + "@babel/register" "^7.18.9" + commander "^4.0.1" + core-js "^3.25.1" + node-environment-flags "^1.0.5" + regenerator-runtime "^0.13.10" + v8flags "^3.1.1" + +"@babel/parser@^7.0.0", "@babel/parser@^7.18.10", "@babel/parser@^7.20.1", "@babel/parser@^7.20.2": + version "7.20.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.3.tgz#5358cf62e380cf69efcb87a7bb922ff88bfac6e2" + integrity sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg== + +"@babel/plugin-syntax-flow@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz#774d825256f2379d06139be0c723c4dd444f3ca1" + integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-flow-strip-types@^7.18.6": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz#e9e8606633287488216028719638cbbb2f2dde8f" + integrity sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-flow" "^7.18.6" + +"@babel/preset-flow@^7.0.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.18.6.tgz#83f7602ba566e72a9918beefafef8ef16d2810cb" + integrity sha512-E7BDhL64W6OUqpuyHnSroLnqyRTcG6ZdOBl1OKI/QK/HJfplqK/S3sq1Cckx7oTodJ5yOXyfw7rEADJ6UjoQDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-flow-strip-types" "^7.18.6" + +"@babel/register@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.18.9.tgz#1888b24bc28d5cc41c412feb015e9ff6b96e439c" + integrity sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw== + dependencies: + clone-deep "^4.0.1" + find-cache-dir "^2.0.0" + make-dir "^2.1.0" + pirates "^4.0.5" + source-map-support "^0.5.16" + +"@babel/template@^7.0.0", "@babel/template@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.20.1": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.1.tgz#9b15ccbf882f6d107eeeecf263fbcdd208777ec8" + integrity sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.1" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.20.1" + "@babel/types" "^7.20.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.2.tgz#67ac09266606190f496322dbaff360fdaa5e7842" + integrity sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@esbuild/android-arm@0.15.14": + version "0.15.14" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.14.tgz#5d0027f920eeeac313c01fd6ecb8af50c306a466" + integrity sha512-+Rb20XXxRGisNu2WmNKk+scpanb7nL5yhuI1KR9wQFiC43ddPj/V1fmNyzlFC9bKiG4mYzxW7egtoHVcynr+OA== + +"@esbuild/linux-loong64@0.15.14": + version "0.15.14" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.14.tgz#1221684955c44385f8af34f7240088b7dc08d19d" + integrity sha512-eQi9rosGNVQFJyJWV0HCA5WZae/qWIQME7s8/j8DMvnylfBv62Pbu+zJ2eUDqNf2O4u3WB+OEXyfkpBoe194sg== + +"@gar/promisify@^1.0.1": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@js-joda/core@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@js-joda/core/-/core-3.2.0.tgz#3e61e21b7b2b8a6be746df1335cf91d70db2a273" + integrity sha512-PMqgJ0sw5B7FKb2d5bWYIoxjri+QlW/Pys7+Rw82jSH0QN3rB05jZ/VrrsUdh1w4+i2kw9JOejXGq/KhDOX7Kg== + +"@npmcli/fs@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" + integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== + dependencies: + "@gar/promisify" "^1.0.1" + semver "^7.3.5" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@socket.io/component-emitter@~3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" + integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/cors@^2.8.12": + version "2.8.12" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" + integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== + +"@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.4.10" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.10.tgz#19731b9685c19ed1552da7052b6f668ed7eb64bb" + integrity sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + +"@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/google-protobuf@3.15.6": + version "3.15.6" + resolved "https://registry.yarnpkg.com/@types/google-protobuf/-/google-protobuf-3.15.6.tgz#674a69493ef2c849b95eafe69167ea59079eb504" + integrity sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw== + +"@types/json-schema@*", "@types/json-schema@^7.0.8": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/node@*", "@types/node@>=10.0.0", "@types/node@^18.11.8": + version "18.11.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" + integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" + integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== + +"@webpack-cli/info@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" + integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" + integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== + +"@xprofiler/node-pre-gyp@^1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@xprofiler/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz#c3c9c2314967a19b982938022d8086d7ca78642d" + integrity sha512-UISr4KJw8s6dBp28mbHHnRjDu2I76aDqo4a9hFyfXGtGK08obxXnQxwBcZJEMCDgbFJ5z1YyQ1IweonJttq5RQ== + dependencies: + detect-libc "^1.0.3" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.5" + node-gyp "^8.4.1" + nopt "^5.0.0" + npmlog "^5.0.1" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.11" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +accepts@~1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn@^8.4.1, acorn@^8.5.0: + version "8.8.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" + integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== + +agent-base@6, agent-base@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agentkeepalive@^4.1.3: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" + integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== + dependencies: + debug "^4.1.0" + depd "^1.1.2" + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array.prototype.reduce@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" + integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.7" + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +async@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +body-parser@^1.19.0: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserslist@^4.14.5, browserslist@^4.21.3: + version "4.21.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" + integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== + dependencies: + caniuse-lite "^1.0.30001400" + electron-to-chromium "^1.4.251" + node-releases "^2.0.6" + update-browserslist-db "^1.0.9" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@6.0.3, buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacache@^15.2.0: + version "15.3.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== + dependencies: + "@npmcli/fs" "^1.0.0" + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001400: + version "1.0.30001431" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz#e7c59bd1bc518fae03a4656be442ce6c4887a795" + integrity sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@3.5.3, chokidar@^3.5.1: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-support@^1.1.2, color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +colorette@^2.0.14: + version "2.0.19" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +connect@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +console-control-strings@^1.0.0, console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +cookie@~0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + integrity sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA== + +core-js@^3.25.1: + version "3.26.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.26.1.tgz#7a9816dabd9ee846c1c0fe0e8fcad68f3709134e" + integrity sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA== + +cors@~2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-loader@6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" + integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.7" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.5" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +csstype@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" + integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + +custom-event@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + integrity sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg== + +date-format@^4.0.14: + version "4.0.14" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.14.tgz#7a8e584434fb169a521c8b7aa481f355810d9400" + integrity sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg== + +dbly-linked-list@0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/dbly-linked-list/-/dbly-linked-list-0.3.4.tgz#e4f85b79f303808d01a19336c9475abd0aa4f82e" + integrity sha512-327vOlwspi9i1T3Kc9yZhRUR8qDdgMQ4HmXsFDDCQ/HTc3sNe7gnF5b0UrsnaOJ0rvmG7yBZpK0NoOux9rKYKw== + dependencies: + lodash.isequal "^4.5.0" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== + +di@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + integrity sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +dom-serialize@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + integrity sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ== + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +dukat@0.5.8-rc.4: + version "0.5.8-rc.4" + resolved "https://registry.yarnpkg.com/dukat/-/dukat-0.5.8-rc.4.tgz#90384dcb50b14c26f0e99dae92b2dea44f5fce21" + integrity sha512-ZnMt6DGBjlVgK2uQamXfd7uP/AxH7RqI0BL9GLrrJb2gKdDxvJChWy+M9AQEaL+7/6TmxzJxFOsRiInY9oGWTA== + dependencies: + google-protobuf "3.12.2" + typescript "3.9.5" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.251: + version "1.4.284" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" + integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encoding@^0.1.11, encoding@^0.1.12: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +engine.io-parser@~5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.4.tgz#0b13f704fa9271b3ec4f33112410d8f3f41d0fc0" + integrity sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg== + +engine.io@~6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.2.0.tgz#003bec48f6815926f2b1b17873e576acd54f41d0" + integrity sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg== + dependencies: + "@types/cookie" "^0.4.1" + "@types/cors" "^2.8.12" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~5.0.3" + ws "~8.2.3" + +enhanced-resolve@^5.9.3: + version "5.10.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" + integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +ent@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + integrity sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA== + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.20.4" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" + integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.3" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.2" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +esbuild-android-64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.14.tgz#114e55b0d58fb7b45d7fa3d93516bd13fc8869cc" + integrity sha512-HuilVIb4rk9abT4U6bcFdU35UHOzcWVGLSjEmC58OVr96q5UiRqzDtWjPlCMugjhgUGKEs8Zf4ueIvYbOStbIg== + +esbuild-android-arm64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.14.tgz#8541f38a9aacf88e574fb13f5ad4ca51a04c12bb" + integrity sha512-/QnxRVxsR2Vtf3XottAHj7hENAMW2wCs6S+OZcAbc/8nlhbAL/bCQRCVD78VtI5mdwqWkVi3wMqM94kScQCgqg== + +esbuild-darwin-64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.14.tgz#b40b334db81ff1e3677a6712b23761748a157c57" + integrity sha512-ToNuf1uifu8hhwWvoZJGCdLIX/1zpo8cOGnT0XAhDQXiKOKYaotVNx7pOVB1f+wHoWwTLInrOmh3EmA7Fd+8Vg== + +esbuild-darwin-arm64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.14.tgz#44b5c1477bb7bdb852dd905e906f68765e2828bc" + integrity sha512-KgGP+y77GszfYJgceO0Wi/PiRtYo5y2Xo9rhBUpxTPaBgWDJ14gqYN0+NMbu+qC2fykxXaipHxN4Scaj9tUS1A== + +esbuild-freebsd-64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.14.tgz#8c57315d238690f34b6ed0c94e5cfc04c858247a" + integrity sha512-xr0E2n5lyWw3uFSwwUXHc0EcaBDtsal/iIfLioflHdhAe10KSctV978Te7YsfnsMKzcoGeS366+tqbCXdqDHQA== + +esbuild-freebsd-arm64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.14.tgz#2e92acca09258daa849e635565f52469266f0b7b" + integrity sha512-8XH96sOQ4b1LhMlO10eEWOjEngmZ2oyw3pW4o8kvBcpF6pULr56eeYVP5radtgw54g3T8nKHDHYEI5AItvskZg== + +esbuild-linux-32@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.14.tgz#ca5ed3e9dff82df486ddde362d7e00775a597dfd" + integrity sha512-6ssnvwaTAi8AzKN8By2V0nS+WF5jTP7SfuK6sStGnDP7MCJo/4zHgM9oE1eQTS2jPmo3D673rckuCzRlig+HMA== + +esbuild-linux-64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.14.tgz#42952e1d08a299d5f573c567639fb37b033befbf" + integrity sha512-ONySx3U0wAJOJuxGUlXBWxVKFVpWv88JEv0NZ6NlHknmDd1yCbf4AEdClSgLrqKQDXYywmw4gYDvdLsS6z0hcw== + +esbuild-linux-arm64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.14.tgz#0c0d788099703327ec0ae70758cb2639ef6c5d88" + integrity sha512-kle2Ov6a1e5AjlHlMQl1e+c4myGTeggrRzArQFmWp6O6JoqqB9hT+B28EW4tjFWgV/NxUq46pWYpgaWXsXRPAg== + +esbuild-linux-arm@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.14.tgz#751a5ca5042cd60f669b07c3bcec3dd6c4f8151c" + integrity sha512-D2LImAIV3QzL7lHURyCHBkycVFbKwkDb1XEUWan+2fb4qfW7qAeUtul7ZIcIwFKZgPcl+6gKZmvLgPSj26RQ2Q== + +esbuild-linux-mips64le@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.14.tgz#da8ac35f2704de0b52bf53a99c12f604fbe9b916" + integrity sha512-FVdMYIzOLXUq+OE7XYKesuEAqZhmAIV6qOoYahvUp93oXy0MOVTP370ECbPfGXXUdlvc0TNgkJa3YhEwyZ6MRA== + +esbuild-linux-ppc64le@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.14.tgz#a315b5016917429080c3d32e03319f1ff876ac55" + integrity sha512-2NzH+iuzMDA+jjtPjuIz/OhRDf8tzbQ1tRZJI//aT25o1HKc0reMMXxKIYq/8nSHXiJSnYV4ODzTiv45s+h73w== + +esbuild-linux-riscv64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.14.tgz#9f2e0a935e5086d398fc19c7ff5d217bfefe3e12" + integrity sha512-VqxvutZNlQxmUNS7Ac+aczttLEoHBJ9e3OYGqnULrfipRvG97qLrAv9EUY9iSrRKBqeEbSvS9bSfstZqwz0T4Q== + +esbuild-linux-s390x@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.14.tgz#53108112faff5a4e1bad17f7b0b0ffa1df4b7efb" + integrity sha512-+KVHEUshX5n6VP6Vp/AKv9fZIl5kr2ph8EUFmQUJnDpHwcfTSn2AQgYYm0HTBR2Mr4d0Wlr0FxF/Cs5pbFgiOw== + +esbuild-netbsd-64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.14.tgz#5330efc41fe4f1c2bab5462bcfe7a4ffce7ba00a" + integrity sha512-6D/dr17piEgevIm1xJfZP2SjB9Z+g8ERhNnBdlZPBWZl+KSPUKLGF13AbvC+nzGh8IxOH2TyTIdRMvKMP0nEzQ== + +esbuild-openbsd-64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.14.tgz#ee64944d863e937611fc31adf349e9bb4f5f7eac" + integrity sha512-rREQBIlMibBetgr2E9Lywt2Qxv2ZdpmYahR4IUlAQ1Efv/A5gYdO0/VIN3iowDbCNTLxp0bb57Vf0LFcffD6kA== + +esbuild-sunos-64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.14.tgz#29b0b20de6fe6ef50f9fbe533ec20dc4b595f9aa" + integrity sha512-DNVjSp/BY4IfwtdUAvWGIDaIjJXY5KI4uD82+15v6k/w7px9dnaDaJJ2R6Mu+KCgr5oklmFc0KjBjh311Gxl9Q== + +esbuild-windows-32@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.14.tgz#05e9b159d664809f7a4a8a68ed048d193457b27d" + integrity sha512-pHBWrcA+/oLgvViuG9FO3kNPO635gkoVrRQwe6ZY1S0jdET07xe2toUvQoJQ8KT3/OkxqUasIty5hpuKFLD+eg== + +esbuild-windows-64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.14.tgz#d5ae086728ab30b72969e40ed0a7a0d9082f2cdd" + integrity sha512-CszIGQVk/P8FOS5UgAH4hKc9zOaFo69fe+k1rqgBHx3CSK3Opyk5lwYriIamaWOVjBt7IwEP6NALz+tkVWdFog== + +esbuild-windows-arm64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.14.tgz#8eb50ab9a0ecaf058593fbad17502749306f801d" + integrity sha512-KW9W4psdZceaS9A7Jsgl4WialOznSURvqX/oHZk3gOP7KbjtHLSsnmSvNdzagGJfxbAe30UVGXRe8q8nDsOSQw== + +esbuild@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.14.tgz#09202b811f1710363d5088a3401a351351c79875" + integrity sha512-pJN8j42fvWLFWwSMG4luuupl2Me7mxciUOsMegKvwCmhEbJ2covUdFnihxm0FMIBV+cbwbtMoHgMCCI+pj1btQ== + optionalDependencies: + "@esbuild/android-arm" "0.15.14" + "@esbuild/linux-loong64" "0.15.14" + esbuild-android-64 "0.15.14" + esbuild-android-arm64 "0.15.14" + esbuild-darwin-64 "0.15.14" + esbuild-darwin-arm64 "0.15.14" + esbuild-freebsd-64 "0.15.14" + esbuild-freebsd-arm64 "0.15.14" + esbuild-linux-32 "0.15.14" + esbuild-linux-64 "0.15.14" + esbuild-linux-arm "0.15.14" + esbuild-linux-arm64 "0.15.14" + esbuild-linux-mips64le "0.15.14" + esbuild-linux-ppc64le "0.15.14" + esbuild-linux-riscv64 "0.15.14" + esbuild-linux-s390x "0.15.14" + esbuild-netbsd-64 "0.15.14" + esbuild-openbsd-64 "0.15.14" + esbuild-sunos-64 "0.15.14" + esbuild-windows-32 "0.15.14" + esbuild-windows-64 "0.15.14" + esbuild-windows-arm64 "0.15.14" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0, events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fastest-levenshtein@^1.0.12: + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + +fbjs@^0.8.16: + version "0.8.18" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.18.tgz#9835e0addb9aca2eff53295cd79ca1cfc7c9662a" + integrity sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA== + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.30" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +follow-redirects@^1.0.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +format-util@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" + integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3, glob@^7.1.4, glob@^7.1.7: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +google-protobuf@3.12.2: + version "3.12.2" + resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.12.2.tgz#50ce9f9b6281235724eb243d6a83e969a2176e53" + integrity sha512-4CZhpuRr1d6HjlyrxoXoocoGFnRYgKULgMtikMddA9ztRyYR59Aondv2FioyxWVamRo0rF2XpYawkTCBEQOSkA== + +google-protobuf@3.21.2: + version "3.21.2" + resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.21.2.tgz#4580a2bea8bbb291ee579d1fefb14d6fa3070ea4" + integrity sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA== + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +grpc-web@1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/grpc-web/-/grpc-web-1.4.2.tgz#86995f76471ce6b2119106ec26f909b7b69e7d43" + integrity sha512-gUxWq42l5ldaRplcKb4Pw5O4XBONWZgz3vxIIXnfIeJj8Jc3wYiq2O4c9xzx/NGbbPEej4rhI62C9eTENwLGNw== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +http-cache-semantics@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2, iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +isbinaryfile@^4.0.8: + version "4.0.10" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" + integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA== + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jszip@2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-2.5.0.tgz#7444fd8551ddf3e5da7198fea0c91bc8308cc274" + integrity sha512-IRoyf8JSYY3nx+uyh5xPc0qdy8pUDTp2UkHOWYNF/IO/3D8nx7899UlSAjD8rf8wUgOmm0lACWx/GbW3EaxIXQ== + dependencies: + pako "~0.2.5" + +jszip@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-2.7.0.tgz#c420b1e1aa800490724a0dd277e8cca950bc2c41" + integrity sha512-JIsRKRVC3gTRo2vM4Wy9WBC3TRcfnIZU8k65Phi3izkvPH975FowRYtKGT6PxevA0XnJ/yO8b0QwV0ydVyQwfw== + dependencies: + pako "~1.0.2" + +karma-chrome-launcher@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz#baca9cc071b1562a1db241827257bfe5cab597ea" + integrity sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ== + dependencies: + which "^1.2.1" + +karma-mocha@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-2.0.1.tgz#4b0254a18dfee71bdbe6188d9a6861bf86b0cd7d" + integrity sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ== + dependencies: + minimist "^1.2.3" + +karma-sourcemap-loader@0.3.8: + version "0.3.8" + resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.8.tgz#d4bae72fb7a8397328a62b75013d2df937bdcf9c" + integrity sha512-zorxyAakYZuBcHRJE+vbrK2o2JXLFWK8VVjiT/6P+ltLBUGUvqTEkUiQ119MGdOrK7mrmxXHZF1/pfT6GgIZ6g== + dependencies: + graceful-fs "^4.1.2" + +karma-webpack@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-5.0.0.tgz#2a2c7b80163fe7ffd1010f83f5507f95ef39f840" + integrity sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + webpack-merge "^4.1.5" + +karma@6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.0.tgz#82652dfecdd853ec227b74ed718a997028a99508" + integrity sha512-s8m7z0IF5g/bS5ONT7wsOavhW4i4aFkzD4u4wgzAQWT4HGUeWI3i21cK2Yz6jndMAeHETp5XuNsRoyGJZXVd4w== + dependencies: + "@colors/colors" "1.5.0" + body-parser "^1.19.0" + braces "^3.0.2" + chokidar "^3.5.1" + connect "^3.7.0" + di "^0.0.1" + dom-serialize "^2.2.1" + glob "^7.1.7" + graceful-fs "^4.2.6" + http-proxy "^1.18.1" + isbinaryfile "^4.0.8" + lodash "^4.17.21" + log4js "^6.4.1" + mime "^2.5.2" + minimatch "^3.0.4" + mkdirp "^0.5.5" + qjobs "^1.2.0" + range-parser "^1.2.1" + rimraf "^3.0.2" + socket.io "^4.4.1" + source-map "^0.6.1" + tmp "^0.2.1" + ua-parser-js "^0.7.30" + yargs "^16.1.1" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + +lodash@^4.17.15, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log4js@^6.4.1: + version "6.7.0" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.7.0.tgz#fff671a74b2f6e956d135c3c756c79072809a23b" + integrity sha512-KA0W9ffgNBLDj6fZCq/lRbgR6ABAodRIDHrZnS48vOtfKa4PzWImb0Md1lmGCdO3n3sbCm/n1/WmrNlZ8kCI3Q== + dependencies: + date-format "^4.0.14" + debug "^4.3.4" + flatted "^3.2.7" + rfdc "^1.3.0" + streamroller "^3.1.3" + +loose-envify@^1.0.0, loose-envify@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-fetch-happen@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" + integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.2.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.2" + promise-retry "^2.0.1" + socks-proxy-agent "^6.0.0" + ssri "^8.0.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@^2.5.2: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.3, minimist@^1.2.6: + version "1.2.7" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" + integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== + dependencies: + minipass "^3.1.0" + minipass-sized "^1.0.3" + minizlib "^2.0.0" + optionalDependencies: + encoding "^0.1.12" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: + version "3.3.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae" + integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw== + dependencies: + yallist "^4.0.0" + +minizlib@^2.0.0, minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mocha@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.0.0.tgz#205447d8993ec755335c4b13deba3d3a13c4def9" + integrity sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + nanoid "3.3.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nan@^2.16.0: + version "2.17.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== + +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +negotiator@0.6.3, negotiator@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-environment-flags@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" + integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== + dependencies: + object.getownpropertydescriptors "^2.0.3" + semver "^5.7.0" + +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-fetch@^2.6.5: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-gyp@^8.4.1: + version "8.4.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937" + integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^9.1.0" + nopt "^5.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + +node-releases@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== + +node-zip@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/node-zip/-/node-zip-1.1.1.tgz#94d1ad674a3cd46a1588dd736f4a9a78c757eb62" + integrity sha512-sXfGL65EcaAJqNSXxuyf//i4D4geUtJgZDYUd7IBo2/CH8XY8vcWh1+CBCxuVVyR+S4vAFc3hr//JkCi2+V5vg== + dependencies: + jszip "2.5.0" + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npmlog@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^3.0.0" + set-blocking "^2.0.0" + +npmlog@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + +object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.12.2, object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.getownpropertydescriptors@^2.0.3: + version "2.1.5" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz#db5a9002489b64eef903df81d6623c07e5b4b4d3" + integrity sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw== + dependencies: + array.prototype.reduce "^1.0.5" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@~0.2.5: + version "0.2.9" + resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + integrity sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA== + +pako@~1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pirates@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: + version "6.0.10" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^8.4.7: + version "8.4.19" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc" + integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prepack@0.2.54: + version "0.2.54" + resolved "https://registry.yarnpkg.com/prepack/-/prepack-0.2.54.tgz#ce2d610dc39731a68f16527053597a11b74ae153" + integrity sha512-wu6j6J6h/TgpYNRS8tXEyprwul2WM2Zr+dSbc/o0O8cdhoOjvMy2T98WK2dhSNe+xyQ/SaqJpepWiCxS8EVjkA== + dependencies: + "@babel/core" "^7.0.0" + "@babel/generator" "^7.0.0" + "@babel/node" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/preset-flow" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + fbjs "^0.8.16" + node-zip "^1.1.1" + queue-fifo "^0.2.3" + seedrandom "^2.4.2" + source-map "^0.5.6" + vscode-debugadapter "^1.24.0" + vscode-debugprotocol "^1.24.0" + zip-dir "^1.0.2" + optionalDependencies: + v8-profiler-node8 "^6.0.1" + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qjobs@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" + integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +queue-fifo@^0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/queue-fifo/-/queue-fifo-0.2.6.tgz#6438814581e7a6d31074202beaa1bd7726b76501" + integrity sha512-rwlnZHAaTmWEGKC7ziasK8u4QnZW/uN6kSiG+tHNf/1GA+R32FArZi18s3SYUpKcA0Y6jJoUDn5GT3Anoc2mWw== + dependencies: + dbly-linked-list "0.3.4" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-dom@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +readable-stream@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.2.0.tgz#a7ef523d3b39e4962b0db1a1af22777b10eeca46" + integrity sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + +readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + +regenerator-runtime@^0.13.10: + version "0.13.10" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" + integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== + +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.9.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +seedrandom@^2.4.2: + version "2.4.4" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.4.tgz#b25ea98632c73e45f58b77cfaa931678df01f9ba" + integrity sha512-9A+PDmgm+2du77B5i0Ip2cxOqqHjgNxnBgglxLcX78A2D6c2rTo61z4jnVABpF4cKeDMDG+cmXXvdnqse2VqMA== + +semver@^5.6.0, semver@^5.7.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.5: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +serialize-javascript@6.0.0, serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socket.io-adapter@~2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz#b50a4a9ecdd00c34d4c8c808224daa1a786152a6" + integrity sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg== + +socket.io-parser@~4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.1.tgz#01c96efa11ded938dcb21cbe590c26af5eff65e5" + integrity sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + +socket.io@^4.4.1: + version "4.5.3" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.5.3.tgz#44dffea48d7f5aa41df4a66377c386b953bc521c" + integrity sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg== + dependencies: + accepts "~1.3.4" + base64id "~2.0.0" + debug "~4.3.2" + engine.io "~6.2.0" + socket.io-adapter "~2.4.0" + socket.io-parser "~4.2.0" + +socks-proxy-agent@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce" + integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.0" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-loader@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-4.0.0.tgz#bdc6b118bc6c87ee4d8d851f2d4efcc5abdb2ef5" + integrity sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw== + dependencies: + abab "^2.0.6" + iconv-lite "^0.6.3" + source-map-js "^1.0.2" + +source-map-support@0.5.21, source-map-support@^0.5.16, source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +ssri@^8.0.0, ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +streamroller@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.3.tgz#d95689a8c29b30d093525d0baffe6616fd62ca7e" + integrity sha512-CphIJyFx2SALGHeINanjFRKQ4l7x2c+rXYJ4BMq0gd+ZK0gi4VT8b+eHe2wi58x4UayBAKx4xtHpXT/ea1cz8w== + dependencies: + date-format "^4.0.14" + debug "^4.3.4" + fs-extra "^8.1.0" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.trimend@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +style-loader@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" + integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== + +supports-color@8.1.1, supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: + version "6.1.12" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.12.tgz#3b742fb05669b55671fb769ab67a7791ea1a62e6" + integrity sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +terser-webpack-plugin@^5.1.3: + version "5.3.6" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" + integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.14" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + terser "^5.14.1" + +terser@^5.14.1: + version "5.15.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.15.1.tgz#8561af6e0fd6d839669c73b92bdd5777d870ed6c" + integrity sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typescript@3.9.5: + version "3.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36" + integrity sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ== + +ua-parser-js@^0.7.30: + version "0.7.32" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.32.tgz#cd8c639cdca949e30fa68c44b7813ef13e36d211" + integrity sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +v8-profiler-next@^1.7.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/v8-profiler-next/-/v8-profiler-next-1.9.0.tgz#73da0b3b74d5ae19a3dbc758424d463600ec3319" + integrity sha512-+k2Lb0c9lEDsGNT1GfrrlV4evR2KsF3LljW8PUfRaM1OQmr+F3lXGxVIffa+LNXaw3CnwdsSdqI2zaYEhDdu5Q== + dependencies: + "@xprofiler/node-pre-gyp" "^1.0.9" + nan "^2.16.0" + +v8-profiler-node8@^6.0.1: + version "6.4.0" + resolved "https://registry.yarnpkg.com/v8-profiler-node8/-/v8-profiler-node8-6.4.0.tgz#6934c5c1ce66e2e0c00119bdf0d089e85aa3f11a" + integrity sha512-L+pmdKUPCiTaWjuDWziiB2PrSZmBgLHz3nIwG4i6D0UuBx7PCSJ6G5uh+wdbf30vLfELI1Kb2aZ+XG/ki9ZMDg== + dependencies: + v8-profiler-next "^1.7.1" + +v8flags@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656" + integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg== + dependencies: + homedir-polyfill "^1.0.1" + +vary@^1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== + +vscode-debugadapter@^1.24.0: + version "1.51.0" + resolved "https://registry.yarnpkg.com/vscode-debugadapter/-/vscode-debugadapter-1.51.0.tgz#ef600c3aa165523645887ec15df1443ba7d68aa6" + integrity sha512-mObaXD5/FH/z6aL2GDuyCLbnwLsYRCAJWgFid01vKW9Y5Si8OvINK+Tn+Yl/lRUbetjNuZW3j1euMEz6z8Yzqg== + dependencies: + mkdirp "^1.0.4" + vscode-debugprotocol "1.51.0" + +vscode-debugprotocol@1.51.0, vscode-debugprotocol@^1.24.0: + version "1.51.0" + resolved "https://registry.yarnpkg.com/vscode-debugprotocol/-/vscode-debugprotocol-1.51.0.tgz#c03168dac778b6c24ce17b3511cb61e89c11b2df" + integrity sha512-dzKWTMMyebIMPF1VYMuuQj7gGFq7guR8AFya0mKacu+ayptJfaRuM0mdHCqiOth4FnRP8mPhEroFPx6Ift8wHA== + +watchpack@^2.3.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webpack-cli@4.10.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" + integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.2.0" + "@webpack-cli/info" "^1.5.0" + "@webpack-cli/serve" "^1.7.0" + colorette "^2.0.14" + commander "^7.0.0" + cross-spawn "^7.0.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" + +webpack-merge@^4.1.5: + version "4.2.2" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" + integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== + dependencies: + lodash "^4.17.15" + +webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@5.73.0: + version "5.73.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38" + integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.9.3" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.3.1" + webpack-sources "^3.2.3" + +whatwg-fetch@>=0.10.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.2, wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@~8.2.3: + version "8.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" + integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0, yargs@^16.1.1: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zip-dir@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/zip-dir/-/zip-dir-1.0.2.tgz#253f907aead62a21acd8721d8b88032b2411c051" + integrity sha512-OZ4WThDcFqvamrq4e2lSdz+q6a9fnD55ktBzsfQ95R0YrnZDd7Cz1gTI8OMveqlASz8PXVN0av8Bi7Ky+uJ+SA== + dependencies: + async "^1.5.2" + jszip "^2.4.0" diff --git a/local.properties b/local.properties index bf6d6bac81..6feb0aaf65 100644 --- a/local.properties +++ b/local.properties @@ -1 +1 @@ -elide.graalvm.variant=COMMUNITY \ No newline at end of file +elide.graalvm.variant = COMMUNITY diff --git a/package.json b/package.json index d303e4a904..b4d3d96491 100644 --- a/package.json +++ b/package.json @@ -3,34 +3,43 @@ "version": "3.0.0", "private": true, "packageManager": "yarn@3.2.1", + "lint-staged": { + "**/*": "prettier --write --ignore-unknown" + }, "dependencies": { "react": "18.2.0", "react-dom": "18.2.0" }, "devDependencies": { - "@lit/localize": "0.11.4", - "@lit/localize-tools": "0.6.5", - "@lit-labs/analyzer": "0.3.0", + "@lit-labs/analyzer": "0.4.0", "@lit-labs/context": "0.1.3", + "@lit-labs/motion": "1.0.3", "@lit-labs/react": "1.0.9", "@lit-labs/ssr": "2.2.3", "@lit-labs/ssr-client": "1.0.1", - "@lit-labs/motion": "1.0.3", "@lit-labs/task": "2.0.0", "@lit-labs/virtualizer": "0.7.2", + "@lit/localize": "0.11.4", + "@lit/localize-tools": "0.6.5", "@types/google-protobuf": "3.15.6", "@types/prettier": "2.7.1", - "@types/react": "18.0.21", - "@types/react-dom": "^18", + "@types/react": "18.0.25", + "@types/react-dom": "18.0.9", "buffer": "6.0.3", - "esbuild": "0.15.11", - "grpc-web": "1.4.1", + "esbuild": "0.15.14", "gradle-upgrade-interactive": "^0.7.4", + "grpc-web": "1.4.2", + "husky": "^8.0.2", + "lint-staged": "^13.0.3", "lit": "2.4.0", "lit-element": "3.2.2", "lit-html": "2.4.0", "prepack": "0.2.54", - "prettier": "^2.7.1", + "prettier": "2.7.1", + "prettier-plugin-java": "^1.6.2", + "prettier-plugin-properties": "^0.2.0", + "prettier-plugin-sh": "^0.12.8", + "prettier-plugin-toml": "^0.3.1", "readable-stream": "4.2.0", "webpack": "5" }, @@ -38,6 +47,9 @@ "build": "make build", "test": "make test", "upgrade-node": "yarn upgrade-interactive", - "upgrade-gradle": "gradle-upgrade-interactive" + "upgrade-gradle": "gradle-upgrade-interactive", + "prepare": "husky install", + "lint": "prettier --write . --plugin=prettier-plugin-sh --plugin=prettier-plugin-toml --plugin=prettier-plugin-properties --plugin=prettier-plugin-java", + "lint:check": "prettier --check . --plugin=prettier-plugin-sh --plugin=prettier-plugin-toml --plugin=prettier-plugin-properties --plugin=prettier-plugin-java" } } diff --git a/packages/README.md b/packages/README.md index 4795d24a49..2be8315b8e 100644 --- a/packages/README.md +++ b/packages/README.md @@ -1,12 +1,12 @@ - ## Elide Packages + ### `dev.elide.v3` ([API docs](https://v3.docs.elide.dev/kotlin/html/)) This directory contains the main framework source code for each distinct package. Packages are organized in a flat directory structure. | **Package** | Artifact | Platforms | Summary | -|-----------------------------------|------------------------------|----------------------|----------------------------------------------------| +| --------------------------------- | ---------------------------- | -------------------- | -------------------------------------------------- | | [`base`][1] ([docs][11]) | `dev.elide.v3:base` | Multiplatform | Base library (annotations, x-plat code) | | [`frontend`][2] ([docs][12]) | `dev.elide.v3:frontend` | JavaScript (Browser) | Baseline frontend code, lib bindings (proto, gRPC) | | [`graalvm`][3] ([docs][13]) | `dev.elide.v3:graalvm` | JVM/Native | JVM integration code for GraalVM support | @@ -30,7 +30,6 @@ Core modules shoot for full, 100% coverage. [![codecov box](https://codecov.io/gh/elide-dev/v3/branch/v3/graphs/tree.svg?token=FXxhJlpKG3)](https://codecov.io/gh/elide-dev/v3) [![codecov sunburst](https://codecov.io/gh/elide-dev/v3/branch/v3/graphs/sunburst.svg?token=FXxhJlpKG3)](https://codecov.io/gh/elide-dev/v3) - ### Static analysis The Sonar Quality Gate will fail if duplication, vulnerabilities, or technical debt exceed reasonable limits on a given @@ -90,7 +89,6 @@ PR or branch. - ## Dependency management Library dependencies are declared in the [`elide` version catalog](../gradle/elide.versions.toml), and should be @@ -101,12 +99,10 @@ and by [Renovate](https://github.com/renovatebot/renovate) (see License checks are handled by [Licensebat](https://licensebat.com/). Additional OWASP security checks are performed by Snyk and OWASP's own tools. - ### Interactive upgrades Run `update-jsdeps` or `update-jdeps` to run an interactive upgrade for NPM or Maven deps, respectively. - ### Dependency locking Elide extensively locks and verifies dependencies. Gradle is configured to [verify dependency hashes and signatures][21], so please make sure to update these @@ -114,7 +110,6 @@ files if dependencies change, and to verify your update is legitimate to the bes After dependency changes, locks can be updated with `make relock-deps`. - [1]: ./base [2]: ./frontend [3]: ./graalvm @@ -136,4 +131,3 @@ After dependency changes, locks can be updated with `make relock-deps`. [19]: https://v3.docs.elide.dev/kotlin/html/packages/server/index.html [20]: https://v3.docs.elide.dev/kotlin/html/packages/test/index.html [21]: https://docs.gradle.org/7.4.2/userguide/dependency_verification.html#sub:enabling-verification - diff --git a/packages/base/build.gradle.kts b/packages/base/build.gradle.kts index f0dc770b30..6cefbcac76 100644 --- a/packages/base/build.gradle.kts +++ b/packages/base/build.gradle.kts @@ -5,142 +5,18 @@ "DSL_SCOPE_VIOLATION", ) -import java.net.URI +import Java9Modularity.configureJava9ModuleInfo plugins { - `maven-publish` - signing - kotlin("multiplatform") - kotlin("plugin.serialization") - alias(libs.plugins.kotlinx.plugin.atomicfu) - alias(libs.plugins.testLogger) - alias(libs.plugins.dokka) + id("dev.elide.build.multiplatform") } group = "dev.elide" version = rootProject.version as String -val javadocJar by tasks.registering(Jar::class) { - archiveClassifier.set("javadoc") -} - -tasks { - artifacts { - add("archives", javadocJar) - add("archives", sourcesJar) - } -} - -signing { - if (project.hasProperty("enableSigning") && project.properties["enableSigning"] == "true") { - sign(configurations.archives.get()) - sign(publishing.publications) - } -} - -publishing { - repositories { - maven { - name = "elide" - url = URI.create(project.properties["elide.publish.repo.maven"] as String) - - if (project.hasProperty("elide.publish.repo.maven.auth")) { - credentials { - username = (project.properties["elide.publish.repo.maven.username"] as? String - ?: System.getenv("PUBLISH_USER"))?.ifBlank { null } - password = (project.properties["elide.publish.repo.maven.password"] as? String - ?: System.getenv("PUBLISH_TOKEN"))?.ifBlank { null } - } - } - } - } - - publications.withType { - artifact(javadocJar.get()) - - pom { - name.set("Elide") - description.set("Polyglot application framework") - url.set("https://github.com/elide-dev/v3") - - licenses { - license { - name.set("Properity License") - url.set("https://github.com/elide-dev/v3/blob/v3/LICENSE") - } - } - developers { - developer { - id.set("sgammon") - name.set("Sam Gammon") - email.set("samuel.gammon@gmail.com") - } - } - scm { - url.set("https://github.com/elide-dev/v3") - } - } - } -} - kotlin { explicitApi() - jvm { - withJava() - testRuns["test"].executionTask.configure { - useJUnitPlatform() - } - } - js(BOTH) { - compilations.all { - kotlinOptions { - sourceMap = true - moduleKind = "umd" - metaInfo = true - } - } - browser { - commonWebpackConfig { - cssSupport.enabled = true - } - } - } - - if (project.hasProperty("publishMainHostLock") && project.properties["publishMainHostLock"] == "true") { - val publicationsFromMainHost = - listOf(jvm(), js()).map { it.name } + "kotlinMultiplatform" - - publishing { - publications { - matching { it.name in publicationsFromMainHost }.all { - val targetPublication = this@all - tasks.withType() - .matching { it.publication == targetPublication } - .configureEach { onlyIf { findProperty("isMainHost") == "true" } } - } - } - } - } - - val hostOs = System.getProperty("os.name") - val isMingwX64 = hostOs.startsWith("Windows") - val nativeTarget = when { - hostOs == "Mac OS X" -> macosX64("native") - hostOs == "Linux" -> linuxX64("native") - isMingwX64 -> mingwX64("native") - else -> throw GradleException("Host OS is not supported in Kotlin/Native.") - } - - sourceSets.all { - languageSettings.apply { - languageVersion = libs.versions.kotlin.language.get() - apiVersion = libs.versions.kotlin.language.get() - optIn("kotlin.ExperimentalUnsignedTypes") - progressiveMode = true - } - } - sourceSets { val commonMain by getting { dependencies { @@ -200,23 +76,6 @@ kotlin { } } -tasks.withType().configureEach { - kotlinOptions { - apiVersion = libs.versions.kotlin.language.get() - languageVersion = libs.versions.kotlin.language.get() - } -} -tasks.withType().configureEach { - kotlinOptions { - apiVersion = libs.versions.kotlin.language.get() - languageVersion = libs.versions.kotlin.language.get() - jvmTarget = (project.properties["versions.java.language"] as String) - javaParameters = true - } -} -tasks.withType().configureEach { - kotlinOptions { - apiVersion = libs.versions.kotlin.language.get() - languageVersion = libs.versions.kotlin.language.get() - } -} +configureJava9ModuleInfo( + multiRelease = true, +) diff --git a/packages/base/module.md b/packages/base/module.md new file mode 100644 index 0000000000..428f935547 --- /dev/null +++ b/packages/base/module.md @@ -0,0 +1,3 @@ +# Module base + +Module docs here diff --git a/packages/base/src/jsMain/kotlin/elide/runtime/Logging.kt b/packages/base/src/jsMain/kotlin/elide/runtime/Logging.kt index ae542ae98f..133274f560 100644 --- a/packages/base/src/jsMain/kotlin/elide/runtime/Logging.kt +++ b/packages/base/src/jsMain/kotlin/elide/runtime/Logging.kt @@ -33,6 +33,7 @@ import kotlin.reflect.KClass } // @TODO(sgammon): logging control JS-side + @Suppress("UNUSED_PARAMETER") internal fun isEnabled(level: LogLevel) = true // Static log sender. diff --git a/packages/base/src/jvmMain/java/elide/package-info.java b/packages/base/src/jvmMain/java/elide/package-info.java new file mode 100644 index 0000000000..9503fb2617 --- /dev/null +++ b/packages/base/src/jvmMain/java/elide/package-info.java @@ -0,0 +1,4 @@ +/** + * Package root for the Elide Framework. + */ +package elide; diff --git a/packages/base/src/jvmMain/java/module-info.java b/packages/base/src/jvmMain/java/module-info.java new file mode 100644 index 0000000000..7493633fbb --- /dev/null +++ b/packages/base/src/jvmMain/java/module-info.java @@ -0,0 +1,9 @@ +module elide.base { + requires kotlin.stdlib; + requires org.slf4j; + + exports elide.annotations ; + exports elide.runtime ; + exports elide.runtime.jvm ; + exports elide.util ; +} diff --git a/packages/base/src/jvmMain/kotlin/elide/annotations/package-info.java b/packages/base/src/jvmMain/kotlin/elide/annotations/package-info.java index 3ad4d61ee7..d11d6a808a 100644 --- a/packages/base/src/jvmMain/kotlin/elide/annotations/package-info.java +++ b/packages/base/src/jvmMain/kotlin/elide/annotations/package-info.java @@ -1,4 +1,4 @@ /** * Provides annotations for Elide JVM targets. */ -package elide.annotations; \ No newline at end of file +package elide.annotations; diff --git a/packages/base/src/jvmMain/kotlin/elide/runtime/jvm/package-info.java b/packages/base/src/jvmMain/kotlin/elide/runtime/jvm/package-info.java index 3d411ff1aa..867cab1794 100644 --- a/packages/base/src/jvmMain/kotlin/elide/runtime/jvm/package-info.java +++ b/packages/base/src/jvmMain/kotlin/elide/runtime/jvm/package-info.java @@ -1,4 +1,4 @@ /** * Runtime definitions which apply only on the JVM. */ -package elide.runtime.jvm; \ No newline at end of file +package elide.runtime.jvm; diff --git a/packages/base/src/jvmMain/kotlin/elide/runtime/package-info.java b/packages/base/src/jvmMain/kotlin/elide/runtime/package-info.java index 8b27433e71..aa383a412e 100644 --- a/packages/base/src/jvmMain/kotlin/elide/runtime/package-info.java +++ b/packages/base/src/jvmMain/kotlin/elide/runtime/package-info.java @@ -1,4 +1,4 @@ /** * General runtime definitions which apply on all platforms. */ -package elide.runtime; \ No newline at end of file +package elide.runtime; diff --git a/packages/bom/build.gradle.kts b/packages/bom/build.gradle.kts new file mode 100644 index 0000000000..44f337ec44 --- /dev/null +++ b/packages/bom/build.gradle.kts @@ -0,0 +1,90 @@ + +plugins { + `version-catalog` + `maven-publish` + distribution + signing + idea + + id("org.jetbrains.kotlinx.kover") + id("dev.elide.build.core") +} + +group = "dev.elide" +version = rootProject.version as String + +// Elide modules. +val libraries = listOf( + "base", + "base-js", + "base-jvm", + "server", + "ssg", + "frontend", + "proto", + "test", + "rpc-js", + "rpc-jvm", + "graalvm", + "graalvm-js", + "graalvm-react", +) + +// Peer modules. +val peers = mapOf( + "guava" to ("com.google.guava:guava" to Versions.guava), + "protobuf" to ("com.google.protobuf:protobuf-java" to Versions.protobuf), + "grpc" to ("io.grpc:grpc-bom" to Versions.grpc), + "netty" to ("io.netty:netty-bom" to Versions.netty), + "micronaut" to ("io.micronaut:micronaut-bom" to Versions.micronaut), +) + +kover { + isDisabled.set(true) +} + +catalog { + versionCatalog { + // map Elide versions + version("elide", Elide.version) + version("elidePlugin", Elide.pluginVersion) + + // map each peer version + peers.forEach { alias, (_, version) -> + version(alias, version) + } + + // define Elide build plugin + plugin("buildtools", "dev.elide.buildtools.plugin").versionRef("elidePlugin") + + // define the BOM (this module) + library("elide-bom", Elide.group, "bom").versionRef("elide") + + // define Elide library aliases + libraries.forEach { libName -> + library("elide-$libName", Elide.group, libName).versionRef("elide") + } + + // define peer library aliases + peers.forEach { alias, (group, _) -> + library(alias, group.split(":").first(), group.split(":").last()).versionRef( + alias + ) + } + } +} + +publishing { + publications { + create("maven") { + groupId = "dev.elide" + artifactId = "bom" + version = project.version as String + from(components["versionCatalog"]) + } + } +} + +sonarqube { + isSkipProject = true +} diff --git a/tools/plugin/gradle-plugin/plugin-build/plugin/src/model/kotlin/com/google/common/html/types/HtmlKt.kt b/packages/bom/src/main/kotlin/.gitkeep similarity index 100% rename from tools/plugin/gradle-plugin/plugin-build/plugin/src/model/kotlin/com/google/common/html/types/HtmlKt.kt rename to packages/bom/src/main/kotlin/.gitkeep diff --git a/packages/bom/src/main/resources/.gitkeep b/packages/bom/src/main/resources/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/bom/src/test/kotlin/.gitkeep b/packages/bom/src/test/kotlin/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/bom/src/test/resources/.gitkeep b/packages/bom/src/test/resources/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/frontend/build.gradle.kts b/packages/frontend/build.gradle.kts index 19d6085921..4a8b32a586 100644 --- a/packages/frontend/build.gradle.kts +++ b/packages/frontend/build.gradle.kts @@ -1,94 +1,16 @@ @file:Suppress( - "UNUSED_VARIABLE", "DSL_SCOPE_VIOLATION", ) -import java.net.URI - plugins { - idea - `maven-publish` - signing - kotlin("js") - kotlin("plugin.serialization") - alias(libs.plugins.dokka) + id("dev.elide.build.js") } group = "dev.elide" version = rootProject.version as String kotlin { - js { - browser() - nodejs() - } - - publishing { - publications { - create("main") { - groupId = "dev.elide" - artifactId = "frontend" - version = rootProject.version as String - - from(components["kotlin"]) - } - } - } -} - -val javadocJar by tasks.registering(Jar::class) { - archiveClassifier.set("javadoc") -} - -signing { - if (project.hasProperty("enableSigning") && project.properties["enableSigning"] == "true") { - sign(configurations.archives.get()) - sign(publishing.publications) - } -} - -publishing { - repositories { - maven { - name = "elide" - url = URI.create(project.properties["elide.publish.repo.maven"] as String) - - if (project.hasProperty("elide.publish.repo.maven.auth")) { - credentials { - username = (project.properties["elide.publish.repo.maven.username"] as? String - ?: System.getenv("PUBLISH_USER"))?.ifBlank { null } - password = (project.properties["elide.publish.repo.maven.password"] as? String - ?: System.getenv("PUBLISH_TOKEN"))?.ifBlank { null } - } - } - } - } - - publications.withType { - artifact(javadocJar.get()) - pom { - name.set("Elide") - description.set("Polyglot application framework") - url.set("https://github.com/elide-dev/v3") - - licenses { - license { - name.set("Properity License") - url.set("https://github.com/elide-dev/v3/blob/v3/LICENSE") - } - } - developers { - developer { - id.set("sgammon") - name.set("Sam Gammon") - email.set("samuel.gammon@gmail.com") - } - } - scm { - url.set("https://github.com/elide-dev/v3") - } - } - } + explicitApi() } dependencies { diff --git a/packages/frontend/src/main/kotlin/lib/protobuf/index.BinaryConstants.module_google-protobuf.kt b/packages/frontend/src/main/kotlin/lib/protobuf/index.BinaryConstants.module_google-protobuf.kt index d3b0235255..2b0d64f9ad 100644 --- a/packages/frontend/src/main/kotlin/lib/protobuf/index.BinaryConstants.module_google-protobuf.kt +++ b/packages/frontend/src/main/kotlin/lib/protobuf/index.BinaryConstants.module_google-protobuf.kt @@ -10,68 +10,68 @@ package lib.protobuf import kotlin.js.* -external enum class FieldType { - INVALID /* = -1 */, - DOUBLE /* = 1 */, - FLOAT /* = 2 */, - INT64 /* = 3 */, - UINT64 /* = 4 */, - INT32 /* = 5 */, - FIXED64 /* = 6 */, - FIXED32 /* = 7 */, - BOOL /* = 8 */, - STRING /* = 9 */, - GROUP /* = 10 */, - MESSAGE /* = 11 */, - BYTES /* = 12 */, - UINT32 /* = 13 */, - ENUM /* = 14 */, - SFIXED32 /* = 15 */, - SFIXED64 /* = 16 */, - SINT32 /* = 17 */, - SINT64 /* = 18 */, - FHASH64 /* = 30 */, - VHASH64 /* = 31 */ +public external enum class FieldType { + INVALID /* = -1 */, + DOUBLE /* = 1 */, + FLOAT /* = 2 */, + INT64 /* = 3 */, + UINT64 /* = 4 */, + INT32 /* = 5 */, + FIXED64 /* = 6 */, + FIXED32 /* = 7 */, + BOOL /* = 8 */, + STRING /* = 9 */, + GROUP /* = 10 */, + MESSAGE /* = 11 */, + BYTES /* = 12 */, + UINT32 /* = 13 */, + ENUM /* = 14 */, + SFIXED32 /* = 15 */, + SFIXED64 /* = 16 */, + SINT32 /* = 17 */, + SINT64 /* = 18 */, + FHASH64 /* = 30 */, + VHASH64 /* = 31 */ } -external enum class WireType { - INVALID /* = -1 */, - VARINT /* = 0 */, - FIXED64 /* = 1 */, - DELIMITED /* = 2 */, - START_GROUP /* = 3 */, - END_GROUP /* = 4 */, - FIXED32 /* = 5 */ +public external enum class WireType { + INVALID /* = -1 */, + VARINT /* = 0 */, + FIXED64 /* = 1 */, + DELIMITED /* = 2 */, + START_GROUP /* = 3 */, + END_GROUP /* = 4 */, + FIXED32 /* = 5 */ } -external var FieldTypeToWireType: (fieldType: FieldType) -> WireType +public external var FieldTypeToWireType: (fieldType: FieldType) -> WireType -external var INVALID_FIELD_NUMBER: Number +public external var INVALID_FIELD_NUMBER: Number -external var FLOAT32_EPS: Number +public external var FLOAT32_EPS: Number -external var FLOAT32_MIN: Number +public external var FLOAT32_MIN: Number -external var FLOAT32_MAX: Number +public external var FLOAT32_MAX: Number -external var FLOAT64_EPS: Number +public external var FLOAT64_EPS: Number -external var FLOAT64_MIN: Number +public external var FLOAT64_MIN: Number -external var FLOAT64_MAX: Number +public external var FLOAT64_MAX: Number -external var TWO_TO_20: Number +public external var TWO_TO_20: Number -external var TWO_TO_23: Number +public external var TWO_TO_23: Number -external var TWO_TO_31: Number +public external var TWO_TO_31: Number -external var TWO_TO_32: Number +public external var TWO_TO_32: Number -external var TWO_TO_52: Number +public external var TWO_TO_52: Number -external var TWO_TO_63: Number +public external var TWO_TO_63: Number -external var TWO_TO_64: Number +public external var TWO_TO_64: Number -external var ZERO_HASH: String +public external var ZERO_HASH: String diff --git a/packages/frontend/src/main/kotlin/lib/protobuf/index.arith.module_google-protobuf.kt b/packages/frontend/src/main/kotlin/lib/protobuf/index.arith.module_google-protobuf.kt index 1dab41248f..0bfcff90ec 100644 --- a/packages/frontend/src/main/kotlin/lib/protobuf/index.arith.module_google-protobuf.kt +++ b/packages/frontend/src/main/kotlin/lib/protobuf/index.arith.module_google-protobuf.kt @@ -10,37 +10,37 @@ package lib.protobuf import kotlin.js.* -open external class UInt64(lo: Number, hi: Number) { - open var lo: Number - open var hi: Number - open fun cmp(other: UInt64): Number - open fun rightShift(): UInt64 - open fun leftShift(): UInt64 - open fun msb(): Boolean - open fun lsb(): Boolean - open fun zero(): Boolean - open fun add(other: UInt64): UInt64 - open fun sub(other: UInt64): UInt64 - open fun mul(a: Number): UInt64 - open fun div(divisor: Number): dynamic /* JsTuple */ - override fun toString(): String - open fun clone(): UInt64 +public open external class UInt64(lo: Number, hi: Number) { + public open var lo: Number + public open var hi: Number + public open fun cmp(other: UInt64): Number + public open fun rightShift(): UInt64 + public open fun leftShift(): UInt64 + public open fun msb(): Boolean + public open fun lsb(): Boolean + public open fun zero(): Boolean + public open fun add(other: UInt64): UInt64 + public open fun sub(other: UInt64): UInt64 + public open fun mul(a: Number): UInt64 + public open fun div(divisor: Number): dynamic /* JsTuple */ + public override fun toString(): String + public open fun clone(): UInt64 - companion object { - fun mul32x32(a: Number, b: Number): UInt64 - fun fromString(str: String): UInt64 + public companion object { + public fun mul32x32(a: Number, b: Number): UInt64 + public fun fromString(str: String): UInt64 } } -open external class Int64(lo: Number, hi: Number) { - open var lo: Number - open var hi: Number - open fun add(other: Int64): Int64 - open fun sub(other: Int64): Int64 - open fun clone(): Int64 - override fun toString(): String +public open external class Int64(lo: Number, hi: Number) { + public open var lo: Number + public open var hi: Number + public open fun add(other: Int64): Int64 + public open fun sub(other: Int64): Int64 + public open fun clone(): Int64 + public override fun toString(): String - companion object { - fun fromString(str: String): Int64 - } + public companion object { + public fun fromString(str: String): Int64 + } } diff --git a/packages/frontend/src/main/kotlin/lib/protobuf/index.module_google-protobuf.kt b/packages/frontend/src/main/kotlin/lib/protobuf/index.module_google-protobuf.kt index fc2d4adac7..63e5c52929 100644 --- a/packages/frontend/src/main/kotlin/lib/protobuf/index.module_google-protobuf.kt +++ b/packages/frontend/src/main/kotlin/lib/protobuf/index.module_google-protobuf.kt @@ -14,496 +14,496 @@ package lib.protobuf import kotlin.js.* import org.khronos.webgl.* -typealias MessageArray = Array +public typealias MessageArray = Array -typealias StaticToObject = (includeInstance: Boolean, msg: Message) -> Any +public typealias StaticToObject = (includeInstance: Boolean, msg: Message) -> Any -typealias FieldValueArray = Array +public typealias FieldValueArray = Array -external interface `T$0` { +public external interface `T$0` { @nativeGetter - operator fun get(key: Number): ExtensionFieldInfo? + public operator fun get(key: Number): ExtensionFieldInfo? @nativeSetter - operator fun set(key: Number, value: ExtensionFieldInfo) + public operator fun set(key: Number, value: ExtensionFieldInfo) } -external interface `T$1` { +public external interface `T$1` { @nativeGetter - operator fun get(key: Number): ExtensionFieldBinaryInfo? + public operator fun get(key: Number): ExtensionFieldBinaryInfo? @nativeSetter - operator fun set(key: Number, value: ExtensionFieldBinaryInfo) + public operator fun set(key: Number, value: ExtensionFieldBinaryInfo) } -open external class Message { - open fun getJsPbMessageId(): String? - open fun serializeBinaryExtensions(proto: Message, writer: BinaryWriter, extensions: `T$1`, getExtensionFn: (fieldInfo: ExtensionFieldInfo) -> T) - open fun readBinaryExtension(proto: Message, reader: BinaryReader, extensions: `T$1`, setExtensionFn: (fieldInfo: ExtensionFieldInfo, param_val: T) -> Unit) - open fun toArray(): MessageArray - override fun toString(): String - open fun getExtension(fieldInfo: ExtensionFieldInfo): T - open fun setExtension(fieldInfo: ExtensionFieldInfo, value: T) - open fun cloneMessage(): Message /* this */ - open fun clone(): Message /* this */ - open fun serializeBinary(): Uint8Array - open fun toObject(includeInstance: Boolean = definedExternally): Any +public open external class Message { + public open fun getJsPbMessageId(): String? + public open fun serializeBinaryExtensions(proto: Message, writer: BinaryWriter, extensions: `T$1`, getExtensionFn: (fieldInfo: ExtensionFieldInfo) -> T) + public open fun readBinaryExtension(proto: Message, reader: BinaryReader, extensions: `T$1`, setExtensionFn: (fieldInfo: ExtensionFieldInfo, param_val: T) -> Unit) + public open fun toArray(): MessageArray + public override fun toString(): String + public open fun getExtension(fieldInfo: ExtensionFieldInfo): T + public open fun setExtension(fieldInfo: ExtensionFieldInfo, value: T) + public open fun cloneMessage(): Message /* this */ + public open fun clone(): Message /* this */ + public open fun serializeBinary(): Uint8Array + public open fun toObject(includeInstance: Boolean = definedExternally): Any - companion object { - fun initialize(msg: Message, data: MessageArray, messageId: String, suggestedPivot: Number, repeatedFields: Array? = definedExternally, oneofFields: Array>? = definedExternally) - fun initialize(msg: Message, data: MessageArray, messageId: Number, suggestedPivot: Number, repeatedFields: Array? = definedExternally, oneofFields: Array>? = definedExternally) - fun toObjectList(field: Array, toObjectFn: (includeInstance: Boolean, data: T) -> Any, includeInstance: Boolean = definedExternally): Array - fun toObjectExtension(msg: Message, obj: Any, extensions: `T$0`, getExtensionFn: (fieldInfo: ExtensionFieldInfo) -> Message, includeInstance: Boolean = definedExternally) - fun getField(msg: Message, fieldNumber: Number): dynamic /* String? | Number? | Boolean? | Uint8Array? | lib.protobuf.FieldValueArray? */ - fun getOptionalFloatingPointField(msg: Message, fieldNumber: Number): Number? - fun getRepeatedFloatingPointField(msg: Message, fieldNumber: Number): Array - fun bytesAsB64(bytes: Uint8Array): String - fun bytesAsU8(str: String): Uint8Array - fun bytesListAsB64(bytesList: Array): Array - fun bytesListAsU8(strList: Array): Array - fun getFieldWithDefault(msg: Message, fieldNumber: Number, defaultValue: T): T - fun getMapField(msg: Message, fieldNumber: Number, noLazyCreate: Boolean, valueCtor: Any = definedExternally): Map - fun setField(msg: Message, fieldNumber: Number, value: String?) - fun setField(msg: Message, fieldNumber: Number, value: Number?) - fun setField(msg: Message, fieldNumber: Number, value: Boolean?) - fun setField(msg: Message, fieldNumber: Number, value: Uint8Array?) - fun setField(msg: Message, fieldNumber: Number, value: FieldValueArray?) - fun addToRepeatedField(msg: Message, fieldNumber: Number, value: Any, index: Number = definedExternally) - fun setOneofField(msg: Message, fieldNumber: Number, oneof: Array, value: String?) - fun setOneofField(msg: Message, fieldNumber: Number, oneof: Array, value: Number?) - fun setOneofField(msg: Message, fieldNumber: Number, oneof: Array, value: Boolean?) - fun setOneofField(msg: Message, fieldNumber: Number, oneof: Array, value: Uint8Array?) - fun setOneofField(msg: Message, fieldNumber: Number, oneof: Array, value: FieldValueArray?) - fun computeOneofCase(msg: Message, oneof: Array): Number - fun getWrapperField(msg: Message, ctor: Any, fieldNumber: Number, required: Number = definedExternally): T - fun getRepeatedWrapperField(msg: Message, ctor: Any, fieldNumber: Number): Array - fun setWrapperField(msg: Message, fieldNumber: Number, value: T = definedExternally) - fun setWrapperField(msg: Message, fieldNumber: Number, value: Map = definedExternally) - fun setOneofWrapperField(msg: Message, fieldNumber: Number, oneof: Array, value: Any) - fun setRepeatedWrapperField(msg: Message, fieldNumber: Number, value: Array = definedExternally) - fun addToRepeatedWrapperField(msg: Message, fieldNumber: Number, value: T?, ctor: Any, index: Number = definedExternally): T - fun toMap(field: Array, mapKeyGetterFn: (field: Any) -> String, toObjectFn: StaticToObject = definedExternally, includeInstance: Boolean = definedExternally) - fun difference(m1: T, m2: T): T - fun equals(m1: Message, m2: Message): Boolean - fun compareExtensions(extension1: Any, extension2: Any): Boolean - fun compareFields(field1: Any, field2: Any): Boolean - fun clone(msg: T): T - fun cloneMessage(msg: T): T - fun copyInto(fromMessage: Message, toMessage: Message) - fun registerMessageType(id: Number, constructor: Any) - fun deserializeBinary(bytes: Uint8Array): Message - fun deserializeBinaryFromReader(message: Message, reader: BinaryReader): Message - fun serializeBinaryToWriter(message: Message, writer: BinaryWriter) - fun toObject(includeInstance: Boolean, msg: Message): Any - var extensions: `T$0` - var extensionsBinary: `T$1` - } + public companion object { + public fun initialize(msg: Message, data: MessageArray, messageId: String, suggestedPivot: Number, repeatedFields: Array? = definedExternally, oneofFields: Array>? = definedExternally) + public fun initialize(msg: Message, data: MessageArray, messageId: Number, suggestedPivot: Number, repeatedFields: Array? = definedExternally, oneofFields: Array>? = definedExternally) + public fun toObjectList(field: Array, toObjectFn: (includeInstance: Boolean, data: T) -> Any, includeInstance: Boolean = definedExternally): Array + public fun toObjectExtension(msg: Message, obj: Any, extensions: `T$0`, getExtensionFn: (fieldInfo: ExtensionFieldInfo) -> Message, includeInstance: Boolean = definedExternally) + public fun getField(msg: Message, fieldNumber: Number): dynamic /* String? | Number? | Boolean? | Uint8Array? | lib.protobuf.FieldValueArray? */ + public fun getOptionalFloatingPointField(msg: Message, fieldNumber: Number): Number? + public fun getRepeatedFloatingPointField(msg: Message, fieldNumber: Number): Array + public fun bytesAsB64(bytes: Uint8Array): String + public fun bytesAsU8(str: String): Uint8Array + public fun bytesListAsB64(bytesList: Array): Array + public fun bytesListAsU8(strList: Array): Array + public fun getFieldWithDefault(msg: Message, fieldNumber: Number, defaultValue: T): T + public fun getMapField(msg: Message, fieldNumber: Number, noLazyCreate: Boolean, valueCtor: Any = definedExternally): Map + public fun setField(msg: Message, fieldNumber: Number, value: String?) + public fun setField(msg: Message, fieldNumber: Number, value: Number?) + public fun setField(msg: Message, fieldNumber: Number, value: Boolean?) + public fun setField(msg: Message, fieldNumber: Number, value: Uint8Array?) + public fun setField(msg: Message, fieldNumber: Number, value: FieldValueArray?) + public fun addToRepeatedField(msg: Message, fieldNumber: Number, value: Any, index: Number = definedExternally) + public fun setOneofField(msg: Message, fieldNumber: Number, oneof: Array, value: String?) + public fun setOneofField(msg: Message, fieldNumber: Number, oneof: Array, value: Number?) + public fun setOneofField(msg: Message, fieldNumber: Number, oneof: Array, value: Boolean?) + public fun setOneofField(msg: Message, fieldNumber: Number, oneof: Array, value: Uint8Array?) + public fun setOneofField(msg: Message, fieldNumber: Number, oneof: Array, value: FieldValueArray?) + public fun computeOneofCase(msg: Message, oneof: Array): Number + public fun getWrapperField(msg: Message, ctor: Any, fieldNumber: Number, required: Number = definedExternally): T + public fun getRepeatedWrapperField(msg: Message, ctor: Any, fieldNumber: Number): Array + public fun setWrapperField(msg: Message, fieldNumber: Number, value: T = definedExternally) + public fun setWrapperField(msg: Message, fieldNumber: Number, value: Map = definedExternally) + public fun setOneofWrapperField(msg: Message, fieldNumber: Number, oneof: Array, value: Any) + public fun setRepeatedWrapperField(msg: Message, fieldNumber: Number, value: Array = definedExternally) + public fun addToRepeatedWrapperField(msg: Message, fieldNumber: Number, value: T?, ctor: Any, index: Number = definedExternally): T + public fun toMap(field: Array, mapKeyGetterFn: (field: Any) -> String, toObjectFn: StaticToObject = definedExternally, includeInstance: Boolean = definedExternally) + public fun difference(m1: T, m2: T): T + public fun equals(m1: Message, m2: Message): Boolean + public fun compareExtensions(extension1: Any, extension2: Any): Boolean + public fun compareFields(field1: Any, field2: Any): Boolean + public fun clone(msg: T): T + public fun cloneMessage(msg: T): T + public fun copyInto(fromMessage: Message, toMessage: Message) + public fun registerMessageType(id: Number, constructor: Any) + public fun deserializeBinary(bytes: Uint8Array): Message + public fun deserializeBinaryFromReader(message: Message, reader: BinaryReader): Message + public fun serializeBinaryToWriter(message: Message, writer: BinaryWriter) + public fun toObject(includeInstance: Boolean, msg: Message): Any + public var extensions: `T$0` + public var extensionsBinary: `T$1` + } } -external interface `T$2` { +public external interface `T$2` { @nativeGetter - operator fun get(key: String): Number? + public operator fun get(key: String): Number? @nativeSetter - operator fun set(key: String, value: Number) + public operator fun set(key: String, value: Number) } -open external class ExtensionFieldInfo(fieldIndex: Number, fieldName: `T$2`, ctor: Any, toObjectFn: StaticToObject, isRepeated: Number) { - open var fieldIndex: Number - open var fieldName: Number - open var ctor: Any - open var toObjectFn: StaticToObject - open var isRepeated: Number - open fun isMessageType(): Boolean +public open external class ExtensionFieldInfo(fieldIndex: Number, fieldName: `T$2`, ctor: Any, toObjectFn: StaticToObject, isRepeated: Number) { + public open var fieldIndex: Number + public open var fieldName: Number + public open var ctor: Any + public open var toObjectFn: StaticToObject + public open var isRepeated: Number + public open fun isMessageType(): Boolean } -open external class ExtensionFieldBinaryInfo(fieldInfo: ExtensionFieldInfo, binaryReaderFn: BinaryRead, binaryWriterFn: BinaryWrite, opt_binaryMessageSerializeFn: (msg: Message, writer: BinaryWriter) -> Unit, opt_binaryMessageDeserializeFn: (msg: Message, reader: BinaryReader) -> Message, opt_isPacked: Boolean) { - open var fieldInfo: ExtensionFieldInfo - open var binaryReaderFn: BinaryRead - open var binaryWriterFn: BinaryWrite - open var opt_binaryMessageSerializeFn: (msg: Message, writer: BinaryWriter) -> Unit - open var opt_binaryMessageDeserializeFn: (msg: Message, reader: BinaryReader) -> Message - open var opt_isPacked: Boolean +public open external class ExtensionFieldBinaryInfo(fieldInfo: ExtensionFieldInfo, binaryReaderFn: BinaryRead, binaryWriterFn: BinaryWrite, opt_binaryMessageSerializeFn: (msg: Message, writer: BinaryWriter) -> Unit, opt_binaryMessageDeserializeFn: (msg: Message, reader: BinaryReader) -> Message, opt_isPacked: Boolean) { + public open var fieldInfo: ExtensionFieldInfo + public open var binaryReaderFn: BinaryRead + public open var binaryWriterFn: BinaryWrite + public open var opt_binaryMessageSerializeFn: (msg: Message, writer: BinaryWriter) -> Unit + public open var opt_binaryMessageDeserializeFn: (msg: Message, reader: BinaryReader) -> Message + public open var opt_isPacked: Boolean } -open external class Map(arr: Array */>, valueCtor: Any = definedExternally) { - open fun toArray(): Array */> - open fun toObject(includeInstance: Boolean = definedExternally): Array */> - open fun toObject(): Array */> - open fun toObject(includeInstance: Boolean, valueToObject: (includeInstance: Boolean, valueWrapper: V) -> VO): Array */> - open fun getLength(): Number - open fun clear() - open fun del(key: K): Boolean - open fun getEntryList(): Array */> - open fun entries(): Iterator */> - open fun keys(): Iterator - open fun values(): Iterator - open fun forEach(callback: (entry: V, key: K) -> Unit, thisArg: Any = definedExternally) - open fun set(key: K, value: V): Map /* this */ - open fun get(key: K): V? - open fun has(key: K): Boolean - open fun serializeBinary(fieldNumber: Number, writer: BinaryWriter, keyWriterFn: (field: Number, key: K) -> Unit, valueWriterFn: (field: Number, value: V, writerCallback: BinaryWriteCallback) -> Unit, writeCallback: BinaryWriteCallback = definedExternally) - interface Iterator { - fun next(): IteratorResult - } - interface IteratorResult { - var done: Boolean - var value: T - } +public open external class Map(arr: Array */>, valueCtor: Any = definedExternally) { + public open fun toArray(): Array */> + public open fun toObject(includeInstance: Boolean = definedExternally): Array */> + public open fun toObject(): Array */> + public open fun toObject(includeInstance: Boolean, valueToObject: (includeInstance: Boolean, valueWrapper: V) -> VO): Array */> + public open fun getLength(): Number + public open fun clear() + public open fun del(key: K): Boolean + public open fun getEntryList(): Array */> + public open fun entries(): Iterator */> + public open fun keys(): Iterator + public open fun values(): Iterator + public open fun forEach(callback: (entry: V, key: K) -> Unit, thisArg: Any = definedExternally) + public open fun set(key: K, value: V): Map /* this */ + public open fun get(key: K): V? + public open fun has(key: K): Boolean + public open fun serializeBinary(fieldNumber: Number, writer: BinaryWriter, keyWriterFn: (field: Number, key: K) -> Unit, valueWriterFn: (field: Number, value: V, writerCallback: BinaryWriteCallback) -> Unit, writeCallback: BinaryWriteCallback = definedExternally) + public interface Iterator { + public fun next(): IteratorResult + } + public interface IteratorResult { + public var done: Boolean + public var value: T + } - companion object { - fun fromObject(entries: Array */>, valueCtor: Any, valueFromObject: Any): Map - fun deserializeBinary(map: Map, reader: BinaryReader, keyReaderFn: (reader: BinaryReader) -> K, valueReaderFn: (reader: BinaryReader, value: Any, readerCallback: BinaryReadCallback) -> V, readCallback: BinaryReadCallback = definedExternally, defaultKey: K = definedExternally, defaultValue: V = definedExternally) - } + public companion object { + public fun fromObject(entries: Array */>, valueCtor: Any, valueFromObject: Any): Map + public fun deserializeBinary(map: Map, reader: BinaryReader, keyReaderFn: (reader: BinaryReader) -> K, valueReaderFn: (reader: BinaryReader, value: Any, readerCallback: BinaryReadCallback) -> V, readCallback: BinaryReadCallback = definedExternally, defaultKey: K = definedExternally, defaultValue: V = definedExternally) + } } -typealias BinaryReadReader = (msg: Any, binaryReader: BinaryReader) -> Unit +public typealias BinaryReadReader = (msg: Any, binaryReader: BinaryReader) -> Unit -typealias BinaryRead = (msg: Any, reader: BinaryReadReader) -> Any +public typealias BinaryRead = (msg: Any, reader: BinaryReadReader) -> Any -typealias BinaryReadCallback = (value: Any, binaryReader: BinaryReader) -> Unit +public typealias BinaryReadCallback = (value: Any, binaryReader: BinaryReader) -> Unit -typealias BinaryWriteCallback = (value: Any, binaryWriter: BinaryWriter) -> Unit +public typealias BinaryWriteCallback = (value: Any, binaryWriter: BinaryWriter) -> Unit -typealias BinaryWrite = (fieldNumber: Number, value: Any, writerCallback: BinaryWriteCallback) -> Unit +public typealias BinaryWrite = (fieldNumber: Number, value: Any, writerCallback: BinaryWriteCallback) -> Unit -open external class BinaryReader { - constructor(bytes: ArrayBuffer = definedExternally, start: Number = definedExternally, length: Number = definedExternally) - constructor() - constructor(bytes: ArrayBuffer = definedExternally) - constructor(bytes: ArrayBuffer = definedExternally, start: Number = definedExternally) - constructor(bytes: Uint8Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally) - constructor(bytes: Uint8Array = definedExternally) - constructor(bytes: Uint8Array = definedExternally, start: Number = definedExternally) - constructor(bytes: Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally) - constructor(bytes: Array = definedExternally) - constructor(bytes: Array = definedExternally, start: Number = definedExternally) - constructor(bytes: String = definedExternally, start: Number = definedExternally, length: Number = definedExternally) - constructor(bytes: String = definedExternally) - constructor(bytes: String = definedExternally, start: Number = definedExternally) - open fun alloc(bytes: ArrayBuffer = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryReader - open fun alloc(): BinaryReader - open fun alloc(bytes: ArrayBuffer = definedExternally): BinaryReader - open fun alloc(bytes: ArrayBuffer = definedExternally, start: Number = definedExternally): BinaryReader - open fun alloc(bytes: Uint8Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryReader - open fun alloc(bytes: Uint8Array = definedExternally): BinaryReader - open fun alloc(bytes: Uint8Array = definedExternally, start: Number = definedExternally): BinaryReader - open fun alloc(bytes: Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryReader - open fun alloc(bytes: Array = definedExternally): BinaryReader - open fun alloc(bytes: Array = definedExternally, start: Number = definedExternally): BinaryReader - open fun alloc(bytes: String = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryReader - open fun alloc(bytes: String = definedExternally): BinaryReader - open fun alloc(bytes: String = definedExternally, start: Number = definedExternally): BinaryReader - open fun free() - open fun getFieldCursor(): Number - open fun getCursor(): Number - open fun getBuffer(): Uint8Array - open fun getFieldNumber(): Number - open fun getWireType(): WireType - open fun isDelimited(): Boolean - open fun isEndGroup(): Boolean - open fun getError(): Boolean - open fun setBlock(bytes: ArrayBuffer = definedExternally, start: Number = definedExternally, length: Number = definedExternally) - open fun setBlock() - open fun setBlock(bytes: ArrayBuffer = definedExternally) - open fun setBlock(bytes: ArrayBuffer = definedExternally, start: Number = definedExternally) - open fun setBlock(bytes: Uint8Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally) - open fun setBlock(bytes: Uint8Array = definedExternally) - open fun setBlock(bytes: Uint8Array = definedExternally, start: Number = definedExternally) - open fun setBlock(bytes: Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally) - open fun setBlock(bytes: Array = definedExternally) - open fun setBlock(bytes: Array = definedExternally, start: Number = definedExternally) - open fun setBlock(bytes: String = definedExternally, start: Number = definedExternally, length: Number = definedExternally) - open fun setBlock(bytes: String = definedExternally) - open fun setBlock(bytes: String = definedExternally, start: Number = definedExternally) - open fun reset() - open fun advance(count: Number) - open fun nextField(): Boolean - open fun unskipHeader() - open fun skipMatchingFields() - open fun skipVarintField() - open fun skipDelimitedField() - open fun skipFixed32Field() - open fun skipFixed64Field() - open fun skipGroup() - open fun skipField() - open fun registerReadCallback(callbackName: String, callback: (binaryReader: BinaryReader) -> Any) - open fun runReadCallback(callbackName: String): Any - open fun readAny(fieldType: FieldType): dynamic /* Boolean | Number | String | Array | Array | Uint8Array */ - open var readMessage: BinaryRead - open fun readGroup(field: Number, message: Message, reader: BinaryReadReader) - open fun getFieldDecoder(): BinaryDecoder - open fun readInt32(): Number - open fun readInt32String(): String - open fun readInt64(): Number - open fun readInt64String(): String - open fun readUint32(): Number - open fun readUint32String(): String - open fun readUint64(): Number - open fun readUint64String(): String - open fun readSint32(): Number - open fun readSint64(): Number - open fun readSint64String(): String - open fun readFixed32(): Number - open fun readFixed64(): Number - open fun readFixed64String(): String - open fun readSfixed32(): Number - open fun readSfixed32String(): String - open fun readSfixed64(): Number - open fun readSfixed64String(): String - open fun readFloat(): Number - open fun readDouble(): Number - open fun readBool(): Boolean - open fun readEnum(): Number - open fun readString(): String - open fun readBytes(): Uint8Array - open fun readVarintHash64(): String - open fun readFixedHash64(): String - open fun readPackedInt32(): Array - open fun readPackedInt32String(): Array - open fun readPackedInt64(): Array - open fun readPackedInt64String(): Array - open fun readPackedUint32(): Array - open fun readPackedUint32String(): Array - open fun readPackedUint64(): Array - open fun readPackedUint64String(): Array - open fun readPackedSint32(): Array - open fun readPackedSint64(): Array - open fun readPackedSint64String(): Array - open fun readPackedFixed32(): Array - open fun readPackedFixed64(): Array - open fun readPackedFixed64String(): Array - open fun readPackedSfixed32(): Array - open fun readPackedSfixed64(): Array - open fun readPackedSfixed64String(): Array - open fun readPackedFloat(): Array - open fun readPackedDouble(): Array - open fun readPackedBool(): Array - open fun readPackedEnum(): Array - open fun readPackedVarintHash64(): Array - open fun readPackedFixedHash64(): Array +public open external class BinaryReader { + public constructor(bytes: ArrayBuffer = definedExternally, start: Number = definedExternally, length: Number = definedExternally) + public constructor() + public constructor(bytes: ArrayBuffer = definedExternally) + public constructor(bytes: ArrayBuffer = definedExternally, start: Number = definedExternally) + public constructor(bytes: Uint8Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally) + public constructor(bytes: Uint8Array = definedExternally) + public constructor(bytes: Uint8Array = definedExternally, start: Number = definedExternally) + public constructor(bytes: Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally) + public constructor(bytes: Array = definedExternally) + public constructor(bytes: Array = definedExternally, start: Number = definedExternally) + public constructor(bytes: String = definedExternally, start: Number = definedExternally, length: Number = definedExternally) + public constructor(bytes: String = definedExternally) + public constructor(bytes: String = definedExternally, start: Number = definedExternally) + public open fun alloc(bytes: ArrayBuffer = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryReader + public open fun alloc(): BinaryReader + public open fun alloc(bytes: ArrayBuffer = definedExternally): BinaryReader + public open fun alloc(bytes: ArrayBuffer = definedExternally, start: Number = definedExternally): BinaryReader + public open fun alloc(bytes: Uint8Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryReader + public open fun alloc(bytes: Uint8Array = definedExternally): BinaryReader + public open fun alloc(bytes: Uint8Array = definedExternally, start: Number = definedExternally): BinaryReader + public open fun alloc(bytes: Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryReader + public open fun alloc(bytes: Array = definedExternally): BinaryReader + public open fun alloc(bytes: Array = definedExternally, start: Number = definedExternally): BinaryReader + public open fun alloc(bytes: String = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryReader + public open fun alloc(bytes: String = definedExternally): BinaryReader + public open fun alloc(bytes: String = definedExternally, start: Number = definedExternally): BinaryReader + public open fun free() + public open fun getFieldCursor(): Number + public open fun getCursor(): Number + public open fun getBuffer(): Uint8Array + public open fun getFieldNumber(): Number + public open fun getWireType(): WireType + public open fun isDelimited(): Boolean + public open fun isEndGroup(): Boolean + public open fun getError(): Boolean + public open fun setBlock(bytes: ArrayBuffer = definedExternally, start: Number = definedExternally, length: Number = definedExternally) + public open fun setBlock() + public open fun setBlock(bytes: ArrayBuffer = definedExternally) + public open fun setBlock(bytes: ArrayBuffer = definedExternally, start: Number = definedExternally) + public open fun setBlock(bytes: Uint8Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally) + public open fun setBlock(bytes: Uint8Array = definedExternally) + public open fun setBlock(bytes: Uint8Array = definedExternally, start: Number = definedExternally) + public open fun setBlock(bytes: Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally) + public open fun setBlock(bytes: Array = definedExternally) + public open fun setBlock(bytes: Array = definedExternally, start: Number = definedExternally) + public open fun setBlock(bytes: String = definedExternally, start: Number = definedExternally, length: Number = definedExternally) + public open fun setBlock(bytes: String = definedExternally) + public open fun setBlock(bytes: String = definedExternally, start: Number = definedExternally) + public open fun reset() + public open fun advance(count: Number) + public open fun nextField(): Boolean + public open fun unskipHeader() + public open fun skipMatchingFields() + public open fun skipVarintField() + public open fun skipDelimitedField() + public open fun skipFixed32Field() + public open fun skipFixed64Field() + public open fun skipGroup() + public open fun skipField() + public open fun registerReadCallback(callbackName: String, callback: (binaryReader: BinaryReader) -> Any) + public open fun runReadCallback(callbackName: String): Any + public open fun readAny(fieldType: FieldType): dynamic /* Boolean | Number | String | Array | Array | Uint8Array */ + public open var readMessage: BinaryRead + public open fun readGroup(field: Number, message: Message, reader: BinaryReadReader) + public open fun getFieldDecoder(): BinaryDecoder + public open fun readInt32(): Number + public open fun readInt32String(): String + public open fun readInt64(): Number + public open fun readInt64String(): String + public open fun readUint32(): Number + public open fun readUint32String(): String + public open fun readUint64(): Number + public open fun readUint64String(): String + public open fun readSint32(): Number + public open fun readSint64(): Number + public open fun readSint64String(): String + public open fun readFixed32(): Number + public open fun readFixed64(): Number + public open fun readFixed64String(): String + public open fun readSfixed32(): Number + public open fun readSfixed32String(): String + public open fun readSfixed64(): Number + public open fun readSfixed64String(): String + public open fun readFloat(): Number + public open fun readDouble(): Number + public open fun readBool(): Boolean + public open fun readEnum(): Number + public open fun readString(): String + public open fun readBytes(): Uint8Array + public open fun readVarintHash64(): String + public open fun readFixedHash64(): String + public open fun readPackedInt32(): Array + public open fun readPackedInt32String(): Array + public open fun readPackedInt64(): Array + public open fun readPackedInt64String(): Array + public open fun readPackedUint32(): Array + public open fun readPackedUint32String(): Array + public open fun readPackedUint64(): Array + public open fun readPackedUint64String(): Array + public open fun readPackedSint32(): Array + public open fun readPackedSint64(): Array + public open fun readPackedSint64String(): Array + public open fun readPackedFixed32(): Array + public open fun readPackedFixed64(): Array + public open fun readPackedFixed64String(): Array + public open fun readPackedSfixed32(): Array + public open fun readPackedSfixed64(): Array + public open fun readPackedSfixed64String(): Array + public open fun readPackedFloat(): Array + public open fun readPackedDouble(): Array + public open fun readPackedBool(): Array + public open fun readPackedEnum(): Array + public open fun readPackedVarintHash64(): Array + public open fun readPackedFixedHash64(): Array - companion object { - fun alloc(bytes: ArrayBuffer = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryReader - fun alloc(bytes: Uint8Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryReader - fun alloc(bytes: Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryReader - fun alloc(bytes: String = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryReader - } + public companion object { + public fun alloc(bytes: ArrayBuffer = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryReader + public fun alloc(bytes: Uint8Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryReader + public fun alloc(bytes: Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryReader + public fun alloc(bytes: String = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryReader + } } -open external class BinaryWriter { - open fun writeSerializedMessage(bytes: Uint8Array, start: Number, end: Number) - open fun maybeWriteSerializedMessage(bytes: Uint8Array = definedExternally, start: Number = definedExternally, end: Number = definedExternally) - open fun reset() - open fun getResultBuffer(): Uint8Array - open fun getResultBase64String(): String - open fun beginSubMessage(field: Number) - open fun endSubMessage(field: Number) - open fun writeAny(fieldType: FieldType, field: Number, value: Boolean) - open fun writeAny(fieldType: FieldType, field: Number, value: Number) - open fun writeAny(fieldType: FieldType, field: Number, value: String) - open fun writeAny(fieldType: FieldType, field: Number, value: Array) - open fun writeAny(fieldType: FieldType, field: Number, value: Array) - open fun writeAny(fieldType: FieldType, field: Number, value: Uint8Array) - open fun writeInt32(field: Number, value: Number = definedExternally) - open fun writeInt32String(field: Number, value: String = definedExternally) - open fun writeInt64(field: Number, value: Number = definedExternally) - open fun writeInt64String(field: Number, value: String = definedExternally) - open fun writeUint32(field: Number, value: Number = definedExternally) - open fun writeUint32String(field: Number, value: String = definedExternally) - open fun writeUint64(field: Number, value: Number = definedExternally) - open fun writeUint64String(field: Number, value: String = definedExternally) - open fun writeSint32(field: Number, value: Number = definedExternally) - open fun writeSint64(field: Number, value: Number = definedExternally) - open fun writeSint64String(field: Number, value: String = definedExternally) - open fun writeFixed32(field: Number, value: Number = definedExternally) - open fun writeFixed64(field: Number, value: Number = definedExternally) - open fun writeFixed64String(field: Number, value: String = definedExternally) - open fun writeSfixed32(field: Number, value: Number = definedExternally) - open fun writeSfixed64(field: Number, value: Number = definedExternally) - open fun writeSfixed64String(field: Number, value: String = definedExternally) - open fun writeFloat(field: Number, value: Number = definedExternally) - open fun writeDouble(field: Number, value: Number = definedExternally) - open fun writeBool(field: Number, value: Boolean = definedExternally) - open fun writeEnum(field: Number, value: Number = definedExternally) - open fun writeString(field: Number, value: String = definedExternally) - open fun writeBytes(field: Number, value: ArrayBuffer = definedExternally) - open fun writeBytes(field: Number) - open fun writeBytes(field: Number, value: Uint8Array = definedExternally) - open fun writeBytes(field: Number, value: Array = definedExternally) - open fun writeBytes(field: Number, value: String = definedExternally) - open var writeMessage: BinaryWrite - open fun writeGroup(field: Number, value: Any, writeCallback: BinaryWriteCallback) - open fun writeFixedHash64(field: Number, value: String = definedExternally) - open fun writeVarintHash64(field: Number, value: String = definedExternally) - open fun writeRepeatedInt32(field: Number, value: Array = definedExternally) - open fun writeRepeatedInt32String(field: Number, value: Array = definedExternally) - open fun writeRepeatedInt64(field: Number, value: Array = definedExternally) - open fun writeRepeatedInt64String(field: Number, value: Array = definedExternally) - open fun writeRepeatedUint32(field: Number, value: Array = definedExternally) - open fun writeRepeatedUint32String(field: Number, value: Array = definedExternally) - open fun writeRepeatedUint64(field: Number, value: Array = definedExternally) - open fun writeRepeatedUint64String(field: Number, value: Array = definedExternally) - open fun writeRepeatedSint32(field: Number, value: Array = definedExternally) - open fun writeRepeatedSint64(field: Number, value: Array = definedExternally) - open fun writeRepeatedSint64String(field: Number, value: Array = definedExternally) - open fun writeRepeatedFixed32(field: Number, value: Array = definedExternally) - open fun writeRepeatedFixed64(field: Number, value: Array = definedExternally) - open fun writeRepeatedFixed64String(field: Number, value: Array = definedExternally) - open fun writeRepeatedSfixed32(field: Number, value: Array = definedExternally) - open fun writeRepeatedSfixed64(field: Number, value: Array = definedExternally) - open fun writeRepeatedSfixed64String(field: Number, value: Array = definedExternally) - open fun writeRepeatedFloat(field: Number, value: Array = definedExternally) - open fun writeRepeatedDouble(field: Number, value: Array = definedExternally) - open fun writeRepeatedBool(field: Number, value: Array = definedExternally) - open fun writeRepeatedEnum(field: Number, value: Array = definedExternally) - open fun writeRepeatedString(field: Number, value: Array = definedExternally) - open fun writeRepeatedBytes(field: Number, value: Array | String */> = definedExternally) - open fun writeRepeatedMessage(field: Number, value: Array, writerCallback: BinaryWriteCallback) - open fun writeRepeatedGroup(field: Number, value: Array, writerCallback: BinaryWriteCallback) - open fun writeRepeatedFixedHash64(field: Number, value: Array = definedExternally) - open fun writeRepeatedVarintHash64(field: Number, value: Array = definedExternally) - open fun writePackedInt32(field: Number, value: Array = definedExternally) - open fun writePackedInt32String(field: Number, value: Array = definedExternally) - open fun writePackedInt64(field: Number, value: Array = definedExternally) - open fun writePackedInt64String(field: Number, value: Array = definedExternally) - open fun writePackedUint32(field: Number, value: Array = definedExternally) - open fun writePackedUint32String(field: Number, value: Array = definedExternally) - open fun writePackedUint64(field: Number, value: Array = definedExternally) - open fun writePackedUint64String(field: Number, value: Array = definedExternally) - open fun writePackedSint32(field: Number, value: Array = definedExternally) - open fun writePackedSint64(field: Number, value: Array = definedExternally) - open fun writePackedSint64String(field: Number, value: Array = definedExternally) - open fun writePackedFixed32(field: Number, value: Array = definedExternally) - open fun writePackedFixed64(field: Number, value: Array = definedExternally) - open fun writePackedFixed64String(field: Number, value: Array = definedExternally) - open fun writePackedSfixed32(field: Number, value: Array = definedExternally) - open fun writePackedSfixed64(field: Number, value: Array = definedExternally) - open fun writePackedSfixed64String(field: Number, value: Array = definedExternally) - open fun writePackedFloat(field: Number, value: Array = definedExternally) - open fun writePackedDouble(field: Number, value: Array = definedExternally) - open fun writePackedBool(field: Number, value: Array = definedExternally) - open fun writePackedEnum(field: Number, value: Array = definedExternally) - open fun writePackedFixedHash64(field: Number, value: Array = definedExternally) - open fun writePackedVarintHash64(field: Number, value: Array = definedExternally) +public open external class BinaryWriter { + public open fun writeSerializedMessage(bytes: Uint8Array, start: Number, end: Number) + public open fun maybeWriteSerializedMessage(bytes: Uint8Array = definedExternally, start: Number = definedExternally, end: Number = definedExternally) + public open fun reset() + public open fun getResultBuffer(): Uint8Array + public open fun getResultBase64String(): String + public open fun beginSubMessage(field: Number) + public open fun endSubMessage(field: Number) + public open fun writeAny(fieldType: FieldType, field: Number, value: Boolean) + public open fun writeAny(fieldType: FieldType, field: Number, value: Number) + public open fun writeAny(fieldType: FieldType, field: Number, value: String) + public open fun writeAny(fieldType: FieldType, field: Number, value: Array) + public open fun writeAny(fieldType: FieldType, field: Number, value: Array) + public open fun writeAny(fieldType: FieldType, field: Number, value: Uint8Array) + public open fun writeInt32(field: Number, value: Number = definedExternally) + public open fun writeInt32String(field: Number, value: String = definedExternally) + public open fun writeInt64(field: Number, value: Number = definedExternally) + public open fun writeInt64String(field: Number, value: String = definedExternally) + public open fun writeUint32(field: Number, value: Number = definedExternally) + public open fun writeUint32String(field: Number, value: String = definedExternally) + public open fun writeUint64(field: Number, value: Number = definedExternally) + public open fun writeUint64String(field: Number, value: String = definedExternally) + public open fun writeSint32(field: Number, value: Number = definedExternally) + public open fun writeSint64(field: Number, value: Number = definedExternally) + public open fun writeSint64String(field: Number, value: String = definedExternally) + public open fun writeFixed32(field: Number, value: Number = definedExternally) + public open fun writeFixed64(field: Number, value: Number = definedExternally) + public open fun writeFixed64String(field: Number, value: String = definedExternally) + public open fun writeSfixed32(field: Number, value: Number = definedExternally) + public open fun writeSfixed64(field: Number, value: Number = definedExternally) + public open fun writeSfixed64String(field: Number, value: String = definedExternally) + public open fun writeFloat(field: Number, value: Number = definedExternally) + public open fun writeDouble(field: Number, value: Number = definedExternally) + public open fun writeBool(field: Number, value: Boolean = definedExternally) + public open fun writeEnum(field: Number, value: Number = definedExternally) + public open fun writeString(field: Number, value: String = definedExternally) + public open fun writeBytes(field: Number, value: ArrayBuffer = definedExternally) + public open fun writeBytes(field: Number) + public open fun writeBytes(field: Number, value: Uint8Array = definedExternally) + public open fun writeBytes(field: Number, value: Array = definedExternally) + public open fun writeBytes(field: Number, value: String = definedExternally) + public open var writeMessage: BinaryWrite + public open fun writeGroup(field: Number, value: Any, writeCallback: BinaryWriteCallback) + public open fun writeFixedHash64(field: Number, value: String = definedExternally) + public open fun writeVarintHash64(field: Number, value: String = definedExternally) + public open fun writeRepeatedInt32(field: Number, value: Array = definedExternally) + public open fun writeRepeatedInt32String(field: Number, value: Array = definedExternally) + public open fun writeRepeatedInt64(field: Number, value: Array = definedExternally) + public open fun writeRepeatedInt64String(field: Number, value: Array = definedExternally) + public open fun writeRepeatedUint32(field: Number, value: Array = definedExternally) + public open fun writeRepeatedUint32String(field: Number, value: Array = definedExternally) + public open fun writeRepeatedUint64(field: Number, value: Array = definedExternally) + public open fun writeRepeatedUint64String(field: Number, value: Array = definedExternally) + public open fun writeRepeatedSint32(field: Number, value: Array = definedExternally) + public open fun writeRepeatedSint64(field: Number, value: Array = definedExternally) + public open fun writeRepeatedSint64String(field: Number, value: Array = definedExternally) + public open fun writeRepeatedFixed32(field: Number, value: Array = definedExternally) + public open fun writeRepeatedFixed64(field: Number, value: Array = definedExternally) + public open fun writeRepeatedFixed64String(field: Number, value: Array = definedExternally) + public open fun writeRepeatedSfixed32(field: Number, value: Array = definedExternally) + public open fun writeRepeatedSfixed64(field: Number, value: Array = definedExternally) + public open fun writeRepeatedSfixed64String(field: Number, value: Array = definedExternally) + public open fun writeRepeatedFloat(field: Number, value: Array = definedExternally) + public open fun writeRepeatedDouble(field: Number, value: Array = definedExternally) + public open fun writeRepeatedBool(field: Number, value: Array = definedExternally) + public open fun writeRepeatedEnum(field: Number, value: Array = definedExternally) + public open fun writeRepeatedString(field: Number, value: Array = definedExternally) + public open fun writeRepeatedBytes(field: Number, value: Array | String */> = definedExternally) + public open fun writeRepeatedMessage(field: Number, value: Array, writerCallback: BinaryWriteCallback) + public open fun writeRepeatedGroup(field: Number, value: Array, writerCallback: BinaryWriteCallback) + public open fun writeRepeatedFixedHash64(field: Number, value: Array = definedExternally) + public open fun writeRepeatedVarintHash64(field: Number, value: Array = definedExternally) + public open fun writePackedInt32(field: Number, value: Array = definedExternally) + public open fun writePackedInt32String(field: Number, value: Array = definedExternally) + public open fun writePackedInt64(field: Number, value: Array = definedExternally) + public open fun writePackedInt64String(field: Number, value: Array = definedExternally) + public open fun writePackedUint32(field: Number, value: Array = definedExternally) + public open fun writePackedUint32String(field: Number, value: Array = definedExternally) + public open fun writePackedUint64(field: Number, value: Array = definedExternally) + public open fun writePackedUint64String(field: Number, value: Array = definedExternally) + public open fun writePackedSint32(field: Number, value: Array = definedExternally) + public open fun writePackedSint64(field: Number, value: Array = definedExternally) + public open fun writePackedSint64String(field: Number, value: Array = definedExternally) + public open fun writePackedFixed32(field: Number, value: Array = definedExternally) + public open fun writePackedFixed64(field: Number, value: Array = definedExternally) + public open fun writePackedFixed64String(field: Number, value: Array = definedExternally) + public open fun writePackedSfixed32(field: Number, value: Array = definedExternally) + public open fun writePackedSfixed64(field: Number, value: Array = definedExternally) + public open fun writePackedSfixed64String(field: Number, value: Array = definedExternally) + public open fun writePackedFloat(field: Number, value: Array = definedExternally) + public open fun writePackedDouble(field: Number, value: Array = definedExternally) + public open fun writePackedBool(field: Number, value: Array = definedExternally) + public open fun writePackedEnum(field: Number, value: Array = definedExternally) + public open fun writePackedFixedHash64(field: Number, value: Array = definedExternally) + public open fun writePackedVarintHash64(field: Number, value: Array = definedExternally) } -open external class BinaryEncoder { - open fun length(): Number - open fun end(): Array - open fun writeSplitVarint64(lowBits: Number, highBits: Number) - open fun writeSplitFixed64(lowBits: Number, highBits: Number) - open fun writeUnsignedVarint32(value: Number) - open fun writeSignedVarint32(value: Number) - open fun writeUnsignedVarint64(value: Number) - open fun writeSignedVarint64(value: Number) - open fun writeZigzagVarint32(value: Number) - open fun writeZigzagVarint64(value: Number) - open fun writeZigzagVarint64String(value: String) - open fun writeUint8(value: Number) - open fun writeUint16(value: Number) - open fun writeUint32(value: Number) - open fun writeUint64(value: Number) - open fun writeInt8(value: Number) - open fun writeInt16(value: Number) - open fun writeInt32(value: Number) - open fun writeInt64(value: Number) - open fun writeInt64String(value: String) - open fun writeFloat(value: Number) - open fun writeDouble(value: Number) - open fun writeBool(value: Boolean) - open fun writeEnum(value: Number) - open fun writeBytes(bytes: Uint8Array) - open fun writeVarintHash64(hash: String) - open fun writeFixedHash64(hash: String) - open fun writeString(value: String): Number +public open external class BinaryEncoder { + public open fun length(): Number + public open fun end(): Array + public open fun writeSplitVarint64(lowBits: Number, highBits: Number) + public open fun writeSplitFixed64(lowBits: Number, highBits: Number) + public open fun writeUnsignedVarint32(value: Number) + public open fun writeSignedVarint32(value: Number) + public open fun writeUnsignedVarint64(value: Number) + public open fun writeSignedVarint64(value: Number) + public open fun writeZigzagVarint32(value: Number) + public open fun writeZigzagVarint64(value: Number) + public open fun writeZigzagVarint64String(value: String) + public open fun writeUint8(value: Number) + public open fun writeUint16(value: Number) + public open fun writeUint32(value: Number) + public open fun writeUint64(value: Number) + public open fun writeInt8(value: Number) + public open fun writeInt16(value: Number) + public open fun writeInt32(value: Number) + public open fun writeInt64(value: Number) + public open fun writeInt64String(value: String) + public open fun writeFloat(value: Number) + public open fun writeDouble(value: Number) + public open fun writeBool(value: Boolean) + public open fun writeEnum(value: Number) + public open fun writeBytes(bytes: Uint8Array) + public open fun writeVarintHash64(hash: String) + public open fun writeFixedHash64(hash: String) + public open fun writeString(value: String): Number } -open external class BinaryDecoder { - constructor(bytes: ArrayBuffer = definedExternally, start: Number = definedExternally, length: Number = definedExternally) - constructor() - constructor(bytes: ArrayBuffer = definedExternally) - constructor(bytes: ArrayBuffer = definedExternally, start: Number = definedExternally) - constructor(bytes: Uint8Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally) - constructor(bytes: Uint8Array = definedExternally) - constructor(bytes: Uint8Array = definedExternally, start: Number = definedExternally) - constructor(bytes: Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally) - constructor(bytes: Array = definedExternally) - constructor(bytes: Array = definedExternally, start: Number = definedExternally) - constructor(bytes: String = definedExternally, start: Number = definedExternally, length: Number = definedExternally) - constructor(bytes: String = definedExternally) - constructor(bytes: String = definedExternally, start: Number = definedExternally) - open fun free() - open fun clone(): BinaryDecoder - open fun clear() - open fun getBuffer(): Uint8Array - open fun setBlock(data: ArrayBuffer, start: Number = definedExternally, length: Number = definedExternally) - open fun setBlock(data: ArrayBuffer) - open fun setBlock(data: ArrayBuffer, start: Number = definedExternally) - open fun setBlock(data: Uint8Array, start: Number = definedExternally, length: Number = definedExternally) - open fun setBlock(data: Uint8Array) - open fun setBlock(data: Uint8Array, start: Number = definedExternally) - open fun setBlock(data: Array, start: Number = definedExternally, length: Number = definedExternally) - open fun setBlock(data: Array) - open fun setBlock(data: Array, start: Number = definedExternally) - open fun setBlock(data: String, start: Number = definedExternally, length: Number = definedExternally) - open fun setBlock(data: String) - open fun setBlock(data: String, start: Number = definedExternally) - open fun getEnd(): Number - open fun setEnd(end: Number) - open fun reset() - open fun getCursor(): Number - open fun setCursor(cursor: Number) - open fun advance(count: Number) - open fun atEnd(): Boolean - open fun pastEnd(): Boolean - open fun getError(): Boolean - open fun skipVarint() - open fun unskipVarint(value: Number) - open fun readUnsignedVarint32(): Number - open fun readSignedVarint32(): Number - open fun readUnsignedVarint32String(): Number - open fun readSignedVarint32String(): Number - open fun readZigzagVarint32(): Number - open fun readUnsignedVarint64(): Number - open fun readUnsignedVarint64String(): Number - open fun readSignedVarint64(): Number - open fun readSignedVarint64String(): Number - open fun readZigzagVarint64(): Number - open fun readZigzagVarint64String(): Number - open fun readUint8(): Number - open fun readUint16(): Number - open fun readUint32(): Number - open fun readUint64(): Number - open fun readUint64String(): String - open fun readInt8(): Number - open fun readInt16(): Number - open fun readInt32(): Number - open fun readInt64(): Number - open fun readInt64String(): String - open fun readFloat(): Number - open fun readDouble(): Number - open fun readBool(): Boolean - open fun readEnum(): Number - open fun readString(length: Number): String - open fun readStringWithLength(): String - open fun readBytes(length: Number): Uint8Array - open fun readVarintHash64(): String - open fun readFixedHash64(): String +public open external class BinaryDecoder { + public constructor(bytes: ArrayBuffer = definedExternally, start: Number = definedExternally, length: Number = definedExternally) + public constructor() + public constructor(bytes: ArrayBuffer = definedExternally) + public constructor(bytes: ArrayBuffer = definedExternally, start: Number = definedExternally) + public constructor(bytes: Uint8Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally) + public constructor(bytes: Uint8Array = definedExternally) + public constructor(bytes: Uint8Array = definedExternally, start: Number = definedExternally) + public constructor(bytes: Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally) + public constructor(bytes: Array = definedExternally) + public constructor(bytes: Array = definedExternally, start: Number = definedExternally) + public constructor(bytes: String = definedExternally, start: Number = definedExternally, length: Number = definedExternally) + public constructor(bytes: String = definedExternally) + public constructor(bytes: String = definedExternally, start: Number = definedExternally) + public open fun free() + public open fun clone(): BinaryDecoder + public open fun clear() + public open fun getBuffer(): Uint8Array + public open fun setBlock(data: ArrayBuffer, start: Number = definedExternally, length: Number = definedExternally) + public open fun setBlock(data: ArrayBuffer) + public open fun setBlock(data: ArrayBuffer, start: Number = definedExternally) + public open fun setBlock(data: Uint8Array, start: Number = definedExternally, length: Number = definedExternally) + public open fun setBlock(data: Uint8Array) + public open fun setBlock(data: Uint8Array, start: Number = definedExternally) + public open fun setBlock(data: Array, start: Number = definedExternally, length: Number = definedExternally) + public open fun setBlock(data: Array) + public open fun setBlock(data: Array, start: Number = definedExternally) + public open fun setBlock(data: String, start: Number = definedExternally, length: Number = definedExternally) + public open fun setBlock(data: String) + public open fun setBlock(data: String, start: Number = definedExternally) + public open fun getEnd(): Number + public open fun setEnd(end: Number) + public open fun reset() + public open fun getCursor(): Number + public open fun setCursor(cursor: Number) + public open fun advance(count: Number) + public open fun atEnd(): Boolean + public open fun pastEnd(): Boolean + public open fun getError(): Boolean + public open fun skipVarint() + public open fun unskipVarint(value: Number) + public open fun readUnsignedVarint32(): Number + public open fun readSignedVarint32(): Number + public open fun readUnsignedVarint32String(): Number + public open fun readSignedVarint32String(): Number + public open fun readZigzagVarint32(): Number + public open fun readUnsignedVarint64(): Number + public open fun readUnsignedVarint64String(): Number + public open fun readSignedVarint64(): Number + public open fun readSignedVarint64String(): Number + public open fun readZigzagVarint64(): Number + public open fun readZigzagVarint64String(): Number + public open fun readUint8(): Number + public open fun readUint16(): Number + public open fun readUint32(): Number + public open fun readUint64(): Number + public open fun readUint64String(): String + public open fun readInt8(): Number + public open fun readInt16(): Number + public open fun readInt32(): Number + public open fun readInt64(): Number + public open fun readInt64String(): String + public open fun readFloat(): Number + public open fun readDouble(): Number + public open fun readBool(): Boolean + public open fun readEnum(): Number + public open fun readString(length: Number): String + public open fun readStringWithLength(): String + public open fun readBytes(length: Number): Uint8Array + public open fun readVarintHash64(): String + public open fun readFixedHash64(): String - companion object { - fun alloc(bytes: ArrayBuffer = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryDecoder - fun alloc(bytes: Uint8Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryDecoder - fun alloc(bytes: Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryDecoder - fun alloc(bytes: String = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryDecoder - } + public companion object { + public fun alloc(bytes: ArrayBuffer = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryDecoder + public fun alloc(bytes: Uint8Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryDecoder + public fun alloc(bytes: Array = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryDecoder + public fun alloc(bytes: String = definedExternally, start: Number = definedExternally, length: Number = definedExternally): BinaryDecoder + } } -open external class BinaryIterator(decoder: BinaryDecoder = definedExternally, next: () -> Any? = definedExternally, elements: Array = definedExternally) { - open fun free() - open fun clear() - open fun get(): dynamic /* Boolean? | Number? | String? */ - open fun atEnd(): Boolean - open fun next(): dynamic /* Boolean? | Number? | String? */ +public open external class BinaryIterator(decoder: BinaryDecoder = definedExternally, next: () -> Any? = definedExternally, elements: Array = definedExternally) { + public open fun free() + public open fun clear() + public open fun get(): dynamic /* Boolean? | Number? | String? */ + public open fun atEnd(): Boolean + public open fun next(): dynamic /* Boolean? | Number? | String? */ - companion object { - fun alloc(decoder: BinaryDecoder = definedExternally, next: () -> Any? = definedExternally, elements: Array = definedExternally): BinaryIterator - } + public companion object { + public fun alloc(decoder: BinaryDecoder = definedExternally, next: () -> Any? = definedExternally, elements: Array = definedExternally): BinaryIterator + } } diff --git a/packages/frontend/src/main/kotlin/lib/tsstdlib/intl/lib.es5.Intl.module_dukat.kt b/packages/frontend/src/main/kotlin/lib/tsstdlib/intl/lib.es5.Intl.module_dukat.kt index 73b9cfe85b..841497a0a8 100644 --- a/packages/frontend/src/main/kotlin/lib/tsstdlib/intl/lib.es5.Intl.module_dukat.kt +++ b/packages/frontend/src/main/kotlin/lib/tsstdlib/intl/lib.es5.Intl.module_dukat.kt @@ -12,205 +12,205 @@ package lib.tsstdlib.intl import kotlin.js.* -external interface CollatorOptions { - var usage: String? - get() = definedExternally - set(value) = definedExternally - var localeMatcher: String? - get() = definedExternally - set(value) = definedExternally - var numeric: Boolean? - get() = definedExternally - set(value) = definedExternally - var caseFirst: String? - get() = definedExternally - set(value) = definedExternally - var sensitivity: String? - get() = definedExternally - set(value) = definedExternally - var ignorePunctuation: Boolean? - get() = definedExternally - set(value) = definedExternally +public external interface CollatorOptions { + public var usage: String? + get() = definedExternally + set(value) = definedExternally + public var localeMatcher: String? + get() = definedExternally + set(value) = definedExternally + public var numeric: Boolean? + get() = definedExternally + set(value) = definedExternally + public var caseFirst: String? + get() = definedExternally + set(value) = definedExternally + public var sensitivity: String? + get() = definedExternally + set(value) = definedExternally + public var ignorePunctuation: Boolean? + get() = definedExternally + set(value) = definedExternally } -external interface ResolvedCollatorOptions { - var locale: String - var usage: String - var sensitivity: String - var ignorePunctuation: Boolean - var collation: String - var caseFirst: String - var numeric: Boolean +public external interface ResolvedCollatorOptions { + public var locale: String + public var usage: String + public var sensitivity: String + public var ignorePunctuation: Boolean + public var collation: String + public var caseFirst: String + public var numeric: Boolean } @Suppress("NESTED_CLASS_IN_EXTERNAL_INTERFACE") -external interface Collator { - fun compare(x: String, y: String): Number - fun resolvedOptions(): ResolvedCollatorOptions +public external interface Collator { + public fun compare(x: String, y: String): Number + public fun resolvedOptions(): ResolvedCollatorOptions - companion object { - @nativeInvoke - operator fun invoke(locales: Any /* String | Array */ = definedExternally, options: CollatorOptions = definedExternally): Collator - fun supportedLocalesOf(locales: Any /* String | Array */, options: CollatorOptions = definedExternally): Array - } + public companion object { + @nativeInvoke + public operator fun invoke(locales: Any /* String | Array */ = definedExternally, options: CollatorOptions = definedExternally): Collator + public fun supportedLocalesOf(locales: Any /* String | Array */, options: CollatorOptions = definedExternally): Array + } } -external interface NumberFormatOptions { - var localeMatcher: String? - get() = definedExternally - set(value) = definedExternally - var style: String? - get() = definedExternally - set(value) = definedExternally - var currency: String? - get() = definedExternally - set(value) = definedExternally - var currencyDisplay: String? - get() = definedExternally - set(value) = definedExternally - var useGrouping: Boolean? - get() = definedExternally - set(value) = definedExternally - var minimumIntegerDigits: Number? - get() = definedExternally - set(value) = definedExternally - var minimumFractionDigits: Number? - get() = definedExternally - set(value) = definedExternally - var maximumFractionDigits: Number? - get() = definedExternally - set(value) = definedExternally - var minimumSignificantDigits: Number? - get() = definedExternally - set(value) = definedExternally - var maximumSignificantDigits: Number? - get() = definedExternally - set(value) = definedExternally +public external interface NumberFormatOptions { + public var localeMatcher: String? + get() = definedExternally + set(value) = definedExternally + public var style: String? + get() = definedExternally + set(value) = definedExternally + public var currency: String? + get() = definedExternally + set(value) = definedExternally + public var currencyDisplay: String? + get() = definedExternally + set(value) = definedExternally + public var useGrouping: Boolean? + get() = definedExternally + set(value) = definedExternally + public var minimumIntegerDigits: Number? + get() = definedExternally + set(value) = definedExternally + public var minimumFractionDigits: Number? + get() = definedExternally + set(value) = definedExternally + public var maximumFractionDigits: Number? + get() = definedExternally + set(value) = definedExternally + public var minimumSignificantDigits: Number? + get() = definedExternally + set(value) = definedExternally + public var maximumSignificantDigits: Number? + get() = definedExternally + set(value) = definedExternally } -external interface ResolvedNumberFormatOptions { - var locale: String - var numberingSystem: String - var style: String - var currency: String? - get() = definedExternally - set(value) = definedExternally - var currencyDisplay: String? - get() = definedExternally - set(value) = definedExternally - var minimumIntegerDigits: Number - var minimumFractionDigits: Number - var maximumFractionDigits: Number - var minimumSignificantDigits: Number? - get() = definedExternally - set(value) = definedExternally - var maximumSignificantDigits: Number? - get() = definedExternally - set(value) = definedExternally - var useGrouping: Boolean +public external interface ResolvedNumberFormatOptions { + public var locale: String + public var numberingSystem: String + public var style: String + public var currency: String? + get() = definedExternally + set(value) = definedExternally + public var currencyDisplay: String? + get() = definedExternally + set(value) = definedExternally + public var minimumIntegerDigits: Number + public var minimumFractionDigits: Number + public var maximumFractionDigits: Number + public var minimumSignificantDigits: Number? + get() = definedExternally + set(value) = definedExternally + public var maximumSignificantDigits: Number? + get() = definedExternally + set(value) = definedExternally + public var useGrouping: Boolean } @Suppress("NESTED_CLASS_IN_EXTERNAL_INTERFACE") -external interface NumberFormat { - fun format(value: Number): String - fun resolvedOptions(): ResolvedNumberFormatOptions +public external interface NumberFormat { + public fun format(value: Number): String + public fun resolvedOptions(): ResolvedNumberFormatOptions - companion object { - @nativeInvoke - operator fun invoke(locales: Any /* String | Array */ = definedExternally, options: NumberFormatOptions = definedExternally): NumberFormat - fun supportedLocalesOf(locales: Any /* String | Array */, options: NumberFormatOptions = definedExternally): Array - } + public companion object { + @nativeInvoke + public operator fun invoke(locales: Any /* String | Array */ = definedExternally, options: NumberFormatOptions = definedExternally): NumberFormat + public fun supportedLocalesOf(locales: Any /* String | Array */, options: NumberFormatOptions = definedExternally): Array + } } -external interface DateTimeFormatOptions { - var localeMatcher: String? - get() = definedExternally - set(value) = definedExternally - var weekday: String? - get() = definedExternally - set(value) = definedExternally - var era: String? - get() = definedExternally - set(value) = definedExternally - var year: String? - get() = definedExternally - set(value) = definedExternally - var month: String? - get() = definedExternally - set(value) = definedExternally - var day: String? - get() = definedExternally - set(value) = definedExternally - var hour: String? - get() = definedExternally - set(value) = definedExternally - var minute: String? - get() = definedExternally - set(value) = definedExternally - var second: String? - get() = definedExternally - set(value) = definedExternally - var timeZoneName: String? - get() = definedExternally - set(value) = definedExternally - var formatMatcher: String? - get() = definedExternally - set(value) = definedExternally - var hour12: Boolean? - get() = definedExternally - set(value) = definedExternally - var timeZone: String? - get() = definedExternally - set(value) = definedExternally +public external interface DateTimeFormatOptions { + public var localeMatcher: String? + get() = definedExternally + set(value) = definedExternally + public var weekday: String? + get() = definedExternally + set(value) = definedExternally + public var era: String? + get() = definedExternally + set(value) = definedExternally + public var year: String? + get() = definedExternally + set(value) = definedExternally + public var month: String? + get() = definedExternally + set(value) = definedExternally + public var day: String? + get() = definedExternally + set(value) = definedExternally + public var hour: String? + get() = definedExternally + set(value) = definedExternally + public var minute: String? + get() = definedExternally + set(value) = definedExternally + public var second: String? + get() = definedExternally + set(value) = definedExternally + public var timeZoneName: String? + get() = definedExternally + set(value) = definedExternally + public var formatMatcher: String? + get() = definedExternally + set(value) = definedExternally + public var hour12: Boolean? + get() = definedExternally + set(value) = definedExternally + public var timeZone: String? + get() = definedExternally + set(value) = definedExternally } -external interface ResolvedDateTimeFormatOptions { - var locale: String - var calendar: String - var numberingSystem: String - var timeZone: String - var hour12: Boolean? - get() = definedExternally - set(value) = definedExternally - var weekday: String? - get() = definedExternally - set(value) = definedExternally - var era: String? - get() = definedExternally - set(value) = definedExternally - var year: String? - get() = definedExternally - set(value) = definedExternally - var month: String? - get() = definedExternally - set(value) = definedExternally - var day: String? - get() = definedExternally - set(value) = definedExternally - var hour: String? - get() = definedExternally - set(value) = definedExternally - var minute: String? - get() = definedExternally - set(value) = definedExternally - var second: String? - get() = definedExternally - set(value) = definedExternally - var timeZoneName: String? - get() = definedExternally - set(value) = definedExternally +public external interface ResolvedDateTimeFormatOptions { + public var locale: String + public var calendar: String + public var numberingSystem: String + public var timeZone: String + public var hour12: Boolean? + get() = definedExternally + set(value) = definedExternally + public var weekday: String? + get() = definedExternally + set(value) = definedExternally + public var era: String? + get() = definedExternally + set(value) = definedExternally + public var year: String? + get() = definedExternally + set(value) = definedExternally + public var month: String? + get() = definedExternally + set(value) = definedExternally + public var day: String? + get() = definedExternally + set(value) = definedExternally + public var hour: String? + get() = definedExternally + set(value) = definedExternally + public var minute: String? + get() = definedExternally + set(value) = definedExternally + public var second: String? + get() = definedExternally + set(value) = definedExternally + public var timeZoneName: String? + get() = definedExternally + set(value) = definedExternally } @Suppress("NESTED_CLASS_IN_EXTERNAL_INTERFACE") -external interface DateTimeFormat { - fun format(date: Date = definedExternally): String - fun format(): String - fun format(date: Number = definedExternally): String - fun resolvedOptions(): ResolvedDateTimeFormatOptions +public external interface DateTimeFormat { + public fun format(date: Date = definedExternally): String + public fun format(): String + public fun format(date: Number = definedExternally): String + public fun resolvedOptions(): ResolvedDateTimeFormatOptions - companion object { - @nativeInvoke - operator fun invoke(locales: Any /* String | Array */ = definedExternally, options: DateTimeFormatOptions = definedExternally): DateTimeFormat - fun supportedLocalesOf(locales: Any /* String | Array */, options: DateTimeFormatOptions = definedExternally): Array - } + public companion object { + @nativeInvoke + public operator fun invoke(locales: Any /* String | Array */ = definedExternally, options: DateTimeFormatOptions = definedExternally): DateTimeFormat + public fun supportedLocalesOf(locales: Any /* String | Array */, options: DateTimeFormatOptions = definedExternally): Array + } } diff --git a/packages/frontend/src/main/kotlin/lib/tsstdlib/lib.es2015.iterable.kt b/packages/frontend/src/main/kotlin/lib/tsstdlib/lib.es2015.iterable.kt index 3cbd2cc36b..1211e18c1c 100644 --- a/packages/frontend/src/main/kotlin/lib/tsstdlib/lib.es2015.iterable.kt +++ b/packages/frontend/src/main/kotlin/lib/tsstdlib/lib.es2015.iterable.kt @@ -9,36 +9,36 @@ package lib.tsstdlib import kotlin.js.* -external interface IteratorYieldResult { - var done: Boolean? - get() = definedExternally - set(value) = definedExternally - var value: TYield +public external interface IteratorYieldResult { + public var done: Boolean? + get() = definedExternally + set(value) = definedExternally + public var value: TYield } -external interface IteratorReturnResult { - var done: Boolean - var value: TReturn +public external interface IteratorReturnResult { + public var done: Boolean + public var value: TReturn } -external interface Iterator { - fun next(vararg args: Any /* JsTuple<> | JsTuple */): dynamic /* IteratorYieldResult | IteratorReturnResult */ - val `return`: ((value: TReturn) -> dynamic)? - val `throw`: ((e: Any) -> dynamic)? +public external interface Iterator { + public fun next(vararg args: Any /* JsTuple<> | JsTuple */): dynamic /* IteratorYieldResult | IteratorReturnResult */ + public val `return`: ((value: TReturn) -> dynamic)? + public val `throw`: ((e: Any) -> dynamic)? } -external interface Iterable +public external interface Iterable -external interface PromiseConstructor { - var prototype: Promise - fun all(values: Any /* JsTuple | JsTuple | JsTuple | JsTuple | JsTuple | JsTuple | JsTuple | JsTuple | JsTuple */): Promise | JsTuple | JsTuple | JsTuple | JsTuple | JsTuple | JsTuple | JsTuple | JsTuple */> - fun all(values: Array */>): Promise> - fun race(values: Array): Promise - fun reject(reason: Any = definedExternally): Promise - fun resolve(value: T): Promise - fun resolve(value: PromiseLike): Promise - fun resolve(): Promise - fun all(values: Iterable */>): Promise> - fun race(values: Iterable): Promise - fun race(values: Iterable */>): Promise +public external interface PromiseConstructor { + public var prototype: Promise + public fun all(values: Any /* JsTuple | JsTuple | JsTuple | JsTuple | JsTuple | JsTuple | JsTuple | JsTuple | JsTuple */): Promise | JsTuple | JsTuple | JsTuple | JsTuple | JsTuple | JsTuple | JsTuple | JsTuple */> + public fun all(values: Array */>): Promise> + public fun race(values: Array): Promise + public fun reject(reason: Any = definedExternally): Promise + public fun resolve(value: T): Promise + public fun resolve(value: PromiseLike): Promise + public fun resolve(): Promise + public fun all(values: Iterable */>): Promise> + public fun race(values: Iterable): Promise + public fun race(values: Iterable */>): Promise } diff --git a/packages/frontend/src/main/kotlin/lib/tsstdlib/lib.es5.kt b/packages/frontend/src/main/kotlin/lib/tsstdlib/lib.es5.kt index 92ad3c08d3..a5da8d6cfe 100644 --- a/packages/frontend/src/main/kotlin/lib/tsstdlib/lib.es5.kt +++ b/packages/frontend/src/main/kotlin/lib/tsstdlib/lib.es5.kt @@ -11,36 +11,36 @@ package lib.tsstdlib import kotlin.js.* -external interface DateConstructor { - var prototype: Date - fun parse(s: String): Number - fun UTC(year: Number, month: Number, date: Number = definedExternally, hours: Number = definedExternally, minutes: Number = definedExternally, seconds: Number = definedExternally, ms: Number = definedExternally): Number - fun now(): Number +public external interface DateConstructor { + public var prototype: Date + public fun parse(s: String): Number + public fun UTC(year: Number, month: Number, date: Number = definedExternally, hours: Number = definedExternally, minutes: Number = definedExternally, seconds: Number = definedExternally, ms: Number = definedExternally): Number + public fun now(): Number } @Suppress("NOTHING_TO_INLINE") -inline operator fun DateConstructor.invoke(): String { +public inline operator fun DateConstructor.invoke(): String { return asDynamic()() as String } -external interface ArrayLike { - var length: Number +public external interface ArrayLike { + public var length: Number } @Suppress("NOTHING_TO_INLINE") -inline operator fun ArrayLike.get(n: Number): T? = asDynamic()[n] as? T +public inline operator fun ArrayLike.get(n: Number): T? = asDynamic()[n] as? T @Suppress("NOTHING_TO_INLINE") -inline operator fun ArrayLike.set(n: Number, value: T) { +public inline operator fun ArrayLike.set(n: Number, value: T) { asDynamic()[n] = value } -external interface ErrorConstructor { +public external interface ErrorConstructor { @nativeInvoke - operator fun invoke(message: String = definedExternally): Error - var prototype: Error + public operator fun invoke(message: String = definedExternally): Error + public var prototype: Error } -external interface PromiseLike { - fun then(onfulfilled: ((value: T) -> Any?)? = definedExternally, onrejected: ((reason: Any) -> Any?)? = definedExternally): PromiseLike +public external interface PromiseLike { + public fun then(onfulfilled: ((value: T) -> Any?)? = definedExternally, onrejected: ((reason: Any) -> Any?)? = definedExternally): PromiseLike } diff --git a/packages/frontend/src/main/kotlin/lib/tsstdlib/lib.scripthost.kt b/packages/frontend/src/main/kotlin/lib/tsstdlib/lib.scripthost.kt index 4a4b51a8db..c6cd13258c 100644 --- a/packages/frontend/src/main/kotlin/lib/tsstdlib/lib.scripthost.kt +++ b/packages/frontend/src/main/kotlin/lib/tsstdlib/lib.scripthost.kt @@ -8,6 +8,6 @@ ) package lib.tsstdlib -open external class VarDate { - open var VarDate_typekey: VarDate +public open external class VarDate { + public open var VarDate_typekey: VarDate } diff --git a/packages/frontend/src/main/kotlin/lib/uuid/index.module_uuid.kt b/packages/frontend/src/main/kotlin/lib/uuid/index.module_uuid.kt index 1ef890f8b3..24742a9127 100644 --- a/packages/frontend/src/main/kotlin/lib/uuid/index.module_uuid.kt +++ b/packages/frontend/src/main/kotlin/lib/uuid/index.module_uuid.kt @@ -16,61 +16,61 @@ package lib.uuid import kotlin.js.* import lib.tsstdlib.ArrayLike -external interface RandomOptions { - var random: ArrayLike? - get() = definedExternally - set(value) = definedExternally +public external interface RandomOptions { + public var random: ArrayLike? + get() = definedExternally + set(value) = definedExternally } -external interface RngOptions { - var rng: (() -> ArrayLike)? - get() = definedExternally - set(value) = definedExternally +public external interface RngOptions { + public var rng: (() -> ArrayLike)? + get() = definedExternally + set(value) = definedExternally } -external interface V1BaseOptions { - var node: ArrayLike? - get() = definedExternally - set(value) = definedExternally - var clockseq: Number? - get() = definedExternally - set(value) = definedExternally - var msecs: dynamic /* Number? | Date? */ - get() = definedExternally - set(value) = definedExternally - var nsecs: Number? - get() = definedExternally - set(value) = definedExternally +public external interface V1BaseOptions { + public var node: ArrayLike? + get() = definedExternally + set(value) = definedExternally + public var clockseq: Number? + get() = definedExternally + set(value) = definedExternally + public var msecs: dynamic /* Number? | Date? */ + get() = definedExternally + set(value) = definedExternally + public var nsecs: Number? + get() = definedExternally + set(value) = definedExternally } -external interface V1RandomOptions : V1BaseOptions, RandomOptions +public external interface V1RandomOptions : V1BaseOptions, RandomOptions -external interface V1RngOptions : V1BaseOptions, RngOptions +public external interface V1RngOptions : V1BaseOptions, RngOptions -external interface v3Static { - var DNS: String - var URL: String +public external interface v3Static { + public var DNS: String + public var URL: String } -external interface v5Static { - var DNS: String - var URL: String +public external interface v5Static { + public var DNS: String + public var URL: String } -external var NIL: String +public external var NIL: String -external var parse: (uuid: String) -> ArrayLike +public external var parse: (uuid: String) -> ArrayLike -external var stringify: (buffer: ArrayLike, offset: Number) -> String +public external var stringify: (buffer: ArrayLike, offset: Number) -> String -external var v1: (options: dynamic /* V1RandomOptions | V1RngOptions */) -> String /* v1String */ +public external var v1: (options: dynamic /* V1RandomOptions | V1RngOptions */) -> String /* v1String */ -external var v3: (name: dynamic /* String | InputBuffer */, namespace: dynamic /* String | InputBuffer */) -> String /* v3String */ +public external var v3: (name: dynamic /* String | InputBuffer */, namespace: dynamic /* String | InputBuffer */) -> String /* v3String */ -external var v4: (options: dynamic /* RandomOptions | RngOptions */) -> String /* v4String */ +public external var v4: (options: dynamic /* RandomOptions | RngOptions */) -> String /* v4String */ -external var v5: (name: dynamic /* String | InputBuffer */, namespace: dynamic /* String | InputBuffer */) -> String /* v5String */ +public external var v5: (name: dynamic /* String | InputBuffer */, namespace: dynamic /* String | InputBuffer */) -> String /* v5String */ -external var validate: (uuid: String) -> Boolean +public external var validate: (uuid: String) -> Boolean -external var version: (uuid: String) -> Number +public external var version: (uuid: String) -> Number diff --git a/packages/graalvm-js/build.gradle.kts b/packages/graalvm-js/build.gradle.kts index 067da58531..cc57e14d8f 100644 --- a/packages/graalvm-js/build.gradle.kts +++ b/packages/graalvm-js/build.gradle.kts @@ -1,90 +1,18 @@ @file:Suppress( "UnstableApiUsage", "unused", - "UNUSED_VARIABLE", "DSL_SCOPE_VIOLATION", ) -import java.net.URI - plugins { - idea - `maven-publish` - signing - kotlin("js") - kotlin("plugin.serialization") - alias(libs.plugins.dokka) + id("dev.elide.build.js") } group = "dev.elide" version = rootProject.version as String kotlin { - js { - nodejs() - } - - publishing { - publications { - create("main") { - groupId = "dev.elide" - artifactId = "graalvm-js" - version = rootProject.version as String - - from(components["kotlin"]) - } - } - } -} - -signing { - if (project.hasProperty("enableSigning") && project.properties["enableSigning"] == "true") { - sign(configurations.archives.get()) - sign(publishing.publications) - } -} - -publishing { - repositories { - maven { - name = "elide" - url = URI.create(project.properties["elide.publish.repo.maven"] as String) - - if (project.hasProperty("elide.publish.repo.maven.auth")) { - credentials { - username = (project.properties["elide.publish.repo.maven.username"] as? String - ?: System.getenv("PUBLISH_USER"))?.ifBlank { null } - password = (project.properties["elide.publish.repo.maven.password"] as? String - ?: System.getenv("PUBLISH_TOKEN"))?.ifBlank { null } - } - } - } - } - - publications.withType { - pom { - name.set("Elide") - description.set("Polyglot application framework") - url.set("https://github.com/elide-dev/v3") - - licenses { - license { - name.set("Properity License") - url.set("https://github.com/elide-dev/v3/blob/v3/LICENSE") - } - } - developers { - developer { - id.set("sgammon") - name.set("Sam Gammon") - email.set("samuel.gammon@gmail.com") - } - } - scm { - url.set("https://github.com/elide-dev/v3") - } - } - } + explicitApi() } dependencies { diff --git a/packages/graalvm-js/src/main/kotlin/elide/frontend/ssr/SSRContext.kt b/packages/graalvm-js/src/main/kotlin/elide/frontend/ssr/SSRContext.kt index 5d0fa1f298..e974bf1680 100644 --- a/packages/graalvm-js/src/main/kotlin/elide/frontend/ssr/SSRContext.kt +++ b/packages/graalvm-js/src/main/kotlin/elide/frontend/ssr/SSRContext.kt @@ -1,9 +1,7 @@ package elide.frontend.ssr -import kotlin.reflect.KClass - /** Context access utility for SSR-shared state. */ -class SSRContext private constructor ( +public class SSRContext private constructor ( private val data: SSRStateContainer? = null, private val decodedState: State? = null, ) { @@ -15,7 +13,7 @@ class SSRContext private constructor ( public const val CONTEXT: String = "_ctx_" /** @return SSR context, decoded from the provided input [ctx]. */ - fun of(ctx: dynamic = null): SSRContext { + public fun of(ctx: dynamic = null): SSRContext { return if (ctx != null) { SSRContext(ctx) } else { @@ -25,7 +23,7 @@ class SSRContext private constructor ( /** @return SSR context, decoded from the provided input [ctx], with the provided [stateType] class. */ @Suppress("UNUSED_PARAMETER") - fun typed(ctx: dynamic = null): SSRContext { + public fun typed(ctx: dynamic = null): SSRContext { return if (ctx != null) { SSRContext(ctx, ctx.state()) } else { @@ -35,12 +33,12 @@ class SSRContext private constructor ( } /** Execute the provided [fn] within the context of this decoded SSR context. */ - fun execute(fn: SSRContext.() -> R): R { + public fun execute(fn: SSRContext.() -> R): R { return fn.invoke(this) } /** @return State container managed by this context. */ - val state: State? get() { + public val state: State? get() { return decodedState } } diff --git a/packages/graalvm-js/src/main/kotlin/elide/frontend/ssr/SSRTypes.kt b/packages/graalvm-js/src/main/kotlin/elide/frontend/ssr/SSRTypes.kt index f06dd81e26..3df9f358ed 100644 --- a/packages/graalvm-js/src/main/kotlin/elide/frontend/ssr/SSRTypes.kt +++ b/packages/graalvm-js/src/main/kotlin/elide/frontend/ssr/SSRTypes.kt @@ -3,9 +3,9 @@ package elide.frontend.ssr /** * TBD */ -external interface SSRStateContainer { +public external interface SSRStateContainer { /** * TBD */ - fun state(): State? + public fun state(): State? } diff --git a/packages/graalvm-react/build.gradle.kts b/packages/graalvm-react/build.gradle.kts index 80f7e3bfad..a46e08ac2b 100644 --- a/packages/graalvm-react/build.gradle.kts +++ b/packages/graalvm-react/build.gradle.kts @@ -1,92 +1,16 @@ @file:Suppress( "UnstableApiUsage", "unused", - "UNUSED_VARIABLE", "DSL_SCOPE_VIOLATION", ) -import java.net.URI - plugins { - idea - `maven-publish` - signing - kotlin("js") - kotlin("plugin.serialization") - alias(libs.plugins.dokka) + id("dev.elide.build.js.node") } group = "dev.elide" version = rootProject.version as String -kotlin { - js { - nodejs() - } - - publishing { - publications { - create("main") { - groupId = "dev.elide" - artifactId = "graalvm-react" - version = rootProject.version as String - - from(components["kotlin"]) - } - } - } -} - -signing { - if (project.hasProperty("enableSigning") && project.properties["enableSigning"] == "true") { - sign(configurations.archives.get()) - sign(publishing.publications) - } -} - -publishing { - repositories { - maven { - name = "elide" - url = URI.create(project.properties["elide.publish.repo.maven"] as String) - - if (project.hasProperty("elide.publish.repo.maven.auth")) { - credentials { - username = (project.properties["elide.publish.repo.maven.username"] as? String - ?: System.getenv("PUBLISH_USER"))?.ifBlank { null } - password = (project.properties["elide.publish.repo.maven.password"] as? String - ?: System.getenv("PUBLISH_TOKEN"))?.ifBlank { null } - } - } - } - } - - publications.withType { - pom { - name.set("Elide") - description.set("Polyglot application framework") - url.set("https://github.com/elide-dev/v3") - - licenses { - license { - name.set("Properity License") - url.set("https://github.com/elide-dev/v3/blob/v3/LICENSE") - } - } - developers { - developer { - id.set("sgammon") - name.set("Sam Gammon") - email.set("samuel.gammon@gmail.com") - } - } - scm { - url.set("https://github.com/elide-dev/v3") - } - } - } -} - dependencies { api(npm("esbuild", libs.versions.npm.esbuild.get())) api(npm("prepack", libs.versions.npm.prepack.get())) diff --git a/packages/graalvm-react/src/main/node/README.md b/packages/graalvm-react/src/main/node/README.md index 26a85b5a95..04930b4eda 100644 --- a/packages/graalvm-react/src/main/node/README.md +++ b/packages/graalvm-react/src/main/node/README.md @@ -1,2 +1 @@ - -*This directory holds patches for Node on GraalVM.* +_This directory holds patches for Node on GraalVM._ diff --git a/packages/graalvm-react/src/main/node/stream/index.js b/packages/graalvm-react/src/main/node/stream/index.js index efd7928d27..19591a8d8b 100644 --- a/packages/graalvm-react/src/main/node/stream/index.js +++ b/packages/graalvm-react/src/main/node/stream/index.js @@ -1,12 +1,11 @@ - const { - Readable, - Writable, - Transform, - Duplex, - pipeline, - finished -} = require('readable-stream') + Readable, + Writable, + Transform, + Duplex, + pipeline, + finished, +} = require("readable-stream"); module.exports.Readable = Readable; module.exports.Writable = Writable; diff --git a/packages/graalvm-react/src/main/node/stream/package.json b/packages/graalvm-react/src/main/node/stream/package.json index cec49a7a45..37a4eab1ed 100644 --- a/packages/graalvm-react/src/main/node/stream/package.json +++ b/packages/graalvm-react/src/main/node/stream/package.json @@ -1,4 +1,4 @@ { "name": "stream", "version": "1.0.0" -} \ No newline at end of file +} diff --git a/packages/graalvm-react/src/main/node/util/index.js b/packages/graalvm-react/src/main/node/util/index.js index 84643395bc..bbb2436108 100644 --- a/packages/graalvm-react/src/main/node/util/index.js +++ b/packages/graalvm-react/src/main/node/util/index.js @@ -1,6 +1,5 @@ - -const inherits = require('./inherits.js'); -const { TextEncoder, TextDecoder } = require('./textencoder'); +const inherits = require("./inherits.js"); +const { TextEncoder, TextDecoder } = require("./textencoder"); module.exports.inherits = inherits; module.exports.TextEncoder = TextEncoder; diff --git a/packages/graalvm-react/src/main/node/util/inherits.js b/packages/graalvm-react/src/main/node/util/inherits.js index bb54162a06..66cad17a57 100644 --- a/packages/graalvm-react/src/main/node/util/inherits.js +++ b/packages/graalvm-react/src/main/node/util/inherits.js @@ -1,11 +1,10 @@ - // from `isaccs/inherits` module.exports = function inherits(ctor, superCtor) { - if (superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } -} + if (superCtor) { + ctor.super_ = superCtor; + var TempCtor = function () {}; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + } +}; diff --git a/packages/graalvm-react/src/main/node/util/package.json b/packages/graalvm-react/src/main/node/util/package.json index 6c2e2d5c4a..b9148a1f67 100644 --- a/packages/graalvm-react/src/main/node/util/package.json +++ b/packages/graalvm-react/src/main/node/util/package.json @@ -1,4 +1,4 @@ { "name": "util", "version": "1.0.0" -} \ No newline at end of file +} diff --git a/packages/graalvm-react/src/main/node/util/textencoder.js b/packages/graalvm-react/src/main/node/util/textencoder.js index 9d085ef3a8..347ab30e1f 100644 --- a/packages/graalvm-react/src/main/node/util/textencoder.js +++ b/packages/graalvm-react/src/main/node/util/textencoder.js @@ -1,35 +1,45 @@ -(function(_) { - if (!("TextEncoder"in self&&"TextDecoder"in self - )) { -// TextEncoder +(function (_) { + if (!("TextEncoder" in self && "TextDecoder" in self)) { + // TextEncoder /** @define {boolean} */ var ENCODEINTO_BUILD = false; - (function(window){ - "use strict"; - //var log = Math.log; - //var LN2 = Math.LN2; - //var clz32 = Math.clz32 || function(x) {return 31 - log(x >> 0) / LN2 | 0}; - var fromCharCode = String.fromCharCode; - var Object_prototype_toString = ({}).toString; - var sharedArrayBufferString = Object_prototype_toString.call(window["SharedArrayBuffer"]); - var undefinedObjectString = '[object Undefined]'; - var NativeUint8Array = window.Uint8Array; - var patchedU8Array = NativeUint8Array || Array; - var nativeArrayBuffer = NativeUint8Array ? ArrayBuffer : patchedU8Array; - var arrayBuffer_isView = nativeArrayBuffer.isView || function(x) {return x && "length" in x}; - var arrayBufferString = Object_prototype_toString.call(nativeArrayBuffer.prototype); - var window_encodeURIComponent = encodeURIComponent; - var window_parseInt = parseInt; - var TextEncoderPrototype = TextEncoder["prototype"]; - var GlobalTextEncoder = window["TextEncoder"]; - var decoderRegexp = /[\xc0-\xff][\x80-\xbf]+|[\x80-\xff]/g; - var encoderRegexp = /[\x80-\uD7ff\uDC00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]?/g; - var tmpBufferU16 = new (NativeUint8Array ? Uint16Array : patchedU8Array)(32); - var globalTextEncoderPrototype; - var globalTextEncoderInstance; + (function (window) { + "use strict"; + //var log = Math.log; + //var LN2 = Math.LN2; + //var clz32 = Math.clz32 || function(x) {return 31 - log(x >> 0) / LN2 | 0}; + var fromCharCode = String.fromCharCode; + var Object_prototype_toString = {}.toString; + var sharedArrayBufferString = Object_prototype_toString.call( + window["SharedArrayBuffer"] + ); + var undefinedObjectString = "[object Undefined]"; + var NativeUint8Array = window.Uint8Array; + var patchedU8Array = NativeUint8Array || Array; + var nativeArrayBuffer = NativeUint8Array ? ArrayBuffer : patchedU8Array; + var arrayBuffer_isView = + nativeArrayBuffer.isView || + function (x) { + return x && "length" in x; + }; + var arrayBufferString = Object_prototype_toString.call( + nativeArrayBuffer.prototype + ); + var window_encodeURIComponent = encodeURIComponent; + var window_parseInt = parseInt; + var TextEncoderPrototype = TextEncoder["prototype"]; + var GlobalTextEncoder = window["TextEncoder"]; + var decoderRegexp = /[\xc0-\xff][\x80-\xbf]+|[\x80-\xff]/g; + var encoderRegexp = + /[\x80-\uD7ff\uDC00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]?/g; + var tmpBufferU16 = new (NativeUint8Array ? Uint16Array : patchedU8Array)( + 32 + ); + var globalTextEncoderPrototype; + var globalTextEncoderInstance; - /*function decoderReplacer(encoded) { + /*function decoderReplacer(encoded) { var cp0 = encoded.charCodeAt(0), codePoint=0x110000, i=0, stringLen=encoded.length|0, result=""; switch(cp0 >> 4) { // no 1 byte sequences @@ -66,79 +76,107 @@ return result; }*/ - function TextDecoder(){}; - TextDecoder["prototype"]["decode"] = function(inputArrayOrBuffer){ - var inputAs8 = inputArrayOrBuffer, asObjectString; - if (!arrayBuffer_isView(inputAs8)) { - asObjectString = Object_prototype_toString.call(inputAs8); - if (asObjectString !== arrayBufferString && asObjectString !== sharedArrayBufferString && asObjectString !== undefinedObjectString) - throw TypeError("Failed to execute 'decode' on 'TextDecoder': The provided value is not of type '(ArrayBuffer or ArrayBufferView)'"); - inputAs8 = NativeUint8Array ? new patchedU8Array(inputAs8) : inputAs8 || []; - } + function TextDecoder() {} + TextDecoder["prototype"]["decode"] = function (inputArrayOrBuffer) { + var inputAs8 = inputArrayOrBuffer, + asObjectString; + if (!arrayBuffer_isView(inputAs8)) { + asObjectString = Object_prototype_toString.call(inputAs8); + if ( + asObjectString !== arrayBufferString && + asObjectString !== sharedArrayBufferString && + asObjectString !== undefinedObjectString + ) + throw TypeError( + "Failed to execute 'decode' on 'TextDecoder': The provided value is not of type '(ArrayBuffer or ArrayBufferView)'" + ); + inputAs8 = NativeUint8Array + ? new patchedU8Array(inputAs8) + : inputAs8 || []; + } - var resultingString="", tmpStr="", index=0, len=inputAs8.length|0, lenMinus32=len-32|0, nextEnd=0, nextStop=0, cp0=0, codePoint=0, minBits=0, cp1=0, pos=0, tmp=-1; - // Note that tmp represents the 2nd half of a surrogate pair incase a surrogate gets divided between blocks - for (; index < len; ) { - nextEnd = index <= lenMinus32 ? 32 : len - index|0; - for (; pos < nextEnd; index=index+1|0, pos=pos+1|0) { - cp0 = inputAs8[index] & 0xff; - switch(cp0 >> 4) { - case 15: - cp1 = inputAs8[index=index+1|0] & 0xff; - if ((cp1 >> 6) !== 2 || 247 < cp0) { - index = index - 1|0; - break; - } - codePoint = ((cp0 & 7) << 6) | (cp1 & 63); - minBits = 5; // 20 ensures it never passes -> all invalid replacements - cp0 = 0x100; // keep track of th bit size - case 14: - cp1 = inputAs8[index=index+1|0] & 0xff; - codePoint <<= 6; - codePoint |= ((cp0 & 15) << 6) | (cp1 & 63); - minBits = (cp1 >> 6) === 2 ? minBits + 4|0 : 24; // 24 ensures it never passes -> all invalid replacements - cp0 = (cp0 + 0x100) & 0x300; // keep track of th bit size - case 13: - case 12: - cp1 = inputAs8[index=index+1|0] & 0xff; - codePoint <<= 6; - codePoint |= ((cp0 & 31) << 6) | cp1 & 63; - minBits = minBits + 7|0; + var resultingString = "", + tmpStr = "", + index = 0, + len = inputAs8.length | 0, + lenMinus32 = (len - 32) | 0, + nextEnd = 0, + nextStop = 0, + cp0 = 0, + codePoint = 0, + minBits = 0, + cp1 = 0, + pos = 0, + tmp = -1; + // Note that tmp represents the 2nd half of a surrogate pair incase a surrogate gets divided between blocks + for (; index < len; ) { + nextEnd = index <= lenMinus32 ? 32 : (len - index) | 0; + for (; pos < nextEnd; index = (index + 1) | 0, pos = (pos + 1) | 0) { + cp0 = inputAs8[index] & 0xff; + switch (cp0 >> 4) { + case 15: + cp1 = inputAs8[(index = (index + 1) | 0)] & 0xff; + if (cp1 >> 6 !== 2 || 247 < cp0) { + index = (index - 1) | 0; + break; + } + codePoint = ((cp0 & 7) << 6) | (cp1 & 63); + minBits = 5; // 20 ensures it never passes -> all invalid replacements + cp0 = 0x100; // keep track of th bit size + case 14: + cp1 = inputAs8[(index = (index + 1) | 0)] & 0xff; + codePoint <<= 6; + codePoint |= ((cp0 & 15) << 6) | (cp1 & 63); + minBits = cp1 >> 6 === 2 ? (minBits + 4) | 0 : 24; // 24 ensures it never passes -> all invalid replacements + cp0 = (cp0 + 0x100) & 0x300; // keep track of th bit size + case 13: + case 12: + cp1 = inputAs8[(index = (index + 1) | 0)] & 0xff; + codePoint <<= 6; + codePoint |= ((cp0 & 31) << 6) | (cp1 & 63); + minBits = (minBits + 7) | 0; - // Now, process the code point - if (index < len && (cp1 >> 6) === 2 && (codePoint >> minBits) && codePoint < 0x110000) { - cp0 = codePoint; - codePoint = codePoint - 0x10000|0; - if (0 <= codePoint/*0xffff < codePoint*/) { // BMP code point - //nextEnd = nextEnd - 1|0; + // Now, process the code point + if ( + index < len && + cp1 >> 6 === 2 && + codePoint >> minBits && + codePoint < 0x110000 + ) { + cp0 = codePoint; + codePoint = (codePoint - 0x10000) | 0; + if (0 <= codePoint /*0xffff < codePoint*/) { + // BMP code point + //nextEnd = nextEnd - 1|0; - tmp = (codePoint >> 10) + 0xD800|0; // highSurrogate - cp0 = (codePoint & 0x3ff) + 0xDC00|0; // lowSurrogate (will be inserted later in the switch-statement) - - if (pos < 31) { // notice 31 instead of 32 - tmpBufferU16[pos] = tmp; - pos = pos + 1|0; - tmp = -1; - } else {// else, we are at the end of the inputAs8 and let tmp0 be filled in later on - // NOTE that cp1 is being used as a temporary variable for the swapping of tmp with cp0 - cp1 = tmp; - tmp = cp0; - cp0 = cp1; - } - } else nextEnd = nextEnd + 1|0; // because we are advancing i without advancing pos - } else { - // invalid code point means replacing the whole thing with null replacement characters - cp0 >>= 8; - index = index - cp0 - 1|0; // reset index back to what it was before - cp0 = 0xfffd; - } + tmp = ((codePoint >> 10) + 0xd800) | 0; // highSurrogate + cp0 = ((codePoint & 0x3ff) + 0xdc00) | 0; // lowSurrogate (will be inserted later in the switch-statement) + if (pos < 31) { + // notice 31 instead of 32 + tmpBufferU16[pos] = tmp; + pos = (pos + 1) | 0; + tmp = -1; + } else { + // else, we are at the end of the inputAs8 and let tmp0 be filled in later on + // NOTE that cp1 is being used as a temporary variable for the swapping of tmp with cp0 + cp1 = tmp; + tmp = cp0; + cp0 = cp1; + } + } else nextEnd = (nextEnd + 1) | 0; // because we are advancing i without advancing pos + } else { + // invalid code point means replacing the whole thing with null replacement characters + cp0 >>= 8; + index = (index - cp0 - 1) | 0; // reset index back to what it was before + cp0 = 0xfffd; + } - // Finally, reset the variables for the next go-around - minBits = 0; - codePoint = 0; - nextEnd = index <= lenMinus32 ? 32 : len - index|0; - /*case 11: + // Finally, reset the variables for the next go-around + minBits = 0; + codePoint = 0; + nextEnd = index <= lenMinus32 ? 32 : (len - index) | 0; + /*case 11: case 10: case 9: case 8: @@ -153,175 +191,233 @@ case 0: tmpBufferU16[pos] = cp0; continue;*/ - default: - tmpBufferU16[pos] = cp0; // fill with invalid replacement character - continue; - case 11: - case 10: - case 9: - case 8: - } - tmpBufferU16[pos] = 0xfffd; // fill with invalid replacement character - } - tmpStr += fromCharCode( - tmpBufferU16[ 0], tmpBufferU16[ 1], tmpBufferU16[ 2], tmpBufferU16[ 3], tmpBufferU16[ 4], tmpBufferU16[ 5], tmpBufferU16[ 6], tmpBufferU16[ 7], - tmpBufferU16[ 8], tmpBufferU16[ 9], tmpBufferU16[10], tmpBufferU16[11], tmpBufferU16[12], tmpBufferU16[13], tmpBufferU16[14], tmpBufferU16[15], - tmpBufferU16[16], tmpBufferU16[17], tmpBufferU16[18], tmpBufferU16[19], tmpBufferU16[20], tmpBufferU16[21], tmpBufferU16[22], tmpBufferU16[23], - tmpBufferU16[24], tmpBufferU16[25], tmpBufferU16[26], tmpBufferU16[27], tmpBufferU16[28], tmpBufferU16[29], tmpBufferU16[30], tmpBufferU16[31] - ); - if (pos < 32) tmpStr = tmpStr.slice(0, pos-32|0);//-(32-pos)); - if (index < len) { - //fromCharCode.apply(0, tmpBufferU16 : NativeUint8Array ? tmpBufferU16.subarray(0,pos) : tmpBufferU16.slice(0,pos)); - tmpBufferU16[0] = tmp; - pos = (~tmp) >>> 31;//tmp !== -1 ? 1 : 0; - tmp = -1; - - if (tmpStr.length < resultingString.length) continue; - } else if (tmp !== -1) { - tmpStr += fromCharCode(tmp); - } - - resultingString += tmpStr; - tmpStr = ""; + default: // fill with invalid replacement character + tmpBufferU16[pos] = cp0; + continue; + case 11: + case 10: + case 9: + case 8: } + tmpBufferU16[pos] = 0xfffd; // fill with invalid replacement character + } + tmpStr += fromCharCode( + tmpBufferU16[0], + tmpBufferU16[1], + tmpBufferU16[2], + tmpBufferU16[3], + tmpBufferU16[4], + tmpBufferU16[5], + tmpBufferU16[6], + tmpBufferU16[7], + tmpBufferU16[8], + tmpBufferU16[9], + tmpBufferU16[10], + tmpBufferU16[11], + tmpBufferU16[12], + tmpBufferU16[13], + tmpBufferU16[14], + tmpBufferU16[15], + tmpBufferU16[16], + tmpBufferU16[17], + tmpBufferU16[18], + tmpBufferU16[19], + tmpBufferU16[20], + tmpBufferU16[21], + tmpBufferU16[22], + tmpBufferU16[23], + tmpBufferU16[24], + tmpBufferU16[25], + tmpBufferU16[26], + tmpBufferU16[27], + tmpBufferU16[28], + tmpBufferU16[29], + tmpBufferU16[30], + tmpBufferU16[31] + ); + if (pos < 32) tmpStr = tmpStr.slice(0, (pos - 32) | 0); //-(32-pos)); + if (index < len) { + //fromCharCode.apply(0, tmpBufferU16 : NativeUint8Array ? tmpBufferU16.subarray(0,pos) : tmpBufferU16.slice(0,pos)); + tmpBufferU16[0] = tmp; + pos = ~tmp >>> 31; //tmp !== -1 ? 1 : 0; + tmp = -1; + + if (tmpStr.length < resultingString.length) continue; + } else if (tmp !== -1) { + tmpStr += fromCharCode(tmp); + } - return resultingString; + resultingString += tmpStr; + tmpStr = ""; } - ////////////////////////////////////////////////////////////////////////////////////// - function encoderReplacer(nonAsciiChars){ - // make the UTF string into a binary UTF-8 encoded string - var point = nonAsciiChars.charCodeAt(0)|0; - if (0xD800 <= point) { - if (point <= 0xDBFF) { - var nextcode = nonAsciiChars.charCodeAt(1)|0; // defaults to 0 when NaN, causing null replacement character - if (0xDC00 <= nextcode && nextcode <= 0xDFFF) { - //point = ((point - 0xD800)<<10) + nextcode - 0xDC00 + 0x10000|0; - point = (point<<10) + nextcode - 0x35fdc00|0; - if (point > 0xffff) - return fromCharCode( - (0x1e/*0b11110*/<<3) | (point>>18), - (0x2/*0b10*/<<6) | ((point>>12)&0x3f/*0b00111111*/), - (0x2/*0b10*/<<6) | ((point>>6)&0x3f/*0b00111111*/), - (0x2/*0b10*/<<6) | (point&0x3f/*0b00111111*/) - ); - } else point = 65533/*0b1111111111111101*/;//return '\xEF\xBF\xBD';//fromCharCode(0xef, 0xbf, 0xbd); - } else if (point <= 0xDFFF) { - point = 65533/*0b1111111111111101*/;//return '\xEF\xBF\xBD';//fromCharCode(0xef, 0xbf, 0xbd); - } - } - /*if (point <= 0x007f) return nonAsciiChars; - else */if (point <= 0x07ff) { - return fromCharCode((0x6<<5)|(point>>6), (0x2<<6)|(point&0x3f)); - } else return fromCharCode( - (0xe/*0b1110*/<<4) | (point>>12), - (0x2/*0b10*/<<6) | ((point>>6)&0x3f/*0b00111111*/), - (0x2/*0b10*/<<6) | (point&0x3f/*0b00111111*/) - ); + return resultingString; + }; + ////////////////////////////////////////////////////////////////////////////////////// + function encoderReplacer(nonAsciiChars) { + // make the UTF string into a binary UTF-8 encoded string + var point = nonAsciiChars.charCodeAt(0) | 0; + if (0xd800 <= point) { + if (point <= 0xdbff) { + var nextcode = nonAsciiChars.charCodeAt(1) | 0; // defaults to 0 when NaN, causing null replacement character + + if (0xdc00 <= nextcode && nextcode <= 0xdfff) { + //point = ((point - 0xD800)<<10) + nextcode - 0xDC00 + 0x10000|0; + point = ((point << 10) + nextcode - 0x35fdc00) | 0; + if (point > 0xffff) + return fromCharCode( + (0x1e /*0b11110*/ << 3) | (point >> 18), + (0x2 /*0b10*/ << 6) | ((point >> 12) & 0x3f) /*0b00111111*/, + (0x2 /*0b10*/ << 6) | ((point >> 6) & 0x3f) /*0b00111111*/, + (0x2 /*0b10*/ << 6) | (point & 0x3f) /*0b00111111*/ + ); + } else point = 65533 /*0b1111111111111101*/; //return '\xEF\xBF\xBD';//fromCharCode(0xef, 0xbf, 0xbd); + } else if (point <= 0xdfff) { + point = 65533 /*0b1111111111111101*/; //return '\xEF\xBF\xBD';//fromCharCode(0xef, 0xbf, 0xbd); + } } - function TextEncoder(){}; - TextEncoderPrototype["encode"] = function(inputString){ - // 0xc0 => 0b11000000; 0xff => 0b11111111; 0xc0-0xff => 0b11xxxxxx - // 0x80 => 0b10000000; 0xbf => 0b10111111; 0x80-0xbf => 0b10xxxxxx - var encodedString = inputString === void 0 ? "" : ("" + inputString), len=encodedString.length|0; - var result=new patchedU8Array((len << 1) + 8|0), tmpResult; - var i=0, pos=0, point=0, nextcode=0; - var upgradededArraySize=!NativeUint8Array; // normal arrays are auto-expanding - for (i=0; i>6); - result[pos=pos+1|0] = (0x2<<6)|(point&0x3f); - } else { - widenCheck: { - if (0xD800 <= point) { - if (point <= 0xDBFF) { - nextcode = encodedString.charCodeAt(i=i+1|0)|0; // defaults to 0 when NaN, causing null replacement character + /*if (point <= 0x007f) return nonAsciiChars; + else */ if (point <= 0x07ff) { + return fromCharCode( + (0x6 << 5) | (point >> 6), + (0x2 << 6) | (point & 0x3f) + ); + } else + return fromCharCode( + (0xe /*0b1110*/ << 4) | (point >> 12), + (0x2 /*0b10*/ << 6) | ((point >> 6) & 0x3f) /*0b00111111*/, + (0x2 /*0b10*/ << 6) | (point & 0x3f) /*0b00111111*/ + ); + } + function TextEncoder() {} + TextEncoderPrototype["encode"] = function (inputString) { + // 0xc0 => 0b11000000; 0xff => 0b11111111; 0xc0-0xff => 0b11xxxxxx + // 0x80 => 0b10000000; 0xbf => 0b10111111; 0x80-0xbf => 0b10xxxxxx + var encodedString = inputString === void 0 ? "" : "" + inputString, + len = encodedString.length | 0; + var result = new patchedU8Array(((len << 1) + 8) | 0), + tmpResult; + var i = 0, + pos = 0, + point = 0, + nextcode = 0; + var upgradededArraySize = !NativeUint8Array; // normal arrays are auto-expanding + for (i = 0; i < len; i = (i + 1) | 0, pos = (pos + 1) | 0) { + point = encodedString.charCodeAt(i) | 0; + if (point <= 0x007f) { + result[pos] = point; + } else if (point <= 0x07ff) { + result[pos] = (0x6 << 5) | (point >> 6); + result[(pos = (pos + 1) | 0)] = (0x2 << 6) | (point & 0x3f); + } else { + widenCheck: { + if (0xd800 <= point) { + if (point <= 0xdbff) { + nextcode = encodedString.charCodeAt((i = (i + 1) | 0)) | 0; // defaults to 0 when NaN, causing null replacement character - if (0xDC00 <= nextcode && nextcode <= 0xDFFF) { - //point = ((point - 0xD800)<<10) + nextcode - 0xDC00 + 0x10000|0; - point = (point<<10) + nextcode - 0x35fdc00|0; - if (point > 0xffff) { - result[pos] = (0x1e/*0b11110*/<<3) | (point>>18); - result[pos=pos+1|0] = (0x2/*0b10*/<<6) | ((point>>12)&0x3f/*0b00111111*/); - result[pos=pos+1|0] = (0x2/*0b10*/<<6) | ((point>>6)&0x3f/*0b00111111*/); - result[pos=pos+1|0] = (0x2/*0b10*/<<6) | (point&0x3f/*0b00111111*/); - continue; - } - break widenCheck; - } - point = 65533/*0b1111111111111101*/;//return '\xEF\xBF\xBD';//fromCharCode(0xef, 0xbf, 0xbd); - } else if (point <= 0xDFFF) { - point = 65533/*0b1111111111111101*/;//return '\xEF\xBF\xBD';//fromCharCode(0xef, 0xbf, 0xbd); - } - } - if (!upgradededArraySize && (i << 1) < pos && (i << 1) < (pos - 7|0)) { - upgradededArraySize = true; - tmpResult = new patchedU8Array(len * 3); - tmpResult.set( result ); - result = tmpResult; - } + if (0xdc00 <= nextcode && nextcode <= 0xdfff) { + //point = ((point - 0xD800)<<10) + nextcode - 0xDC00 + 0x10000|0; + point = ((point << 10) + nextcode - 0x35fdc00) | 0; + if (point > 0xffff) { + result[pos] = (0x1e /*0b11110*/ << 3) | (point >> 18); + result[(pos = (pos + 1) | 0)] = + (0x2 /*0b10*/ << 6) | + ((point >> 12) & 0x3f) /*0b00111111*/; + result[(pos = (pos + 1) | 0)] = + (0x2 /*0b10*/ << 6) | + ((point >> 6) & 0x3f) /*0b00111111*/; + result[(pos = (pos + 1) | 0)] = + (0x2 /*0b10*/ << 6) | (point & 0x3f) /*0b00111111*/; + continue; } - result[pos] = (0xe/*0b1110*/<<4) | (point>>12); - result[pos=pos+1|0] =(0x2/*0b10*/<<6) | ((point>>6)&0x3f/*0b00111111*/); - result[pos=pos+1|0] =(0x2/*0b10*/<<6) | (point&0x3f/*0b00111111*/); + break widenCheck; + } + point = 65533 /*0b1111111111111101*/; //return '\xEF\xBF\xBD';//fromCharCode(0xef, 0xbf, 0xbd); + } else if (point <= 0xdfff) { + point = 65533 /*0b1111111111111101*/; //return '\xEF\xBF\xBD';//fromCharCode(0xef, 0xbf, 0xbd); } + } + if ( + !upgradededArraySize && + i << 1 < pos && + i << 1 < ((pos - 7) | 0) + ) { + upgradededArraySize = true; + tmpResult = new patchedU8Array(len * 3); + tmpResult.set(result); + result = tmpResult; + } } - return NativeUint8Array ? result.subarray(0, pos) : result.slice(0, pos); - }; - function polyfill_encodeInto(inputString, u8Arr) { - var encodedString = inputString === void 0 ? "" : ("" + inputString).replace(encoderRegexp, encoderReplacer); - var len=encodedString.length|0, i=0, char=0, read=0, u8ArrLen = u8Arr.length|0, inputLength=inputString.length|0; - if (u8ArrLen < len) len=u8ArrLen; - putChars: { - for (; i> 4) { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - read = read + 1|0; - // extension points: - case 8: - case 9: - case 10: - case 11: - break; - case 12: - case 13: - if ((i+1|0) < u8ArrLen) { - read = read + 1|0; - break; - } - case 14: - if ((i+2|0) < u8ArrLen) { - //if (!(char === 0xEF && encodedString.substr(i+1|0,2) === "\xBF\xBD")) - read = read + 1|0; - break; - } - case 15: - if ((i+3|0) < u8ArrLen) { - read = read + 1|0; - break; - } - default: - break putChars; - } - //read = read + ((char >> 6) !== 2) |0; - u8Arr[i] = char; + result[pos] = (0xe /*0b1110*/ << 4) | (point >> 12); + result[(pos = (pos + 1) | 0)] = + (0x2 /*0b10*/ << 6) | ((point >> 6) & 0x3f) /*0b00111111*/; + result[(pos = (pos + 1) | 0)] = + (0x2 /*0b10*/ << 6) | (point & 0x3f) /*0b00111111*/; + } + } + return NativeUint8Array + ? result.subarray(0, pos) + : result.slice(0, pos); + }; + function polyfill_encodeInto(inputString, u8Arr) { + var encodedString = + inputString === void 0 + ? "" + : ("" + inputString).replace(encoderRegexp, encoderReplacer); + var len = encodedString.length | 0, + i = 0, + char = 0, + read = 0, + u8ArrLen = u8Arr.length | 0, + inputLength = inputString.length | 0; + if (u8ArrLen < len) len = u8ArrLen; + putChars: { + for (; i < len; i = (i + 1) | 0) { + char = encodedString.charCodeAt(i) | 0; + switch (char >> 4) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + read = (read + 1) | 0; + // extension points: + case 8: + case 9: + case 10: + case 11: + break; + case 12: + case 13: + if (((i + 1) | 0) < u8ArrLen) { + read = (read + 1) | 0; + break; + } + case 14: + if (((i + 2) | 0) < u8ArrLen) { + //if (!(char === 0xEF && encodedString.substr(i+1|0,2) === "\xBF\xBD")) + read = (read + 1) | 0; + break; + } + case 15: + if (((i + 3) | 0) < u8ArrLen) { + read = (read + 1) | 0; + break; } + default: + break putChars; } - return {"written": i, "read": inputLength < read ? inputLength : read}; - // 0xc0 => 0b11000000; 0xff => 0b11111111; 0xc0-0xff => 0b11xxxxxx - // 0x80 => 0b10000000; 0xbf => 0b10111111; 0x80-0xbf => 0b10xxxxxx - /*var encodedString = typeof inputString == "string" ? inputString : inputString === void 0 ? "" : "" + inputString; + //read = read + ((char >> 6) !== 2) |0; + u8Arr[i] = char; + } + } + return { written: i, read: inputLength < read ? inputLength : read }; + // 0xc0 => 0b11000000; 0xff => 0b11111111; 0xc0-0xff => 0b11xxxxxx + // 0x80 => 0b10000000; 0xbf => 0b10111111; 0x80-0xbf => 0b10xxxxxx + /*var encodedString = typeof inputString == "string" ? inputString : inputString === void 0 ? "" : "" + inputString; var encodedLen = encodedString.length|0, u8LenLeft=u8Arr.length|0; var i=-1, read=-1, code=0, point=0, nextcode=0; tryFast: if (2 < encodedLen && encodedLen < (u8LenLeft >> 1)) { @@ -426,53 +522,73 @@ } } return {"read": read < 0 ? 0 : u8LenLeft < 0 ? read : read+1|0, "written": i < 0 ? 0 : i+1|0};*/ - }; - if (ENCODEINTO_BUILD) { - TextEncoderPrototype["encodeInto"] = polyfill_encodeInto; - } + } + if (ENCODEINTO_BUILD) { + TextEncoderPrototype["encodeInto"] = polyfill_encodeInto; + } - if (!GlobalTextEncoder) { - window["TextDecoder"] = TextDecoder; - window["TextEncoder"] = TextEncoder; - if (module && module.exports) { - module.exports.TextEncoder = TextEncoder; - module.exports.TextDecoder = TextDecoder; - } else if (!!exports) { - exports.TextEncoder = TextEncoder; - exports.TextDecoder = TextDecoder; - } - } else if (ENCODEINTO_BUILD && !(globalTextEncoderPrototype = GlobalTextEncoder["prototype"])["encodeInto"]) { - globalTextEncoderInstance = new GlobalTextEncoder; - globalTextEncoderPrototype["encodeInto"] = function(string, u8arr) { - // Unfortunately, there's no way I can think of to quickly extract the number of bits written and the number of bytes read and such - var strLen = string.length|0, u8Len = u8arr.length|0; - if (strLen < (u8Len >> 1)) { // in most circumstances, this means its safe. there are still edge-cases which are possible - // in many circumstances, we can use the faster native TextEncoder - var res8 = globalTextEncoderInstance["encode"](string); - var res8Len = res8.length|0; - if (res8Len < u8Len) { // if we dont have to worry about read/written - u8arr.set( res8 ); // every browser that supports TextEncoder also supports typedarray.prototype.set - return { - "read": strLen, - "written": res8.length|0 - }; - } - } - return polyfill_encodeInto(string, u8arr); - }; + if (!GlobalTextEncoder) { + window["TextDecoder"] = TextDecoder; + window["TextEncoder"] = TextEncoder; + if (module && module.exports) { + module.exports.TextEncoder = TextEncoder; + module.exports.TextDecoder = TextDecoder; + } else if (!!exports) { + exports.TextEncoder = TextEncoder; + exports.TextDecoder = TextDecoder; } - })((module && module.exports) || (!!exports && exports) || typeof global == "" + void 0 ? typeof self == "" + void 0 ? this : self : global); -} else { + } else if ( + ENCODEINTO_BUILD && + !(globalTextEncoderPrototype = GlobalTextEncoder["prototype"])[ + "encodeInto" + ] + ) { + globalTextEncoderInstance = new GlobalTextEncoder(); + globalTextEncoderPrototype["encodeInto"] = function (string, u8arr) { + // Unfortunately, there's no way I can think of to quickly extract the number of bits written and the number of bytes read and such + var strLen = string.length | 0, + u8Len = u8arr.length | 0; + if (strLen < u8Len >> 1) { + // in most circumstances, this means its safe. there are still edge-cases which are possible + // in many circumstances, we can use the faster native TextEncoder + var res8 = globalTextEncoderInstance["encode"](string); + var res8Len = res8.length | 0; + if (res8Len < u8Len) { + // if we dont have to worry about read/written + u8arr.set(res8); // every browser that supports TextEncoder also supports typedarray.prototype.set + return { + read: strLen, + written: res8.length | 0, + }; + } + } + return polyfill_encodeInto(string, u8arr); + }; + } + })( + (module && module.exports) || + (!!exports && exports) || + typeof global == "" + void 0 + ? typeof self == "" + void 0 + ? this + : self + : global + ); + } else { // already exists in the JS context (probably via kotlin). mount what we found forcibly as this module's exports. - const encoder = self['TextEncoder']; - const decoder = self['TextDecoder']; + const encoder = self["TextEncoder"]; + const decoder = self["TextDecoder"]; if (module && module.exports) { - module.exports.TextEncoder = encoder; - module.exports.TextDecoder = decoder; + module.exports.TextEncoder = encoder; + module.exports.TextDecoder = decoder; } else if (!!exports) { - exports.TextEncoder = encoder; - exports.TextDecoder = decoder; + exports.TextEncoder = encoder; + exports.TextDecoder = decoder; } -}}).call( - 'object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {} -); + } +}.call( + ("object" === typeof window && window) || + ("object" === typeof self && self) || + ("object" === typeof global && global) || + {} +)); diff --git a/packages/graalvm/build.gradle.kts b/packages/graalvm/build.gradle.kts index c71b27d891..bbf581ca06 100644 --- a/packages/graalvm/build.gradle.kts +++ b/packages/graalvm/build.gradle.kts @@ -1,73 +1,26 @@ @file:Suppress( "UnstableApiUsage", "unused", - "UNUSED_VARIABLE", "DSL_SCOPE_VIOLATION", ) -import java.net.URI - plugins { - java - jacoco - idea - `maven-publish` - signing - kotlin("jvm") - kotlin("kapt") - kotlin("plugin.serialization") - alias(libs.plugins.micronaut.library) - alias(libs.plugins.testLogger) - alias(libs.plugins.dokka) + id("io.micronaut.library") + id("io.micronaut.graalvm") + id("dev.elide.build.native.lib") } group = "dev.elide" version = rootProject.version as String -kapt { - useBuildCache = true -} kotlin { explicitApi() - - jvmToolchain { - languageVersion.set(JavaLanguageVersion.of((project.properties["versions.java.language"] as String))) - } - publishing { - publications { - create("main") { - groupId = "dev.elide" - artifactId = "graalvm" - version = rootProject.version as String - - from(components["kotlin"]) - } - } - } } -java { - toolchain { - languageVersion.set(JavaLanguageVersion.of((project.properties["versions.java.language"] as String))) - vendor.set(JvmVendorSpec.GRAAL_VM) - if (project.hasProperty("elide.graalvm.variant")) { - val variant = project.property("elide.graalvm.variant") as String - if (variant != "COMMUNITY") { - vendor.set(JvmVendorSpec.matching(when (variant.trim()) { - "ENTERPRISE" -> "GraalVM Enterprise" - else -> "GraalVM Community" - })) - } - } - } -} - -testing { - suites { - val test by getting(JvmTestSuite::class) { - useJUnitJupiter() - } +graalvmNative { + agent { + enabled.set(false) } } @@ -75,81 +28,10 @@ micronaut { version.set(libs.versions.micronaut.lib.get()) } -val javadocJar by tasks.registering(Jar::class) { - archiveClassifier.set("javadoc") -} - -tasks.jacocoTestReport { - dependsOn(tasks.test) - reports { - xml.required.set(true) - } - classDirectories.setFrom( - files(classDirectories.files.map { - fileTree(it) { - exclude( - "**/generated/**", - "**/com/**", - "**/grpc/gateway/**", - "**/tools/elide/**", - ) - } - }) - ) -} - -signing { - if (project.hasProperty("enableSigning") && project.properties["enableSigning"] == "true") { - sign(configurations.archives.get()) - sign(publishing.publications) - } -} - -publishing { - repositories { - maven { - name = "elide" - url = URI.create(project.properties["elide.publish.repo.maven"] as String) - - if (project.hasProperty("elide.publish.repo.maven.auth")) { - credentials { - username = (project.properties["elide.publish.repo.maven.username"] as? String - ?: System.getenv("PUBLISH_USER"))?.ifBlank { null } - password = (project.properties["elide.publish.repo.maven.password"] as? String - ?: System.getenv("PUBLISH_TOKEN"))?.ifBlank { null } - } - } - } - } - - publications.withType { - artifact(javadocJar.get()) - pom { - name.set("Elide") - description.set("Polyglot application framework") - url.set("https://github.com/elide-dev/v3") - - licenses { - license { - name.set("Properity License") - url.set("https://github.com/elide-dev/v3/blob/v3/LICENSE") - } - } - developers { - developer { - id.set("sgammon") - name.set("Sam Gammon") - email.set("samuel.gammon@gmail.com") - } - } - scm { - url.set("https://github.com/elide-dev/v3") - } - } - } -} - dependencies { + // Core platform versions. + api(platform(project(":packages:platform"))) + // API Deps api(libs.jakarta.inject) api(libs.graalvm.sdk) @@ -182,4 +64,5 @@ dependencies { // Testing testImplementation(project(":packages:test")) + testImplementation(libs.graalvm.sdk) } diff --git a/packages/graalvm/src/main/kotlin/elide/server/SSRExtensions.kt b/packages/graalvm/src/main/kotlin/elide/server/SSRExtensions.kt index 96f29a3b36..a1411f2acc 100644 --- a/packages/graalvm/src/main/kotlin/elide/server/SSRExtensions.kt +++ b/packages/graalvm/src/main/kotlin/elide/server/SSRExtensions.kt @@ -110,6 +110,7 @@ public suspend fun BODY.injectSSR( * @return HTTP response wrapping the generated React SSR output, or an HTTP response which serves a 404 if the asset * could not be located at the specified path. */ +@Suppress("UNUSED_PARAMETER") public suspend fun ssr( request: HttpRequest<*>, path: String = NODE_SSR_DEFAULT_PATH, diff --git a/packages/graalvm/src/main/resources/embedded/runtime/abort-controller.js b/packages/graalvm/src/main/resources/embedded/runtime/abort-controller.js index 807296dde2..886ce4bd57 100644 --- a/packages/graalvm/src/main/resources/embedded/runtime/abort-controller.js +++ b/packages/graalvm/src/main/resources/embedded/runtime/abort-controller.js @@ -1,362 +1,389 @@ (function (factory) { - typeof define === 'function' && define.amd ? define(factory) : - factory(); -})((function () { 'use strict'; + typeof define === "function" && define.amd ? define(factory) : factory(); +})(function () { + "use strict"; - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); } - - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } + } + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); } - - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false, + }); + return Constructor; + } + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); } - function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function"); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - writable: true, - configurable: true - } - }); - Object.defineProperty(subClass, "prototype", { - writable: false - }); - if (superClass) _setPrototypeOf(subClass, superClass); - } - - function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { - return o.__proto__ || Object.getPrototypeOf(o); + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true, + }, + }); + Object.defineProperty(subClass, "prototype", { + writable: false, + }); + if (superClass) _setPrototypeOf(subClass, superClass); + } + + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf + ? Object.getPrototypeOf.bind() + : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); }; - return _getPrototypeOf(o); - } - - function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { - o.__proto__ = p; - return o; + return _getPrototypeOf(o); + } + + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf + ? Object.setPrototypeOf.bind() + : function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; }; - return _setPrototypeOf(o, p); + return _setPrototypeOf(o, p); + } + + function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + + try { + Boolean.prototype.valueOf.call( + Reflect.construct(Boolean, [], function () {}) + ); + return true; + } catch (e) { + return false; } + } - function _isNativeReflectConstruct() { - if (typeof Reflect === "undefined" || !Reflect.construct) return false; - if (Reflect.construct.sham) return false; - if (typeof Proxy === "function") return true; - - try { - Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); - return true; - } catch (e) { - return false; - } + function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError( + "this hasn't been initialised - super() hasn't been called" + ); } - function _assertThisInitialized(self) { - if (self === void 0) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return self; - } + return self; + } - function _possibleConstructorReturn(self, call) { - if (call && (typeof call === "object" || typeof call === "function")) { - return call; - } else if (call !== void 0) { - throw new TypeError("Derived constructors may only return object or undefined"); - } - - return _assertThisInitialized(self); + function _possibleConstructorReturn(self, call) { + if (call && (typeof call === "object" || typeof call === "function")) { + return call; + } else if (call !== void 0) { + throw new TypeError( + "Derived constructors may only return object or undefined" + ); } - function _createSuper(Derived) { - var hasNativeReflectConstruct = _isNativeReflectConstruct(); + return _assertThisInitialized(self); + } - return function _createSuperInternal() { - var Super = _getPrototypeOf(Derived), - result; + function _createSuper(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct(); - if (hasNativeReflectConstruct) { - var NewTarget = _getPrototypeOf(this).constructor; + return function _createSuperInternal() { + var Super = _getPrototypeOf(Derived), + result; - result = Reflect.construct(Super, arguments, NewTarget); - } else { - result = Super.apply(this, arguments); - } + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf(this).constructor; - return _possibleConstructorReturn(this, result); - }; - } + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } - function _superPropBase(object, property) { - while (!Object.prototype.hasOwnProperty.call(object, property)) { - object = _getPrototypeOf(object); - if (object === null) break; - } + return _possibleConstructorReturn(this, result); + }; + } - return object; + function _superPropBase(object, property) { + while (!Object.prototype.hasOwnProperty.call(object, property)) { + object = _getPrototypeOf(object); + if (object === null) break; } - function _get() { - if (typeof Reflect !== "undefined" && Reflect.get) { - _get = Reflect.get.bind(); - } else { - _get = function _get(target, property, receiver) { - var base = _superPropBase(target, property); + return object; + } - if (!base) return; - var desc = Object.getOwnPropertyDescriptor(base, property); + function _get() { + if (typeof Reflect !== "undefined" && Reflect.get) { + _get = Reflect.get.bind(); + } else { + _get = function _get(target, property, receiver) { + var base = _superPropBase(target, property); - if (desc.get) { - return desc.get.call(arguments.length < 3 ? target : receiver); - } + if (!base) return; + var desc = Object.getOwnPropertyDescriptor(base, property); - return desc.value; - }; + if (desc.get) { + return desc.get.call(arguments.length < 3 ? target : receiver); } - return _get.apply(this, arguments); + return desc.value; + }; } - var Emitter = /*#__PURE__*/function () { - function Emitter() { - _classCallCheck(this, Emitter); - - Object.defineProperty(this, 'listeners', { - value: {}, - writable: true, - configurable: true - }); - } - - _createClass(Emitter, [{ - key: "addEventListener", - value: function addEventListener(type, callback, options) { - if (!(type in this.listeners)) { - this.listeners[type] = []; - } - - this.listeners[type].push({ - callback: callback, - options: options - }); - } - }, { - key: "removeEventListener", - value: function removeEventListener(type, callback) { - if (!(type in this.listeners)) { - return; - } - - var stack = this.listeners[type]; - - for (var i = 0, l = stack.length; i < l; i++) { - if (stack[i].callback === callback) { - stack.splice(i, 1); - return; - } - } - } - }, { - key: "dispatchEvent", - value: function dispatchEvent(event) { - if (!(event.type in this.listeners)) { - return; - } - - var stack = this.listeners[event.type]; - var stackToCall = stack.slice(); - - for (var i = 0, l = stackToCall.length; i < l; i++) { - var listener = stackToCall[i]; - - try { - listener.callback.call(this, event); - } catch (e) { - Promise.resolve().then(function () { - throw e; - }); - } - - if (listener.options && listener.options.once) { - this.removeEventListener(event.type, listener.callback); - } - } - - return !event.defaultPrevented; - } - }]); + return _get.apply(this, arguments); + } - return Emitter; - }(); + var Emitter = /*#__PURE__*/ (function () { + function Emitter() { + _classCallCheck(this, Emitter); - var AbortSignal = /*#__PURE__*/function (_Emitter) { - _inherits(AbortSignal, _Emitter); - - var _super = _createSuper(AbortSignal); - - function AbortSignal() { - var _this; + Object.defineProperty(this, "listeners", { + value: {}, + writable: true, + configurable: true, + }); + } - _classCallCheck(this, AbortSignal); + _createClass(Emitter, [ + { + key: "addEventListener", + value: function addEventListener(type, callback, options) { + if (!(type in this.listeners)) { + this.listeners[type] = []; + } + + this.listeners[type].push({ + callback: callback, + options: options, + }); + }, + }, + { + key: "removeEventListener", + value: function removeEventListener(type, callback) { + if (!(type in this.listeners)) { + return; + } - _this = _super.call(this); // Some versions of babel does not transpile super() correctly for IE <= 10, if the parent - // constructor has failed to run, then "this.listeners" will still be undefined and then we call - // the parent constructor directly instead as a workaround. For general details, see babel bug: - // https://github.com/babel/babel/issues/3041 - // This hack was added as a fix for the issue described here: - // https://github.com/Financial-Times/polyfill-library/pull/59#issuecomment-477558042 + var stack = this.listeners[type]; - if (!_this.listeners) { - Emitter.call(_assertThisInitialized(_this)); - } // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and - // we want Object.keys(new AbortController().signal) to be [] for compat with the native impl + for (var i = 0, l = stack.length; i < l; i++) { + if (stack[i].callback === callback) { + stack.splice(i, 1); + return; + } + } + }, + }, + { + key: "dispatchEvent", + value: function dispatchEvent(event) { + if (!(event.type in this.listeners)) { + return; + } + var stack = this.listeners[event.type]; + var stackToCall = stack.slice(); - Object.defineProperty(_assertThisInitialized(_this), 'aborted', { - value: false, - writable: true, - configurable: true - }); - Object.defineProperty(_assertThisInitialized(_this), 'onabort', { - value: null, - writable: true, - configurable: true - }); - return _this; - } + for (var i = 0, l = stackToCall.length; i < l; i++) { + var listener = stackToCall[i]; - _createClass(AbortSignal, [{ - key: "toString", - value: function toString() { - return '[object AbortSignal]'; - } - }, { - key: "dispatchEvent", - value: function dispatchEvent(event) { - if (event.type === 'abort') { - this.aborted = true; - - if (typeof this.onabort === 'function') { - this.onabort.call(this, event); - } - } - - _get(_getPrototypeOf(AbortSignal.prototype), "dispatchEvent", this).call(this, event); + try { + listener.callback.call(this, event); + } catch (e) { + Promise.resolve().then(function () { + throw e; + }); } - }]); - - return AbortSignal; - }(Emitter); - var AbortController = /*#__PURE__*/function () { - function AbortController() { - _classCallCheck(this, AbortController); - - // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and - // we want Object.keys(new AbortController()) to be [] for compat with the native impl - Object.defineProperty(this, 'signal', { - value: new AbortSignal(), - writable: true, - configurable: true - }); - } - _createClass(AbortController, [{ - key: "abort", - value: function abort() { - var event; - - try { - event = new Event('abort'); - } catch (e) { - if (typeof document !== 'undefined') { - if (!document.createEvent) { - // For Internet Explorer 8: - event = document.createEventObject(); - event.type = 'abort'; - } else { - // For Internet Explorer 11: - event = document.createEvent('Event'); - event.initEvent('abort', false, false); - } - } else { - // Fallback where document isn't available: - event = { - type: 'abort', - bubbles: false, - cancelable: false - }; - } - } - - this.signal.dispatchEvent(event); + if (listener.options && listener.options.once) { + this.removeEventListener(event.type, listener.callback); } - }, { - key: "toString", - value: function toString() { - return '[object AbortController]'; - } - }]); - - return AbortController; - }(); - - if (typeof Symbol !== 'undefined' && Symbol.toStringTag) { - // These are necessary to make sure that we get correct output for: - // Object.prototype.toString.call(new AbortController()) - AbortController.prototype[Symbol.toStringTag] = 'AbortController'; - AbortSignal.prototype[Symbol.toStringTag] = 'AbortSignal'; + } + + return !event.defaultPrevented; + }, + }, + ]); + + return Emitter; + })(); + + var AbortSignal = /*#__PURE__*/ (function (_Emitter) { + _inherits(AbortSignal, _Emitter); + + var _super = _createSuper(AbortSignal); + + function AbortSignal() { + var _this; + + _classCallCheck(this, AbortSignal); + + _this = _super.call(this); // Some versions of babel does not transpile super() correctly for IE <= 10, if the parent + // constructor has failed to run, then "this.listeners" will still be undefined and then we call + // the parent constructor directly instead as a workaround. For general details, see babel bug: + // https://github.com/babel/babel/issues/3041 + // This hack was added as a fix for the issue described here: + // https://github.com/Financial-Times/polyfill-library/pull/59#issuecomment-477558042 + + if (!_this.listeners) { + Emitter.call(_assertThisInitialized(_this)); + } // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and + // we want Object.keys(new AbortController().signal) to be [] for compat with the native impl + + Object.defineProperty(_assertThisInitialized(_this), "aborted", { + value: false, + writable: true, + configurable: true, + }); + Object.defineProperty(_assertThisInitialized(_this), "onabort", { + value: null, + writable: true, + configurable: true, + }); + return _this; } - function polyfillNeeded(self) { - if (self.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) { - console.log('__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL=true is set, will force install polyfill'); - return true; - } // Note that the "unfetch" minimal fetch polyfill defines fetch() without - // defining window.Request, and this polyfill need to work on top of unfetch - // so the below feature detection needs the !self.AbortController part. - // The Request.prototype check is also needed because Safari versions 11.1.2 - // up to and including 12.1.x has a window.AbortController present but still - // does NOT correctly implement abortable fetch: - // https://bugs.webkit.org/show_bug.cgi?id=174980#c2 - - - return typeof self.Request === 'function' && !self.Request.prototype.hasOwnProperty('signal') || !self.AbortController; + _createClass(AbortSignal, [ + { + key: "toString", + value: function toString() { + return "[object AbortSignal]"; + }, + }, + { + key: "dispatchEvent", + value: function dispatchEvent(event) { + if (event.type === "abort") { + this.aborted = true; + + if (typeof this.onabort === "function") { + this.onabort.call(this, event); + } + } + + _get( + _getPrototypeOf(AbortSignal.prototype), + "dispatchEvent", + this + ).call(this, event); + }, + }, + ]); + + return AbortSignal; + })(Emitter); + var AbortController = /*#__PURE__*/ (function () { + function AbortController() { + _classCallCheck(this, AbortController); + + // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and + // we want Object.keys(new AbortController()) to be [] for compat with the native impl + Object.defineProperty(this, "signal", { + value: new AbortSignal(), + writable: true, + configurable: true, + }); } - (function (self) { - - if (!polyfillNeeded(self)) { - return; - } + _createClass(AbortController, [ + { + key: "abort", + value: function abort() { + var event; + + try { + event = new Event("abort"); + } catch (e) { + if (typeof document !== "undefined") { + if (!document.createEvent) { + // For Internet Explorer 8: + event = document.createEventObject(); + event.type = "abort"; + } else { + // For Internet Explorer 11: + event = document.createEvent("Event"); + event.initEvent("abort", false, false); + } + } else { + // Fallback where document isn't available: + event = { + type: "abort", + bubbles: false, + cancelable: false, + }; + } + } + + this.signal.dispatchEvent(event); + }, + }, + { + key: "toString", + value: function toString() { + return "[object AbortController]"; + }, + }, + ]); + + return AbortController; + })(); + + if (typeof Symbol !== "undefined" && Symbol.toStringTag) { + // These are necessary to make sure that we get correct output for: + // Object.prototype.toString.call(new AbortController()) + AbortController.prototype[Symbol.toStringTag] = "AbortController"; + AbortSignal.prototype[Symbol.toStringTag] = "AbortSignal"; + } + + function polyfillNeeded(self) { + if (self.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) { + console.log( + "__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL=true is set, will force install polyfill" + ); + return true; + } // Note that the "unfetch" minimal fetch polyfill defines fetch() without + // defining window.Request, and this polyfill need to work on top of unfetch + // so the below feature detection needs the !self.AbortController part. + // The Request.prototype check is also needed because Safari versions 11.1.2 + // up to and including 12.1.x has a window.AbortController present but still + // does NOT correctly implement abortable fetch: + // https://bugs.webkit.org/show_bug.cgi?id=174980#c2 + + return ( + (typeof self.Request === "function" && + !self.Request.prototype.hasOwnProperty("signal")) || + !self.AbortController + ); + } + + (function (self) { + if (!polyfillNeeded(self)) { + return; + } - self.AbortController = AbortController; - self.AbortSignal = AbortSignal; - })(typeof self !== 'undefined' ? self : global); -})); + self.AbortController = AbortController; + self.AbortSignal = AbortSignal; + })(typeof self !== "undefined" ? self : global); +}); -const AbortController = global['AbortController']; -const AbortSignal = global['AbortSignal']; +const AbortController = global["AbortController"]; +const AbortSignal = global["AbortSignal"]; diff --git a/packages/graalvm/src/main/resources/embedded/runtime/invoke.js b/packages/graalvm/src/main/resources/embedded/runtime/invoke.js index e3ce271c94..a09594184b 100644 --- a/packages/graalvm/src/main/resources/embedded/runtime/invoke.js +++ b/packages/graalvm/src/main/resources/embedded/runtime/invoke.js @@ -2,7 +2,7 @@ * Invoke the user's `renderContent` entrypoint function after setting up runtime state. */ function embeddedExecute() { - // noinspection JSUnresolvedFunction,JSUnresolvedVariable - return embedded.renderContent; + // noinspection JSUnresolvedFunction,JSUnresolvedVariable + return embedded.renderContent; } embeddedExecute(); diff --git a/packages/graalvm/src/main/resources/embedded/runtime/preamble.js b/packages/graalvm/src/main/resources/embedded/runtime/preamble.js index 12d8a19c76..8bc796933a 100644 --- a/packages/graalvm/src/main/resources/embedded/runtime/preamble.js +++ b/packages/graalvm/src/main/resources/embedded/runtime/preamble.js @@ -1,13 +1,13 @@ -const process = this['process'] || { - "pid": -1, - "cwd": () => '', - "env": {}, - "NODE_DEBUG": false, - "NODE_ENV": 'production', - "noDeprecation": false +const process = this["process"] || { + pid: -1, + cwd: () => "", + env: {}, + NODE_DEBUG: false, + NODE_ENV: "production", + noDeprecation: false, }; const window = globalThis || this; const global = globalThis || this; const self = globalThis || this; -let gc = null; \ No newline at end of file +let gc = null; diff --git a/packages/graalvm/src/main/resources/embedded/runtime/runtime-js.json b/packages/graalvm/src/main/resources/embedded/runtime/runtime-js.json index f54824667b..0f20f1a11c 100644 --- a/packages/graalvm/src/main/resources/embedded/runtime/runtime-js.json +++ b/packages/graalvm/src/main/resources/embedded/runtime/runtime-js.json @@ -1,7 +1,4 @@ { - "artifacts": [ - {"name": "preamble.js"}, - {"name": "abort-controller.js"} - ], + "artifacts": [{ "name": "preamble.js" }, { "name": "abort-controller.js" }], "entry": "invoke.js" -} \ No newline at end of file +} diff --git a/packages/graalvm/src/test/resources/embedded/harness.js b/packages/graalvm/src/test/resources/embedded/harness.js index e99a7da54a..9e582e5f70 100644 --- a/packages/graalvm/src/test/resources/embedded/harness.js +++ b/packages/graalvm/src/test/resources/embedded/harness.js @@ -1,10 +1,10 @@ -const process = this['process'] || { - "pid": -1, - "cwd": () => '', - "env": {}, - "NODE_DEBUG": false, - "NODE_ENV": 'production', - "noDeprecation": false +const process = this["process"] || { + pid: -1, + cwd: () => "", + env: {}, + NODE_DEBUG: false, + NODE_ENV: "production", + noDeprecation: false, }; const window = globalThis || this; @@ -12,25338 +12,31896 @@ const global = globalThis || this; const self = globalThis || this; let gc = null; (function (factory) { - typeof define === 'function' && define.amd ? define(factory) : - factory(); -})((function () { 'use strict'; + typeof define === "function" && define.amd ? define(factory) : factory(); +})(function () { + "use strict"; - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); } + } - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); } + } - function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function"); - } + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + Object.defineProperty(Constructor, "prototype", { + writable: false, + }); + return Constructor; + } - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - writable: true, - configurable: true - } - }); - Object.defineProperty(subClass, "prototype", { - writable: false - }); - if (superClass) _setPrototypeOf(subClass, superClass); + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); } - function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { - return o.__proto__ || Object.getPrototypeOf(o); + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true, + }, + }); + Object.defineProperty(subClass, "prototype", { + writable: false, + }); + if (superClass) _setPrototypeOf(subClass, superClass); + } + + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf + ? Object.getPrototypeOf.bind() + : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); }; - return _getPrototypeOf(o); - } + return _getPrototypeOf(o); + } - function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { - o.__proto__ = p; - return o; + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf + ? Object.setPrototypeOf.bind() + : function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; }; - return _setPrototypeOf(o, p); - } + return _setPrototypeOf(o, p); + } - function _isNativeReflectConstruct() { - if (typeof Reflect === "undefined" || !Reflect.construct) return false; - if (Reflect.construct.sham) return false; - if (typeof Proxy === "function") return true; + function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; - try { - Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); - return true; - } catch (e) { - return false; - } + try { + Boolean.prototype.valueOf.call( + Reflect.construct(Boolean, [], function () {}) + ); + return true; + } catch (e) { + return false; } + } - function _assertThisInitialized(self) { - if (self === void 0) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return self; + function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError( + "this hasn't been initialised - super() hasn't been called" + ); } - function _possibleConstructorReturn(self, call) { - if (call && (typeof call === "object" || typeof call === "function")) { - return call; - } else if (call !== void 0) { - throw new TypeError("Derived constructors may only return object or undefined"); - } + return self; + } - return _assertThisInitialized(self); + function _possibleConstructorReturn(self, call) { + if (call && (typeof call === "object" || typeof call === "function")) { + return call; + } else if (call !== void 0) { + throw new TypeError( + "Derived constructors may only return object or undefined" + ); } - function _createSuper(Derived) { - var hasNativeReflectConstruct = _isNativeReflectConstruct(); + return _assertThisInitialized(self); + } - return function _createSuperInternal() { - var Super = _getPrototypeOf(Derived), - result; + function _createSuper(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct(); - if (hasNativeReflectConstruct) { - var NewTarget = _getPrototypeOf(this).constructor; + return function _createSuperInternal() { + var Super = _getPrototypeOf(Derived), + result; - result = Reflect.construct(Super, arguments, NewTarget); - } else { - result = Super.apply(this, arguments); - } + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf(this).constructor; - return _possibleConstructorReturn(this, result); - }; - } + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } - function _superPropBase(object, property) { - while (!Object.prototype.hasOwnProperty.call(object, property)) { - object = _getPrototypeOf(object); - if (object === null) break; - } + return _possibleConstructorReturn(this, result); + }; + } - return object; + function _superPropBase(object, property) { + while (!Object.prototype.hasOwnProperty.call(object, property)) { + object = _getPrototypeOf(object); + if (object === null) break; } - function _get() { - if (typeof Reflect !== "undefined" && Reflect.get) { - _get = Reflect.get.bind(); - } else { - _get = function _get(target, property, receiver) { - var base = _superPropBase(target, property); + return object; + } - if (!base) return; - var desc = Object.getOwnPropertyDescriptor(base, property); + function _get() { + if (typeof Reflect !== "undefined" && Reflect.get) { + _get = Reflect.get.bind(); + } else { + _get = function _get(target, property, receiver) { + var base = _superPropBase(target, property); - if (desc.get) { - return desc.get.call(arguments.length < 3 ? target : receiver); - } + if (!base) return; + var desc = Object.getOwnPropertyDescriptor(base, property); - return desc.value; - }; + if (desc.get) { + return desc.get.call(arguments.length < 3 ? target : receiver); } - return _get.apply(this, arguments); + return desc.value; + }; } - var Emitter = /*#__PURE__*/function () { - function Emitter() { - _classCallCheck(this, Emitter); - - Object.defineProperty(this, 'listeners', { - value: {}, - writable: true, - configurable: true - }); - } + return _get.apply(this, arguments); + } - _createClass(Emitter, [{ - key: "addEventListener", - value: function addEventListener(type, callback, options) { - if (!(type in this.listeners)) { - this.listeners[type] = []; - } + var Emitter = /*#__PURE__*/ (function () { + function Emitter() { + _classCallCheck(this, Emitter); - this.listeners[type].push({ - callback: callback, - options: options - }); - } - }, { - key: "removeEventListener", - value: function removeEventListener(type, callback) { - if (!(type in this.listeners)) { - return; - } + Object.defineProperty(this, "listeners", { + value: {}, + writable: true, + configurable: true, + }); + } - var stack = this.listeners[type]; + _createClass(Emitter, [ + { + key: "addEventListener", + value: function addEventListener(type, callback, options) { + if (!(type in this.listeners)) { + this.listeners[type] = []; + } - for (var i = 0, l = stack.length; i < l; i++) { - if (stack[i].callback === callback) { - stack.splice(i, 1); - return; - } - } - } - }, { - key: "dispatchEvent", - value: function dispatchEvent(event) { - if (!(event.type in this.listeners)) { - return; - } + this.listeners[type].push({ + callback: callback, + options: options, + }); + }, + }, + { + key: "removeEventListener", + value: function removeEventListener(type, callback) { + if (!(type in this.listeners)) { + return; + } - var stack = this.listeners[event.type]; - var stackToCall = stack.slice(); + var stack = this.listeners[type]; - for (var i = 0, l = stackToCall.length; i < l; i++) { - var listener = stackToCall[i]; + for (var i = 0, l = stack.length; i < l; i++) { + if (stack[i].callback === callback) { + stack.splice(i, 1); + return; + } + } + }, + }, + { + key: "dispatchEvent", + value: function dispatchEvent(event) { + if (!(event.type in this.listeners)) { + return; + } - try { - listener.callback.call(this, event); - } catch (e) { - Promise.resolve().then(function () { - throw e; - }); - } + var stack = this.listeners[event.type]; + var stackToCall = stack.slice(); - if (listener.options && listener.options.once) { - this.removeEventListener(event.type, listener.callback); - } - } + for (var i = 0, l = stackToCall.length; i < l; i++) { + var listener = stackToCall[i]; - return !event.defaultPrevented; + try { + listener.callback.call(this, event); + } catch (e) { + Promise.resolve().then(function () { + throw e; + }); } - }]); - return Emitter; - }(); + if (listener.options && listener.options.once) { + this.removeEventListener(event.type, listener.callback); + } + } - var AbortSignal = /*#__PURE__*/function (_Emitter) { - _inherits(AbortSignal, _Emitter); + return !event.defaultPrevented; + }, + }, + ]); - var _super = _createSuper(AbortSignal); + return Emitter; + })(); - function AbortSignal() { - var _this; + var AbortSignal = /*#__PURE__*/ (function (_Emitter) { + _inherits(AbortSignal, _Emitter); - _classCallCheck(this, AbortSignal); + var _super = _createSuper(AbortSignal); - _this = _super.call(this); // Some versions of babel does not transpile super() correctly for IE <= 10, if the parent - // constructor has failed to run, then "this.listeners" will still be undefined and then we call - // the parent constructor directly instead as a workaround. For general details, see babel bug: - // https://github.com/babel/babel/issues/3041 - // This hack was added as a fix for the issue described here: - // https://github.com/Financial-Times/polyfill-library/pull/59#issuecomment-477558042 + function AbortSignal() { + var _this; - if (!_this.listeners) { - Emitter.call(_assertThisInitialized(_this)); - } // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and - // we want Object.keys(new AbortController().signal) to be [] for compat with the native impl + _classCallCheck(this, AbortSignal); + _this = _super.call(this); // Some versions of babel does not transpile super() correctly for IE <= 10, if the parent + // constructor has failed to run, then "this.listeners" will still be undefined and then we call + // the parent constructor directly instead as a workaround. For general details, see babel bug: + // https://github.com/babel/babel/issues/3041 + // This hack was added as a fix for the issue described here: + // https://github.com/Financial-Times/polyfill-library/pull/59#issuecomment-477558042 - Object.defineProperty(_assertThisInitialized(_this), 'aborted', { - value: false, - writable: true, - configurable: true - }); - Object.defineProperty(_assertThisInitialized(_this), 'onabort', { - value: null, - writable: true, - configurable: true - }); - return _this; - } + if (!_this.listeners) { + Emitter.call(_assertThisInitialized(_this)); + } // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and + // we want Object.keys(new AbortController().signal) to be [] for compat with the native impl - _createClass(AbortSignal, [{ - key: "toString", - value: function toString() { - return '[object AbortSignal]'; - } - }, { - key: "dispatchEvent", - value: function dispatchEvent(event) { - if (event.type === 'abort') { - this.aborted = true; + Object.defineProperty(_assertThisInitialized(_this), "aborted", { + value: false, + writable: true, + configurable: true, + }); + Object.defineProperty(_assertThisInitialized(_this), "onabort", { + value: null, + writable: true, + configurable: true, + }); + return _this; + } - if (typeof this.onabort === 'function') { - this.onabort.call(this, event); - } - } + _createClass(AbortSignal, [ + { + key: "toString", + value: function toString() { + return "[object AbortSignal]"; + }, + }, + { + key: "dispatchEvent", + value: function dispatchEvent(event) { + if (event.type === "abort") { + this.aborted = true; - _get(_getPrototypeOf(AbortSignal.prototype), "dispatchEvent", this).call(this, event); + if (typeof this.onabort === "function") { + this.onabort.call(this, event); } - }]); + } - return AbortSignal; - }(Emitter); - var AbortController = /*#__PURE__*/function () { - function AbortController() { - _classCallCheck(this, AbortController); + _get( + _getPrototypeOf(AbortSignal.prototype), + "dispatchEvent", + this + ).call(this, event); + }, + }, + ]); - // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and - // we want Object.keys(new AbortController()) to be [] for compat with the native impl - Object.defineProperty(this, 'signal', { - value: new AbortSignal(), - writable: true, - configurable: true - }); - } - - _createClass(AbortController, [{ - key: "abort", - value: function abort() { - var event; + return AbortSignal; + })(Emitter); + var AbortController = /*#__PURE__*/ (function () { + function AbortController() { + _classCallCheck(this, AbortController); - try { - event = new Event('abort'); - } catch (e) { - if (typeof document !== 'undefined') { - if (!document.createEvent) { - // For Internet Explorer 8: - event = document.createEventObject(); - event.type = 'abort'; - } else { - // For Internet Explorer 11: - event = document.createEvent('Event'); - event.initEvent('abort', false, false); - } - } else { - // Fallback where document isn't available: - event = { - type: 'abort', - bubbles: false, - cancelable: false - }; - } - } + // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and + // we want Object.keys(new AbortController()) to be [] for compat with the native impl + Object.defineProperty(this, "signal", { + value: new AbortSignal(), + writable: true, + configurable: true, + }); + } - this.signal.dispatchEvent(event); - } - }, { - key: "toString", - value: function toString() { - return '[object AbortController]'; - } - }]); + _createClass(AbortController, [ + { + key: "abort", + value: function abort() { + var event; - return AbortController; - }(); + try { + event = new Event("abort"); + } catch (e) { + if (typeof document !== "undefined") { + if (!document.createEvent) { + // For Internet Explorer 8: + event = document.createEventObject(); + event.type = "abort"; + } else { + // For Internet Explorer 11: + event = document.createEvent("Event"); + event.initEvent("abort", false, false); + } + } else { + // Fallback where document isn't available: + event = { + type: "abort", + bubbles: false, + cancelable: false, + }; + } + } - if (typeof Symbol !== 'undefined' && Symbol.toStringTag) { - // These are necessary to make sure that we get correct output for: - // Object.prototype.toString.call(new AbortController()) - AbortController.prototype[Symbol.toStringTag] = 'AbortController'; - AbortSignal.prototype[Symbol.toStringTag] = 'AbortSignal'; - } + this.signal.dispatchEvent(event); + }, + }, + { + key: "toString", + value: function toString() { + return "[object AbortController]"; + }, + }, + ]); - function polyfillNeeded(self) { - if (self.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) { - console.log('__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL=true is set, will force install polyfill'); - return true; - } // Note that the "unfetch" minimal fetch polyfill defines fetch() without - // defining window.Request, and this polyfill need to work on top of unfetch - // so the below feature detection needs the !self.AbortController part. - // The Request.prototype check is also needed because Safari versions 11.1.2 - // up to and including 12.1.x has a window.AbortController present but still - // does NOT correctly implement abortable fetch: - // https://bugs.webkit.org/show_bug.cgi?id=174980#c2 + return AbortController; + })(); + if (typeof Symbol !== "undefined" && Symbol.toStringTag) { + // These are necessary to make sure that we get correct output for: + // Object.prototype.toString.call(new AbortController()) + AbortController.prototype[Symbol.toStringTag] = "AbortController"; + AbortSignal.prototype[Symbol.toStringTag] = "AbortSignal"; + } - return typeof self.Request === 'function' && !self.Request.prototype.hasOwnProperty('signal') || !self.AbortController; - } + function polyfillNeeded(self) { + if (self.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) { + console.log( + "__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL=true is set, will force install polyfill" + ); + return true; + } // Note that the "unfetch" minimal fetch polyfill defines fetch() without + // defining window.Request, and this polyfill need to work on top of unfetch + // so the below feature detection needs the !self.AbortController part. + // The Request.prototype check is also needed because Safari versions 11.1.2 + // up to and including 12.1.x has a window.AbortController present but still + // does NOT correctly implement abortable fetch: + // https://bugs.webkit.org/show_bug.cgi?id=174980#c2 - (function (self) { + return ( + (typeof self.Request === "function" && + !self.Request.prototype.hasOwnProperty("signal")) || + !self.AbortController + ); + } - if (!polyfillNeeded(self)) { - return; - } + (function (self) { + if (!polyfillNeeded(self)) { + return; + } - self.AbortController = AbortController; - self.AbortSignal = AbortSignal; - })(typeof self !== 'undefined' ? self : global); -})); + self.AbortController = AbortController; + self.AbortSignal = AbortSignal; + })(typeof self !== "undefined" ? self : global); +}); -const AbortController = global['AbortController']; -const AbortSignal = global['AbortSignal']; +const AbortController = global["AbortController"]; +const AbortSignal = global["AbortSignal"]; var embedded = (() => { - var __getOwnPropNames = Object.getOwnPropertyNames; - var __esm = (fn, res) => function __init() { - return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; + var __getOwnPropNames = Object.getOwnPropertyNames; + var __esm = (fn, res) => + function __init() { + return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])((fn = 0))), res; }; - var __commonJS = (cb, mod) => function __require() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; + var __commonJS = (cb, mod) => + function __require() { + return ( + mod || + (0, cb[__getOwnPropNames(cb)[0]])( + (mod = { exports: {} }).exports, + mod + ), + mod.exports + ); }; - // ../../samples/fullstack/react-ssr/node/build/esbuild/process-shim.js - var process; - var init_process_shim = __esm({ - "../../samples/fullstack/react-ssr/node/build/esbuild/process-shim.js"() { - process = { - pid: -1, - cwd: () => "", - env: {}, - NODE_DEBUG: false, - NODE_ENV: "production", - noDeprecation: false - }; + // ../../samples/fullstack/react-ssr/node/build/esbuild/process-shim.js + var process; + var init_process_shim = __esm({ + "../../samples/fullstack/react-ssr/node/build/esbuild/process-shim.js"() { + process = { + pid: -1, + cwd: () => "", + env: {}, + NODE_DEBUG: false, + NODE_ENV: "production", + noDeprecation: false, + }; + }, + }); + + // node_modules/react/cjs/react.production.min.js + var require_react_production_min = __commonJS({ + "node_modules/react/cjs/react.production.min.js"(exports) { + "use strict"; + init_process_shim(); + var l = Symbol.for("react.element"); + var n = Symbol.for("react.portal"); + var p = Symbol.for("react.fragment"); + var q = Symbol.for("react.strict_mode"); + var r = Symbol.for("react.profiler"); + var t = Symbol.for("react.provider"); + var u = Symbol.for("react.context"); + var v = Symbol.for("react.forward_ref"); + var w = Symbol.for("react.suspense"); + var x = Symbol.for("react.memo"); + var y = Symbol.for("react.lazy"); + var z = Symbol.iterator; + function A(a) { + if (a === null || typeof a !== "object") return null; + a = (z && a[z]) || a["@@iterator"]; + return typeof a === "function" ? a : null; + } + var B = { + isMounted: function () { + return false; + }, + enqueueForceUpdate: function () {}, + enqueueReplaceState: function () {}, + enqueueSetState: function () {}, + }; + var C = Object.assign; + var D = {}; + function E(a, b, e) { + this.props = a; + this.context = b; + this.refs = D; + this.updater = e || B; + } + E.prototype.isReactComponent = {}; + E.prototype.setState = function (a, b) { + if (typeof a !== "object" && typeof a !== "function" && a != null) + throw Error( + "setState(...): takes an object of state variables to update or a function which returns an object of state variables." + ); + this.updater.enqueueSetState(this, a, b, "setState"); + }; + E.prototype.forceUpdate = function (a) { + this.updater.enqueueForceUpdate(this, a, "forceUpdate"); + }; + function F() {} + F.prototype = E.prototype; + function G(a, b, e) { + this.props = a; + this.context = b; + this.refs = D; + this.updater = e || B; + } + var H = (G.prototype = new F()); + H.constructor = G; + C(H, E.prototype); + H.isPureReactComponent = true; + var I = Array.isArray; + var J = Object.prototype.hasOwnProperty; + var K = { current: null }; + var L = { key: true, ref: true, __self: true, __source: true }; + function M(a, b, e) { + var d, + c = {}, + k = null, + h = null; + if (b != null) + for (d in (b.ref !== void 0 && (h = b.ref), + b.key !== void 0 && (k = "" + b.key), + b)) + J.call(b, d) && !L.hasOwnProperty(d) && (c[d] = b[d]); + var g = arguments.length - 2; + if (g === 1) c.children = e; + else if (1 < g) { + for (var f = Array(g), m = 0; m < g; m++) f[m] = arguments[m + 2]; + c.children = f; } - }); + if (a && a.defaultProps) + for (d in ((g = a.defaultProps), g)) c[d] === void 0 && (c[d] = g[d]); + return { + $$typeof: l, + type: a, + key: k, + ref: h, + props: c, + _owner: K.current, + }; + } + function N(a, b) { + return { + $$typeof: l, + type: a.type, + key: b, + ref: a.ref, + props: a.props, + _owner: a._owner, + }; + } + function O(a) { + return typeof a === "object" && a !== null && a.$$typeof === l; + } + function escape(a) { + var b = { "=": "=0", ":": "=2" }; + return ( + "$" + + a.replace(/[=:]/g, function (a2) { + return b[a2]; + }) + ); + } + var P = /\/+/g; + function Q(a, b) { + return typeof a === "object" && a !== null && a.key != null + ? escape("" + a.key) + : b.toString(36); + } + function R(a, b, e, d, c) { + var k = typeof a; + if (k === "undefined" || k === "boolean") a = null; + var h = false; + if (a === null) h = true; + else + switch (k) { + case "string": + case "number": + h = true; + break; + case "object": + switch (a.$$typeof) { + case l: + case n: + h = true; + } + } + if (h) + return ( + (h = a), + (c = c(h)), + (a = d === "" ? "." + Q(h, 0) : d), + I(c) + ? ((e = ""), + a != null && (e = a.replace(P, "$&/") + "/"), + R(c, b, e, "", function (a2) { + return a2; + })) + : c != null && + (O(c) && + (c = N( + c, + e + + (!c.key || (h && h.key === c.key) + ? "" + : ("" + c.key).replace(P, "$&/") + "/") + + a + )), + b.push(c)), + 1 + ); + h = 0; + d = d === "" ? "." : d + ":"; + if (I(a)) + for (var g = 0; g < a.length; g++) { + k = a[g]; + var f = d + Q(k, g); + h += R(k, b, e, f, c); + } + else if (((f = A(a)), typeof f === "function")) + for (a = f.call(a), g = 0; !(k = a.next()).done; ) + (k = k.value), (f = d + Q(k, g++)), (h += R(k, b, e, f, c)); + else if (k === "object") + throw ( + ((b = String(a)), + Error( + "Objects are not valid as a React child (found: " + + (b === "[object Object]" + ? "object with keys {" + Object.keys(a).join(", ") + "}" + : b) + + "). If you meant to render a collection of children, use an array instead." + )) + ); + return h; + } + function S(a, b, e) { + if (a == null) return a; + var d = [], + c = 0; + R(a, d, "", "", function (a2) { + return b.call(e, a2, c++); + }); + return d; + } + function T(a) { + if (a._status === -1) { + var b = a._result; + b = b(); + b.then( + function (b2) { + if (a._status === 0 || a._status === -1) + (a._status = 1), (a._result = b2); + }, + function (b2) { + if (a._status === 0 || a._status === -1) + (a._status = 2), (a._result = b2); + } + ); + a._status === -1 && ((a._status = 0), (a._result = b)); + } + if (a._status === 1) return a._result.default; + throw a._result; + } + var U = { current: null }; + var V = { transition: null }; + var W = { + ReactCurrentDispatcher: U, + ReactCurrentBatchConfig: V, + ReactCurrentOwner: K, + }; + exports.Children = { + map: S, + forEach: function (a, b, e) { + S( + a, + function () { + b.apply(this, arguments); + }, + e + ); + }, + count: function (a) { + var b = 0; + S(a, function () { + b++; + }); + return b; + }, + toArray: function (a) { + return ( + S(a, function (a2) { + return a2; + }) || [] + ); + }, + only: function (a) { + if (!O(a)) + throw Error( + "React.Children.only expected to receive a single React element child." + ); + return a; + }, + }; + exports.Component = E; + exports.Fragment = p; + exports.Profiler = r; + exports.PureComponent = G; + exports.StrictMode = q; + exports.Suspense = w; + exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = W; + exports.cloneElement = function (a, b, e) { + if (a === null || a === void 0) + throw Error( + "React.cloneElement(...): The argument must be a React element, but you passed " + + a + + "." + ); + var d = C({}, a.props), + c = a.key, + k = a.ref, + h = a._owner; + if (b != null) { + b.ref !== void 0 && ((k = b.ref), (h = K.current)); + b.key !== void 0 && (c = "" + b.key); + if (a.type && a.type.defaultProps) var g = a.type.defaultProps; + for (f in b) + J.call(b, f) && + !L.hasOwnProperty(f) && + (d[f] = b[f] === void 0 && g !== void 0 ? g[f] : b[f]); + } + var f = arguments.length - 2; + if (f === 1) d.children = e; + else if (1 < f) { + g = Array(f); + for (var m = 0; m < f; m++) g[m] = arguments[m + 2]; + d.children = g; + } + return { + $$typeof: l, + type: a.type, + key: c, + ref: k, + props: d, + _owner: h, + }; + }; + exports.createContext = function (a) { + a = { + $$typeof: u, + _currentValue: a, + _currentValue2: a, + _threadCount: 0, + Provider: null, + Consumer: null, + _defaultValue: null, + _globalName: null, + }; + a.Provider = { $$typeof: t, _context: a }; + return (a.Consumer = a); + }; + exports.createElement = M; + exports.createFactory = function (a) { + var b = M.bind(null, a); + b.type = a; + return b; + }; + exports.createRef = function () { + return { current: null }; + }; + exports.forwardRef = function (a) { + return { $$typeof: v, render: a }; + }; + exports.isValidElement = O; + exports.lazy = function (a) { + return { $$typeof: y, _payload: { _status: -1, _result: a }, _init: T }; + }; + exports.memo = function (a, b) { + return { $$typeof: x, type: a, compare: b === void 0 ? null : b }; + }; + exports.startTransition = function (a) { + var b = V.transition; + V.transition = {}; + try { + a(); + } finally { + V.transition = b; + } + }; + exports.unstable_act = function () { + throw Error("act(...) is not supported in production builds of React."); + }; + exports.useCallback = function (a, b) { + return U.current.useCallback(a, b); + }; + exports.useContext = function (a) { + return U.current.useContext(a); + }; + exports.useDebugValue = function () {}; + exports.useDeferredValue = function (a) { + return U.current.useDeferredValue(a); + }; + exports.useEffect = function (a, b) { + return U.current.useEffect(a, b); + }; + exports.useId = function () { + return U.current.useId(); + }; + exports.useImperativeHandle = function (a, b, e) { + return U.current.useImperativeHandle(a, b, e); + }; + exports.useInsertionEffect = function (a, b) { + return U.current.useInsertionEffect(a, b); + }; + exports.useLayoutEffect = function (a, b) { + return U.current.useLayoutEffect(a, b); + }; + exports.useMemo = function (a, b) { + return U.current.useMemo(a, b); + }; + exports.useReducer = function (a, b, e) { + return U.current.useReducer(a, b, e); + }; + exports.useRef = function (a) { + return U.current.useRef(a); + }; + exports.useState = function (a) { + return U.current.useState(a); + }; + exports.useSyncExternalStore = function (a, b, e) { + return U.current.useSyncExternalStore(a, b, e); + }; + exports.useTransition = function () { + return U.current.useTransition(); + }; + exports.version = "18.2.0"; + }, + }); - // node_modules/react/cjs/react.production.min.js - var require_react_production_min = __commonJS({ - "node_modules/react/cjs/react.production.min.js"(exports) { - "use strict"; - init_process_shim(); - var l = Symbol.for("react.element"); - var n = Symbol.for("react.portal"); - var p = Symbol.for("react.fragment"); - var q = Symbol.for("react.strict_mode"); - var r = Symbol.for("react.profiler"); - var t = Symbol.for("react.provider"); - var u = Symbol.for("react.context"); - var v = Symbol.for("react.forward_ref"); - var w = Symbol.for("react.suspense"); - var x = Symbol.for("react.memo"); - var y = Symbol.for("react.lazy"); - var z = Symbol.iterator; - function A(a) { - if (a === null || typeof a !== "object") - return null; - a = z && a[z] || a["@@iterator"]; - return typeof a === "function" ? a : null; - } - var B = { isMounted: function() { - return false; - }, enqueueForceUpdate: function() { - }, enqueueReplaceState: function() { - }, enqueueSetState: function() { - } }; - var C = Object.assign; - var D = {}; - function E(a, b, e) { - this.props = a; - this.context = b; - this.refs = D; - this.updater = e || B; - } - E.prototype.isReactComponent = {}; - E.prototype.setState = function(a, b) { - if (typeof a !== "object" && typeof a !== "function" && a != null) - throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables."); - this.updater.enqueueSetState(this, a, b, "setState"); - }; - E.prototype.forceUpdate = function(a) { - this.updater.enqueueForceUpdate(this, a, "forceUpdate"); - }; - function F() { - } - F.prototype = E.prototype; - function G(a, b, e) { - this.props = a; - this.context = b; - this.refs = D; - this.updater = e || B; - } - var H = G.prototype = new F(); - H.constructor = G; - C(H, E.prototype); - H.isPureReactComponent = true; - var I = Array.isArray; - var J = Object.prototype.hasOwnProperty; - var K = { current: null }; - var L = { key: true, ref: true, __self: true, __source: true }; - function M(a, b, e) { - var d, c = {}, k = null, h = null; - if (b != null) - for (d in b.ref !== void 0 && (h = b.ref), b.key !== void 0 && (k = "" + b.key), b) - J.call(b, d) && !L.hasOwnProperty(d) && (c[d] = b[d]); - var g = arguments.length - 2; - if (g === 1) - c.children = e; - else if (1 < g) { - for (var f = Array(g), m = 0; m < g; m++) - f[m] = arguments[m + 2]; - c.children = f; - } - if (a && a.defaultProps) - for (d in g = a.defaultProps, g) - c[d] === void 0 && (c[d] = g[d]); - return { $$typeof: l, type: a, key: k, ref: h, props: c, _owner: K.current }; - } - function N(a, b) { - return { $$typeof: l, type: a.type, key: b, ref: a.ref, props: a.props, _owner: a._owner }; - } - function O(a) { - return typeof a === "object" && a !== null && a.$$typeof === l; - } - function escape(a) { - var b = { "=": "=0", ":": "=2" }; - return "$" + a.replace(/[=:]/g, function(a2) { - return b[a2]; - }); - } - var P = /\/+/g; - function Q(a, b) { - return typeof a === "object" && a !== null && a.key != null ? escape("" + a.key) : b.toString(36); - } - function R(a, b, e, d, c) { - var k = typeof a; - if (k === "undefined" || k === "boolean") - a = null; - var h = false; - if (a === null) - h = true; - else - switch (k) { - case "string": - case "number": - h = true; - break; - case "object": - switch (a.$$typeof) { - case l: - case n: - h = true; - } - } - if (h) - return h = a, c = c(h), a = d === "" ? "." + Q(h, 0) : d, I(c) ? (e = "", a != null && (e = a.replace(P, "$&/") + "/"), R(c, b, e, "", function(a2) { - return a2; - })) : c != null && (O(c) && (c = N(c, e + (!c.key || h && h.key === c.key ? "" : ("" + c.key).replace(P, "$&/") + "/") + a)), b.push(c)), 1; - h = 0; - d = d === "" ? "." : d + ":"; - if (I(a)) - for (var g = 0; g < a.length; g++) { - k = a[g]; - var f = d + Q(k, g); - h += R(k, b, e, f, c); - } - else if (f = A(a), typeof f === "function") - for (a = f.call(a), g = 0; !(k = a.next()).done; ) - k = k.value, f = d + Q(k, g++), h += R(k, b, e, f, c); - else if (k === "object") - throw b = String(a), Error("Objects are not valid as a React child (found: " + (b === "[object Object]" ? "object with keys {" + Object.keys(a).join(", ") + "}" : b) + "). If you meant to render a collection of children, use an array instead."); - return h; - } - function S(a, b, e) { - if (a == null) - return a; - var d = [], c = 0; - R(a, d, "", "", function(a2) { - return b.call(e, a2, c++); - }); - return d; - } - function T(a) { - if (a._status === -1) { - var b = a._result; - b = b(); - b.then(function(b2) { - if (a._status === 0 || a._status === -1) - a._status = 1, a._result = b2; - }, function(b2) { - if (a._status === 0 || a._status === -1) - a._status = 2, a._result = b2; - }); - a._status === -1 && (a._status = 0, a._result = b); - } - if (a._status === 1) - return a._result.default; - throw a._result; - } - var U = { current: null }; - var V = { transition: null }; - var W = { ReactCurrentDispatcher: U, ReactCurrentBatchConfig: V, ReactCurrentOwner: K }; - exports.Children = { map: S, forEach: function(a, b, e) { - S(a, function() { - b.apply(this, arguments); - }, e); - }, count: function(a) { - var b = 0; - S(a, function() { - b++; - }); - return b; - }, toArray: function(a) { - return S(a, function(a2) { - return a2; - }) || []; - }, only: function(a) { - if (!O(a)) - throw Error("React.Children.only expected to receive a single React element child."); - return a; - } }; - exports.Component = E; - exports.Fragment = p; - exports.Profiler = r; - exports.PureComponent = G; - exports.StrictMode = q; - exports.Suspense = w; - exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = W; - exports.cloneElement = function(a, b, e) { - if (a === null || a === void 0) - throw Error("React.cloneElement(...): The argument must be a React element, but you passed " + a + "."); - var d = C({}, a.props), c = a.key, k = a.ref, h = a._owner; - if (b != null) { - b.ref !== void 0 && (k = b.ref, h = K.current); - b.key !== void 0 && (c = "" + b.key); - if (a.type && a.type.defaultProps) - var g = a.type.defaultProps; - for (f in b) - J.call(b, f) && !L.hasOwnProperty(f) && (d[f] = b[f] === void 0 && g !== void 0 ? g[f] : b[f]); - } - var f = arguments.length - 2; - if (f === 1) - d.children = e; - else if (1 < f) { - g = Array(f); - for (var m = 0; m < f; m++) - g[m] = arguments[m + 2]; - d.children = g; - } - return { $$typeof: l, type: a.type, key: c, ref: k, props: d, _owner: h }; - }; - exports.createContext = function(a) { - a = { $$typeof: u, _currentValue: a, _currentValue2: a, _threadCount: 0, Provider: null, Consumer: null, _defaultValue: null, _globalName: null }; - a.Provider = { $$typeof: t, _context: a }; - return a.Consumer = a; - }; - exports.createElement = M; - exports.createFactory = function(a) { - var b = M.bind(null, a); - b.type = a; - return b; + // node_modules/react/cjs/react.development.js + var require_react_development = __commonJS({ + "node_modules/react/cjs/react.development.js"(exports, module) { + "use strict"; + init_process_shim(); + if (process.env.NODE_ENV !== "production") { + (function () { + "use strict"; + if ( + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === + "function" + ) { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart( + new Error() + ); + } + var ReactVersion = "18.2.0"; + var REACT_ELEMENT_TYPE = Symbol.for("react.element"); + var REACT_PORTAL_TYPE = Symbol.for("react.portal"); + var REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"); + var REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"); + var REACT_PROFILER_TYPE = Symbol.for("react.profiler"); + var REACT_PROVIDER_TYPE = Symbol.for("react.provider"); + var REACT_CONTEXT_TYPE = Symbol.for("react.context"); + var REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"); + var REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"); + var REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list"); + var REACT_MEMO_TYPE = Symbol.for("react.memo"); + var REACT_LAZY_TYPE = Symbol.for("react.lazy"); + var REACT_OFFSCREEN_TYPE = Symbol.for("react.offscreen"); + var MAYBE_ITERATOR_SYMBOL = Symbol.iterator; + var FAUX_ITERATOR_SYMBOL = "@@iterator"; + function getIteratorFn(maybeIterable) { + if (maybeIterable === null || typeof maybeIterable !== "object") { + return null; + } + var maybeIterator = + (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) || + maybeIterable[FAUX_ITERATOR_SYMBOL]; + if (typeof maybeIterator === "function") { + return maybeIterator; + } + return null; + } + var ReactCurrentDispatcher = { + current: null, + }; + var ReactCurrentBatchConfig = { + transition: null, + }; + var ReactCurrentActQueue = { + current: null, + isBatchingLegacy: false, + didScheduleLegacyUpdate: false, + }; + var ReactCurrentOwner = { + current: null, + }; + var ReactDebugCurrentFrame = {}; + var currentExtraStackFrame = null; + function setExtraStackFrame(stack) { + { + currentExtraStackFrame = stack; + } + } + { + ReactDebugCurrentFrame.setExtraStackFrame = function (stack) { + { + currentExtraStackFrame = stack; + } }; - exports.createRef = function() { - return { current: null }; + ReactDebugCurrentFrame.getCurrentStack = null; + ReactDebugCurrentFrame.getStackAddendum = function () { + var stack = ""; + if (currentExtraStackFrame) { + stack += currentExtraStackFrame; + } + var impl = ReactDebugCurrentFrame.getCurrentStack; + if (impl) { + stack += impl() || ""; + } + return stack; }; - exports.forwardRef = function(a) { - return { $$typeof: v, render: a }; + } + var enableScopeAPI = false; + var enableCacheElement = false; + var enableTransitionTracing = false; + var enableLegacyHidden = false; + var enableDebugTracing = false; + var ReactSharedInternals = { + ReactCurrentDispatcher, + ReactCurrentBatchConfig, + ReactCurrentOwner, + }; + { + ReactSharedInternals.ReactDebugCurrentFrame = + ReactDebugCurrentFrame; + ReactSharedInternals.ReactCurrentActQueue = ReactCurrentActQueue; + } + function warn(format) { + { + { + for ( + var _len = arguments.length, + args = new Array(_len > 1 ? _len - 1 : 0), + _key = 1; + _key < _len; + _key++ + ) { + args[_key - 1] = arguments[_key]; + } + printWarning("warn", format, args); + } + } + } + function error(format) { + { + { + for ( + var _len2 = arguments.length, + args = new Array(_len2 > 1 ? _len2 - 1 : 0), + _key2 = 1; + _key2 < _len2; + _key2++ + ) { + args[_key2 - 1] = arguments[_key2]; + } + printWarning("error", format, args); + } + } + } + function printWarning(level, format, args) { + { + var ReactDebugCurrentFrame2 = + ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame2.getStackAddendum(); + if (stack !== "") { + format += "%s"; + args = args.concat([stack]); + } + var argsWithFormat = args.map(function (item) { + return String(item); + }); + argsWithFormat.unshift("Warning: " + format); + Function.prototype.apply.call( + console[level], + console, + argsWithFormat + ); + } + } + var didWarnStateUpdateForUnmountedComponent = {}; + function warnNoop(publicInstance, callerName) { + { + var _constructor = publicInstance.constructor; + var componentName = + (_constructor && + (_constructor.displayName || _constructor.name)) || + "ReactClass"; + var warningKey = componentName + "." + callerName; + if (didWarnStateUpdateForUnmountedComponent[warningKey]) { + return; + } + error( + "Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.", + callerName, + componentName + ); + didWarnStateUpdateForUnmountedComponent[warningKey] = true; + } + } + var ReactNoopUpdateQueue = { + isMounted: function (publicInstance) { + return false; + }, + enqueueForceUpdate: function ( + publicInstance, + callback, + callerName + ) { + warnNoop(publicInstance, "forceUpdate"); + }, + enqueueReplaceState: function ( + publicInstance, + completeState, + callback, + callerName + ) { + warnNoop(publicInstance, "replaceState"); + }, + enqueueSetState: function ( + publicInstance, + partialState, + callback, + callerName + ) { + warnNoop(publicInstance, "setState"); + }, + }; + var assign = Object.assign; + var emptyObject = {}; + { + Object.freeze(emptyObject); + } + function Component(props, context, updater) { + this.props = props; + this.context = context; + this.refs = emptyObject; + this.updater = updater || ReactNoopUpdateQueue; + } + Component.prototype.isReactComponent = {}; + Component.prototype.setState = function (partialState, callback) { + if ( + typeof partialState !== "object" && + typeof partialState !== "function" && + partialState != null + ) { + throw new Error( + "setState(...): takes an object of state variables to update or a function which returns an object of state variables." + ); + } + this.updater.enqueueSetState( + this, + partialState, + callback, + "setState" + ); + }; + Component.prototype.forceUpdate = function (callback) { + this.updater.enqueueForceUpdate(this, callback, "forceUpdate"); + }; + { + var deprecatedAPIs = { + isMounted: [ + "isMounted", + "Instead, make sure to clean up subscriptions and pending requests in componentWillUnmount to prevent memory leaks.", + ], + replaceState: [ + "replaceState", + "Refactor your code to use setState instead (see https://github.com/facebook/react/issues/3236).", + ], }; - exports.isValidElement = O; - exports.lazy = function(a) { - return { $$typeof: y, _payload: { _status: -1, _result: a }, _init: T }; + var defineDeprecationWarning = function (methodName, info) { + Object.defineProperty(Component.prototype, methodName, { + get: function () { + warn( + "%s(...) is deprecated in plain JavaScript React classes. %s", + info[0], + info[1] + ); + return void 0; + }, + }); }; - exports.memo = function(a, b) { - return { $$typeof: x, type: a, compare: b === void 0 ? null : b }; + for (var fnName in deprecatedAPIs) { + if (deprecatedAPIs.hasOwnProperty(fnName)) { + defineDeprecationWarning(fnName, deprecatedAPIs[fnName]); + } + } + } + function ComponentDummy() {} + ComponentDummy.prototype = Component.prototype; + function PureComponent(props, context, updater) { + this.props = props; + this.context = context; + this.refs = emptyObject; + this.updater = updater || ReactNoopUpdateQueue; + } + var pureComponentPrototype = (PureComponent.prototype = + new ComponentDummy()); + pureComponentPrototype.constructor = PureComponent; + assign(pureComponentPrototype, Component.prototype); + pureComponentPrototype.isPureReactComponent = true; + function createRef() { + var refObject = { + current: null, }; - exports.startTransition = function(a) { - var b = V.transition; - V.transition = {}; - try { - a(); - } finally { - V.transition = b; + { + Object.seal(refObject); + } + return refObject; + } + var isArrayImpl = Array.isArray; + function isArray(a) { + return isArrayImpl(a); + } + function typeName(value) { + { + var hasToStringTag = + typeof Symbol === "function" && Symbol.toStringTag; + var type = + (hasToStringTag && value[Symbol.toStringTag]) || + value.constructor.name || + "Object"; + return type; + } + } + function willCoercionThrow(value) { + { + try { + testStringCoercion(value); + return false; + } catch (e) { + return true; + } + } + } + function testStringCoercion(value) { + return "" + value; + } + function checkKeyStringCoercion(value) { + { + if (willCoercionThrow(value)) { + error( + "The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.", + typeName(value) + ); + return testStringCoercion(value); + } + } + } + function getWrappedName(outerType, innerType, wrapperName) { + var displayName = outerType.displayName; + if (displayName) { + return displayName; + } + var functionName = innerType.displayName || innerType.name || ""; + return functionName !== "" + ? wrapperName + "(" + functionName + ")" + : wrapperName; + } + function getContextName(type) { + return type.displayName || "Context"; + } + function getComponentNameFromType(type) { + if (type == null) { + return null; + } + { + if (typeof type.tag === "number") { + error( + "Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue." + ); + } + } + if (typeof type === "function") { + return type.displayName || type.name || null; + } + if (typeof type === "string") { + return type; + } + switch (type) { + case REACT_FRAGMENT_TYPE: + return "Fragment"; + case REACT_PORTAL_TYPE: + return "Portal"; + case REACT_PROFILER_TYPE: + return "Profiler"; + case REACT_STRICT_MODE_TYPE: + return "StrictMode"; + case REACT_SUSPENSE_TYPE: + return "Suspense"; + case REACT_SUSPENSE_LIST_TYPE: + return "SuspenseList"; + } + if (typeof type === "object") { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + var context = type; + return getContextName(context) + ".Consumer"; + case REACT_PROVIDER_TYPE: + var provider = type; + return getContextName(provider._context) + ".Provider"; + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, "ForwardRef"); + case REACT_MEMO_TYPE: + var outerName = type.displayName || null; + if (outerName !== null) { + return outerName; + } + return getComponentNameFromType(type.type) || "Memo"; + case REACT_LAZY_TYPE: { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + try { + return getComponentNameFromType(init(payload)); + } catch (x) { + return null; + } + } + } + } + return null; + } + var hasOwnProperty = Object.prototype.hasOwnProperty; + var RESERVED_PROPS = { + key: true, + ref: true, + __self: true, + __source: true, + }; + var specialPropKeyWarningShown, + specialPropRefWarningShown, + didWarnAboutStringRefs; + { + didWarnAboutStringRefs = {}; + } + function hasValidRef(config) { + { + if (hasOwnProperty.call(config, "ref")) { + var getter = Object.getOwnPropertyDescriptor(config, "ref").get; + if (getter && getter.isReactWarning) { + return false; } + } + } + return config.ref !== void 0; + } + function hasValidKey(config) { + { + if (hasOwnProperty.call(config, "key")) { + var getter = Object.getOwnPropertyDescriptor(config, "key").get; + if (getter && getter.isReactWarning) { + return false; + } + } + } + return config.key !== void 0; + } + function defineKeyPropWarningGetter(props, displayName) { + var warnAboutAccessingKey = function () { + { + if (!specialPropKeyWarningShown) { + specialPropKeyWarningShown = true; + error( + "%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)", + displayName + ); + } + } }; - exports.unstable_act = function() { - throw Error("act(...) is not supported in production builds of React."); - }; - exports.useCallback = function(a, b) { - return U.current.useCallback(a, b); - }; - exports.useContext = function(a) { - return U.current.useContext(a); - }; - exports.useDebugValue = function() { - }; - exports.useDeferredValue = function(a) { - return U.current.useDeferredValue(a); - }; - exports.useEffect = function(a, b) { - return U.current.useEffect(a, b); - }; - exports.useId = function() { - return U.current.useId(); - }; - exports.useImperativeHandle = function(a, b, e) { - return U.current.useImperativeHandle(a, b, e); + warnAboutAccessingKey.isReactWarning = true; + Object.defineProperty(props, "key", { + get: warnAboutAccessingKey, + configurable: true, + }); + } + function defineRefPropWarningGetter(props, displayName) { + var warnAboutAccessingRef = function () { + { + if (!specialPropRefWarningShown) { + specialPropRefWarningShown = true; + error( + "%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)", + displayName + ); + } + } }; - exports.useInsertionEffect = function(a, b) { - return U.current.useInsertionEffect(a, b); + warnAboutAccessingRef.isReactWarning = true; + Object.defineProperty(props, "ref", { + get: warnAboutAccessingRef, + configurable: true, + }); + } + function warnIfStringRefCannotBeAutoConverted(config) { + { + if ( + typeof config.ref === "string" && + ReactCurrentOwner.current && + config.__self && + ReactCurrentOwner.current.stateNode !== config.__self + ) { + var componentName = getComponentNameFromType( + ReactCurrentOwner.current.type + ); + if (!didWarnAboutStringRefs[componentName]) { + error( + 'Component "%s" contains the string ref "%s". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref', + componentName, + config.ref + ); + didWarnAboutStringRefs[componentName] = true; + } + } + } + } + var ReactElement = function ( + type, + key, + ref, + self2, + source, + owner, + props + ) { + var element = { + $$typeof: REACT_ELEMENT_TYPE, + type, + key, + ref, + props, + _owner: owner, }; - exports.useLayoutEffect = function(a, b) { - return U.current.useLayoutEffect(a, b); + { + element._store = {}; + Object.defineProperty(element._store, "validated", { + configurable: false, + enumerable: false, + writable: true, + value: false, + }); + Object.defineProperty(element, "_self", { + configurable: false, + enumerable: false, + writable: false, + value: self2, + }); + Object.defineProperty(element, "_source", { + configurable: false, + enumerable: false, + writable: false, + value: source, + }); + if (Object.freeze) { + Object.freeze(element.props); + Object.freeze(element); + } + } + return element; + }; + function createElement(type, config, children) { + var propName; + var props = {}; + var key = null; + var ref = null; + var self2 = null; + var source = null; + if (config != null) { + if (hasValidRef(config)) { + ref = config.ref; + { + warnIfStringRefCannotBeAutoConverted(config); + } + } + if (hasValidKey(config)) { + { + checkKeyStringCoercion(config.key); + } + key = "" + config.key; + } + self2 = config.__self === void 0 ? null : config.__self; + source = config.__source === void 0 ? null : config.__source; + for (propName in config) { + if ( + hasOwnProperty.call(config, propName) && + !RESERVED_PROPS.hasOwnProperty(propName) + ) { + props[propName] = config[propName]; + } + } + } + var childrenLength = arguments.length - 2; + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + { + if (Object.freeze) { + Object.freeze(childArray); + } + } + props.children = childArray; + } + if (type && type.defaultProps) { + var defaultProps = type.defaultProps; + for (propName in defaultProps) { + if (props[propName] === void 0) { + props[propName] = defaultProps[propName]; + } + } + } + { + if (key || ref) { + var displayName = + typeof type === "function" + ? type.displayName || type.name || "Unknown" + : type; + if (key) { + defineKeyPropWarningGetter(props, displayName); + } + if (ref) { + defineRefPropWarningGetter(props, displayName); + } + } + } + return ReactElement( + type, + key, + ref, + self2, + source, + ReactCurrentOwner.current, + props + ); + } + function cloneAndReplaceKey(oldElement, newKey) { + var newElement = ReactElement( + oldElement.type, + newKey, + oldElement.ref, + oldElement._self, + oldElement._source, + oldElement._owner, + oldElement.props + ); + return newElement; + } + function cloneElement(element, config, children) { + if (element === null || element === void 0) { + throw new Error( + "React.cloneElement(...): The argument must be a React element, but you passed " + + element + + "." + ); + } + var propName; + var props = assign({}, element.props); + var key = element.key; + var ref = element.ref; + var self2 = element._self; + var source = element._source; + var owner = element._owner; + if (config != null) { + if (hasValidRef(config)) { + ref = config.ref; + owner = ReactCurrentOwner.current; + } + if (hasValidKey(config)) { + { + checkKeyStringCoercion(config.key); + } + key = "" + config.key; + } + var defaultProps; + if (element.type && element.type.defaultProps) { + defaultProps = element.type.defaultProps; + } + for (propName in config) { + if ( + hasOwnProperty.call(config, propName) && + !RESERVED_PROPS.hasOwnProperty(propName) + ) { + if (config[propName] === void 0 && defaultProps !== void 0) { + props[propName] = defaultProps[propName]; + } else { + props[propName] = config[propName]; + } + } + } + } + var childrenLength = arguments.length - 2; + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + props.children = childArray; + } + return ReactElement( + element.type, + key, + ref, + self2, + source, + owner, + props + ); + } + function isValidElement(object) { + return ( + typeof object === "object" && + object !== null && + object.$$typeof === REACT_ELEMENT_TYPE + ); + } + var SEPARATOR = "."; + var SUBSEPARATOR = ":"; + function escape(key) { + var escapeRegex = /[=:]/g; + var escaperLookup = { + "=": "=0", + ":": "=2", }; - exports.useMemo = function(a, b) { - return U.current.useMemo(a, b); + var escapedString = key.replace(escapeRegex, function (match) { + return escaperLookup[match]; + }); + return "$" + escapedString; + } + var didWarnAboutMaps = false; + var userProvidedKeyEscapeRegex = /\/+/g; + function escapeUserProvidedKey(text) { + return text.replace(userProvidedKeyEscapeRegex, "$&/"); + } + function getElementKey(element, index) { + if ( + typeof element === "object" && + element !== null && + element.key != null + ) { + { + checkKeyStringCoercion(element.key); + } + return escape("" + element.key); + } + return index.toString(36); + } + function mapIntoArray( + children, + array, + escapedPrefix, + nameSoFar, + callback + ) { + var type = typeof children; + if (type === "undefined" || type === "boolean") { + children = null; + } + var invokeCallback = false; + if (children === null) { + invokeCallback = true; + } else { + switch (type) { + case "string": + case "number": + invokeCallback = true; + break; + case "object": + switch (children.$$typeof) { + case REACT_ELEMENT_TYPE: + case REACT_PORTAL_TYPE: + invokeCallback = true; + } + } + } + if (invokeCallback) { + var _child = children; + var mappedChild = callback(_child); + var childKey = + nameSoFar === "" + ? SEPARATOR + getElementKey(_child, 0) + : nameSoFar; + if (isArray(mappedChild)) { + var escapedChildKey = ""; + if (childKey != null) { + escapedChildKey = escapeUserProvidedKey(childKey) + "/"; + } + mapIntoArray( + mappedChild, + array, + escapedChildKey, + "", + function (c) { + return c; + } + ); + } else if (mappedChild != null) { + if (isValidElement(mappedChild)) { + { + if ( + mappedChild.key && + (!_child || _child.key !== mappedChild.key) + ) { + checkKeyStringCoercion(mappedChild.key); + } + } + mappedChild = cloneAndReplaceKey( + mappedChild, + escapedPrefix + + (mappedChild.key && + (!_child || _child.key !== mappedChild.key) + ? escapeUserProvidedKey("" + mappedChild.key) + "/" + : "") + + childKey + ); + } + array.push(mappedChild); + } + return 1; + } + var child; + var nextName; + var subtreeCount = 0; + var nextNamePrefix = + nameSoFar === "" ? SEPARATOR : nameSoFar + SUBSEPARATOR; + if (isArray(children)) { + for (var i = 0; i < children.length; i++) { + child = children[i]; + nextName = nextNamePrefix + getElementKey(child, i); + subtreeCount += mapIntoArray( + child, + array, + escapedPrefix, + nextName, + callback + ); + } + } else { + var iteratorFn = getIteratorFn(children); + if (typeof iteratorFn === "function") { + var iterableChildren = children; + { + if (iteratorFn === iterableChildren.entries) { + if (!didWarnAboutMaps) { + warn( + "Using Maps as children is not supported. Use an array of keyed ReactElements instead." + ); + } + didWarnAboutMaps = true; + } + } + var iterator = iteratorFn.call(iterableChildren); + var step; + var ii = 0; + while (!(step = iterator.next()).done) { + child = step.value; + nextName = nextNamePrefix + getElementKey(child, ii++); + subtreeCount += mapIntoArray( + child, + array, + escapedPrefix, + nextName, + callback + ); + } + } else if (type === "object") { + var childrenString = String(children); + throw new Error( + "Objects are not valid as a React child (found: " + + (childrenString === "[object Object]" + ? "object with keys {" + + Object.keys(children).join(", ") + + "}" + : childrenString) + + "). If you meant to render a collection of children, use an array instead." + ); + } + } + return subtreeCount; + } + function mapChildren(children, func, context) { + if (children == null) { + return children; + } + var result = []; + var count = 0; + mapIntoArray(children, result, "", "", function (child) { + return func.call(context, child, count++); + }); + return result; + } + function countChildren(children) { + var n = 0; + mapChildren(children, function () { + n++; + }); + return n; + } + function forEachChildren(children, forEachFunc, forEachContext) { + mapChildren( + children, + function () { + forEachFunc.apply(this, arguments); + }, + forEachContext + ); + } + function toArray(children) { + return ( + mapChildren(children, function (child) { + return child; + }) || [] + ); + } + function onlyChild(children) { + if (!isValidElement(children)) { + throw new Error( + "React.Children.only expected to receive a single React element child." + ); + } + return children; + } + function createContext(defaultValue) { + var context = { + $$typeof: REACT_CONTEXT_TYPE, + _currentValue: defaultValue, + _currentValue2: defaultValue, + _threadCount: 0, + Provider: null, + Consumer: null, + _defaultValue: null, + _globalName: null, }; - exports.useReducer = function(a, b, e) { - return U.current.useReducer(a, b, e); + context.Provider = { + $$typeof: REACT_PROVIDER_TYPE, + _context: context, }; - exports.useRef = function(a) { - return U.current.useRef(a); + var hasWarnedAboutUsingNestedContextConsumers = false; + var hasWarnedAboutUsingConsumerProvider = false; + var hasWarnedAboutDisplayNameOnConsumer = false; + { + var Consumer = { + $$typeof: REACT_CONTEXT_TYPE, + _context: context, + }; + Object.defineProperties(Consumer, { + Provider: { + get: function () { + if (!hasWarnedAboutUsingConsumerProvider) { + hasWarnedAboutUsingConsumerProvider = true; + error( + "Rendering is not supported and will be removed in a future major release. Did you mean to render instead?" + ); + } + return context.Provider; + }, + set: function (_Provider) { + context.Provider = _Provider; + }, + }, + _currentValue: { + get: function () { + return context._currentValue; + }, + set: function (_currentValue) { + context._currentValue = _currentValue; + }, + }, + _currentValue2: { + get: function () { + return context._currentValue2; + }, + set: function (_currentValue2) { + context._currentValue2 = _currentValue2; + }, + }, + _threadCount: { + get: function () { + return context._threadCount; + }, + set: function (_threadCount) { + context._threadCount = _threadCount; + }, + }, + Consumer: { + get: function () { + if (!hasWarnedAboutUsingNestedContextConsumers) { + hasWarnedAboutUsingNestedContextConsumers = true; + error( + "Rendering is not supported and will be removed in a future major release. Did you mean to render instead?" + ); + } + return context.Consumer; + }, + }, + displayName: { + get: function () { + return context.displayName; + }, + set: function (displayName) { + if (!hasWarnedAboutDisplayNameOnConsumer) { + warn( + "Setting `displayName` on Context.Consumer has no effect. You should set it directly on the context with Context.displayName = '%s'.", + displayName + ); + hasWarnedAboutDisplayNameOnConsumer = true; + } + }, + }, + }); + context.Consumer = Consumer; + } + { + context._currentRenderer = null; + context._currentRenderer2 = null; + } + return context; + } + var Uninitialized = -1; + var Pending = 0; + var Resolved = 1; + var Rejected = 2; + function lazyInitializer(payload) { + if (payload._status === Uninitialized) { + var ctor = payload._result; + var thenable = ctor(); + thenable.then( + function (moduleObject2) { + if ( + payload._status === Pending || + payload._status === Uninitialized + ) { + var resolved = payload; + resolved._status = Resolved; + resolved._result = moduleObject2; + } + }, + function (error2) { + if ( + payload._status === Pending || + payload._status === Uninitialized + ) { + var rejected = payload; + rejected._status = Rejected; + rejected._result = error2; + } + } + ); + if (payload._status === Uninitialized) { + var pending = payload; + pending._status = Pending; + pending._result = thenable; + } + } + if (payload._status === Resolved) { + var moduleObject = payload._result; + { + if (moduleObject === void 0) { + error( + "lazy: Expected the result of a dynamic import() call. Instead received: %s\n\nYour code should look like: \n const MyComponent = lazy(() => import('./MyComponent'))\n\nDid you accidentally put curly braces around the import?", + moduleObject + ); + } + } + { + if (!("default" in moduleObject)) { + error( + "lazy: Expected the result of a dynamic import() call. Instead received: %s\n\nYour code should look like: \n const MyComponent = lazy(() => import('./MyComponent'))", + moduleObject + ); + } + } + return moduleObject.default; + } else { + throw payload._result; + } + } + function lazy(ctor) { + var payload = { + _status: Uninitialized, + _result: ctor, }; - exports.useState = function(a) { - return U.current.useState(a); + var lazyType = { + $$typeof: REACT_LAZY_TYPE, + _payload: payload, + _init: lazyInitializer, }; - exports.useSyncExternalStore = function(a, b, e) { - return U.current.useSyncExternalStore(a, b, e); + { + var defaultProps; + var propTypes; + Object.defineProperties(lazyType, { + defaultProps: { + configurable: true, + get: function () { + return defaultProps; + }, + set: function (newDefaultProps) { + error( + "React.lazy(...): It is not supported to assign `defaultProps` to a lazy component import. Either specify them where the component is defined, or create a wrapping component around it." + ); + defaultProps = newDefaultProps; + Object.defineProperty(lazyType, "defaultProps", { + enumerable: true, + }); + }, + }, + propTypes: { + configurable: true, + get: function () { + return propTypes; + }, + set: function (newPropTypes) { + error( + "React.lazy(...): It is not supported to assign `propTypes` to a lazy component import. Either specify them where the component is defined, or create a wrapping component around it." + ); + propTypes = newPropTypes; + Object.defineProperty(lazyType, "propTypes", { + enumerable: true, + }); + }, + }, + }); + } + return lazyType; + } + function forwardRef(render) { + { + if (render != null && render.$$typeof === REACT_MEMO_TYPE) { + error( + "forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))." + ); + } else if (typeof render !== "function") { + error( + "forwardRef requires a render function but was given %s.", + render === null ? "null" : typeof render + ); + } else { + if (render.length !== 0 && render.length !== 2) { + error( + "forwardRef render functions accept exactly two parameters: props and ref. %s", + render.length === 1 + ? "Did you forget to use the ref parameter?" + : "Any additional parameter will be undefined." + ); + } + } + if (render != null) { + if (render.defaultProps != null || render.propTypes != null) { + error( + "forwardRef render functions do not support propTypes or defaultProps. Did you accidentally pass a React component?" + ); + } + } + } + var elementType = { + $$typeof: REACT_FORWARD_REF_TYPE, + render, }; - exports.useTransition = function() { - return U.current.useTransition(); + { + var ownName; + Object.defineProperty(elementType, "displayName", { + enumerable: false, + configurable: true, + get: function () { + return ownName; + }, + set: function (name) { + ownName = name; + if (!render.name && !render.displayName) { + render.displayName = name; + } + }, + }); + } + return elementType; + } + var REACT_MODULE_REFERENCE; + { + REACT_MODULE_REFERENCE = Symbol.for("react.module.reference"); + } + function isValidElementType(type) { + if (typeof type === "string" || typeof type === "function") { + return true; + } + if ( + type === REACT_FRAGMENT_TYPE || + type === REACT_PROFILER_TYPE || + enableDebugTracing || + type === REACT_STRICT_MODE_TYPE || + type === REACT_SUSPENSE_TYPE || + type === REACT_SUSPENSE_LIST_TYPE || + enableLegacyHidden || + type === REACT_OFFSCREEN_TYPE || + enableScopeAPI || + enableCacheElement || + enableTransitionTracing + ) { + return true; + } + if (typeof type === "object" && type !== null) { + if ( + type.$$typeof === REACT_LAZY_TYPE || + type.$$typeof === REACT_MEMO_TYPE || + type.$$typeof === REACT_PROVIDER_TYPE || + type.$$typeof === REACT_CONTEXT_TYPE || + type.$$typeof === REACT_FORWARD_REF_TYPE || + type.$$typeof === REACT_MODULE_REFERENCE || + type.getModuleId !== void 0 + ) { + return true; + } + } + return false; + } + function memo(type, compare) { + { + if (!isValidElementType(type)) { + error( + "memo: The first argument must be a component. Instead received: %s", + type === null ? "null" : typeof type + ); + } + } + var elementType = { + $$typeof: REACT_MEMO_TYPE, + type, + compare: compare === void 0 ? null : compare, }; - exports.version = "18.2.0"; - } - }); - - // node_modules/react/cjs/react.development.js - var require_react_development = __commonJS({ - "node_modules/react/cjs/react.development.js"(exports, module) { - "use strict"; - init_process_shim(); - if (process.env.NODE_ENV !== "production") { - (function() { - "use strict"; - if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === "function") { - __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); - } - var ReactVersion = "18.2.0"; - var REACT_ELEMENT_TYPE = Symbol.for("react.element"); - var REACT_PORTAL_TYPE = Symbol.for("react.portal"); - var REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"); - var REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"); - var REACT_PROFILER_TYPE = Symbol.for("react.profiler"); - var REACT_PROVIDER_TYPE = Symbol.for("react.provider"); - var REACT_CONTEXT_TYPE = Symbol.for("react.context"); - var REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"); - var REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"); - var REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list"); - var REACT_MEMO_TYPE = Symbol.for("react.memo"); - var REACT_LAZY_TYPE = Symbol.for("react.lazy"); - var REACT_OFFSCREEN_TYPE = Symbol.for("react.offscreen"); - var MAYBE_ITERATOR_SYMBOL = Symbol.iterator; - var FAUX_ITERATOR_SYMBOL = "@@iterator"; - function getIteratorFn(maybeIterable) { - if (maybeIterable === null || typeof maybeIterable !== "object") { - return null; - } - var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; - if (typeof maybeIterator === "function") { - return maybeIterator; - } - return null; - } - var ReactCurrentDispatcher = { - current: null - }; - var ReactCurrentBatchConfig = { - transition: null - }; - var ReactCurrentActQueue = { - current: null, - isBatchingLegacy: false, - didScheduleLegacyUpdate: false - }; - var ReactCurrentOwner = { - current: null - }; - var ReactDebugCurrentFrame = {}; - var currentExtraStackFrame = null; - function setExtraStackFrame(stack) { - { - currentExtraStackFrame = stack; - } - } - { - ReactDebugCurrentFrame.setExtraStackFrame = function(stack) { - { - currentExtraStackFrame = stack; - } - }; - ReactDebugCurrentFrame.getCurrentStack = null; - ReactDebugCurrentFrame.getStackAddendum = function() { - var stack = ""; - if (currentExtraStackFrame) { - stack += currentExtraStackFrame; - } - var impl = ReactDebugCurrentFrame.getCurrentStack; - if (impl) { - stack += impl() || ""; - } - return stack; - }; - } - var enableScopeAPI = false; - var enableCacheElement = false; - var enableTransitionTracing = false; - var enableLegacyHidden = false; - var enableDebugTracing = false; - var ReactSharedInternals = { - ReactCurrentDispatcher, - ReactCurrentBatchConfig, - ReactCurrentOwner - }; - { - ReactSharedInternals.ReactDebugCurrentFrame = ReactDebugCurrentFrame; - ReactSharedInternals.ReactCurrentActQueue = ReactCurrentActQueue; - } - function warn(format) { - { - { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - printWarning("warn", format, args); - } - } - } - function error(format) { - { - { - for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - args[_key2 - 1] = arguments[_key2]; - } - printWarning("error", format, args); - } - } - } - function printWarning(level, format, args) { - { - var ReactDebugCurrentFrame2 = ReactSharedInternals.ReactDebugCurrentFrame; - var stack = ReactDebugCurrentFrame2.getStackAddendum(); - if (stack !== "") { - format += "%s"; - args = args.concat([stack]); - } - var argsWithFormat = args.map(function(item) { - return String(item); - }); - argsWithFormat.unshift("Warning: " + format); - Function.prototype.apply.call(console[level], console, argsWithFormat); - } - } - var didWarnStateUpdateForUnmountedComponent = {}; - function warnNoop(publicInstance, callerName) { - { - var _constructor = publicInstance.constructor; - var componentName = _constructor && (_constructor.displayName || _constructor.name) || "ReactClass"; - var warningKey = componentName + "." + callerName; - if (didWarnStateUpdateForUnmountedComponent[warningKey]) { - return; - } - error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.", callerName, componentName); - didWarnStateUpdateForUnmountedComponent[warningKey] = true; - } - } - var ReactNoopUpdateQueue = { - isMounted: function(publicInstance) { - return false; - }, - enqueueForceUpdate: function(publicInstance, callback, callerName) { - warnNoop(publicInstance, "forceUpdate"); - }, - enqueueReplaceState: function(publicInstance, completeState, callback, callerName) { - warnNoop(publicInstance, "replaceState"); - }, - enqueueSetState: function(publicInstance, partialState, callback, callerName) { - warnNoop(publicInstance, "setState"); - } - }; - var assign = Object.assign; - var emptyObject = {}; - { - Object.freeze(emptyObject); - } - function Component(props, context, updater) { - this.props = props; - this.context = context; - this.refs = emptyObject; - this.updater = updater || ReactNoopUpdateQueue; - } - Component.prototype.isReactComponent = {}; - Component.prototype.setState = function(partialState, callback) { - if (typeof partialState !== "object" && typeof partialState !== "function" && partialState != null) { - throw new Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables."); - } - this.updater.enqueueSetState(this, partialState, callback, "setState"); - }; - Component.prototype.forceUpdate = function(callback) { - this.updater.enqueueForceUpdate(this, callback, "forceUpdate"); - }; - { - var deprecatedAPIs = { - isMounted: ["isMounted", "Instead, make sure to clean up subscriptions and pending requests in componentWillUnmount to prevent memory leaks."], - replaceState: ["replaceState", "Refactor your code to use setState instead (see https://github.com/facebook/react/issues/3236)."] - }; - var defineDeprecationWarning = function(methodName, info) { - Object.defineProperty(Component.prototype, methodName, { - get: function() { - warn("%s(...) is deprecated in plain JavaScript React classes. %s", info[0], info[1]); - return void 0; - } - }); - }; - for (var fnName in deprecatedAPIs) { - if (deprecatedAPIs.hasOwnProperty(fnName)) { - defineDeprecationWarning(fnName, deprecatedAPIs[fnName]); + { + var ownName; + Object.defineProperty(elementType, "displayName", { + enumerable: false, + configurable: true, + get: function () { + return ownName; + }, + set: function (name) { + ownName = name; + if (!type.name && !type.displayName) { + type.displayName = name; + } + }, + }); + } + return elementType; + } + function resolveDispatcher() { + var dispatcher = ReactCurrentDispatcher.current; + { + if (dispatcher === null) { + error( + "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem." + ); + } + } + return dispatcher; + } + function useContext(Context) { + var dispatcher = resolveDispatcher(); + { + if (Context._context !== void 0) { + var realContext = Context._context; + if (realContext.Consumer === Context) { + error( + "Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be removed in a future major release. Did you mean to call useContext(Context) instead?" + ); + } else if (realContext.Provider === Context) { + error( + "Calling useContext(Context.Provider) is not supported. Did you mean to call useContext(Context) instead?" + ); + } + } + } + return dispatcher.useContext(Context); + } + function useState(initialState) { + var dispatcher = resolveDispatcher(); + return dispatcher.useState(initialState); + } + function useReducer(reducer, initialArg, init) { + var dispatcher = resolveDispatcher(); + return dispatcher.useReducer(reducer, initialArg, init); + } + function useRef(initialValue) { + var dispatcher = resolveDispatcher(); + return dispatcher.useRef(initialValue); + } + function useEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useEffect(create, deps); + } + function useInsertionEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useInsertionEffect(create, deps); + } + function useLayoutEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useLayoutEffect(create, deps); + } + function useCallback(callback, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useCallback(callback, deps); + } + function useMemo(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useMemo(create, deps); + } + function useImperativeHandle(ref, create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useImperativeHandle(ref, create, deps); + } + function useDebugValue(value, formatterFn) { + { + var dispatcher = resolveDispatcher(); + return dispatcher.useDebugValue(value, formatterFn); + } + } + function useTransition() { + var dispatcher = resolveDispatcher(); + return dispatcher.useTransition(); + } + function useDeferredValue(value) { + var dispatcher = resolveDispatcher(); + return dispatcher.useDeferredValue(value); + } + function useId() { + var dispatcher = resolveDispatcher(); + return dispatcher.useId(); + } + function useSyncExternalStore( + subscribe, + getSnapshot, + getServerSnapshot + ) { + var dispatcher = resolveDispatcher(); + return dispatcher.useSyncExternalStore( + subscribe, + getSnapshot, + getServerSnapshot + ); + } + var disabledDepth = 0; + var prevLog; + var prevInfo; + var prevWarn; + var prevError; + var prevGroup; + var prevGroupCollapsed; + var prevGroupEnd; + function disabledLog() {} + disabledLog.__reactDisabledLog = true; + function disableLogs() { + { + if (disabledDepth === 0) { + prevLog = console.log; + prevInfo = console.info; + prevWarn = console.warn; + prevError = console.error; + prevGroup = console.group; + prevGroupCollapsed = console.groupCollapsed; + prevGroupEnd = console.groupEnd; + var props = { + configurable: true, + enumerable: true, + value: disabledLog, + writable: true, + }; + Object.defineProperties(console, { + info: props, + log: props, + warn: props, + error: props, + group: props, + groupCollapsed: props, + groupEnd: props, + }); + } + disabledDepth++; + } + } + function reenableLogs() { + { + disabledDepth--; + if (disabledDepth === 0) { + var props = { + configurable: true, + enumerable: true, + writable: true, + }; + Object.defineProperties(console, { + log: assign({}, props, { + value: prevLog, + }), + info: assign({}, props, { + value: prevInfo, + }), + warn: assign({}, props, { + value: prevWarn, + }), + error: assign({}, props, { + value: prevError, + }), + group: assign({}, props, { + value: prevGroup, + }), + groupCollapsed: assign({}, props, { + value: prevGroupCollapsed, + }), + groupEnd: assign({}, props, { + value: prevGroupEnd, + }), + }); + } + if (disabledDepth < 0) { + error( + "disabledDepth fell below zero. This is a bug in React. Please file an issue." + ); + } + } + } + var ReactCurrentDispatcher$1 = + ReactSharedInternals.ReactCurrentDispatcher; + var prefix; + function describeBuiltInComponentFrame(name, source, ownerFn) { + { + if (prefix === void 0) { + try { + throw Error(); + } catch (x) { + var match = x.stack.trim().match(/\n( *(at )?)/); + prefix = (match && match[1]) || ""; + } + } + return "\n" + prefix + name; + } + } + var reentry = false; + var componentFrameCache; + { + var PossiblyWeakMap = typeof WeakMap === "function" ? WeakMap : Map; + componentFrameCache = new PossiblyWeakMap(); + } + function describeNativeComponentFrame(fn, construct) { + if (!fn || reentry) { + return ""; + } + { + var frame = componentFrameCache.get(fn); + if (frame !== void 0) { + return frame; + } + } + var control; + reentry = true; + var previousPrepareStackTrace = Error.prepareStackTrace; + Error.prepareStackTrace = void 0; + var previousDispatcher; + { + previousDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = null; + disableLogs(); + } + try { + if (construct) { + var Fake = function () { + throw Error(); + }; + Object.defineProperty(Fake.prototype, "props", { + set: function () { + throw Error(); + }, + }); + if (typeof Reflect === "object" && Reflect.construct) { + try { + Reflect.construct(Fake, []); + } catch (x) { + control = x; + } + Reflect.construct(fn, [], Fake); + } else { + try { + Fake.call(); + } catch (x) { + control = x; + } + fn.call(Fake.prototype); + } + } else { + try { + throw Error(); + } catch (x) { + control = x; + } + fn(); + } + } catch (sample) { + if (sample && control && typeof sample.stack === "string") { + var sampleLines = sample.stack.split("\n"); + var controlLines = control.stack.split("\n"); + var s = sampleLines.length - 1; + var c = controlLines.length - 1; + while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { + c--; + } + for (; s >= 1 && c >= 0; s--, c--) { + if (sampleLines[s] !== controlLines[c]) { + if (s !== 1 || c !== 1) { + do { + s--; + c--; + if (c < 0 || sampleLines[s] !== controlLines[c]) { + var _frame = + "\n" + sampleLines[s].replace(" at new ", " at "); + if ( + fn.displayName && + _frame.includes("") + ) { + _frame = _frame.replace( + "", + fn.displayName + ); + } + { + if (typeof fn === "function") { + componentFrameCache.set(fn, _frame); } + } + return _frame; } + } while (s >= 1 && c >= 0); } - function ComponentDummy() { - } - ComponentDummy.prototype = Component.prototype; - function PureComponent(props, context, updater) { - this.props = props; - this.context = context; - this.refs = emptyObject; - this.updater = updater || ReactNoopUpdateQueue; - } - var pureComponentPrototype = PureComponent.prototype = new ComponentDummy(); - pureComponentPrototype.constructor = PureComponent; - assign(pureComponentPrototype, Component.prototype); - pureComponentPrototype.isPureReactComponent = true; - function createRef() { - var refObject = { - current: null - }; - { - Object.seal(refObject); - } - return refObject; - } - var isArrayImpl = Array.isArray; - function isArray(a) { - return isArrayImpl(a); - } - function typeName(value) { - { - var hasToStringTag = typeof Symbol === "function" && Symbol.toStringTag; - var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || "Object"; - return type; - } - } - function willCoercionThrow(value) { - { - try { - testStringCoercion(value); - return false; - } catch (e) { - return true; - } - } - } - function testStringCoercion(value) { - return "" + value; - } - function checkKeyStringCoercion(value) { - { - if (willCoercionThrow(value)) { - error("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.", typeName(value)); - return testStringCoercion(value); - } - } - } - function getWrappedName(outerType, innerType, wrapperName) { - var displayName = outerType.displayName; - if (displayName) { - return displayName; - } - var functionName = innerType.displayName || innerType.name || ""; - return functionName !== "" ? wrapperName + "(" + functionName + ")" : wrapperName; - } - function getContextName(type) { - return type.displayName || "Context"; - } - function getComponentNameFromType(type) { - if (type == null) { - return null; - } - { - if (typeof type.tag === "number") { - error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."); - } - } - if (typeof type === "function") { - return type.displayName || type.name || null; - } - if (typeof type === "string") { - return type; - } - switch (type) { - case REACT_FRAGMENT_TYPE: - return "Fragment"; - case REACT_PORTAL_TYPE: - return "Portal"; - case REACT_PROFILER_TYPE: - return "Profiler"; - case REACT_STRICT_MODE_TYPE: - return "StrictMode"; - case REACT_SUSPENSE_TYPE: - return "Suspense"; - case REACT_SUSPENSE_LIST_TYPE: - return "SuspenseList"; - } - if (typeof type === "object") { - switch (type.$$typeof) { - case REACT_CONTEXT_TYPE: - var context = type; - return getContextName(context) + ".Consumer"; - case REACT_PROVIDER_TYPE: - var provider = type; - return getContextName(provider._context) + ".Provider"; - case REACT_FORWARD_REF_TYPE: - return getWrappedName(type, type.render, "ForwardRef"); - case REACT_MEMO_TYPE: - var outerName = type.displayName || null; - if (outerName !== null) { - return outerName; - } - return getComponentNameFromType(type.type) || "Memo"; - case REACT_LAZY_TYPE: { - var lazyComponent = type; - var payload = lazyComponent._payload; - var init = lazyComponent._init; - try { - return getComponentNameFromType(init(payload)); - } catch (x) { - return null; - } - } - } - } - return null; - } - var hasOwnProperty = Object.prototype.hasOwnProperty; - var RESERVED_PROPS = { - key: true, - ref: true, - __self: true, - __source: true - }; - var specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs; - { - didWarnAboutStringRefs = {}; - } - function hasValidRef(config) { - { - if (hasOwnProperty.call(config, "ref")) { - var getter = Object.getOwnPropertyDescriptor(config, "ref").get; - if (getter && getter.isReactWarning) { - return false; - } - } - } - return config.ref !== void 0; - } - function hasValidKey(config) { - { - if (hasOwnProperty.call(config, "key")) { - var getter = Object.getOwnPropertyDescriptor(config, "key").get; - if (getter && getter.isReactWarning) { - return false; - } - } - } - return config.key !== void 0; - } - function defineKeyPropWarningGetter(props, displayName) { - var warnAboutAccessingKey = function() { - { - if (!specialPropKeyWarningShown) { - specialPropKeyWarningShown = true; - error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)", displayName); - } - } - }; - warnAboutAccessingKey.isReactWarning = true; - Object.defineProperty(props, "key", { - get: warnAboutAccessingKey, - configurable: true - }); - } - function defineRefPropWarningGetter(props, displayName) { - var warnAboutAccessingRef = function() { - { - if (!specialPropRefWarningShown) { - specialPropRefWarningShown = true; - error("%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)", displayName); - } - } - }; - warnAboutAccessingRef.isReactWarning = true; - Object.defineProperty(props, "ref", { - get: warnAboutAccessingRef, - configurable: true - }); - } - function warnIfStringRefCannotBeAutoConverted(config) { - { - if (typeof config.ref === "string" && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) { - var componentName = getComponentNameFromType(ReactCurrentOwner.current.type); - if (!didWarnAboutStringRefs[componentName]) { - error('Component "%s" contains the string ref "%s". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref', componentName, config.ref); - didWarnAboutStringRefs[componentName] = true; - } - } - } - } - var ReactElement = function(type, key, ref, self2, source, owner, props) { - var element = { - $$typeof: REACT_ELEMENT_TYPE, - type, - key, - ref, - props, - _owner: owner - }; - { - element._store = {}; - Object.defineProperty(element._store, "validated", { - configurable: false, - enumerable: false, - writable: true, - value: false - }); - Object.defineProperty(element, "_self", { - configurable: false, - enumerable: false, - writable: false, - value: self2 - }); - Object.defineProperty(element, "_source", { - configurable: false, - enumerable: false, - writable: false, - value: source - }); - if (Object.freeze) { - Object.freeze(element.props); - Object.freeze(element); - } - } - return element; - }; - function createElement(type, config, children) { - var propName; - var props = {}; - var key = null; - var ref = null; - var self2 = null; - var source = null; - if (config != null) { - if (hasValidRef(config)) { - ref = config.ref; - { - warnIfStringRefCannotBeAutoConverted(config); - } - } - if (hasValidKey(config)) { - { - checkKeyStringCoercion(config.key); - } - key = "" + config.key; - } - self2 = config.__self === void 0 ? null : config.__self; - source = config.__source === void 0 ? null : config.__source; - for (propName in config) { - if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { - props[propName] = config[propName]; - } - } - } - var childrenLength = arguments.length - 2; - if (childrenLength === 1) { - props.children = children; - } else if (childrenLength > 1) { - var childArray = Array(childrenLength); - for (var i = 0; i < childrenLength; i++) { - childArray[i] = arguments[i + 2]; - } - { - if (Object.freeze) { - Object.freeze(childArray); - } - } - props.children = childArray; - } - if (type && type.defaultProps) { - var defaultProps = type.defaultProps; - for (propName in defaultProps) { - if (props[propName] === void 0) { - props[propName] = defaultProps[propName]; - } - } - } - { - if (key || ref) { - var displayName = typeof type === "function" ? type.displayName || type.name || "Unknown" : type; - if (key) { - defineKeyPropWarningGetter(props, displayName); - } - if (ref) { - defineRefPropWarningGetter(props, displayName); - } - } - } - return ReactElement(type, key, ref, self2, source, ReactCurrentOwner.current, props); - } - function cloneAndReplaceKey(oldElement, newKey) { - var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props); - return newElement; - } - function cloneElement(element, config, children) { - if (element === null || element === void 0) { - throw new Error("React.cloneElement(...): The argument must be a React element, but you passed " + element + "."); - } - var propName; - var props = assign({}, element.props); - var key = element.key; - var ref = element.ref; - var self2 = element._self; - var source = element._source; - var owner = element._owner; - if (config != null) { - if (hasValidRef(config)) { - ref = config.ref; - owner = ReactCurrentOwner.current; - } - if (hasValidKey(config)) { - { - checkKeyStringCoercion(config.key); - } - key = "" + config.key; - } - var defaultProps; - if (element.type && element.type.defaultProps) { - defaultProps = element.type.defaultProps; - } - for (propName in config) { - if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { - if (config[propName] === void 0 && defaultProps !== void 0) { - props[propName] = defaultProps[propName]; - } else { - props[propName] = config[propName]; - } - } - } - } - var childrenLength = arguments.length - 2; - if (childrenLength === 1) { - props.children = children; - } else if (childrenLength > 1) { - var childArray = Array(childrenLength); - for (var i = 0; i < childrenLength; i++) { - childArray[i] = arguments[i + 2]; - } - props.children = childArray; - } - return ReactElement(element.type, key, ref, self2, source, owner, props); - } - function isValidElement(object) { - return typeof object === "object" && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; - } - var SEPARATOR = "."; - var SUBSEPARATOR = ":"; - function escape(key) { - var escapeRegex = /[=:]/g; - var escaperLookup = { - "=": "=0", - ":": "=2" - }; - var escapedString = key.replace(escapeRegex, function(match) { - return escaperLookup[match]; - }); - return "$" + escapedString; - } - var didWarnAboutMaps = false; - var userProvidedKeyEscapeRegex = /\/+/g; - function escapeUserProvidedKey(text) { - return text.replace(userProvidedKeyEscapeRegex, "$&/"); - } - function getElementKey(element, index) { - if (typeof element === "object" && element !== null && element.key != null) { - { - checkKeyStringCoercion(element.key); - } - return escape("" + element.key); - } - return index.toString(36); - } - function mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) { - var type = typeof children; - if (type === "undefined" || type === "boolean") { - children = null; - } - var invokeCallback = false; - if (children === null) { - invokeCallback = true; - } else { - switch (type) { - case "string": - case "number": - invokeCallback = true; - break; - case "object": - switch (children.$$typeof) { - case REACT_ELEMENT_TYPE: - case REACT_PORTAL_TYPE: - invokeCallback = true; - } - } - } - if (invokeCallback) { - var _child = children; - var mappedChild = callback(_child); - var childKey = nameSoFar === "" ? SEPARATOR + getElementKey(_child, 0) : nameSoFar; - if (isArray(mappedChild)) { - var escapedChildKey = ""; - if (childKey != null) { - escapedChildKey = escapeUserProvidedKey(childKey) + "/"; - } - mapIntoArray(mappedChild, array, escapedChildKey, "", function(c) { - return c; - }); - } else if (mappedChild != null) { - if (isValidElement(mappedChild)) { - { - if (mappedChild.key && (!_child || _child.key !== mappedChild.key)) { - checkKeyStringCoercion(mappedChild.key); - } - } - mappedChild = cloneAndReplaceKey(mappedChild, escapedPrefix + (mappedChild.key && (!_child || _child.key !== mappedChild.key) ? escapeUserProvidedKey("" + mappedChild.key) + "/" : "") + childKey); - } - array.push(mappedChild); - } - return 1; - } - var child; - var nextName; - var subtreeCount = 0; - var nextNamePrefix = nameSoFar === "" ? SEPARATOR : nameSoFar + SUBSEPARATOR; - if (isArray(children)) { - for (var i = 0; i < children.length; i++) { - child = children[i]; - nextName = nextNamePrefix + getElementKey(child, i); - subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); - } - } else { - var iteratorFn = getIteratorFn(children); - if (typeof iteratorFn === "function") { - var iterableChildren = children; - { - if (iteratorFn === iterableChildren.entries) { - if (!didWarnAboutMaps) { - warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."); - } - didWarnAboutMaps = true; - } - } - var iterator = iteratorFn.call(iterableChildren); - var step; - var ii = 0; - while (!(step = iterator.next()).done) { - child = step.value; - nextName = nextNamePrefix + getElementKey(child, ii++); - subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); - } - } else if (type === "object") { - var childrenString = String(children); - throw new Error("Objects are not valid as a React child (found: " + (childrenString === "[object Object]" ? "object with keys {" + Object.keys(children).join(", ") + "}" : childrenString) + "). If you meant to render a collection of children, use an array instead."); - } - } - return subtreeCount; - } - function mapChildren(children, func, context) { - if (children == null) { - return children; - } - var result = []; - var count = 0; - mapIntoArray(children, result, "", "", function(child) { - return func.call(context, child, count++); - }); - return result; - } - function countChildren(children) { - var n = 0; - mapChildren(children, function() { - n++; - }); - return n; - } - function forEachChildren(children, forEachFunc, forEachContext) { - mapChildren(children, function() { - forEachFunc.apply(this, arguments); - }, forEachContext); - } - function toArray(children) { - return mapChildren(children, function(child) { - return child; - }) || []; - } - function onlyChild(children) { - if (!isValidElement(children)) { - throw new Error("React.Children.only expected to receive a single React element child."); - } - return children; - } - function createContext(defaultValue) { - var context = { - $$typeof: REACT_CONTEXT_TYPE, - _currentValue: defaultValue, - _currentValue2: defaultValue, - _threadCount: 0, - Provider: null, - Consumer: null, - _defaultValue: null, - _globalName: null - }; - context.Provider = { - $$typeof: REACT_PROVIDER_TYPE, - _context: context - }; - var hasWarnedAboutUsingNestedContextConsumers = false; - var hasWarnedAboutUsingConsumerProvider = false; - var hasWarnedAboutDisplayNameOnConsumer = false; - { - var Consumer = { - $$typeof: REACT_CONTEXT_TYPE, - _context: context - }; - Object.defineProperties(Consumer, { - Provider: { - get: function() { - if (!hasWarnedAboutUsingConsumerProvider) { - hasWarnedAboutUsingConsumerProvider = true; - error("Rendering is not supported and will be removed in a future major release. Did you mean to render instead?"); - } - return context.Provider; - }, - set: function(_Provider) { - context.Provider = _Provider; - } - }, - _currentValue: { - get: function() { - return context._currentValue; - }, - set: function(_currentValue) { - context._currentValue = _currentValue; - } - }, - _currentValue2: { - get: function() { - return context._currentValue2; - }, - set: function(_currentValue2) { - context._currentValue2 = _currentValue2; - } - }, - _threadCount: { - get: function() { - return context._threadCount; - }, - set: function(_threadCount) { - context._threadCount = _threadCount; - } - }, - Consumer: { - get: function() { - if (!hasWarnedAboutUsingNestedContextConsumers) { - hasWarnedAboutUsingNestedContextConsumers = true; - error("Rendering is not supported and will be removed in a future major release. Did you mean to render instead?"); - } - return context.Consumer; - } - }, - displayName: { - get: function() { - return context.displayName; - }, - set: function(displayName) { - if (!hasWarnedAboutDisplayNameOnConsumer) { - warn("Setting `displayName` on Context.Consumer has no effect. You should set it directly on the context with Context.displayName = '%s'.", displayName); - hasWarnedAboutDisplayNameOnConsumer = true; - } - } - } - }); - context.Consumer = Consumer; - } - { - context._currentRenderer = null; - context._currentRenderer2 = null; - } - return context; - } - var Uninitialized = -1; - var Pending = 0; - var Resolved = 1; - var Rejected = 2; - function lazyInitializer(payload) { - if (payload._status === Uninitialized) { - var ctor = payload._result; - var thenable = ctor(); - thenable.then(function(moduleObject2) { - if (payload._status === Pending || payload._status === Uninitialized) { - var resolved = payload; - resolved._status = Resolved; - resolved._result = moduleObject2; - } - }, function(error2) { - if (payload._status === Pending || payload._status === Uninitialized) { - var rejected = payload; - rejected._status = Rejected; - rejected._result = error2; - } - }); - if (payload._status === Uninitialized) { - var pending = payload; - pending._status = Pending; - pending._result = thenable; - } - } - if (payload._status === Resolved) { - var moduleObject = payload._result; - { - if (moduleObject === void 0) { - error("lazy: Expected the result of a dynamic import() call. Instead received: %s\n\nYour code should look like: \n const MyComponent = lazy(() => import('./MyComponent'))\n\nDid you accidentally put curly braces around the import?", moduleObject); - } - } - { - if (!("default" in moduleObject)) { - error("lazy: Expected the result of a dynamic import() call. Instead received: %s\n\nYour code should look like: \n const MyComponent = lazy(() => import('./MyComponent'))", moduleObject); - } - } - return moduleObject.default; - } else { - throw payload._result; - } - } - function lazy(ctor) { - var payload = { - _status: Uninitialized, - _result: ctor - }; - var lazyType = { - $$typeof: REACT_LAZY_TYPE, - _payload: payload, - _init: lazyInitializer - }; - { - var defaultProps; - var propTypes; - Object.defineProperties(lazyType, { - defaultProps: { - configurable: true, - get: function() { - return defaultProps; - }, - set: function(newDefaultProps) { - error("React.lazy(...): It is not supported to assign `defaultProps` to a lazy component import. Either specify them where the component is defined, or create a wrapping component around it."); - defaultProps = newDefaultProps; - Object.defineProperty(lazyType, "defaultProps", { - enumerable: true - }); - } - }, - propTypes: { - configurable: true, - get: function() { - return propTypes; - }, - set: function(newPropTypes) { - error("React.lazy(...): It is not supported to assign `propTypes` to a lazy component import. Either specify them where the component is defined, or create a wrapping component around it."); - propTypes = newPropTypes; - Object.defineProperty(lazyType, "propTypes", { - enumerable: true - }); - } - } - }); - } - return lazyType; - } - function forwardRef(render) { - { - if (render != null && render.$$typeof === REACT_MEMO_TYPE) { - error("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."); - } else if (typeof render !== "function") { - error("forwardRef requires a render function but was given %s.", render === null ? "null" : typeof render); - } else { - if (render.length !== 0 && render.length !== 2) { - error("forwardRef render functions accept exactly two parameters: props and ref. %s", render.length === 1 ? "Did you forget to use the ref parameter?" : "Any additional parameter will be undefined."); - } - } - if (render != null) { - if (render.defaultProps != null || render.propTypes != null) { - error("forwardRef render functions do not support propTypes or defaultProps. Did you accidentally pass a React component?"); - } - } - } - var elementType = { - $$typeof: REACT_FORWARD_REF_TYPE, - render - }; - { - var ownName; - Object.defineProperty(elementType, "displayName", { - enumerable: false, - configurable: true, - get: function() { - return ownName; - }, - set: function(name) { - ownName = name; - if (!render.name && !render.displayName) { - render.displayName = name; - } - } - }); - } - return elementType; - } - var REACT_MODULE_REFERENCE; - { - REACT_MODULE_REFERENCE = Symbol.for("react.module.reference"); - } - function isValidElementType(type) { - if (typeof type === "string" || typeof type === "function") { - return true; - } - if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing) { - return true; - } - if (typeof type === "object" && type !== null) { - if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== void 0) { - return true; - } - } - return false; - } - function memo(type, compare) { - { - if (!isValidElementType(type)) { - error("memo: The first argument must be a component. Instead received: %s", type === null ? "null" : typeof type); - } - } - var elementType = { - $$typeof: REACT_MEMO_TYPE, - type, - compare: compare === void 0 ? null : compare - }; - { - var ownName; - Object.defineProperty(elementType, "displayName", { - enumerable: false, - configurable: true, - get: function() { - return ownName; - }, - set: function(name) { - ownName = name; - if (!type.name && !type.displayName) { - type.displayName = name; - } - } - }); - } - return elementType; - } - function resolveDispatcher() { - var dispatcher = ReactCurrentDispatcher.current; - { - if (dispatcher === null) { - error("Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem."); - } - } - return dispatcher; - } - function useContext(Context) { - var dispatcher = resolveDispatcher(); - { - if (Context._context !== void 0) { - var realContext = Context._context; - if (realContext.Consumer === Context) { - error("Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be removed in a future major release. Did you mean to call useContext(Context) instead?"); - } else if (realContext.Provider === Context) { - error("Calling useContext(Context.Provider) is not supported. Did you mean to call useContext(Context) instead?"); - } - } - } - return dispatcher.useContext(Context); - } - function useState(initialState) { - var dispatcher = resolveDispatcher(); - return dispatcher.useState(initialState); - } - function useReducer(reducer, initialArg, init) { - var dispatcher = resolveDispatcher(); - return dispatcher.useReducer(reducer, initialArg, init); - } - function useRef(initialValue) { - var dispatcher = resolveDispatcher(); - return dispatcher.useRef(initialValue); - } - function useEffect(create, deps) { - var dispatcher = resolveDispatcher(); - return dispatcher.useEffect(create, deps); - } - function useInsertionEffect(create, deps) { - var dispatcher = resolveDispatcher(); - return dispatcher.useInsertionEffect(create, deps); - } - function useLayoutEffect(create, deps) { - var dispatcher = resolveDispatcher(); - return dispatcher.useLayoutEffect(create, deps); - } - function useCallback(callback, deps) { - var dispatcher = resolveDispatcher(); - return dispatcher.useCallback(callback, deps); - } - function useMemo(create, deps) { - var dispatcher = resolveDispatcher(); - return dispatcher.useMemo(create, deps); - } - function useImperativeHandle(ref, create, deps) { - var dispatcher = resolveDispatcher(); - return dispatcher.useImperativeHandle(ref, create, deps); - } - function useDebugValue(value, formatterFn) { - { - var dispatcher = resolveDispatcher(); - return dispatcher.useDebugValue(value, formatterFn); - } - } - function useTransition() { - var dispatcher = resolveDispatcher(); - return dispatcher.useTransition(); - } - function useDeferredValue(value) { - var dispatcher = resolveDispatcher(); - return dispatcher.useDeferredValue(value); - } - function useId() { - var dispatcher = resolveDispatcher(); - return dispatcher.useId(); - } - function useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) { - var dispatcher = resolveDispatcher(); - return dispatcher.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot); - } - var disabledDepth = 0; - var prevLog; - var prevInfo; - var prevWarn; - var prevError; - var prevGroup; - var prevGroupCollapsed; - var prevGroupEnd; - function disabledLog() { - } - disabledLog.__reactDisabledLog = true; - function disableLogs() { - { - if (disabledDepth === 0) { - prevLog = console.log; - prevInfo = console.info; - prevWarn = console.warn; - prevError = console.error; - prevGroup = console.group; - prevGroupCollapsed = console.groupCollapsed; - prevGroupEnd = console.groupEnd; - var props = { - configurable: true, - enumerable: true, - value: disabledLog, - writable: true - }; - Object.defineProperties(console, { - info: props, - log: props, - warn: props, - error: props, - group: props, - groupCollapsed: props, - groupEnd: props - }); - } - disabledDepth++; - } - } - function reenableLogs() { - { - disabledDepth--; - if (disabledDepth === 0) { - var props = { - configurable: true, - enumerable: true, - writable: true - }; - Object.defineProperties(console, { - log: assign({}, props, { - value: prevLog - }), - info: assign({}, props, { - value: prevInfo - }), - warn: assign({}, props, { - value: prevWarn - }), - error: assign({}, props, { - value: prevError - }), - group: assign({}, props, { - value: prevGroup - }), - groupCollapsed: assign({}, props, { - value: prevGroupCollapsed - }), - groupEnd: assign({}, props, { - value: prevGroupEnd - }) - }); - } - if (disabledDepth < 0) { - error("disabledDepth fell below zero. This is a bug in React. Please file an issue."); - } - } - } - var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher; - var prefix; - function describeBuiltInComponentFrame(name, source, ownerFn) { - { - if (prefix === void 0) { - try { - throw Error(); - } catch (x) { - var match = x.stack.trim().match(/\n( *(at )?)/); - prefix = match && match[1] || ""; - } - } - return "\n" + prefix + name; - } - } - var reentry = false; - var componentFrameCache; - { - var PossiblyWeakMap = typeof WeakMap === "function" ? WeakMap : Map; - componentFrameCache = new PossiblyWeakMap(); - } - function describeNativeComponentFrame(fn, construct) { - if (!fn || reentry) { - return ""; - } - { - var frame = componentFrameCache.get(fn); - if (frame !== void 0) { - return frame; - } - } - var control; - reentry = true; - var previousPrepareStackTrace = Error.prepareStackTrace; - Error.prepareStackTrace = void 0; - var previousDispatcher; - { - previousDispatcher = ReactCurrentDispatcher$1.current; - ReactCurrentDispatcher$1.current = null; - disableLogs(); - } - try { - if (construct) { - var Fake = function() { - throw Error(); - }; - Object.defineProperty(Fake.prototype, "props", { - set: function() { - throw Error(); - } - }); - if (typeof Reflect === "object" && Reflect.construct) { - try { - Reflect.construct(Fake, []); - } catch (x) { - control = x; - } - Reflect.construct(fn, [], Fake); - } else { - try { - Fake.call(); - } catch (x) { - control = x; - } - fn.call(Fake.prototype); - } - } else { - try { - throw Error(); - } catch (x) { - control = x; - } - fn(); - } - } catch (sample) { - if (sample && control && typeof sample.stack === "string") { - var sampleLines = sample.stack.split("\n"); - var controlLines = control.stack.split("\n"); - var s = sampleLines.length - 1; - var c = controlLines.length - 1; - while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { - c--; - } - for (; s >= 1 && c >= 0; s--, c--) { - if (sampleLines[s] !== controlLines[c]) { - if (s !== 1 || c !== 1) { - do { - s--; - c--; - if (c < 0 || sampleLines[s] !== controlLines[c]) { - var _frame = "\n" + sampleLines[s].replace(" at new ", " at "); - if (fn.displayName && _frame.includes("")) { - _frame = _frame.replace("", fn.displayName); - } - { - if (typeof fn === "function") { - componentFrameCache.set(fn, _frame); - } - } - return _frame; - } - } while (s >= 1 && c >= 0); - } - break; - } - } - } - } finally { - reentry = false; - { - ReactCurrentDispatcher$1.current = previousDispatcher; - reenableLogs(); - } - Error.prepareStackTrace = previousPrepareStackTrace; - } - var name = fn ? fn.displayName || fn.name : ""; - var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ""; - { - if (typeof fn === "function") { - componentFrameCache.set(fn, syntheticFrame); - } - } - return syntheticFrame; - } - function describeFunctionComponentFrame(fn, source, ownerFn) { - { - return describeNativeComponentFrame(fn, false); - } - } - function shouldConstruct(Component2) { - var prototype = Component2.prototype; - return !!(prototype && prototype.isReactComponent); - } - function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { - if (type == null) { - return ""; - } - if (typeof type === "function") { - { - return describeNativeComponentFrame(type, shouldConstruct(type)); - } - } - if (typeof type === "string") { - return describeBuiltInComponentFrame(type); - } - switch (type) { - case REACT_SUSPENSE_TYPE: - return describeBuiltInComponentFrame("Suspense"); - case REACT_SUSPENSE_LIST_TYPE: - return describeBuiltInComponentFrame("SuspenseList"); - } - if (typeof type === "object") { - switch (type.$$typeof) { - case REACT_FORWARD_REF_TYPE: - return describeFunctionComponentFrame(type.render); - case REACT_MEMO_TYPE: - return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); - case REACT_LAZY_TYPE: { - var lazyComponent = type; - var payload = lazyComponent._payload; - var init = lazyComponent._init; - try { - return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); - } catch (x) { - } - } - } - } - return ""; - } - var loggedTypeFailures = {}; - var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; - function setCurrentlyValidatingElement(element) { - { - if (element) { - var owner = element._owner; - var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); - ReactDebugCurrentFrame$1.setExtraStackFrame(stack); - } else { - ReactDebugCurrentFrame$1.setExtraStackFrame(null); - } - } - } - function checkPropTypes(typeSpecs, values, location, componentName, element) { - { - var has = Function.call.bind(hasOwnProperty); - for (var typeSpecName in typeSpecs) { - if (has(typeSpecs, typeSpecName)) { - var error$1 = void 0; - try { - if (typeof typeSpecs[typeSpecName] !== "function") { - var err = Error((componentName || "React class") + ": " + location + " type `" + typeSpecName + "` is invalid; it must be a function, usually from the `prop-types` package, but received `" + typeof typeSpecs[typeSpecName] + "`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`."); - err.name = "Invariant Violation"; - throw err; - } - error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"); - } catch (ex) { - error$1 = ex; - } - if (error$1 && !(error$1 instanceof Error)) { - setCurrentlyValidatingElement(element); - error("%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).", componentName || "React class", location, typeSpecName, typeof error$1); - setCurrentlyValidatingElement(null); - } - if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { - loggedTypeFailures[error$1.message] = true; - setCurrentlyValidatingElement(element); - error("Failed %s type: %s", location, error$1.message); - setCurrentlyValidatingElement(null); - } - } - } - } - } - function setCurrentlyValidatingElement$1(element) { - { - if (element) { - var owner = element._owner; - var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); - setExtraStackFrame(stack); - } else { - setExtraStackFrame(null); - } - } - } - var propTypesMisspellWarningShown; - { - propTypesMisspellWarningShown = false; - } - function getDeclarationErrorAddendum() { - if (ReactCurrentOwner.current) { - var name = getComponentNameFromType(ReactCurrentOwner.current.type); - if (name) { - return "\n\nCheck the render method of `" + name + "`."; - } - } - return ""; - } - function getSourceInfoErrorAddendum(source) { - if (source !== void 0) { - var fileName = source.fileName.replace(/^.*[\\\/]/, ""); - var lineNumber = source.lineNumber; - return "\n\nCheck your code at " + fileName + ":" + lineNumber + "."; - } - return ""; - } - function getSourceInfoErrorAddendumForProps(elementProps) { - if (elementProps !== null && elementProps !== void 0) { - return getSourceInfoErrorAddendum(elementProps.__source); - } - return ""; - } - var ownerHasKeyUseWarning = {}; - function getCurrentComponentErrorInfo(parentType) { - var info = getDeclarationErrorAddendum(); - if (!info) { - var parentName = typeof parentType === "string" ? parentType : parentType.displayName || parentType.name; - if (parentName) { - info = "\n\nCheck the top-level render call using <" + parentName + ">."; - } - } - return info; - } - function validateExplicitKey(element, parentType) { - if (!element._store || element._store.validated || element.key != null) { - return; - } - element._store.validated = true; - var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); - if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { - return; - } - ownerHasKeyUseWarning[currentComponentErrorInfo] = true; - var childOwner = ""; - if (element && element._owner && element._owner !== ReactCurrentOwner.current) { - childOwner = " It was passed a child from " + getComponentNameFromType(element._owner.type) + "."; - } - { - setCurrentlyValidatingElement$1(element); - error('Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner); - setCurrentlyValidatingElement$1(null); - } - } - function validateChildKeys(node, parentType) { - if (typeof node !== "object") { - return; - } - if (isArray(node)) { - for (var i = 0; i < node.length; i++) { - var child = node[i]; - if (isValidElement(child)) { - validateExplicitKey(child, parentType); - } - } - } else if (isValidElement(node)) { - if (node._store) { - node._store.validated = true; - } - } else if (node) { - var iteratorFn = getIteratorFn(node); - if (typeof iteratorFn === "function") { - if (iteratorFn !== node.entries) { - var iterator = iteratorFn.call(node); - var step; - while (!(step = iterator.next()).done) { - if (isValidElement(step.value)) { - validateExplicitKey(step.value, parentType); - } - } - } - } - } - } - function validatePropTypes(element) { - { - var type = element.type; - if (type === null || type === void 0 || typeof type === "string") { - return; - } - var propTypes; - if (typeof type === "function") { - propTypes = type.propTypes; - } else if (typeof type === "object" && (type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_MEMO_TYPE)) { - propTypes = type.propTypes; - } else { - return; - } - if (propTypes) { - var name = getComponentNameFromType(type); - checkPropTypes(propTypes, element.props, "prop", name, element); - } else if (type.PropTypes !== void 0 && !propTypesMisspellWarningShown) { - propTypesMisspellWarningShown = true; - var _name = getComponentNameFromType(type); - error("Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?", _name || "Unknown"); - } - if (typeof type.getDefaultProps === "function" && !type.getDefaultProps.isReactClassApproved) { - error("getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead."); - } - } - } - function validateFragmentProps(fragment) { - { - var keys = Object.keys(fragment.props); - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - if (key !== "children" && key !== "key") { - setCurrentlyValidatingElement$1(fragment); - error("Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key` and `children` props.", key); - setCurrentlyValidatingElement$1(null); - break; - } - } - if (fragment.ref !== null) { - setCurrentlyValidatingElement$1(fragment); - error("Invalid attribute `ref` supplied to `React.Fragment`."); - setCurrentlyValidatingElement$1(null); - } - } - } - function createElementWithValidation(type, props, children) { - var validType = isValidElementType(type); - if (!validType) { - var info = ""; - if (type === void 0 || typeof type === "object" && type !== null && Object.keys(type).length === 0) { - info += " You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports."; - } - var sourceInfo = getSourceInfoErrorAddendumForProps(props); - if (sourceInfo) { - info += sourceInfo; - } else { - info += getDeclarationErrorAddendum(); - } - var typeString; - if (type === null) { - typeString = "null"; - } else if (isArray(type)) { - typeString = "array"; - } else if (type !== void 0 && type.$$typeof === REACT_ELEMENT_TYPE) { - typeString = "<" + (getComponentNameFromType(type.type) || "Unknown") + " />"; - info = " Did you accidentally export a JSX literal instead of a component?"; - } else { - typeString = typeof type; - } - { - error("React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s", typeString, info); - } - } - var element = createElement.apply(this, arguments); - if (element == null) { - return element; - } - if (validType) { - for (var i = 2; i < arguments.length; i++) { - validateChildKeys(arguments[i], type); - } - } - if (type === REACT_FRAGMENT_TYPE) { - validateFragmentProps(element); + break; + } + } + } + } finally { + reentry = false; + { + ReactCurrentDispatcher$1.current = previousDispatcher; + reenableLogs(); + } + Error.prepareStackTrace = previousPrepareStackTrace; + } + var name = fn ? fn.displayName || fn.name : ""; + var syntheticFrame = name + ? describeBuiltInComponentFrame(name) + : ""; + { + if (typeof fn === "function") { + componentFrameCache.set(fn, syntheticFrame); + } + } + return syntheticFrame; + } + function describeFunctionComponentFrame(fn, source, ownerFn) { + { + return describeNativeComponentFrame(fn, false); + } + } + function shouldConstruct(Component2) { + var prototype = Component2.prototype; + return !!(prototype && prototype.isReactComponent); + } + function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { + if (type == null) { + return ""; + } + if (typeof type === "function") { + { + return describeNativeComponentFrame( + type, + shouldConstruct(type) + ); + } + } + if (typeof type === "string") { + return describeBuiltInComponentFrame(type); + } + switch (type) { + case REACT_SUSPENSE_TYPE: + return describeBuiltInComponentFrame("Suspense"); + case REACT_SUSPENSE_LIST_TYPE: + return describeBuiltInComponentFrame("SuspenseList"); + } + if (typeof type === "object") { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + return describeFunctionComponentFrame(type.render); + case REACT_MEMO_TYPE: + return describeUnknownElementTypeFrameInDEV( + type.type, + source, + ownerFn + ); + case REACT_LAZY_TYPE: { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + try { + return describeUnknownElementTypeFrameInDEV( + init(payload), + source, + ownerFn + ); + } catch (x) {} + } + } + } + return ""; + } + var loggedTypeFailures = {}; + var ReactDebugCurrentFrame$1 = + ReactSharedInternals.ReactDebugCurrentFrame; + function setCurrentlyValidatingElement(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV( + element.type, + element._source, + owner ? owner.type : null + ); + ReactDebugCurrentFrame$1.setExtraStackFrame(stack); + } else { + ReactDebugCurrentFrame$1.setExtraStackFrame(null); + } + } + } + function checkPropTypes( + typeSpecs, + values, + location, + componentName, + element + ) { + { + var has = Function.call.bind(hasOwnProperty); + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error$1 = void 0; + try { + if (typeof typeSpecs[typeSpecName] !== "function") { + var err = Error( + (componentName || "React class") + + ": " + + location + + " type `" + + typeSpecName + + "` is invalid; it must be a function, usually from the `prop-types` package, but received `" + + typeof typeSpecs[typeSpecName] + + "`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`." + ); + err.name = "Invariant Violation"; + throw err; + } + error$1 = typeSpecs[typeSpecName]( + values, + typeSpecName, + componentName, + location, + null, + "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED" + ); + } catch (ex) { + error$1 = ex; + } + if (error$1 && !(error$1 instanceof Error)) { + setCurrentlyValidatingElement(element); + error( + "%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).", + componentName || "React class", + location, + typeSpecName, + typeof error$1 + ); + setCurrentlyValidatingElement(null); + } + if ( + error$1 instanceof Error && + !(error$1.message in loggedTypeFailures) + ) { + loggedTypeFailures[error$1.message] = true; + setCurrentlyValidatingElement(element); + error("Failed %s type: %s", location, error$1.message); + setCurrentlyValidatingElement(null); + } + } + } + } + } + function setCurrentlyValidatingElement$1(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV( + element.type, + element._source, + owner ? owner.type : null + ); + setExtraStackFrame(stack); + } else { + setExtraStackFrame(null); + } + } + } + var propTypesMisspellWarningShown; + { + propTypesMisspellWarningShown = false; + } + function getDeclarationErrorAddendum() { + if (ReactCurrentOwner.current) { + var name = getComponentNameFromType( + ReactCurrentOwner.current.type + ); + if (name) { + return "\n\nCheck the render method of `" + name + "`."; + } + } + return ""; + } + function getSourceInfoErrorAddendum(source) { + if (source !== void 0) { + var fileName = source.fileName.replace(/^.*[\\\/]/, ""); + var lineNumber = source.lineNumber; + return ( + "\n\nCheck your code at " + fileName + ":" + lineNumber + "." + ); + } + return ""; + } + function getSourceInfoErrorAddendumForProps(elementProps) { + if (elementProps !== null && elementProps !== void 0) { + return getSourceInfoErrorAddendum(elementProps.__source); + } + return ""; + } + var ownerHasKeyUseWarning = {}; + function getCurrentComponentErrorInfo(parentType) { + var info = getDeclarationErrorAddendum(); + if (!info) { + var parentName = + typeof parentType === "string" + ? parentType + : parentType.displayName || parentType.name; + if (parentName) { + info = + "\n\nCheck the top-level render call using <" + + parentName + + ">."; + } + } + return info; + } + function validateExplicitKey(element, parentType) { + if ( + !element._store || + element._store.validated || + element.key != null + ) { + return; + } + element._store.validated = true; + var currentComponentErrorInfo = + getCurrentComponentErrorInfo(parentType); + if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { + return; + } + ownerHasKeyUseWarning[currentComponentErrorInfo] = true; + var childOwner = ""; + if ( + element && + element._owner && + element._owner !== ReactCurrentOwner.current + ) { + childOwner = + " It was passed a child from " + + getComponentNameFromType(element._owner.type) + + "."; + } + { + setCurrentlyValidatingElement$1(element); + error( + 'Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.', + currentComponentErrorInfo, + childOwner + ); + setCurrentlyValidatingElement$1(null); + } + } + function validateChildKeys(node, parentType) { + if (typeof node !== "object") { + return; + } + if (isArray(node)) { + for (var i = 0; i < node.length; i++) { + var child = node[i]; + if (isValidElement(child)) { + validateExplicitKey(child, parentType); + } + } + } else if (isValidElement(node)) { + if (node._store) { + node._store.validated = true; + } + } else if (node) { + var iteratorFn = getIteratorFn(node); + if (typeof iteratorFn === "function") { + if (iteratorFn !== node.entries) { + var iterator = iteratorFn.call(node); + var step; + while (!(step = iterator.next()).done) { + if (isValidElement(step.value)) { + validateExplicitKey(step.value, parentType); + } + } + } + } + } + } + function validatePropTypes(element) { + { + var type = element.type; + if ( + type === null || + type === void 0 || + typeof type === "string" + ) { + return; + } + var propTypes; + if (typeof type === "function") { + propTypes = type.propTypes; + } else if ( + typeof type === "object" && + (type.$$typeof === REACT_FORWARD_REF_TYPE || + type.$$typeof === REACT_MEMO_TYPE) + ) { + propTypes = type.propTypes; + } else { + return; + } + if (propTypes) { + var name = getComponentNameFromType(type); + checkPropTypes(propTypes, element.props, "prop", name, element); + } else if ( + type.PropTypes !== void 0 && + !propTypesMisspellWarningShown + ) { + propTypesMisspellWarningShown = true; + var _name = getComponentNameFromType(type); + error( + "Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?", + _name || "Unknown" + ); + } + if ( + typeof type.getDefaultProps === "function" && + !type.getDefaultProps.isReactClassApproved + ) { + error( + "getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead." + ); + } + } + } + function validateFragmentProps(fragment) { + { + var keys = Object.keys(fragment.props); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (key !== "children" && key !== "key") { + setCurrentlyValidatingElement$1(fragment); + error( + "Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key` and `children` props.", + key + ); + setCurrentlyValidatingElement$1(null); + break; + } + } + if (fragment.ref !== null) { + setCurrentlyValidatingElement$1(fragment); + error("Invalid attribute `ref` supplied to `React.Fragment`."); + setCurrentlyValidatingElement$1(null); + } + } + } + function createElementWithValidation(type, props, children) { + var validType = isValidElementType(type); + if (!validType) { + var info = ""; + if ( + type === void 0 || + (typeof type === "object" && + type !== null && + Object.keys(type).length === 0) + ) { + info += + " You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports."; + } + var sourceInfo = getSourceInfoErrorAddendumForProps(props); + if (sourceInfo) { + info += sourceInfo; + } else { + info += getDeclarationErrorAddendum(); + } + var typeString; + if (type === null) { + typeString = "null"; + } else if (isArray(type)) { + typeString = "array"; + } else if ( + type !== void 0 && + type.$$typeof === REACT_ELEMENT_TYPE + ) { + typeString = + "<" + + (getComponentNameFromType(type.type) || "Unknown") + + " />"; + info = + " Did you accidentally export a JSX literal instead of a component?"; + } else { + typeString = typeof type; + } + { + error( + "React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s", + typeString, + info + ); + } + } + var element = createElement.apply(this, arguments); + if (element == null) { + return element; + } + if (validType) { + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], type); + } + } + if (type === REACT_FRAGMENT_TYPE) { + validateFragmentProps(element); + } else { + validatePropTypes(element); + } + return element; + } + var didWarnAboutDeprecatedCreateFactory = false; + function createFactoryWithValidation(type) { + var validatedFactory = createElementWithValidation.bind(null, type); + validatedFactory.type = type; + { + if (!didWarnAboutDeprecatedCreateFactory) { + didWarnAboutDeprecatedCreateFactory = true; + warn( + "React.createFactory() is deprecated and will be removed in a future major release. Consider using JSX or use React.createElement() directly instead." + ); + } + Object.defineProperty(validatedFactory, "type", { + enumerable: false, + get: function () { + warn( + "Factory.type is deprecated. Access the class directly before passing it to createFactory." + ); + Object.defineProperty(this, "type", { + value: type, + }); + return type; + }, + }); + } + return validatedFactory; + } + function cloneElementWithValidation(element, props, children) { + var newElement = cloneElement.apply(this, arguments); + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], newElement.type); + } + validatePropTypes(newElement); + return newElement; + } + function startTransition(scope, options) { + var prevTransition = ReactCurrentBatchConfig.transition; + ReactCurrentBatchConfig.transition = {}; + var currentTransition = ReactCurrentBatchConfig.transition; + { + ReactCurrentBatchConfig.transition._updatedFibers = + /* @__PURE__ */ new Set(); + } + try { + scope(); + } finally { + ReactCurrentBatchConfig.transition = prevTransition; + { + if ( + prevTransition === null && + currentTransition._updatedFibers + ) { + var updatedFibersCount = + currentTransition._updatedFibers.size; + if (updatedFibersCount > 10) { + warn( + "Detected a large number of updates inside startTransition. If this is due to a subscription please re-write it to use React provided hooks. Otherwise concurrent mode guarantees are off the table." + ); + } + currentTransition._updatedFibers.clear(); + } + } + } + } + var didWarnAboutMessageChannel = false; + var enqueueTaskImpl = null; + function enqueueTask(task) { + if (enqueueTaskImpl === null) { + try { + var requireString = ("require" + Math.random()).slice(0, 7); + var nodeRequire = module && module[requireString]; + enqueueTaskImpl = nodeRequire.call( + module, + "timers" + ).setImmediate; + } catch (_err) { + enqueueTaskImpl = function (callback) { + { + if (didWarnAboutMessageChannel === false) { + didWarnAboutMessageChannel = true; + if (typeof MessageChannel === "undefined") { + error( + "This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning." + ); + } + } + } + var channel = new MessageChannel(); + channel.port1.onmessage = callback; + channel.port2.postMessage(void 0); + }; + } + } + return enqueueTaskImpl(task); + } + var actScopeDepth = 0; + var didWarnNoAwaitAct = false; + function act(callback) { + { + var prevActScopeDepth = actScopeDepth; + actScopeDepth++; + if (ReactCurrentActQueue.current === null) { + ReactCurrentActQueue.current = []; + } + var prevIsBatchingLegacy = ReactCurrentActQueue.isBatchingLegacy; + var result; + try { + ReactCurrentActQueue.isBatchingLegacy = true; + result = callback(); + if ( + !prevIsBatchingLegacy && + ReactCurrentActQueue.didScheduleLegacyUpdate + ) { + var queue = ReactCurrentActQueue.current; + if (queue !== null) { + ReactCurrentActQueue.didScheduleLegacyUpdate = false; + flushActQueue(queue); + } + } + } catch (error2) { + popActScope(prevActScopeDepth); + throw error2; + } finally { + ReactCurrentActQueue.isBatchingLegacy = prevIsBatchingLegacy; + } + if ( + result !== null && + typeof result === "object" && + typeof result.then === "function" + ) { + var thenableResult = result; + var wasAwaited = false; + var thenable = { + then: function (resolve, reject) { + wasAwaited = true; + thenableResult.then( + function (returnValue2) { + popActScope(prevActScopeDepth); + if (actScopeDepth === 0) { + recursivelyFlushAsyncActWork( + returnValue2, + resolve, + reject + ); } else { - validatePropTypes(element); - } - return element; - } - var didWarnAboutDeprecatedCreateFactory = false; - function createFactoryWithValidation(type) { - var validatedFactory = createElementWithValidation.bind(null, type); - validatedFactory.type = type; - { - if (!didWarnAboutDeprecatedCreateFactory) { - didWarnAboutDeprecatedCreateFactory = true; - warn("React.createFactory() is deprecated and will be removed in a future major release. Consider using JSX or use React.createElement() directly instead."); - } - Object.defineProperty(validatedFactory, "type", { - enumerable: false, - get: function() { - warn("Factory.type is deprecated. Access the class directly before passing it to createFactory."); - Object.defineProperty(this, "type", { - value: type - }); - return type; - } - }); - } - return validatedFactory; - } - function cloneElementWithValidation(element, props, children) { - var newElement = cloneElement.apply(this, arguments); - for (var i = 2; i < arguments.length; i++) { - validateChildKeys(arguments[i], newElement.type); - } - validatePropTypes(newElement); - return newElement; + resolve(returnValue2); + } + }, + function (error2) { + popActScope(prevActScopeDepth); + reject(error2); + } + ); + }, + }; + { + if (!didWarnNoAwaitAct && typeof Promise !== "undefined") { + Promise.resolve() + .then(function () {}) + .then(function () { + if (!wasAwaited) { + didWarnNoAwaitAct = true; + error( + "You called act(async () => ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);" + ); + } + }); + } + } + return thenable; + } else { + var returnValue = result; + popActScope(prevActScopeDepth); + if (actScopeDepth === 0) { + var _queue = ReactCurrentActQueue.current; + if (_queue !== null) { + flushActQueue(_queue); + ReactCurrentActQueue.current = null; + } + var _thenable = { + then: function (resolve, reject) { + if (ReactCurrentActQueue.current === null) { + ReactCurrentActQueue.current = []; + recursivelyFlushAsyncActWork( + returnValue, + resolve, + reject + ); + } else { + resolve(returnValue); + } + }, + }; + return _thenable; + } else { + var _thenable2 = { + then: function (resolve, reject) { + resolve(returnValue); + }, + }; + return _thenable2; + } + } + } + } + function popActScope(prevActScopeDepth) { + { + if (prevActScopeDepth !== actScopeDepth - 1) { + error( + "You seem to have overlapping act() calls, this is not supported. Be sure to await previous act() calls before making a new one. " + ); + } + actScopeDepth = prevActScopeDepth; + } + } + function recursivelyFlushAsyncActWork(returnValue, resolve, reject) { + { + var queue = ReactCurrentActQueue.current; + if (queue !== null) { + try { + flushActQueue(queue); + enqueueTask(function () { + if (queue.length === 0) { + ReactCurrentActQueue.current = null; + resolve(returnValue); + } else { + recursivelyFlushAsyncActWork( + returnValue, + resolve, + reject + ); } - function startTransition(scope, options) { - var prevTransition = ReactCurrentBatchConfig.transition; - ReactCurrentBatchConfig.transition = {}; - var currentTransition = ReactCurrentBatchConfig.transition; - { - ReactCurrentBatchConfig.transition._updatedFibers = /* @__PURE__ */ new Set(); - } - try { - scope(); - } finally { - ReactCurrentBatchConfig.transition = prevTransition; - { - if (prevTransition === null && currentTransition._updatedFibers) { - var updatedFibersCount = currentTransition._updatedFibers.size; - if (updatedFibersCount > 10) { - warn("Detected a large number of updates inside startTransition. If this is due to a subscription please re-write it to use React provided hooks. Otherwise concurrent mode guarantees are off the table."); - } - currentTransition._updatedFibers.clear(); - } - } - } - } - var didWarnAboutMessageChannel = false; - var enqueueTaskImpl = null; - function enqueueTask(task) { - if (enqueueTaskImpl === null) { - try { - var requireString = ("require" + Math.random()).slice(0, 7); - var nodeRequire = module && module[requireString]; - enqueueTaskImpl = nodeRequire.call(module, "timers").setImmediate; - } catch (_err) { - enqueueTaskImpl = function(callback) { - { - if (didWarnAboutMessageChannel === false) { - didWarnAboutMessageChannel = true; - if (typeof MessageChannel === "undefined") { - error("This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning."); - } - } - } - var channel = new MessageChannel(); - channel.port1.onmessage = callback; - channel.port2.postMessage(void 0); - }; - } - } - return enqueueTaskImpl(task); - } - var actScopeDepth = 0; - var didWarnNoAwaitAct = false; - function act(callback) { - { - var prevActScopeDepth = actScopeDepth; - actScopeDepth++; - if (ReactCurrentActQueue.current === null) { - ReactCurrentActQueue.current = []; - } - var prevIsBatchingLegacy = ReactCurrentActQueue.isBatchingLegacy; - var result; - try { - ReactCurrentActQueue.isBatchingLegacy = true; - result = callback(); - if (!prevIsBatchingLegacy && ReactCurrentActQueue.didScheduleLegacyUpdate) { - var queue = ReactCurrentActQueue.current; - if (queue !== null) { - ReactCurrentActQueue.didScheduleLegacyUpdate = false; - flushActQueue(queue); - } - } - } catch (error2) { - popActScope(prevActScopeDepth); - throw error2; - } finally { - ReactCurrentActQueue.isBatchingLegacy = prevIsBatchingLegacy; - } - if (result !== null && typeof result === "object" && typeof result.then === "function") { - var thenableResult = result; - var wasAwaited = false; - var thenable = { - then: function(resolve, reject) { - wasAwaited = true; - thenableResult.then(function(returnValue2) { - popActScope(prevActScopeDepth); - if (actScopeDepth === 0) { - recursivelyFlushAsyncActWork(returnValue2, resolve, reject); - } else { - resolve(returnValue2); - } - }, function(error2) { - popActScope(prevActScopeDepth); - reject(error2); - }); - } - }; - { - if (!didWarnNoAwaitAct && typeof Promise !== "undefined") { - Promise.resolve().then(function() { - }).then(function() { - if (!wasAwaited) { - didWarnNoAwaitAct = true; - error("You called act(async () => ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);"); - } - }); - } - } - return thenable; - } else { - var returnValue = result; - popActScope(prevActScopeDepth); - if (actScopeDepth === 0) { - var _queue = ReactCurrentActQueue.current; - if (_queue !== null) { - flushActQueue(_queue); - ReactCurrentActQueue.current = null; - } - var _thenable = { - then: function(resolve, reject) { - if (ReactCurrentActQueue.current === null) { - ReactCurrentActQueue.current = []; - recursivelyFlushAsyncActWork(returnValue, resolve, reject); - } else { - resolve(returnValue); - } - } - }; - return _thenable; - } else { - var _thenable2 = { - then: function(resolve, reject) { - resolve(returnValue); - } - }; - return _thenable2; - } - } - } - } - function popActScope(prevActScopeDepth) { - { - if (prevActScopeDepth !== actScopeDepth - 1) { - error("You seem to have overlapping act() calls, this is not supported. Be sure to await previous act() calls before making a new one. "); - } - actScopeDepth = prevActScopeDepth; - } - } - function recursivelyFlushAsyncActWork(returnValue, resolve, reject) { - { - var queue = ReactCurrentActQueue.current; - if (queue !== null) { - try { - flushActQueue(queue); - enqueueTask(function() { - if (queue.length === 0) { - ReactCurrentActQueue.current = null; - resolve(returnValue); - } else { - recursivelyFlushAsyncActWork(returnValue, resolve, reject); - } - }); - } catch (error2) { - reject(error2); - } - } else { - resolve(returnValue); - } - } - } - var isFlushing = false; - function flushActQueue(queue) { - { - if (!isFlushing) { - isFlushing = true; - var i = 0; - try { - for (; i < queue.length; i++) { - var callback = queue[i]; - do { - callback = callback(true); - } while (callback !== null); - } - queue.length = 0; - } catch (error2) { - queue = queue.slice(i + 1); - throw error2; - } finally { - isFlushing = false; - } - } - } - } - var createElement$1 = createElementWithValidation; - var cloneElement$1 = cloneElementWithValidation; - var createFactory = createFactoryWithValidation; - var Children = { - map: mapChildren, - forEach: forEachChildren, - count: countChildren, - toArray, - only: onlyChild - }; - exports.Children = Children; - exports.Component = Component; - exports.Fragment = REACT_FRAGMENT_TYPE; - exports.Profiler = REACT_PROFILER_TYPE; - exports.PureComponent = PureComponent; - exports.StrictMode = REACT_STRICT_MODE_TYPE; - exports.Suspense = REACT_SUSPENSE_TYPE; - exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals; - exports.cloneElement = cloneElement$1; - exports.createContext = createContext; - exports.createElement = createElement$1; - exports.createFactory = createFactory; - exports.createRef = createRef; - exports.forwardRef = forwardRef; - exports.isValidElement = isValidElement; - exports.lazy = lazy; - exports.memo = memo; - exports.startTransition = startTransition; - exports.unstable_act = act; - exports.useCallback = useCallback; - exports.useContext = useContext; - exports.useDebugValue = useDebugValue; - exports.useDeferredValue = useDeferredValue; - exports.useEffect = useEffect; - exports.useId = useId; - exports.useImperativeHandle = useImperativeHandle; - exports.useInsertionEffect = useInsertionEffect; - exports.useLayoutEffect = useLayoutEffect; - exports.useMemo = useMemo; - exports.useReducer = useReducer; - exports.useRef = useRef; - exports.useState = useState; - exports.useSyncExternalStore = useSyncExternalStore; - exports.useTransition = useTransition; - exports.version = ReactVersion; - if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === "function") { - __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error()); - } - })(); + }); + } catch (error2) { + reject(error2); + } + } else { + resolve(returnValue); + } } - } - }); + } + var isFlushing = false; + function flushActQueue(queue) { + { + if (!isFlushing) { + isFlushing = true; + var i = 0; + try { + for (; i < queue.length; i++) { + var callback = queue[i]; + do { + callback = callback(true); + } while (callback !== null); + } + queue.length = 0; + } catch (error2) { + queue = queue.slice(i + 1); + throw error2; + } finally { + isFlushing = false; + } + } + } + } + var createElement$1 = createElementWithValidation; + var cloneElement$1 = cloneElementWithValidation; + var createFactory = createFactoryWithValidation; + var Children = { + map: mapChildren, + forEach: forEachChildren, + count: countChildren, + toArray, + only: onlyChild, + }; + exports.Children = Children; + exports.Component = Component; + exports.Fragment = REACT_FRAGMENT_TYPE; + exports.Profiler = REACT_PROFILER_TYPE; + exports.PureComponent = PureComponent; + exports.StrictMode = REACT_STRICT_MODE_TYPE; + exports.Suspense = REACT_SUSPENSE_TYPE; + exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = + ReactSharedInternals; + exports.cloneElement = cloneElement$1; + exports.createContext = createContext; + exports.createElement = createElement$1; + exports.createFactory = createFactory; + exports.createRef = createRef; + exports.forwardRef = forwardRef; + exports.isValidElement = isValidElement; + exports.lazy = lazy; + exports.memo = memo; + exports.startTransition = startTransition; + exports.unstable_act = act; + exports.useCallback = useCallback; + exports.useContext = useContext; + exports.useDebugValue = useDebugValue; + exports.useDeferredValue = useDeferredValue; + exports.useEffect = useEffect; + exports.useId = useId; + exports.useImperativeHandle = useImperativeHandle; + exports.useInsertionEffect = useInsertionEffect; + exports.useLayoutEffect = useLayoutEffect; + exports.useMemo = useMemo; + exports.useReducer = useReducer; + exports.useRef = useRef; + exports.useState = useState; + exports.useSyncExternalStore = useSyncExternalStore; + exports.useTransition = useTransition; + exports.version = ReactVersion; + if ( + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== "undefined" && + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === + "function" + ) { + __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop( + new Error() + ); + } + })(); + } + }, + }); - // node_modules/react/index.js - var require_react = __commonJS({ - "node_modules/react/index.js"(exports, module) { - "use strict"; - init_process_shim(); - if (process.env.NODE_ENV === "production") { - module.exports = require_react_production_min(); - } else { - module.exports = require_react_development(); - } + // node_modules/react/index.js + var require_react = __commonJS({ + "node_modules/react/index.js"(exports, module) { + "use strict"; + init_process_shim(); + if (process.env.NODE_ENV === "production") { + module.exports = require_react_production_min(); + } else { + module.exports = require_react_development(); + } + }, + }); + + // node_modules/readable-stream/lib/ours/primordials.js + var require_primordials = __commonJS({ + "node_modules/readable-stream/lib/ours/primordials.js"(exports, module) { + "use strict"; + init_process_shim(); + module.exports = { + ArrayIsArray(self2) { + return Array.isArray(self2); + }, + ArrayPrototypeIncludes(self2, el) { + return self2.includes(el); + }, + ArrayPrototypeIndexOf(self2, el) { + return self2.indexOf(el); + }, + ArrayPrototypeJoin(self2, sep) { + return self2.join(sep); + }, + ArrayPrototypeMap(self2, fn) { + return self2.map(fn); + }, + ArrayPrototypePop(self2, el) { + return self2.pop(el); + }, + ArrayPrototypePush(self2, el) { + return self2.push(el); + }, + ArrayPrototypeSlice(self2, start, end) { + return self2.slice(start, end); + }, + Error, + FunctionPrototypeCall(fn, thisArgs, ...args) { + return fn.call(thisArgs, ...args); + }, + FunctionPrototypeSymbolHasInstance(self2, instance) { + return Function.prototype[Symbol.hasInstance].call(self2, instance); + }, + MathFloor: Math.floor, + Number, + NumberIsInteger: Number.isInteger, + NumberIsNaN: Number.isNaN, + NumberMAX_SAFE_INTEGER: Number.MAX_SAFE_INTEGER, + NumberMIN_SAFE_INTEGER: Number.MIN_SAFE_INTEGER, + NumberParseInt: Number.parseInt, + ObjectDefineProperties(self2, props) { + return Object.defineProperties(self2, props); + }, + ObjectDefineProperty(self2, name, prop) { + return Object.defineProperty(self2, name, prop); + }, + ObjectGetOwnPropertyDescriptor(self2, name) { + return Object.getOwnPropertyDescriptor(self2, name); + }, + ObjectKeys(obj) { + return Object.keys(obj); + }, + ObjectSetPrototypeOf(target, proto) { + return Object.setPrototypeOf(target, proto); + }, + Promise, + PromisePrototypeCatch(self2, fn) { + return self2.catch(fn); + }, + PromisePrototypeThen(self2, thenFn, catchFn) { + return self2.then(thenFn, catchFn); + }, + PromiseReject(err) { + return Promise.reject(err); + }, + ReflectApply: Reflect.apply, + RegExpPrototypeTest(self2, value) { + return self2.test(value); + }, + SafeSet: Set, + String, + StringPrototypeSlice(self2, start, end) { + return self2.slice(start, end); + }, + StringPrototypeToLowerCase(self2) { + return self2.toLowerCase(); + }, + StringPrototypeToUpperCase(self2) { + return self2.toUpperCase(); + }, + StringPrototypeTrim(self2) { + return self2.trim(); + }, + Symbol, + SymbolAsyncIterator: Symbol.asyncIterator, + SymbolHasInstance: Symbol.hasInstance, + SymbolIterator: Symbol.iterator, + TypedArrayPrototypeSet(self2, buf, len) { + return self2.set(buf, len); + }, + Uint8Array, + }; + }, + }); + + // node_modules/base64-js/index.js + var require_base64_js = __commonJS({ + "node_modules/base64-js/index.js"(exports) { + "use strict"; + init_process_shim(); + exports.byteLength = byteLength; + exports.toByteArray = toByteArray; + exports.fromByteArray = fromByteArray; + var lookup = []; + var revLookup = []; + var Arr = typeof Uint8Array !== "undefined" ? Uint8Array : Array; + var code = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + for (i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i]; + revLookup[code.charCodeAt(i)] = i; + } + var i; + var len; + revLookup["-".charCodeAt(0)] = 62; + revLookup["_".charCodeAt(0)] = 63; + function getLens(b64) { + var len2 = b64.length; + if (len2 % 4 > 0) { + throw new Error("Invalid string. Length must be a multiple of 4"); } - }); + var validLen = b64.indexOf("="); + if (validLen === -1) validLen = len2; + var placeHoldersLen = validLen === len2 ? 0 : 4 - (validLen % 4); + return [validLen, placeHoldersLen]; + } + function byteLength(b64) { + var lens = getLens(b64); + var validLen = lens[0]; + var placeHoldersLen = lens[1]; + return ((validLen + placeHoldersLen) * 3) / 4 - placeHoldersLen; + } + function _byteLength(b64, validLen, placeHoldersLen) { + return ((validLen + placeHoldersLen) * 3) / 4 - placeHoldersLen; + } + function toByteArray(b64) { + var tmp; + var lens = getLens(b64); + var validLen = lens[0]; + var placeHoldersLen = lens[1]; + var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)); + var curByte = 0; + var len2 = placeHoldersLen > 0 ? validLen - 4 : validLen; + var i2; + for (i2 = 0; i2 < len2; i2 += 4) { + tmp = + (revLookup[b64.charCodeAt(i2)] << 18) | + (revLookup[b64.charCodeAt(i2 + 1)] << 12) | + (revLookup[b64.charCodeAt(i2 + 2)] << 6) | + revLookup[b64.charCodeAt(i2 + 3)]; + arr[curByte++] = (tmp >> 16) & 255; + arr[curByte++] = (tmp >> 8) & 255; + arr[curByte++] = tmp & 255; + } + if (placeHoldersLen === 2) { + tmp = + (revLookup[b64.charCodeAt(i2)] << 2) | + (revLookup[b64.charCodeAt(i2 + 1)] >> 4); + arr[curByte++] = tmp & 255; + } + if (placeHoldersLen === 1) { + tmp = + (revLookup[b64.charCodeAt(i2)] << 10) | + (revLookup[b64.charCodeAt(i2 + 1)] << 4) | + (revLookup[b64.charCodeAt(i2 + 2)] >> 2); + arr[curByte++] = (tmp >> 8) & 255; + arr[curByte++] = tmp & 255; + } + return arr; + } + function tripletToBase64(num) { + return ( + lookup[(num >> 18) & 63] + + lookup[(num >> 12) & 63] + + lookup[(num >> 6) & 63] + + lookup[num & 63] + ); + } + function encodeChunk(uint8, start, end) { + var tmp; + var output = []; + for (var i2 = start; i2 < end; i2 += 3) { + tmp = + ((uint8[i2] << 16) & 16711680) + + ((uint8[i2 + 1] << 8) & 65280) + + (uint8[i2 + 2] & 255); + output.push(tripletToBase64(tmp)); + } + return output.join(""); + } + function fromByteArray(uint8) { + var tmp; + var len2 = uint8.length; + var extraBytes = len2 % 3; + var parts = []; + var maxChunkLength = 16383; + for ( + var i2 = 0, len22 = len2 - extraBytes; + i2 < len22; + i2 += maxChunkLength + ) { + parts.push( + encodeChunk( + uint8, + i2, + i2 + maxChunkLength > len22 ? len22 : i2 + maxChunkLength + ) + ); + } + if (extraBytes === 1) { + tmp = uint8[len2 - 1]; + parts.push(lookup[tmp >> 2] + lookup[(tmp << 4) & 63] + "=="); + } else if (extraBytes === 2) { + tmp = (uint8[len2 - 2] << 8) + uint8[len2 - 1]; + parts.push( + lookup[tmp >> 10] + + lookup[(tmp >> 4) & 63] + + lookup[(tmp << 2) & 63] + + "=" + ); + } + return parts.join(""); + } + }, + }); - // node_modules/readable-stream/lib/ours/primordials.js - var require_primordials = __commonJS({ - "node_modules/readable-stream/lib/ours/primordials.js"(exports, module) { - "use strict"; - init_process_shim(); - module.exports = { - ArrayIsArray(self2) { - return Array.isArray(self2); - }, - ArrayPrototypeIncludes(self2, el) { - return self2.includes(el); - }, - ArrayPrototypeIndexOf(self2, el) { - return self2.indexOf(el); - }, - ArrayPrototypeJoin(self2, sep) { - return self2.join(sep); - }, - ArrayPrototypeMap(self2, fn) { - return self2.map(fn); - }, - ArrayPrototypePop(self2, el) { - return self2.pop(el); - }, - ArrayPrototypePush(self2, el) { - return self2.push(el); - }, - ArrayPrototypeSlice(self2, start, end) { - return self2.slice(start, end); - }, - Error, - FunctionPrototypeCall(fn, thisArgs, ...args) { - return fn.call(thisArgs, ...args); - }, - FunctionPrototypeSymbolHasInstance(self2, instance) { - return Function.prototype[Symbol.hasInstance].call(self2, instance); - }, - MathFloor: Math.floor, - Number, - NumberIsInteger: Number.isInteger, - NumberIsNaN: Number.isNaN, - NumberMAX_SAFE_INTEGER: Number.MAX_SAFE_INTEGER, - NumberMIN_SAFE_INTEGER: Number.MIN_SAFE_INTEGER, - NumberParseInt: Number.parseInt, - ObjectDefineProperties(self2, props) { - return Object.defineProperties(self2, props); - }, - ObjectDefineProperty(self2, name, prop) { - return Object.defineProperty(self2, name, prop); - }, - ObjectGetOwnPropertyDescriptor(self2, name) { - return Object.getOwnPropertyDescriptor(self2, name); - }, - ObjectKeys(obj) { - return Object.keys(obj); - }, - ObjectSetPrototypeOf(target, proto) { - return Object.setPrototypeOf(target, proto); - }, - Promise, - PromisePrototypeCatch(self2, fn) { - return self2.catch(fn); - }, - PromisePrototypeThen(self2, thenFn, catchFn) { - return self2.then(thenFn, catchFn); - }, - PromiseReject(err) { - return Promise.reject(err); - }, - ReflectApply: Reflect.apply, - RegExpPrototypeTest(self2, value) { - return self2.test(value); - }, - SafeSet: Set, - String, - StringPrototypeSlice(self2, start, end) { - return self2.slice(start, end); - }, - StringPrototypeToLowerCase(self2) { - return self2.toLowerCase(); - }, - StringPrototypeToUpperCase(self2) { - return self2.toUpperCase(); - }, - StringPrototypeTrim(self2) { - return self2.trim(); - }, - Symbol, - SymbolAsyncIterator: Symbol.asyncIterator, - SymbolHasInstance: Symbol.hasInstance, - SymbolIterator: Symbol.iterator, - TypedArrayPrototypeSet(self2, buf, len) { - return self2.set(buf, len); - }, - Uint8Array - }; + // node_modules/ieee754/index.js + var require_ieee754 = __commonJS({ + "node_modules/ieee754/index.js"(exports) { + init_process_shim(); + exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var nBits = -7; + var i = isLE ? nBytes - 1 : 0; + var d = isLE ? -1 : 1; + var s = buffer[offset + i]; + i += d; + e = s & ((1 << -nBits) - 1); + s >>= -nBits; + nBits += eLen; + for ( + ; + nBits > 0; + e = e * 256 + buffer[offset + i], i += d, nBits -= 8 + ) {} + m = e & ((1 << -nBits) - 1); + e >>= -nBits; + nBits += mLen; + for ( + ; + nBits > 0; + m = m * 256 + buffer[offset + i], i += d, nBits -= 8 + ) {} + if (e === 0) { + e = 1 - eBias; + } else if (e === eMax) { + return m ? NaN : (s ? -1 : 1) * Infinity; + } else { + m = m + Math.pow(2, mLen); + e = e - eBias; } - }); + return (s ? -1 : 1) * m * Math.pow(2, e - mLen); + }; + exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0; + var i = isLE ? 0 : nBytes - 1; + var d = isLE ? 1 : -1; + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; + value = Math.abs(value); + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0; + e = eMax; + } else { + e = Math.floor(Math.log(value) / Math.LN2); + if (value * (c = Math.pow(2, -e)) < 1) { + e--; + c *= 2; + } + if (e + eBias >= 1) { + value += rt / c; + } else { + value += rt * Math.pow(2, 1 - eBias); + } + if (value * c >= 2) { + e++; + c /= 2; + } + if (e + eBias >= eMax) { + m = 0; + e = eMax; + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen); + e = e + eBias; + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); + e = 0; + } + } + for ( + ; + mLen >= 8; + buffer[offset + i] = m & 255, i += d, m /= 256, mLen -= 8 + ) {} + e = (e << mLen) | m; + eLen += mLen; + for ( + ; + eLen > 0; + buffer[offset + i] = e & 255, i += d, e /= 256, eLen -= 8 + ) {} + buffer[offset + i - d] |= s * 128; + }; + }, + }); - // node_modules/base64-js/index.js - var require_base64_js = __commonJS({ - "node_modules/base64-js/index.js"(exports) { - "use strict"; - init_process_shim(); - exports.byteLength = byteLength; - exports.toByteArray = toByteArray; - exports.fromByteArray = fromByteArray; - var lookup = []; - var revLookup = []; - var Arr = typeof Uint8Array !== "undefined" ? Uint8Array : Array; - var code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - for (i = 0, len = code.length; i < len; ++i) { - lookup[i] = code[i]; - revLookup[code.charCodeAt(i)] = i; - } - var i; - var len; - revLookup["-".charCodeAt(0)] = 62; - revLookup["_".charCodeAt(0)] = 63; - function getLens(b64) { - var len2 = b64.length; - if (len2 % 4 > 0) { - throw new Error("Invalid string. Length must be a multiple of 4"); - } - var validLen = b64.indexOf("="); - if (validLen === -1) - validLen = len2; - var placeHoldersLen = validLen === len2 ? 0 : 4 - validLen % 4; - return [validLen, placeHoldersLen]; - } - function byteLength(b64) { - var lens = getLens(b64); - var validLen = lens[0]; - var placeHoldersLen = lens[1]; - return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen; - } - function _byteLength(b64, validLen, placeHoldersLen) { - return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen; - } - function toByteArray(b64) { - var tmp; - var lens = getLens(b64); - var validLen = lens[0]; - var placeHoldersLen = lens[1]; - var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)); - var curByte = 0; - var len2 = placeHoldersLen > 0 ? validLen - 4 : validLen; - var i2; - for (i2 = 0; i2 < len2; i2 += 4) { - tmp = revLookup[b64.charCodeAt(i2)] << 18 | revLookup[b64.charCodeAt(i2 + 1)] << 12 | revLookup[b64.charCodeAt(i2 + 2)] << 6 | revLookup[b64.charCodeAt(i2 + 3)]; - arr[curByte++] = tmp >> 16 & 255; - arr[curByte++] = tmp >> 8 & 255; - arr[curByte++] = tmp & 255; - } - if (placeHoldersLen === 2) { - tmp = revLookup[b64.charCodeAt(i2)] << 2 | revLookup[b64.charCodeAt(i2 + 1)] >> 4; - arr[curByte++] = tmp & 255; - } - if (placeHoldersLen === 1) { - tmp = revLookup[b64.charCodeAt(i2)] << 10 | revLookup[b64.charCodeAt(i2 + 1)] << 4 | revLookup[b64.charCodeAt(i2 + 2)] >> 2; - arr[curByte++] = tmp >> 8 & 255; - arr[curByte++] = tmp & 255; - } - return arr; - } - function tripletToBase64(num) { - return lookup[num >> 18 & 63] + lookup[num >> 12 & 63] + lookup[num >> 6 & 63] + lookup[num & 63]; - } - function encodeChunk(uint8, start, end) { - var tmp; - var output = []; - for (var i2 = start; i2 < end; i2 += 3) { - tmp = (uint8[i2] << 16 & 16711680) + (uint8[i2 + 1] << 8 & 65280) + (uint8[i2 + 2] & 255); - output.push(tripletToBase64(tmp)); - } - return output.join(""); - } - function fromByteArray(uint8) { - var tmp; - var len2 = uint8.length; - var extraBytes = len2 % 3; - var parts = []; - var maxChunkLength = 16383; - for (var i2 = 0, len22 = len2 - extraBytes; i2 < len22; i2 += maxChunkLength) { - parts.push(encodeChunk(uint8, i2, i2 + maxChunkLength > len22 ? len22 : i2 + maxChunkLength)); - } - if (extraBytes === 1) { - tmp = uint8[len2 - 1]; - parts.push(lookup[tmp >> 2] + lookup[tmp << 4 & 63] + "=="); - } else if (extraBytes === 2) { - tmp = (uint8[len2 - 2] << 8) + uint8[len2 - 1]; - parts.push(lookup[tmp >> 10] + lookup[tmp >> 4 & 63] + lookup[tmp << 2 & 63] + "="); - } - return parts.join(""); + // node_modules/buffer/index.js + var require_buffer = __commonJS({ + "node_modules/buffer/index.js"(exports) { + "use strict"; + init_process_shim(); + var base64 = require_base64_js(); + var ieee754 = require_ieee754(); + var customInspectSymbol = + typeof Symbol === "function" && typeof Symbol["for"] === "function" + ? Symbol["for"]("nodejs.util.inspect.custom") + : null; + exports.Buffer = Buffer2; + exports.SlowBuffer = SlowBuffer; + exports.INSPECT_MAX_BYTES = 50; + var K_MAX_LENGTH = 2147483647; + exports.kMaxLength = K_MAX_LENGTH; + Buffer2.TYPED_ARRAY_SUPPORT = typedArraySupport(); + if ( + !Buffer2.TYPED_ARRAY_SUPPORT && + typeof console !== "undefined" && + typeof console.error === "function" + ) { + console.error( + "This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support." + ); + } + function typedArraySupport() { + try { + const arr = new Uint8Array(1); + const proto = { + foo: function () { + return 42; + }, + }; + Object.setPrototypeOf(proto, Uint8Array.prototype); + Object.setPrototypeOf(arr, proto); + return arr.foo() === 42; + } catch (e) { + return false; + } + } + Object.defineProperty(Buffer2.prototype, "parent", { + enumerable: true, + get: function () { + if (!Buffer2.isBuffer(this)) return void 0; + return this.buffer; + }, + }); + Object.defineProperty(Buffer2.prototype, "offset", { + enumerable: true, + get: function () { + if (!Buffer2.isBuffer(this)) return void 0; + return this.byteOffset; + }, + }); + function createBuffer(length) { + if (length > K_MAX_LENGTH) { + throw new RangeError( + 'The value "' + length + '" is invalid for option "size"' + ); + } + const buf = new Uint8Array(length); + Object.setPrototypeOf(buf, Buffer2.prototype); + return buf; + } + function Buffer2(arg, encodingOrOffset, length) { + if (typeof arg === "number") { + if (typeof encodingOrOffset === "string") { + throw new TypeError( + 'The "string" argument must be of type string. Received type number' + ); + } + return allocUnsafe(arg); + } + return from(arg, encodingOrOffset, length); + } + Buffer2.poolSize = 8192; + function from(value, encodingOrOffset, length) { + if (typeof value === "string") { + return fromString(value, encodingOrOffset); + } + if (ArrayBuffer.isView(value)) { + return fromArrayView(value); + } + if (value == null) { + throw new TypeError( + "The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + + typeof value + ); + } + if ( + isInstance(value, ArrayBuffer) || + (value && isInstance(value.buffer, ArrayBuffer)) + ) { + return fromArrayBuffer(value, encodingOrOffset, length); + } + if ( + typeof SharedArrayBuffer !== "undefined" && + (isInstance(value, SharedArrayBuffer) || + (value && isInstance(value.buffer, SharedArrayBuffer))) + ) { + return fromArrayBuffer(value, encodingOrOffset, length); + } + if (typeof value === "number") { + throw new TypeError( + 'The "value" argument must not be of type number. Received type number' + ); + } + const valueOf = value.valueOf && value.valueOf(); + if (valueOf != null && valueOf !== value) { + return Buffer2.from(valueOf, encodingOrOffset, length); + } + const b = fromObject(value); + if (b) return b; + if ( + typeof Symbol !== "undefined" && + Symbol.toPrimitive != null && + typeof value[Symbol.toPrimitive] === "function" + ) { + return Buffer2.from( + value[Symbol.toPrimitive]("string"), + encodingOrOffset, + length + ); + } + throw new TypeError( + "The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + + typeof value + ); + } + Buffer2.from = function (value, encodingOrOffset, length) { + return from(value, encodingOrOffset, length); + }; + Object.setPrototypeOf(Buffer2.prototype, Uint8Array.prototype); + Object.setPrototypeOf(Buffer2, Uint8Array); + function assertSize(size) { + if (typeof size !== "number") { + throw new TypeError('"size" argument must be of type number'); + } else if (size < 0) { + throw new RangeError( + 'The value "' + size + '" is invalid for option "size"' + ); + } + } + function alloc(size, fill, encoding) { + assertSize(size); + if (size <= 0) { + return createBuffer(size); + } + if (fill !== void 0) { + return typeof encoding === "string" + ? createBuffer(size).fill(fill, encoding) + : createBuffer(size).fill(fill); + } + return createBuffer(size); + } + Buffer2.alloc = function (size, fill, encoding) { + return alloc(size, fill, encoding); + }; + function allocUnsafe(size) { + assertSize(size); + return createBuffer(size < 0 ? 0 : checked(size) | 0); + } + Buffer2.allocUnsafe = function (size) { + return allocUnsafe(size); + }; + Buffer2.allocUnsafeSlow = function (size) { + return allocUnsafe(size); + }; + function fromString(string, encoding) { + if (typeof encoding !== "string" || encoding === "") { + encoding = "utf8"; + } + if (!Buffer2.isEncoding(encoding)) { + throw new TypeError("Unknown encoding: " + encoding); + } + const length = byteLength(string, encoding) | 0; + let buf = createBuffer(length); + const actual = buf.write(string, encoding); + if (actual !== length) { + buf = buf.slice(0, actual); + } + return buf; + } + function fromArrayLike(array) { + const length = array.length < 0 ? 0 : checked(array.length) | 0; + const buf = createBuffer(length); + for (let i = 0; i < length; i += 1) { + buf[i] = array[i] & 255; + } + return buf; + } + function fromArrayView(arrayView) { + if (isInstance(arrayView, Uint8Array)) { + const copy = new Uint8Array(arrayView); + return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength); + } + return fromArrayLike(arrayView); + } + function fromArrayBuffer(array, byteOffset, length) { + if (byteOffset < 0 || array.byteLength < byteOffset) { + throw new RangeError('"offset" is outside of buffer bounds'); + } + if (array.byteLength < byteOffset + (length || 0)) { + throw new RangeError('"length" is outside of buffer bounds'); + } + let buf; + if (byteOffset === void 0 && length === void 0) { + buf = new Uint8Array(array); + } else if (length === void 0) { + buf = new Uint8Array(array, byteOffset); + } else { + buf = new Uint8Array(array, byteOffset, length); + } + Object.setPrototypeOf(buf, Buffer2.prototype); + return buf; + } + function fromObject(obj) { + if (Buffer2.isBuffer(obj)) { + const len = checked(obj.length) | 0; + const buf = createBuffer(len); + if (buf.length === 0) { + return buf; + } + obj.copy(buf, 0, 0, len); + return buf; + } + if (obj.length !== void 0) { + if (typeof obj.length !== "number" || numberIsNaN(obj.length)) { + return createBuffer(0); + } + return fromArrayLike(obj); + } + if (obj.type === "Buffer" && Array.isArray(obj.data)) { + return fromArrayLike(obj.data); + } + } + function checked(length) { + if (length >= K_MAX_LENGTH) { + throw new RangeError( + "Attempt to allocate Buffer larger than maximum size: 0x" + + K_MAX_LENGTH.toString(16) + + " bytes" + ); + } + return length | 0; + } + function SlowBuffer(length) { + if (+length != length) { + length = 0; + } + return Buffer2.alloc(+length); + } + Buffer2.isBuffer = function isBuffer(b) { + return b != null && b._isBuffer === true && b !== Buffer2.prototype; + }; + Buffer2.compare = function compare(a, b) { + if (isInstance(a, Uint8Array)) + a = Buffer2.from(a, a.offset, a.byteLength); + if (isInstance(b, Uint8Array)) + b = Buffer2.from(b, b.offset, b.byteLength); + if (!Buffer2.isBuffer(a) || !Buffer2.isBuffer(b)) { + throw new TypeError( + 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array' + ); + } + if (a === b) return 0; + let x = a.length; + let y = b.length; + for (let i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i]; + y = b[i]; + break; + } + } + if (x < y) return -1; + if (y < x) return 1; + return 0; + }; + Buffer2.isEncoding = function isEncoding(encoding) { + switch (String(encoding).toLowerCase()) { + case "hex": + case "utf8": + case "utf-8": + case "ascii": + case "latin1": + case "binary": + case "base64": + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return true; + default: + return false; + } + }; + Buffer2.concat = function concat(list, length) { + if (!Array.isArray(list)) { + throw new TypeError('"list" argument must be an Array of Buffers'); + } + if (list.length === 0) { + return Buffer2.alloc(0); + } + let i; + if (length === void 0) { + length = 0; + for (i = 0; i < list.length; ++i) { + length += list[i].length; + } + } + const buffer = Buffer2.allocUnsafe(length); + let pos = 0; + for (i = 0; i < list.length; ++i) { + let buf = list[i]; + if (isInstance(buf, Uint8Array)) { + if (pos + buf.length > buffer.length) { + if (!Buffer2.isBuffer(buf)) buf = Buffer2.from(buf); + buf.copy(buffer, pos); + } else { + Uint8Array.prototype.set.call(buffer, buf, pos); + } + } else if (!Buffer2.isBuffer(buf)) { + throw new TypeError('"list" argument must be an Array of Buffers'); + } else { + buf.copy(buffer, pos); + } + pos += buf.length; + } + return buffer; + }; + function byteLength(string, encoding) { + if (Buffer2.isBuffer(string)) { + return string.length; + } + if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) { + return string.byteLength; + } + if (typeof string !== "string") { + throw new TypeError( + 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type ' + + typeof string + ); + } + const len = string.length; + const mustMatch = arguments.length > 2 && arguments[2] === true; + if (!mustMatch && len === 0) return 0; + let loweredCase = false; + for (;;) { + switch (encoding) { + case "ascii": + case "latin1": + case "binary": + return len; + case "utf8": + case "utf-8": + return utf8ToBytes(string).length; + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return len * 2; + case "hex": + return len >>> 1; + case "base64": + return base64ToBytes(string).length; + default: + if (loweredCase) { + return mustMatch ? -1 : utf8ToBytes(string).length; + } + encoding = ("" + encoding).toLowerCase(); + loweredCase = true; + } + } + } + Buffer2.byteLength = byteLength; + function slowToString(encoding, start, end) { + let loweredCase = false; + if (start === void 0 || start < 0) { + start = 0; + } + if (start > this.length) { + return ""; + } + if (end === void 0 || end > this.length) { + end = this.length; + } + if (end <= 0) { + return ""; + } + end >>>= 0; + start >>>= 0; + if (end <= start) { + return ""; + } + if (!encoding) encoding = "utf8"; + while (true) { + switch (encoding) { + case "hex": + return hexSlice(this, start, end); + case "utf8": + case "utf-8": + return utf8Slice(this, start, end); + case "ascii": + return asciiSlice(this, start, end); + case "latin1": + case "binary": + return latin1Slice(this, start, end); + case "base64": + return base64Slice(this, start, end); + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return utf16leSlice(this, start, end); + default: + if (loweredCase) + throw new TypeError("Unknown encoding: " + encoding); + encoding = (encoding + "").toLowerCase(); + loweredCase = true; + } + } + } + Buffer2.prototype._isBuffer = true; + function swap(b, n, m) { + const i = b[n]; + b[n] = b[m]; + b[m] = i; + } + Buffer2.prototype.swap16 = function swap16() { + const len = this.length; + if (len % 2 !== 0) { + throw new RangeError("Buffer size must be a multiple of 16-bits"); + } + for (let i = 0; i < len; i += 2) { + swap(this, i, i + 1); + } + return this; + }; + Buffer2.prototype.swap32 = function swap32() { + const len = this.length; + if (len % 4 !== 0) { + throw new RangeError("Buffer size must be a multiple of 32-bits"); + } + for (let i = 0; i < len; i += 4) { + swap(this, i, i + 3); + swap(this, i + 1, i + 2); + } + return this; + }; + Buffer2.prototype.swap64 = function swap64() { + const len = this.length; + if (len % 8 !== 0) { + throw new RangeError("Buffer size must be a multiple of 64-bits"); + } + for (let i = 0; i < len; i += 8) { + swap(this, i, i + 7); + swap(this, i + 1, i + 6); + swap(this, i + 2, i + 5); + swap(this, i + 3, i + 4); + } + return this; + }; + Buffer2.prototype.toString = function toString() { + const length = this.length; + if (length === 0) return ""; + if (arguments.length === 0) return utf8Slice(this, 0, length); + return slowToString.apply(this, arguments); + }; + Buffer2.prototype.toLocaleString = Buffer2.prototype.toString; + Buffer2.prototype.equals = function equals(b) { + if (!Buffer2.isBuffer(b)) + throw new TypeError("Argument must be a Buffer"); + if (this === b) return true; + return Buffer2.compare(this, b) === 0; + }; + Buffer2.prototype.inspect = function inspect() { + let str = ""; + const max = exports.INSPECT_MAX_BYTES; + str = this.toString("hex", 0, max) + .replace(/(.{2})/g, "$1 ") + .trim(); + if (this.length > max) str += " ... "; + return ""; + }; + if (customInspectSymbol) { + Buffer2.prototype[customInspectSymbol] = Buffer2.prototype.inspect; + } + Buffer2.prototype.compare = function compare( + target, + start, + end, + thisStart, + thisEnd + ) { + if (isInstance(target, Uint8Array)) { + target = Buffer2.from(target, target.offset, target.byteLength); + } + if (!Buffer2.isBuffer(target)) { + throw new TypeError( + 'The "target" argument must be one of type Buffer or Uint8Array. Received type ' + + typeof target + ); + } + if (start === void 0) { + start = 0; + } + if (end === void 0) { + end = target ? target.length : 0; + } + if (thisStart === void 0) { + thisStart = 0; + } + if (thisEnd === void 0) { + thisEnd = this.length; + } + if ( + start < 0 || + end > target.length || + thisStart < 0 || + thisEnd > this.length + ) { + throw new RangeError("out of range index"); + } + if (thisStart >= thisEnd && start >= end) { + return 0; + } + if (thisStart >= thisEnd) { + return -1; + } + if (start >= end) { + return 1; + } + start >>>= 0; + end >>>= 0; + thisStart >>>= 0; + thisEnd >>>= 0; + if (this === target) return 0; + let x = thisEnd - thisStart; + let y = end - start; + const len = Math.min(x, y); + const thisCopy = this.slice(thisStart, thisEnd); + const targetCopy = target.slice(start, end); + for (let i = 0; i < len; ++i) { + if (thisCopy[i] !== targetCopy[i]) { + x = thisCopy[i]; + y = targetCopy[i]; + break; + } + } + if (x < y) return -1; + if (y < x) return 1; + return 0; + }; + function bidirectionalIndexOf(buffer, val, byteOffset, encoding, dir) { + if (buffer.length === 0) return -1; + if (typeof byteOffset === "string") { + encoding = byteOffset; + byteOffset = 0; + } else if (byteOffset > 2147483647) { + byteOffset = 2147483647; + } else if (byteOffset < -2147483648) { + byteOffset = -2147483648; + } + byteOffset = +byteOffset; + if (numberIsNaN(byteOffset)) { + byteOffset = dir ? 0 : buffer.length - 1; + } + if (byteOffset < 0) byteOffset = buffer.length + byteOffset; + if (byteOffset >= buffer.length) { + if (dir) return -1; + else byteOffset = buffer.length - 1; + } else if (byteOffset < 0) { + if (dir) byteOffset = 0; + else return -1; + } + if (typeof val === "string") { + val = Buffer2.from(val, encoding); + } + if (Buffer2.isBuffer(val)) { + if (val.length === 0) { + return -1; + } + return arrayIndexOf(buffer, val, byteOffset, encoding, dir); + } else if (typeof val === "number") { + val = val & 255; + if (typeof Uint8Array.prototype.indexOf === "function") { + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset); + } else { + return Uint8Array.prototype.lastIndexOf.call( + buffer, + val, + byteOffset + ); + } + } + return arrayIndexOf(buffer, [val], byteOffset, encoding, dir); + } + throw new TypeError("val must be string, number or Buffer"); + } + function arrayIndexOf(arr, val, byteOffset, encoding, dir) { + let indexSize = 1; + let arrLength = arr.length; + let valLength = val.length; + if (encoding !== void 0) { + encoding = String(encoding).toLowerCase(); + if ( + encoding === "ucs2" || + encoding === "ucs-2" || + encoding === "utf16le" || + encoding === "utf-16le" + ) { + if (arr.length < 2 || val.length < 2) { + return -1; + } + indexSize = 2; + arrLength /= 2; + valLength /= 2; + byteOffset /= 2; + } + } + function read(buf, i2) { + if (indexSize === 1) { + return buf[i2]; + } else { + return buf.readUInt16BE(i2 * indexSize); + } + } + let i; + if (dir) { + let foundIndex = -1; + for (i = byteOffset; i < arrLength; i++) { + if ( + read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex) + ) { + if (foundIndex === -1) foundIndex = i; + if (i - foundIndex + 1 === valLength) + return foundIndex * indexSize; + } else { + if (foundIndex !== -1) i -= i - foundIndex; + foundIndex = -1; } + } + } else { + if (byteOffset + valLength > arrLength) + byteOffset = arrLength - valLength; + for (i = byteOffset; i >= 0; i--) { + let found = true; + for (let j = 0; j < valLength; j++) { + if (read(arr, i + j) !== read(val, j)) { + found = false; + break; + } + } + if (found) return i; + } } - }); + return -1; + } + Buffer2.prototype.includes = function includes( + val, + byteOffset, + encoding + ) { + return this.indexOf(val, byteOffset, encoding) !== -1; + }; + Buffer2.prototype.indexOf = function indexOf(val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, true); + }; + Buffer2.prototype.lastIndexOf = function lastIndexOf( + val, + byteOffset, + encoding + ) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, false); + }; + function hexWrite(buf, string, offset, length) { + offset = Number(offset) || 0; + const remaining = buf.length - offset; + if (!length) { + length = remaining; + } else { + length = Number(length); + if (length > remaining) { + length = remaining; + } + } + const strLen = string.length; + if (length > strLen / 2) { + length = strLen / 2; + } + let i; + for (i = 0; i < length; ++i) { + const parsed = parseInt(string.substr(i * 2, 2), 16); + if (numberIsNaN(parsed)) return i; + buf[offset + i] = parsed; + } + return i; + } + function utf8Write(buf, string, offset, length) { + return blitBuffer( + utf8ToBytes(string, buf.length - offset), + buf, + offset, + length + ); + } + function asciiWrite(buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length); + } + function base64Write(buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length); + } + function ucs2Write(buf, string, offset, length) { + return blitBuffer( + utf16leToBytes(string, buf.length - offset), + buf, + offset, + length + ); + } + Buffer2.prototype.write = function write( + string, + offset, + length, + encoding + ) { + if (offset === void 0) { + encoding = "utf8"; + length = this.length; + offset = 0; + } else if (length === void 0 && typeof offset === "string") { + encoding = offset; + length = this.length; + offset = 0; + } else if (isFinite(offset)) { + offset = offset >>> 0; + if (isFinite(length)) { + length = length >>> 0; + if (encoding === void 0) encoding = "utf8"; + } else { + encoding = length; + length = void 0; + } + } else { + throw new Error( + "Buffer.write(string, encoding, offset[, length]) is no longer supported" + ); + } + const remaining = this.length - offset; + if (length === void 0 || length > remaining) length = remaining; + if ( + (string.length > 0 && (length < 0 || offset < 0)) || + offset > this.length + ) { + throw new RangeError("Attempt to write outside buffer bounds"); + } + if (!encoding) encoding = "utf8"; + let loweredCase = false; + for (;;) { + switch (encoding) { + case "hex": + return hexWrite(this, string, offset, length); + case "utf8": + case "utf-8": + return utf8Write(this, string, offset, length); + case "ascii": + case "latin1": + case "binary": + return asciiWrite(this, string, offset, length); + case "base64": + return base64Write(this, string, offset, length); + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return ucs2Write(this, string, offset, length); + default: + if (loweredCase) + throw new TypeError("Unknown encoding: " + encoding); + encoding = ("" + encoding).toLowerCase(); + loweredCase = true; + } + } + }; + Buffer2.prototype.toJSON = function toJSON() { + return { + type: "Buffer", + data: Array.prototype.slice.call(this._arr || this, 0), + }; + }; + function base64Slice(buf, start, end) { + if (start === 0 && end === buf.length) { + return base64.fromByteArray(buf); + } else { + return base64.fromByteArray(buf.slice(start, end)); + } + } + function utf8Slice(buf, start, end) { + end = Math.min(buf.length, end); + const res = []; + let i = start; + while (i < end) { + const firstByte = buf[i]; + let codePoint = null; + let bytesPerSequence = + firstByte > 239 ? 4 : firstByte > 223 ? 3 : firstByte > 191 ? 2 : 1; + if (i + bytesPerSequence <= end) { + let secondByte, thirdByte, fourthByte, tempCodePoint; + switch (bytesPerSequence) { + case 1: + if (firstByte < 128) { + codePoint = firstByte; + } + break; + case 2: + secondByte = buf[i + 1]; + if ((secondByte & 192) === 128) { + tempCodePoint = ((firstByte & 31) << 6) | (secondByte & 63); + if (tempCodePoint > 127) { + codePoint = tempCodePoint; + } + } + break; + case 3: + secondByte = buf[i + 1]; + thirdByte = buf[i + 2]; + if ((secondByte & 192) === 128 && (thirdByte & 192) === 128) { + tempCodePoint = + ((firstByte & 15) << 12) | + ((secondByte & 63) << 6) | + (thirdByte & 63); + if ( + tempCodePoint > 2047 && + (tempCodePoint < 55296 || tempCodePoint > 57343) + ) { + codePoint = tempCodePoint; + } + } + break; + case 4: + secondByte = buf[i + 1]; + thirdByte = buf[i + 2]; + fourthByte = buf[i + 3]; + if ( + (secondByte & 192) === 128 && + (thirdByte & 192) === 128 && + (fourthByte & 192) === 128 + ) { + tempCodePoint = + ((firstByte & 15) << 18) | + ((secondByte & 63) << 12) | + ((thirdByte & 63) << 6) | + (fourthByte & 63); + if (tempCodePoint > 65535 && tempCodePoint < 1114112) { + codePoint = tempCodePoint; + } + } + } + } + if (codePoint === null) { + codePoint = 65533; + bytesPerSequence = 1; + } else if (codePoint > 65535) { + codePoint -= 65536; + res.push(((codePoint >>> 10) & 1023) | 55296); + codePoint = 56320 | (codePoint & 1023); + } + res.push(codePoint); + i += bytesPerSequence; + } + return decodeCodePointsArray(res); + } + var MAX_ARGUMENTS_LENGTH = 4096; + function decodeCodePointsArray(codePoints) { + const len = codePoints.length; + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints); + } + let res = ""; + let i = 0; + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, (i += MAX_ARGUMENTS_LENGTH)) + ); + } + return res; + } + function asciiSlice(buf, start, end) { + let ret = ""; + end = Math.min(buf.length, end); + for (let i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i] & 127); + } + return ret; + } + function latin1Slice(buf, start, end) { + let ret = ""; + end = Math.min(buf.length, end); + for (let i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i]); + } + return ret; + } + function hexSlice(buf, start, end) { + const len = buf.length; + if (!start || start < 0) start = 0; + if (!end || end < 0 || end > len) end = len; + let out = ""; + for (let i = start; i < end; ++i) { + out += hexSliceLookupTable[buf[i]]; + } + return out; + } + function utf16leSlice(buf, start, end) { + const bytes = buf.slice(start, end); + let res = ""; + for (let i = 0; i < bytes.length - 1; i += 2) { + res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256); + } + return res; + } + Buffer2.prototype.slice = function slice(start, end) { + const len = this.length; + start = ~~start; + end = end === void 0 ? len : ~~end; + if (start < 0) { + start += len; + if (start < 0) start = 0; + } else if (start > len) { + start = len; + } + if (end < 0) { + end += len; + if (end < 0) end = 0; + } else if (end > len) { + end = len; + } + if (end < start) end = start; + const newBuf = this.subarray(start, end); + Object.setPrototypeOf(newBuf, Buffer2.prototype); + return newBuf; + }; + function checkOffset(offset, ext, length) { + if (offset % 1 !== 0 || offset < 0) + throw new RangeError("offset is not uint"); + if (offset + ext > length) + throw new RangeError("Trying to access beyond buffer length"); + } + Buffer2.prototype.readUintLE = Buffer2.prototype.readUIntLE = + function readUIntLE(offset, byteLength2, noAssert) { + offset = offset >>> 0; + byteLength2 = byteLength2 >>> 0; + if (!noAssert) checkOffset(offset, byteLength2, this.length); + let val = this[offset]; + let mul = 1; + let i = 0; + while (++i < byteLength2 && (mul *= 256)) { + val += this[offset + i] * mul; + } + return val; + }; + Buffer2.prototype.readUintBE = Buffer2.prototype.readUIntBE = + function readUIntBE(offset, byteLength2, noAssert) { + offset = offset >>> 0; + byteLength2 = byteLength2 >>> 0; + if (!noAssert) { + checkOffset(offset, byteLength2, this.length); + } + let val = this[offset + --byteLength2]; + let mul = 1; + while (byteLength2 > 0 && (mul *= 256)) { + val += this[offset + --byteLength2] * mul; + } + return val; + }; + Buffer2.prototype.readUint8 = Buffer2.prototype.readUInt8 = + function readUInt8(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 1, this.length); + return this[offset]; + }; + Buffer2.prototype.readUint16LE = Buffer2.prototype.readUInt16LE = + function readUInt16LE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 2, this.length); + return this[offset] | (this[offset + 1] << 8); + }; + Buffer2.prototype.readUint16BE = Buffer2.prototype.readUInt16BE = + function readUInt16BE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 2, this.length); + return (this[offset] << 8) | this[offset + 1]; + }; + Buffer2.prototype.readUint32LE = Buffer2.prototype.readUInt32LE = + function readUInt32LE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return ( + (this[offset] | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + this[offset + 3] * 16777216 + ); + }; + Buffer2.prototype.readUint32BE = Buffer2.prototype.readUInt32BE = + function readUInt32BE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return ( + this[offset] * 16777216 + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) + ); + }; + Buffer2.prototype.readBigUInt64LE = defineBigIntMethod( + function readBigUInt64LE(offset) { + offset = offset >>> 0; + validateNumber(offset, "offset"); + const first = this[offset]; + const last = this[offset + 7]; + if (first === void 0 || last === void 0) { + boundsError(offset, this.length - 8); + } + const lo = + first + + this[++offset] * 2 ** 8 + + this[++offset] * 2 ** 16 + + this[++offset] * 2 ** 24; + const hi = + this[++offset] + + this[++offset] * 2 ** 8 + + this[++offset] * 2 ** 16 + + last * 2 ** 24; + return BigInt(lo) + (BigInt(hi) << BigInt(32)); + } + ); + Buffer2.prototype.readBigUInt64BE = defineBigIntMethod( + function readBigUInt64BE(offset) { + offset = offset >>> 0; + validateNumber(offset, "offset"); + const first = this[offset]; + const last = this[offset + 7]; + if (first === void 0 || last === void 0) { + boundsError(offset, this.length - 8); + } + const hi = + first * 2 ** 24 + + this[++offset] * 2 ** 16 + + this[++offset] * 2 ** 8 + + this[++offset]; + const lo = + this[++offset] * 2 ** 24 + + this[++offset] * 2 ** 16 + + this[++offset] * 2 ** 8 + + last; + return (BigInt(hi) << BigInt(32)) + BigInt(lo); + } + ); + Buffer2.prototype.readIntLE = function readIntLE( + offset, + byteLength2, + noAssert + ) { + offset = offset >>> 0; + byteLength2 = byteLength2 >>> 0; + if (!noAssert) checkOffset(offset, byteLength2, this.length); + let val = this[offset]; + let mul = 1; + let i = 0; + while (++i < byteLength2 && (mul *= 256)) { + val += this[offset + i] * mul; + } + mul *= 128; + if (val >= mul) val -= Math.pow(2, 8 * byteLength2); + return val; + }; + Buffer2.prototype.readIntBE = function readIntBE( + offset, + byteLength2, + noAssert + ) { + offset = offset >>> 0; + byteLength2 = byteLength2 >>> 0; + if (!noAssert) checkOffset(offset, byteLength2, this.length); + let i = byteLength2; + let mul = 1; + let val = this[offset + --i]; + while (i > 0 && (mul *= 256)) { + val += this[offset + --i] * mul; + } + mul *= 128; + if (val >= mul) val -= Math.pow(2, 8 * byteLength2); + return val; + }; + Buffer2.prototype.readInt8 = function readInt8(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 1, this.length); + if (!(this[offset] & 128)) return this[offset]; + return (255 - this[offset] + 1) * -1; + }; + Buffer2.prototype.readInt16LE = function readInt16LE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 2, this.length); + const val = this[offset] | (this[offset + 1] << 8); + return val & 32768 ? val | 4294901760 : val; + }; + Buffer2.prototype.readInt16BE = function readInt16BE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 2, this.length); + const val = this[offset + 1] | (this[offset] << 8); + return val & 32768 ? val | 4294901760 : val; + }; + Buffer2.prototype.readInt32LE = function readInt32LE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return ( + this[offset] | + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) + ); + }; + Buffer2.prototype.readInt32BE = function readInt32BE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return ( + (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3] + ); + }; + Buffer2.prototype.readBigInt64LE = defineBigIntMethod( + function readBigInt64LE(offset) { + offset = offset >>> 0; + validateNumber(offset, "offset"); + const first = this[offset]; + const last = this[offset + 7]; + if (first === void 0 || last === void 0) { + boundsError(offset, this.length - 8); + } + const val = + this[offset + 4] + + this[offset + 5] * 2 ** 8 + + this[offset + 6] * 2 ** 16 + + (last << 24); + return ( + (BigInt(val) << BigInt(32)) + + BigInt( + first + + this[++offset] * 2 ** 8 + + this[++offset] * 2 ** 16 + + this[++offset] * 2 ** 24 + ) + ); + } + ); + Buffer2.prototype.readBigInt64BE = defineBigIntMethod( + function readBigInt64BE(offset) { + offset = offset >>> 0; + validateNumber(offset, "offset"); + const first = this[offset]; + const last = this[offset + 7]; + if (first === void 0 || last === void 0) { + boundsError(offset, this.length - 8); + } + const val = + (first << 24) + + this[++offset] * 2 ** 16 + + this[++offset] * 2 ** 8 + + this[++offset]; + return ( + (BigInt(val) << BigInt(32)) + + BigInt( + this[++offset] * 2 ** 24 + + this[++offset] * 2 ** 16 + + this[++offset] * 2 ** 8 + + last + ) + ); + } + ); + Buffer2.prototype.readFloatLE = function readFloatLE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return ieee754.read(this, offset, true, 23, 4); + }; + Buffer2.prototype.readFloatBE = function readFloatBE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 4, this.length); + return ieee754.read(this, offset, false, 23, 4); + }; + Buffer2.prototype.readDoubleLE = function readDoubleLE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 8, this.length); + return ieee754.read(this, offset, true, 52, 8); + }; + Buffer2.prototype.readDoubleBE = function readDoubleBE(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) checkOffset(offset, 8, this.length); + return ieee754.read(this, offset, false, 52, 8); + }; + function checkInt(buf, value, offset, ext, max, min) { + if (!Buffer2.isBuffer(buf)) + throw new TypeError('"buffer" argument must be a Buffer instance'); + if (value > max || value < min) + throw new RangeError('"value" argument is out of bounds'); + if (offset + ext > buf.length) + throw new RangeError("Index out of range"); + } + Buffer2.prototype.writeUintLE = Buffer2.prototype.writeUIntLE = + function writeUIntLE(value, offset, byteLength2, noAssert) { + value = +value; + offset = offset >>> 0; + byteLength2 = byteLength2 >>> 0; + if (!noAssert) { + const maxBytes = Math.pow(2, 8 * byteLength2) - 1; + checkInt(this, value, offset, byteLength2, maxBytes, 0); + } + let mul = 1; + let i = 0; + this[offset] = value & 255; + while (++i < byteLength2 && (mul *= 256)) { + this[offset + i] = (value / mul) & 255; + } + return offset + byteLength2; + }; + Buffer2.prototype.writeUintBE = Buffer2.prototype.writeUIntBE = + function writeUIntBE(value, offset, byteLength2, noAssert) { + value = +value; + offset = offset >>> 0; + byteLength2 = byteLength2 >>> 0; + if (!noAssert) { + const maxBytes = Math.pow(2, 8 * byteLength2) - 1; + checkInt(this, value, offset, byteLength2, maxBytes, 0); + } + let i = byteLength2 - 1; + let mul = 1; + this[offset + i] = value & 255; + while (--i >= 0 && (mul *= 256)) { + this[offset + i] = (value / mul) & 255; + } + return offset + byteLength2; + }; + Buffer2.prototype.writeUint8 = Buffer2.prototype.writeUInt8 = + function writeUInt8(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 1, 255, 0); + this[offset] = value & 255; + return offset + 1; + }; + Buffer2.prototype.writeUint16LE = Buffer2.prototype.writeUInt16LE = + function writeUInt16LE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 2, 65535, 0); + this[offset] = value & 255; + this[offset + 1] = value >>> 8; + return offset + 2; + }; + Buffer2.prototype.writeUint16BE = Buffer2.prototype.writeUInt16BE = + function writeUInt16BE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 2, 65535, 0); + this[offset] = value >>> 8; + this[offset + 1] = value & 255; + return offset + 2; + }; + Buffer2.prototype.writeUint32LE = Buffer2.prototype.writeUInt32LE = + function writeUInt32LE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 4, 4294967295, 0); + this[offset + 3] = value >>> 24; + this[offset + 2] = value >>> 16; + this[offset + 1] = value >>> 8; + this[offset] = value & 255; + return offset + 4; + }; + Buffer2.prototype.writeUint32BE = Buffer2.prototype.writeUInt32BE = + function writeUInt32BE(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 4, 4294967295, 0); + this[offset] = value >>> 24; + this[offset + 1] = value >>> 16; + this[offset + 2] = value >>> 8; + this[offset + 3] = value & 255; + return offset + 4; + }; + function wrtBigUInt64LE(buf, value, offset, min, max) { + checkIntBI(value, min, max, buf, offset, 7); + let lo = Number(value & BigInt(4294967295)); + buf[offset++] = lo; + lo = lo >> 8; + buf[offset++] = lo; + lo = lo >> 8; + buf[offset++] = lo; + lo = lo >> 8; + buf[offset++] = lo; + let hi = Number((value >> BigInt(32)) & BigInt(4294967295)); + buf[offset++] = hi; + hi = hi >> 8; + buf[offset++] = hi; + hi = hi >> 8; + buf[offset++] = hi; + hi = hi >> 8; + buf[offset++] = hi; + return offset; + } + function wrtBigUInt64BE(buf, value, offset, min, max) { + checkIntBI(value, min, max, buf, offset, 7); + let lo = Number(value & BigInt(4294967295)); + buf[offset + 7] = lo; + lo = lo >> 8; + buf[offset + 6] = lo; + lo = lo >> 8; + buf[offset + 5] = lo; + lo = lo >> 8; + buf[offset + 4] = lo; + let hi = Number((value >> BigInt(32)) & BigInt(4294967295)); + buf[offset + 3] = hi; + hi = hi >> 8; + buf[offset + 2] = hi; + hi = hi >> 8; + buf[offset + 1] = hi; + hi = hi >> 8; + buf[offset] = hi; + return offset + 8; + } + Buffer2.prototype.writeBigUInt64LE = defineBigIntMethod( + function writeBigUInt64LE(value, offset = 0) { + return wrtBigUInt64LE( + this, + value, + offset, + BigInt(0), + BigInt("0xffffffffffffffff") + ); + } + ); + Buffer2.prototype.writeBigUInt64BE = defineBigIntMethod( + function writeBigUInt64BE(value, offset = 0) { + return wrtBigUInt64BE( + this, + value, + offset, + BigInt(0), + BigInt("0xffffffffffffffff") + ); + } + ); + Buffer2.prototype.writeIntLE = function writeIntLE( + value, + offset, + byteLength2, + noAssert + ) { + value = +value; + offset = offset >>> 0; + if (!noAssert) { + const limit = Math.pow(2, 8 * byteLength2 - 1); + checkInt(this, value, offset, byteLength2, limit - 1, -limit); + } + let i = 0; + let mul = 1; + let sub = 0; + this[offset] = value & 255; + while (++i < byteLength2 && (mul *= 256)) { + if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { + sub = 1; + } + this[offset + i] = (((value / mul) >> 0) - sub) & 255; + } + return offset + byteLength2; + }; + Buffer2.prototype.writeIntBE = function writeIntBE( + value, + offset, + byteLength2, + noAssert + ) { + value = +value; + offset = offset >>> 0; + if (!noAssert) { + const limit = Math.pow(2, 8 * byteLength2 - 1); + checkInt(this, value, offset, byteLength2, limit - 1, -limit); + } + let i = byteLength2 - 1; + let mul = 1; + let sub = 0; + this[offset + i] = value & 255; + while (--i >= 0 && (mul *= 256)) { + if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { + sub = 1; + } + this[offset + i] = (((value / mul) >> 0) - sub) & 255; + } + return offset + byteLength2; + }; + Buffer2.prototype.writeInt8 = function writeInt8( + value, + offset, + noAssert + ) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 1, 127, -128); + if (value < 0) value = 255 + value + 1; + this[offset] = value & 255; + return offset + 1; + }; + Buffer2.prototype.writeInt16LE = function writeInt16LE( + value, + offset, + noAssert + ) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 2, 32767, -32768); + this[offset] = value & 255; + this[offset + 1] = value >>> 8; + return offset + 2; + }; + Buffer2.prototype.writeInt16BE = function writeInt16BE( + value, + offset, + noAssert + ) { + value = +value; + offset = offset >>> 0; + if (!noAssert) checkInt(this, value, offset, 2, 32767, -32768); + this[offset] = value >>> 8; + this[offset + 1] = value & 255; + return offset + 2; + }; + Buffer2.prototype.writeInt32LE = function writeInt32LE( + value, + offset, + noAssert + ) { + value = +value; + offset = offset >>> 0; + if (!noAssert) + checkInt(this, value, offset, 4, 2147483647, -2147483648); + this[offset] = value & 255; + this[offset + 1] = value >>> 8; + this[offset + 2] = value >>> 16; + this[offset + 3] = value >>> 24; + return offset + 4; + }; + Buffer2.prototype.writeInt32BE = function writeInt32BE( + value, + offset, + noAssert + ) { + value = +value; + offset = offset >>> 0; + if (!noAssert) + checkInt(this, value, offset, 4, 2147483647, -2147483648); + if (value < 0) value = 4294967295 + value + 1; + this[offset] = value >>> 24; + this[offset + 1] = value >>> 16; + this[offset + 2] = value >>> 8; + this[offset + 3] = value & 255; + return offset + 4; + }; + Buffer2.prototype.writeBigInt64LE = defineBigIntMethod( + function writeBigInt64LE(value, offset = 0) { + return wrtBigUInt64LE( + this, + value, + offset, + -BigInt("0x8000000000000000"), + BigInt("0x7fffffffffffffff") + ); + } + ); + Buffer2.prototype.writeBigInt64BE = defineBigIntMethod( + function writeBigInt64BE(value, offset = 0) { + return wrtBigUInt64BE( + this, + value, + offset, + -BigInt("0x8000000000000000"), + BigInt("0x7fffffffffffffff") + ); + } + ); + function checkIEEE754(buf, value, offset, ext, max, min) { + if (offset + ext > buf.length) + throw new RangeError("Index out of range"); + if (offset < 0) throw new RangeError("Index out of range"); + } + function writeFloat(buf, value, offset, littleEndian, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) { + checkIEEE754( + buf, + value, + offset, + 4, + 34028234663852886e22, + -34028234663852886e22 + ); + } + ieee754.write(buf, value, offset, littleEndian, 23, 4); + return offset + 4; + } + Buffer2.prototype.writeFloatLE = function writeFloatLE( + value, + offset, + noAssert + ) { + return writeFloat(this, value, offset, true, noAssert); + }; + Buffer2.prototype.writeFloatBE = function writeFloatBE( + value, + offset, + noAssert + ) { + return writeFloat(this, value, offset, false, noAssert); + }; + function writeDouble(buf, value, offset, littleEndian, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) { + checkIEEE754( + buf, + value, + offset, + 8, + 17976931348623157e292, + -17976931348623157e292 + ); + } + ieee754.write(buf, value, offset, littleEndian, 52, 8); + return offset + 8; + } + Buffer2.prototype.writeDoubleLE = function writeDoubleLE( + value, + offset, + noAssert + ) { + return writeDouble(this, value, offset, true, noAssert); + }; + Buffer2.prototype.writeDoubleBE = function writeDoubleBE( + value, + offset, + noAssert + ) { + return writeDouble(this, value, offset, false, noAssert); + }; + Buffer2.prototype.copy = function copy(target, targetStart, start, end) { + if (!Buffer2.isBuffer(target)) + throw new TypeError("argument should be a Buffer"); + if (!start) start = 0; + if (!end && end !== 0) end = this.length; + if (targetStart >= target.length) targetStart = target.length; + if (!targetStart) targetStart = 0; + if (end > 0 && end < start) end = start; + if (end === start) return 0; + if (target.length === 0 || this.length === 0) return 0; + if (targetStart < 0) { + throw new RangeError("targetStart out of bounds"); + } + if (start < 0 || start >= this.length) + throw new RangeError("Index out of range"); + if (end < 0) throw new RangeError("sourceEnd out of bounds"); + if (end > this.length) end = this.length; + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start; + } + const len = end - start; + if ( + this === target && + typeof Uint8Array.prototype.copyWithin === "function" + ) { + this.copyWithin(targetStart, start, end); + } else { + Uint8Array.prototype.set.call( + target, + this.subarray(start, end), + targetStart + ); + } + return len; + }; + Buffer2.prototype.fill = function fill(val, start, end, encoding) { + if (typeof val === "string") { + if (typeof start === "string") { + encoding = start; + start = 0; + end = this.length; + } else if (typeof end === "string") { + encoding = end; + end = this.length; + } + if (encoding !== void 0 && typeof encoding !== "string") { + throw new TypeError("encoding must be a string"); + } + if (typeof encoding === "string" && !Buffer2.isEncoding(encoding)) { + throw new TypeError("Unknown encoding: " + encoding); + } + if (val.length === 1) { + const code = val.charCodeAt(0); + if ((encoding === "utf8" && code < 128) || encoding === "latin1") { + val = code; + } + } + } else if (typeof val === "number") { + val = val & 255; + } else if (typeof val === "boolean") { + val = Number(val); + } + if (start < 0 || this.length < start || this.length < end) { + throw new RangeError("Out of range index"); + } + if (end <= start) { + return this; + } + start = start >>> 0; + end = end === void 0 ? this.length : end >>> 0; + if (!val) val = 0; + let i; + if (typeof val === "number") { + for (i = start; i < end; ++i) { + this[i] = val; + } + } else { + const bytes = Buffer2.isBuffer(val) + ? val + : Buffer2.from(val, encoding); + const len = bytes.length; + if (len === 0) { + throw new TypeError( + 'The value "' + val + '" is invalid for argument "value"' + ); + } + for (i = 0; i < end - start; ++i) { + this[i + start] = bytes[i % len]; + } + } + return this; + }; + var errors = {}; + function E(sym, getMessage, Base) { + errors[sym] = class NodeError extends Base { + constructor() { + super(); + Object.defineProperty(this, "message", { + value: getMessage.apply(this, arguments), + writable: true, + configurable: true, + }); + this.name = `${this.name} [${sym}]`; + this.stack; + delete this.name; + } + get code() { + return sym; + } + set code(value) { + Object.defineProperty(this, "code", { + configurable: true, + enumerable: true, + value, + writable: true, + }); + } + toString() { + return `${this.name} [${sym}]: ${this.message}`; + } + }; + } + E( + "ERR_BUFFER_OUT_OF_BOUNDS", + function (name) { + if (name) { + return `${name} is outside of buffer bounds`; + } + return "Attempt to access memory outside buffer bounds"; + }, + RangeError + ); + E( + "ERR_INVALID_ARG_TYPE", + function (name, actual) { + return `The "${name}" argument must be of type number. Received type ${typeof actual}`; + }, + TypeError + ); + E( + "ERR_OUT_OF_RANGE", + function (str, range, input) { + let msg = `The value of "${str}" is out of range.`; + let received = input; + if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) { + received = addNumericalSeparator(String(input)); + } else if (typeof input === "bigint") { + received = String(input); + if ( + input > BigInt(2) ** BigInt(32) || + input < -(BigInt(2) ** BigInt(32)) + ) { + received = addNumericalSeparator(received); + } + received += "n"; + } + msg += ` It must be ${range}. Received ${received}`; + return msg; + }, + RangeError + ); + function addNumericalSeparator(val) { + let res = ""; + let i = val.length; + const start = val[0] === "-" ? 1 : 0; + for (; i >= start + 4; i -= 3) { + res = `_${val.slice(i - 3, i)}${res}`; + } + return `${val.slice(0, i)}${res}`; + } + function checkBounds(buf, offset, byteLength2) { + validateNumber(offset, "offset"); + if (buf[offset] === void 0 || buf[offset + byteLength2] === void 0) { + boundsError(offset, buf.length - (byteLength2 + 1)); + } + } + function checkIntBI(value, min, max, buf, offset, byteLength2) { + if (value > max || value < min) { + const n = typeof min === "bigint" ? "n" : ""; + let range; + if (byteLength2 > 3) { + if (min === 0 || min === BigInt(0)) { + range = `>= 0${n} and < 2${n} ** ${(byteLength2 + 1) * 8}${n}`; + } else { + range = `>= -(2${n} ** ${ + (byteLength2 + 1) * 8 - 1 + }${n}) and < 2 ** ${(byteLength2 + 1) * 8 - 1}${n}`; + } + } else { + range = `>= ${min}${n} and <= ${max}${n}`; + } + throw new errors.ERR_OUT_OF_RANGE("value", range, value); + } + checkBounds(buf, offset, byteLength2); + } + function validateNumber(value, name) { + if (typeof value !== "number") { + throw new errors.ERR_INVALID_ARG_TYPE(name, "number", value); + } + } + function boundsError(value, length, type) { + if (Math.floor(value) !== value) { + validateNumber(value, type); + throw new errors.ERR_OUT_OF_RANGE( + type || "offset", + "an integer", + value + ); + } + if (length < 0) { + throw new errors.ERR_BUFFER_OUT_OF_BOUNDS(); + } + throw new errors.ERR_OUT_OF_RANGE( + type || "offset", + `>= ${type ? 1 : 0} and <= ${length}`, + value + ); + } + var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g; + function base64clean(str) { + str = str.split("=")[0]; + str = str.trim().replace(INVALID_BASE64_RE, ""); + if (str.length < 2) return ""; + while (str.length % 4 !== 0) { + str = str + "="; + } + return str; + } + function utf8ToBytes(string, units) { + units = units || Infinity; + let codePoint; + const length = string.length; + let leadSurrogate = null; + const bytes = []; + for (let i = 0; i < length; ++i) { + codePoint = string.charCodeAt(i); + if (codePoint > 55295 && codePoint < 57344) { + if (!leadSurrogate) { + if (codePoint > 56319) { + if ((units -= 3) > -1) bytes.push(239, 191, 189); + continue; + } else if (i + 1 === length) { + if ((units -= 3) > -1) bytes.push(239, 191, 189); + continue; + } + leadSurrogate = codePoint; + continue; + } + if (codePoint < 56320) { + if ((units -= 3) > -1) bytes.push(239, 191, 189); + leadSurrogate = codePoint; + continue; + } + codePoint = + (((leadSurrogate - 55296) << 10) | (codePoint - 56320)) + 65536; + } else if (leadSurrogate) { + if ((units -= 3) > -1) bytes.push(239, 191, 189); + } + leadSurrogate = null; + if (codePoint < 128) { + if ((units -= 1) < 0) break; + bytes.push(codePoint); + } else if (codePoint < 2048) { + if ((units -= 2) < 0) break; + bytes.push((codePoint >> 6) | 192, (codePoint & 63) | 128); + } else if (codePoint < 65536) { + if ((units -= 3) < 0) break; + bytes.push( + (codePoint >> 12) | 224, + ((codePoint >> 6) & 63) | 128, + (codePoint & 63) | 128 + ); + } else if (codePoint < 1114112) { + if ((units -= 4) < 0) break; + bytes.push( + (codePoint >> 18) | 240, + ((codePoint >> 12) & 63) | 128, + ((codePoint >> 6) & 63) | 128, + (codePoint & 63) | 128 + ); + } else { + throw new Error("Invalid code point"); + } + } + return bytes; + } + function asciiToBytes(str) { + const byteArray = []; + for (let i = 0; i < str.length; ++i) { + byteArray.push(str.charCodeAt(i) & 255); + } + return byteArray; + } + function utf16leToBytes(str, units) { + let c, hi, lo; + const byteArray = []; + for (let i = 0; i < str.length; ++i) { + if ((units -= 2) < 0) break; + c = str.charCodeAt(i); + hi = c >> 8; + lo = c % 256; + byteArray.push(lo); + byteArray.push(hi); + } + return byteArray; + } + function base64ToBytes(str) { + return base64.toByteArray(base64clean(str)); + } + function blitBuffer(src, dst, offset, length) { + let i; + for (i = 0; i < length; ++i) { + if (i + offset >= dst.length || i >= src.length) break; + dst[i + offset] = src[i]; + } + return i; + } + function isInstance(obj, type) { + return ( + obj instanceof type || + (obj != null && + obj.constructor != null && + obj.constructor.name != null && + obj.constructor.name === type.name) + ); + } + function numberIsNaN(obj) { + return obj !== obj; + } + var hexSliceLookupTable = (function () { + const alphabet = "0123456789abcdef"; + const table = new Array(256); + for (let i = 0; i < 16; ++i) { + const i16 = i * 16; + for (let j = 0; j < 16; ++j) { + table[i16 + j] = alphabet[i] + alphabet[j]; + } + } + return table; + })(); + function defineBigIntMethod(fn) { + return typeof BigInt === "undefined" ? BufferBigIntNotDefined : fn; + } + function BufferBigIntNotDefined() { + throw new Error("BigInt not supported"); + } + }, + }); - // node_modules/ieee754/index.js - var require_ieee754 = __commonJS({ - "node_modules/ieee754/index.js"(exports) { - init_process_shim(); - exports.read = function(buffer, offset, isLE, mLen, nBytes) { - var e, m; - var eLen = nBytes * 8 - mLen - 1; - var eMax = (1 << eLen) - 1; - var eBias = eMax >> 1; - var nBits = -7; - var i = isLE ? nBytes - 1 : 0; - var d = isLE ? -1 : 1; - var s = buffer[offset + i]; - i += d; - e = s & (1 << -nBits) - 1; - s >>= -nBits; - nBits += eLen; - for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) { - } - m = e & (1 << -nBits) - 1; - e >>= -nBits; - nBits += mLen; - for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) { - } - if (e === 0) { - e = 1 - eBias; - } else if (e === eMax) { - return m ? NaN : (s ? -1 : 1) * Infinity; - } else { - m = m + Math.pow(2, mLen); - e = e - eBias; - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen); - }; - exports.write = function(buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c; - var eLen = nBytes * 8 - mLen - 1; - var eMax = (1 << eLen) - 1; - var eBias = eMax >> 1; - var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0; - var i = isLE ? 0 : nBytes - 1; - var d = isLE ? 1 : -1; - var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0; - value = Math.abs(value); - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0; - e = eMax; - } else { - e = Math.floor(Math.log(value) / Math.LN2); - if (value * (c = Math.pow(2, -e)) < 1) { - e--; - c *= 2; - } - if (e + eBias >= 1) { - value += rt / c; - } else { - value += rt * Math.pow(2, 1 - eBias); - } - if (value * c >= 2) { - e++; - c /= 2; - } - if (e + eBias >= eMax) { - m = 0; - e = eMax; - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen); - e = e + eBias; - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); - e = 0; - } - } - for (; mLen >= 8; buffer[offset + i] = m & 255, i += d, m /= 256, mLen -= 8) { - } - e = e << mLen | m; - eLen += mLen; - for (; eLen > 0; buffer[offset + i] = e & 255, i += d, e /= 256, eLen -= 8) { - } - buffer[offset + i - d] |= s * 128; + // node_modules/readable-stream/lib/ours/util.js + var require_util = __commonJS({ + "node_modules/readable-stream/lib/ours/util.js"(exports, module) { + "use strict"; + init_process_shim(); + var bufferModule = require_buffer(); + var AsyncFunction = Object.getPrototypeOf( + async function () {} + ).constructor; + var Blob = globalThis.Blob || bufferModule.Blob; + var isBlob = + typeof Blob !== "undefined" + ? function isBlob2(b) { + return b instanceof Blob; + } + : function isBlob2(b) { + return false; }; + var AggregateError = class extends Error { + constructor(errors) { + if (!Array.isArray(errors)) { + throw new TypeError( + `Expected input to be an Array, got ${typeof errors}` + ); + } + let message = ""; + for (let i = 0; i < errors.length; i++) { + message += ` ${errors[i].stack} +`; + } + super(message); + this.name = "AggregateError"; + this.errors = errors; } - }); - - // node_modules/buffer/index.js - var require_buffer = __commonJS({ - "node_modules/buffer/index.js"(exports) { - "use strict"; - init_process_shim(); - var base64 = require_base64_js(); - var ieee754 = require_ieee754(); - var customInspectSymbol = typeof Symbol === "function" && typeof Symbol["for"] === "function" ? Symbol["for"]("nodejs.util.inspect.custom") : null; - exports.Buffer = Buffer2; - exports.SlowBuffer = SlowBuffer; - exports.INSPECT_MAX_BYTES = 50; - var K_MAX_LENGTH = 2147483647; - exports.kMaxLength = K_MAX_LENGTH; - Buffer2.TYPED_ARRAY_SUPPORT = typedArraySupport(); - if (!Buffer2.TYPED_ARRAY_SUPPORT && typeof console !== "undefined" && typeof console.error === "function") { - console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."); - } - function typedArraySupport() { - try { - const arr = new Uint8Array(1); - const proto = { foo: function() { - return 42; - } }; - Object.setPrototypeOf(proto, Uint8Array.prototype); - Object.setPrototypeOf(arr, proto); - return arr.foo() === 42; - } catch (e) { - return false; - } - } - Object.defineProperty(Buffer2.prototype, "parent", { - enumerable: true, - get: function() { - if (!Buffer2.isBuffer(this)) - return void 0; - return this.buffer; - } - }); - Object.defineProperty(Buffer2.prototype, "offset", { - enumerable: true, - get: function() { - if (!Buffer2.isBuffer(this)) - return void 0; - return this.byteOffset; - } + }; + module.exports = { + AggregateError, + once(callback) { + let called = false; + return function (...args) { + if (called) { + return; + } + called = true; + callback.apply(this, args); + }; + }, + createDeferredPromise: function () { + let resolve; + let reject; + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + return { + promise, + resolve, + reject, + }; + }, + promisify(fn) { + return new Promise((resolve, reject) => { + fn((err, ...args) => { + if (err) { + return reject(err); + } + return resolve(...args); }); - function createBuffer(length) { - if (length > K_MAX_LENGTH) { - throw new RangeError('The value "' + length + '" is invalid for option "size"'); - } - const buf = new Uint8Array(length); - Object.setPrototypeOf(buf, Buffer2.prototype); - return buf; - } - function Buffer2(arg, encodingOrOffset, length) { - if (typeof arg === "number") { - if (typeof encodingOrOffset === "string") { - throw new TypeError('The "string" argument must be of type string. Received type number'); - } - return allocUnsafe(arg); - } - return from(arg, encodingOrOffset, length); - } - Buffer2.poolSize = 8192; - function from(value, encodingOrOffset, length) { - if (typeof value === "string") { - return fromString(value, encodingOrOffset); - } - if (ArrayBuffer.isView(value)) { - return fromArrayView(value); - } - if (value == null) { - throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof value); - } - if (isInstance(value, ArrayBuffer) || value && isInstance(value.buffer, ArrayBuffer)) { - return fromArrayBuffer(value, encodingOrOffset, length); - } - if (typeof SharedArrayBuffer !== "undefined" && (isInstance(value, SharedArrayBuffer) || value && isInstance(value.buffer, SharedArrayBuffer))) { - return fromArrayBuffer(value, encodingOrOffset, length); - } - if (typeof value === "number") { - throw new TypeError('The "value" argument must not be of type number. Received type number'); - } - const valueOf = value.valueOf && value.valueOf(); - if (valueOf != null && valueOf !== value) { - return Buffer2.from(valueOf, encodingOrOffset, length); - } - const b = fromObject(value); - if (b) - return b; - if (typeof Symbol !== "undefined" && Symbol.toPrimitive != null && typeof value[Symbol.toPrimitive] === "function") { - return Buffer2.from(value[Symbol.toPrimitive]("string"), encodingOrOffset, length); - } - throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof value); - } - Buffer2.from = function(value, encodingOrOffset, length) { - return from(value, encodingOrOffset, length); - }; - Object.setPrototypeOf(Buffer2.prototype, Uint8Array.prototype); - Object.setPrototypeOf(Buffer2, Uint8Array); - function assertSize(size) { - if (typeof size !== "number") { - throw new TypeError('"size" argument must be of type number'); - } else if (size < 0) { - throw new RangeError('The value "' + size + '" is invalid for option "size"'); - } - } - function alloc(size, fill, encoding) { - assertSize(size); - if (size <= 0) { - return createBuffer(size); - } - if (fill !== void 0) { - return typeof encoding === "string" ? createBuffer(size).fill(fill, encoding) : createBuffer(size).fill(fill); - } - return createBuffer(size); - } - Buffer2.alloc = function(size, fill, encoding) { - return alloc(size, fill, encoding); - }; - function allocUnsafe(size) { - assertSize(size); - return createBuffer(size < 0 ? 0 : checked(size) | 0); - } - Buffer2.allocUnsafe = function(size) { - return allocUnsafe(size); - }; - Buffer2.allocUnsafeSlow = function(size) { - return allocUnsafe(size); - }; - function fromString(string, encoding) { - if (typeof encoding !== "string" || encoding === "") { - encoding = "utf8"; - } - if (!Buffer2.isEncoding(encoding)) { - throw new TypeError("Unknown encoding: " + encoding); - } - const length = byteLength(string, encoding) | 0; - let buf = createBuffer(length); - const actual = buf.write(string, encoding); - if (actual !== length) { - buf = buf.slice(0, actual); - } - return buf; - } - function fromArrayLike(array) { - const length = array.length < 0 ? 0 : checked(array.length) | 0; - const buf = createBuffer(length); - for (let i = 0; i < length; i += 1) { - buf[i] = array[i] & 255; - } - return buf; - } - function fromArrayView(arrayView) { - if (isInstance(arrayView, Uint8Array)) { - const copy = new Uint8Array(arrayView); - return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength); - } - return fromArrayLike(arrayView); - } - function fromArrayBuffer(array, byteOffset, length) { - if (byteOffset < 0 || array.byteLength < byteOffset) { - throw new RangeError('"offset" is outside of buffer bounds'); - } - if (array.byteLength < byteOffset + (length || 0)) { - throw new RangeError('"length" is outside of buffer bounds'); - } - let buf; - if (byteOffset === void 0 && length === void 0) { - buf = new Uint8Array(array); - } else if (length === void 0) { - buf = new Uint8Array(array, byteOffset); + }); + }, + debuglog() { + return function () {}; + }, + format(format, ...args) { + return format.replace(/%([sdifj])/g, function (...[_unused, type]) { + const replacement = args.shift(); + if (type === "f") { + return replacement.toFixed(6); + } else if (type === "j") { + return JSON.stringify(replacement); + } else if (type === "s" && typeof replacement === "object") { + const ctor = + replacement.constructor !== Object + ? replacement.constructor.name + : ""; + return `${ctor} {}`.trim(); + } else { + return replacement.toString(); + } + }); + }, + inspect(value) { + switch (typeof value) { + case "string": + if (value.includes("'")) { + if (!value.includes('"')) { + return `"${value}"`; + } else if (!value.includes("`") && !value.includes("${")) { + return `\`${value}\``; + } + } + return `'${value}'`; + case "number": + if (isNaN(value)) { + return "NaN"; + } else if (Object.is(value, -0)) { + return String(value); + } + return value; + case "bigint": + return `${String(value)}n`; + case "boolean": + case "undefined": + return String(value); + case "object": + return "{}"; + } + }, + types: { + isAsyncFunction(fn) { + return fn instanceof AsyncFunction; + }, + isArrayBufferView(arr) { + return ArrayBuffer.isView(arr); + }, + }, + isBlob, + }; + module.exports.promisify.custom = Symbol.for( + "nodejs.util.promisify.custom" + ); + }, + }); + + // node_modules/event-target-shim/dist/event-target-shim.js + var require_event_target_shim = __commonJS({ + "node_modules/event-target-shim/dist/event-target-shim.js"( + exports, + module + ) { + "use strict"; + init_process_shim(); + Object.defineProperty(exports, "__esModule", { value: true }); + var privateData = /* @__PURE__ */ new WeakMap(); + var wrappers = /* @__PURE__ */ new WeakMap(); + function pd(event) { + const retv = privateData.get(event); + console.assert( + retv != null, + "'this' is expected an Event object, but got", + event + ); + return retv; + } + function setCancelFlag(data) { + if (data.passiveListener != null) { + if ( + typeof console !== "undefined" && + typeof console.error === "function" + ) { + console.error( + "Unable to preventDefault inside passive event listener invocation.", + data.passiveListener + ); + } + return; + } + if (!data.event.cancelable) { + return; + } + data.canceled = true; + if (typeof data.event.preventDefault === "function") { + data.event.preventDefault(); + } + } + function Event(eventTarget, event) { + privateData.set(this, { + eventTarget, + event, + eventPhase: 2, + currentTarget: eventTarget, + canceled: false, + stopped: false, + immediateStopped: false, + passiveListener: null, + timeStamp: event.timeStamp || Date.now(), + }); + Object.defineProperty(this, "isTrusted", { + value: false, + enumerable: true, + }); + const keys = Object.keys(event); + for (let i = 0; i < keys.length; ++i) { + const key = keys[i]; + if (!(key in this)) { + Object.defineProperty(this, key, defineRedirectDescriptor(key)); + } + } + } + Event.prototype = { + get type() { + return pd(this).event.type; + }, + get target() { + return pd(this).eventTarget; + }, + get currentTarget() { + return pd(this).currentTarget; + }, + composedPath() { + const currentTarget = pd(this).currentTarget; + if (currentTarget == null) { + return []; + } + return [currentTarget]; + }, + get NONE() { + return 0; + }, + get CAPTURING_PHASE() { + return 1; + }, + get AT_TARGET() { + return 2; + }, + get BUBBLING_PHASE() { + return 3; + }, + get eventPhase() { + return pd(this).eventPhase; + }, + stopPropagation() { + const data = pd(this); + data.stopped = true; + if (typeof data.event.stopPropagation === "function") { + data.event.stopPropagation(); + } + }, + stopImmediatePropagation() { + const data = pd(this); + data.stopped = true; + data.immediateStopped = true; + if (typeof data.event.stopImmediatePropagation === "function") { + data.event.stopImmediatePropagation(); + } + }, + get bubbles() { + return Boolean(pd(this).event.bubbles); + }, + get cancelable() { + return Boolean(pd(this).event.cancelable); + }, + preventDefault() { + setCancelFlag(pd(this)); + }, + get defaultPrevented() { + return pd(this).canceled; + }, + get composed() { + return Boolean(pd(this).event.composed); + }, + get timeStamp() { + return pd(this).timeStamp; + }, + get srcElement() { + return pd(this).eventTarget; + }, + get cancelBubble() { + return pd(this).stopped; + }, + set cancelBubble(value) { + if (!value) { + return; + } + const data = pd(this); + data.stopped = true; + if (typeof data.event.cancelBubble === "boolean") { + data.event.cancelBubble = true; + } + }, + get returnValue() { + return !pd(this).canceled; + }, + set returnValue(value) { + if (!value) { + setCancelFlag(pd(this)); + } + }, + initEvent() {}, + }; + Object.defineProperty(Event.prototype, "constructor", { + value: Event, + configurable: true, + writable: true, + }); + if ( + typeof window !== "undefined" && + typeof window.Event !== "undefined" + ) { + Object.setPrototypeOf(Event.prototype, window.Event.prototype); + wrappers.set(window.Event.prototype, Event); + } + function defineRedirectDescriptor(key) { + return { + get() { + return pd(this).event[key]; + }, + set(value) { + pd(this).event[key] = value; + }, + configurable: true, + enumerable: true, + }; + } + function defineCallDescriptor(key) { + return { + value() { + const event = pd(this).event; + return event[key].apply(event, arguments); + }, + configurable: true, + enumerable: true, + }; + } + function defineWrapper(BaseEvent, proto) { + const keys = Object.keys(proto); + if (keys.length === 0) { + return BaseEvent; + } + function CustomEvent(eventTarget, event) { + BaseEvent.call(this, eventTarget, event); + } + CustomEvent.prototype = Object.create(BaseEvent.prototype, { + constructor: { + value: CustomEvent, + configurable: true, + writable: true, + }, + }); + for (let i = 0; i < keys.length; ++i) { + const key = keys[i]; + if (!(key in BaseEvent.prototype)) { + const descriptor = Object.getOwnPropertyDescriptor(proto, key); + const isFunc = typeof descriptor.value === "function"; + Object.defineProperty( + CustomEvent.prototype, + key, + isFunc ? defineCallDescriptor(key) : defineRedirectDescriptor(key) + ); + } + } + return CustomEvent; + } + function getWrapper(proto) { + if (proto == null || proto === Object.prototype) { + return Event; + } + let wrapper = wrappers.get(proto); + if (wrapper == null) { + wrapper = defineWrapper( + getWrapper(Object.getPrototypeOf(proto)), + proto + ); + wrappers.set(proto, wrapper); + } + return wrapper; + } + function wrapEvent(eventTarget, event) { + const Wrapper = getWrapper(Object.getPrototypeOf(event)); + return new Wrapper(eventTarget, event); + } + function isStopped(event) { + return pd(event).immediateStopped; + } + function setEventPhase(event, eventPhase) { + pd(event).eventPhase = eventPhase; + } + function setCurrentTarget(event, currentTarget) { + pd(event).currentTarget = currentTarget; + } + function setPassiveListener(event, passiveListener) { + pd(event).passiveListener = passiveListener; + } + var listenersMap = /* @__PURE__ */ new WeakMap(); + var CAPTURE = 1; + var BUBBLE = 2; + var ATTRIBUTE = 3; + function isObject(x) { + return x !== null && typeof x === "object"; + } + function getListeners(eventTarget) { + const listeners = listenersMap.get(eventTarget); + if (listeners == null) { + throw new TypeError( + "'this' is expected an EventTarget object, but got another value." + ); + } + return listeners; + } + function defineEventAttributeDescriptor(eventName) { + return { + get() { + const listeners = getListeners(this); + let node = listeners.get(eventName); + while (node != null) { + if (node.listenerType === ATTRIBUTE) { + return node.listener; + } + node = node.next; + } + return null; + }, + set(listener) { + if (typeof listener !== "function" && !isObject(listener)) { + listener = null; + } + const listeners = getListeners(this); + let prev = null; + let node = listeners.get(eventName); + while (node != null) { + if (node.listenerType === ATTRIBUTE) { + if (prev !== null) { + prev.next = node.next; + } else if (node.next !== null) { + listeners.set(eventName, node.next); } else { - buf = new Uint8Array(array, byteOffset, length); - } - Object.setPrototypeOf(buf, Buffer2.prototype); - return buf; - } - function fromObject(obj) { - if (Buffer2.isBuffer(obj)) { - const len = checked(obj.length) | 0; - const buf = createBuffer(len); - if (buf.length === 0) { - return buf; - } - obj.copy(buf, 0, 0, len); - return buf; - } - if (obj.length !== void 0) { - if (typeof obj.length !== "number" || numberIsNaN(obj.length)) { - return createBuffer(0); - } - return fromArrayLike(obj); - } - if (obj.type === "Buffer" && Array.isArray(obj.data)) { - return fromArrayLike(obj.data); - } - } - function checked(length) { - if (length >= K_MAX_LENGTH) { - throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x" + K_MAX_LENGTH.toString(16) + " bytes"); - } - return length | 0; - } - function SlowBuffer(length) { - if (+length != length) { - length = 0; - } - return Buffer2.alloc(+length); - } - Buffer2.isBuffer = function isBuffer(b) { - return b != null && b._isBuffer === true && b !== Buffer2.prototype; - }; - Buffer2.compare = function compare(a, b) { - if (isInstance(a, Uint8Array)) - a = Buffer2.from(a, a.offset, a.byteLength); - if (isInstance(b, Uint8Array)) - b = Buffer2.from(b, b.offset, b.byteLength); - if (!Buffer2.isBuffer(a) || !Buffer2.isBuffer(b)) { - throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array'); - } - if (a === b) - return 0; - let x = a.length; - let y = b.length; - for (let i = 0, len = Math.min(x, y); i < len; ++i) { - if (a[i] !== b[i]) { - x = a[i]; - y = b[i]; - break; - } - } - if (x < y) - return -1; - if (y < x) - return 1; - return 0; - }; - Buffer2.isEncoding = function isEncoding(encoding) { - switch (String(encoding).toLowerCase()) { - case "hex": - case "utf8": - case "utf-8": - case "ascii": - case "latin1": - case "binary": - case "base64": - case "ucs2": - case "ucs-2": - case "utf16le": - case "utf-16le": - return true; - default: - return false; - } - }; - Buffer2.concat = function concat(list, length) { - if (!Array.isArray(list)) { - throw new TypeError('"list" argument must be an Array of Buffers'); - } - if (list.length === 0) { - return Buffer2.alloc(0); - } - let i; - if (length === void 0) { - length = 0; - for (i = 0; i < list.length; ++i) { - length += list[i].length; - } - } - const buffer = Buffer2.allocUnsafe(length); - let pos = 0; - for (i = 0; i < list.length; ++i) { - let buf = list[i]; - if (isInstance(buf, Uint8Array)) { - if (pos + buf.length > buffer.length) { - if (!Buffer2.isBuffer(buf)) - buf = Buffer2.from(buf); - buf.copy(buffer, pos); - } else { - Uint8Array.prototype.set.call(buffer, buf, pos); - } - } else if (!Buffer2.isBuffer(buf)) { - throw new TypeError('"list" argument must be an Array of Buffers'); - } else { - buf.copy(buffer, pos); - } - pos += buf.length; - } - return buffer; - }; - function byteLength(string, encoding) { - if (Buffer2.isBuffer(string)) { - return string.length; - } - if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) { - return string.byteLength; - } - if (typeof string !== "string") { - throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type ' + typeof string); - } - const len = string.length; - const mustMatch = arguments.length > 2 && arguments[2] === true; - if (!mustMatch && len === 0) - return 0; - let loweredCase = false; - for (; ; ) { - switch (encoding) { - case "ascii": - case "latin1": - case "binary": - return len; - case "utf8": - case "utf-8": - return utf8ToBytes(string).length; - case "ucs2": - case "ucs-2": - case "utf16le": - case "utf-16le": - return len * 2; - case "hex": - return len >>> 1; - case "base64": - return base64ToBytes(string).length; - default: - if (loweredCase) { - return mustMatch ? -1 : utf8ToBytes(string).length; - } - encoding = ("" + encoding).toLowerCase(); - loweredCase = true; - } - } - } - Buffer2.byteLength = byteLength; - function slowToString(encoding, start, end) { - let loweredCase = false; - if (start === void 0 || start < 0) { - start = 0; - } - if (start > this.length) { - return ""; - } - if (end === void 0 || end > this.length) { - end = this.length; - } - if (end <= 0) { - return ""; - } - end >>>= 0; - start >>>= 0; - if (end <= start) { - return ""; - } - if (!encoding) - encoding = "utf8"; - while (true) { - switch (encoding) { - case "hex": - return hexSlice(this, start, end); - case "utf8": - case "utf-8": - return utf8Slice(this, start, end); - case "ascii": - return asciiSlice(this, start, end); - case "latin1": - case "binary": - return latin1Slice(this, start, end); - case "base64": - return base64Slice(this, start, end); - case "ucs2": - case "ucs-2": - case "utf16le": - case "utf-16le": - return utf16leSlice(this, start, end); - default: - if (loweredCase) - throw new TypeError("Unknown encoding: " + encoding); - encoding = (encoding + "").toLowerCase(); - loweredCase = true; - } - } - } - Buffer2.prototype._isBuffer = true; - function swap(b, n, m) { - const i = b[n]; - b[n] = b[m]; - b[m] = i; + listeners.delete(eventName); + } + } else { + prev = node; + } + node = node.next; + } + if (listener !== null) { + const newNode = { + listener, + listenerType: ATTRIBUTE, + passive: false, + once: false, + next: null, + }; + if (prev === null) { + listeners.set(eventName, newNode); + } else { + prev.next = newNode; + } + } + }, + configurable: true, + enumerable: true, + }; + } + function defineEventAttribute(eventTargetPrototype, eventName) { + Object.defineProperty( + eventTargetPrototype, + `on${eventName}`, + defineEventAttributeDescriptor(eventName) + ); + } + function defineCustomEventTarget(eventNames) { + function CustomEventTarget() { + EventTarget.call(this); + } + CustomEventTarget.prototype = Object.create(EventTarget.prototype, { + constructor: { + value: CustomEventTarget, + configurable: true, + writable: true, + }, + }); + for (let i = 0; i < eventNames.length; ++i) { + defineEventAttribute(CustomEventTarget.prototype, eventNames[i]); + } + return CustomEventTarget; + } + function EventTarget() { + if (this instanceof EventTarget) { + listenersMap.set(this, /* @__PURE__ */ new Map()); + return; + } + if (arguments.length === 1 && Array.isArray(arguments[0])) { + return defineCustomEventTarget(arguments[0]); + } + if (arguments.length > 0) { + const types = new Array(arguments.length); + for (let i = 0; i < arguments.length; ++i) { + types[i] = arguments[i]; + } + return defineCustomEventTarget(types); + } + throw new TypeError("Cannot call a class as a function"); + } + EventTarget.prototype = { + addEventListener(eventName, listener, options) { + if (listener == null) { + return; + } + if (typeof listener !== "function" && !isObject(listener)) { + throw new TypeError( + "'listener' should be a function or an object." + ); + } + const listeners = getListeners(this); + const optionsIsObj = isObject(options); + const capture = optionsIsObj + ? Boolean(options.capture) + : Boolean(options); + const listenerType = capture ? CAPTURE : BUBBLE; + const newNode = { + listener, + listenerType, + passive: optionsIsObj && Boolean(options.passive), + once: optionsIsObj && Boolean(options.once), + next: null, + }; + let node = listeners.get(eventName); + if (node === void 0) { + listeners.set(eventName, newNode); + return; + } + let prev = null; + while (node != null) { + if ( + node.listener === listener && + node.listenerType === listenerType + ) { + return; + } + prev = node; + node = node.next; + } + prev.next = newNode; + }, + removeEventListener(eventName, listener, options) { + if (listener == null) { + return; + } + const listeners = getListeners(this); + const capture = isObject(options) + ? Boolean(options.capture) + : Boolean(options); + const listenerType = capture ? CAPTURE : BUBBLE; + let prev = null; + let node = listeners.get(eventName); + while (node != null) { + if ( + node.listener === listener && + node.listenerType === listenerType + ) { + if (prev !== null) { + prev.next = node.next; + } else if (node.next !== null) { + listeners.set(eventName, node.next); + } else { + listeners.delete(eventName); + } + return; + } + prev = node; + node = node.next; + } + }, + dispatchEvent(event) { + if (event == null || typeof event.type !== "string") { + throw new TypeError('"event.type" should be a string.'); + } + const listeners = getListeners(this); + const eventName = event.type; + let node = listeners.get(eventName); + if (node == null) { + return true; + } + const wrappedEvent = wrapEvent(this, event); + let prev = null; + while (node != null) { + if (node.once) { + if (prev !== null) { + prev.next = node.next; + } else if (node.next !== null) { + listeners.set(eventName, node.next); + } else { + listeners.delete(eventName); + } + } else { + prev = node; + } + setPassiveListener( + wrappedEvent, + node.passive ? node.listener : null + ); + if (typeof node.listener === "function") { + try { + node.listener.call(this, wrappedEvent); + } catch (err) { + if ( + typeof console !== "undefined" && + typeof console.error === "function" + ) { + console.error(err); + } + } + } else if ( + node.listenerType !== ATTRIBUTE && + typeof node.listener.handleEvent === "function" + ) { + node.listener.handleEvent(wrappedEvent); + } + if (isStopped(wrappedEvent)) { + break; + } + node = node.next; + } + setPassiveListener(wrappedEvent, null); + setEventPhase(wrappedEvent, 0); + setCurrentTarget(wrappedEvent, null); + return !wrappedEvent.defaultPrevented; + }, + }; + Object.defineProperty(EventTarget.prototype, "constructor", { + value: EventTarget, + configurable: true, + writable: true, + }); + if ( + typeof window !== "undefined" && + typeof window.EventTarget !== "undefined" + ) { + Object.setPrototypeOf( + EventTarget.prototype, + window.EventTarget.prototype + ); + } + exports.defineEventAttribute = defineEventAttribute; + exports.EventTarget = EventTarget; + exports.default = EventTarget; + module.exports = EventTarget; + module.exports.EventTarget = module.exports["default"] = EventTarget; + module.exports.defineEventAttribute = defineEventAttribute; + }, + }); + + // node_modules/abort-controller/dist/abort-controller.js + var require_abort_controller = __commonJS({ + "node_modules/abort-controller/dist/abort-controller.js"(exports, module) { + "use strict"; + init_process_shim(); + Object.defineProperty(exports, "__esModule", { value: true }); + var eventTargetShim = require_event_target_shim(); + var AbortSignal = class extends eventTargetShim.EventTarget { + constructor() { + super(); + throw new TypeError("AbortSignal cannot be constructed directly"); + } + get aborted() { + const aborted = abortedFlags.get(this); + if (typeof aborted !== "boolean") { + throw new TypeError( + `Expected 'this' to be an 'AbortSignal' object, but got ${ + this === null ? "null" : typeof this + }` + ); + } + return aborted; + } + }; + eventTargetShim.defineEventAttribute(AbortSignal.prototype, "abort"); + function createAbortSignal() { + const signal = Object.create(AbortSignal.prototype); + eventTargetShim.EventTarget.call(signal); + abortedFlags.set(signal, false); + return signal; + } + function abortSignal(signal) { + if (abortedFlags.get(signal) !== false) { + return; + } + abortedFlags.set(signal, true); + signal.dispatchEvent({ type: "abort" }); + } + var abortedFlags = /* @__PURE__ */ new WeakMap(); + Object.defineProperties(AbortSignal.prototype, { + aborted: { enumerable: true }, + }); + if ( + typeof Symbol === "function" && + typeof Symbol.toStringTag === "symbol" + ) { + Object.defineProperty(AbortSignal.prototype, Symbol.toStringTag, { + configurable: true, + value: "AbortSignal", + }); + } + var AbortController = class { + constructor() { + signals.set(this, createAbortSignal()); + } + get signal() { + return getSignal(this); + } + abort() { + abortSignal(getSignal(this)); + } + }; + var signals = /* @__PURE__ */ new WeakMap(); + function getSignal(controller) { + const signal = signals.get(controller); + if (signal == null) { + throw new TypeError( + `Expected 'this' to be an 'AbortController' object, but got ${ + controller === null ? "null" : typeof controller + }` + ); + } + return signal; + } + Object.defineProperties(AbortController.prototype, { + signal: { enumerable: true }, + abort: { enumerable: true }, + }); + if ( + typeof Symbol === "function" && + typeof Symbol.toStringTag === "symbol" + ) { + Object.defineProperty(AbortController.prototype, Symbol.toStringTag, { + configurable: true, + value: "AbortController", + }); + } + exports.AbortController = AbortController; + exports.AbortSignal = AbortSignal; + exports.default = AbortController; + module.exports = AbortController; + module.exports.AbortController = module.exports["default"] = + AbortController; + module.exports.AbortSignal = AbortSignal; + }, + }); + + // node_modules/readable-stream/lib/ours/errors.js + var require_errors = __commonJS({ + "node_modules/readable-stream/lib/ours/errors.js"(exports, module) { + "use strict"; + init_process_shim(); + var { + format, + inspect, + AggregateError: CustomAggregateError, + } = require_util(); + var AggregateError = globalThis.AggregateError || CustomAggregateError; + var kIsNodeError = Symbol("kIsNodeError"); + var kTypes = [ + "string", + "function", + "number", + "object", + "Function", + "Object", + "boolean", + "bigint", + "symbol", + ]; + var classRegExp = /^([A-Z][a-z0-9]*)+$/; + var nodeInternalPrefix = "__node_internal_"; + var codes = {}; + function assert(value, message) { + if (!value) { + throw new codes.ERR_INTERNAL_ASSERTION(message); + } + } + function addNumericalSeparator(val) { + let res = ""; + let i = val.length; + const start = val[0] === "-" ? 1 : 0; + for (; i >= start + 4; i -= 3) { + res = `_${val.slice(i - 3, i)}${res}`; + } + return `${val.slice(0, i)}${res}`; + } + function getMessage(key, msg, args) { + if (typeof msg === "function") { + assert( + msg.length <= args.length, + `Code: ${key}; The provided arguments length (${args.length}) does not match the required ones (${msg.length}).` + ); + return msg(...args); + } + const expectedLength = (msg.match(/%[dfijoOs]/g) || []).length; + assert( + expectedLength === args.length, + `Code: ${key}; The provided arguments length (${args.length}) does not match the required ones (${expectedLength}).` + ); + if (args.length === 0) { + return msg; + } + return format(msg, ...args); + } + function E(code, message, Base) { + if (!Base) { + Base = Error; + } + class NodeError extends Base { + constructor(...args) { + super(getMessage(code, message, args)); + } + toString() { + return `${this.name} [${code}]: ${this.message}`; + } + } + NodeError.prototype.name = Base.name; + NodeError.prototype.code = code; + NodeError.prototype[kIsNodeError] = true; + NodeError.prototype.toString = function () { + return `${this.name} [${code}]: ${this.message}`; + }; + codes[code] = NodeError; + } + function hideStackFrames(fn) { + const hidden = nodeInternalPrefix + fn.name; + Object.defineProperty(fn, "name", { + value: hidden, + }); + return fn; + } + function aggregateTwoErrors(innerError, outerError) { + if (innerError && outerError && innerError !== outerError) { + if (Array.isArray(outerError.errors)) { + outerError.errors.push(innerError); + return outerError; + } + const err = new AggregateError( + [outerError, innerError], + outerError.message + ); + err.code = outerError.code; + return err; + } + return innerError || outerError; + } + var AbortError = class extends Error { + constructor(message = "The operation was aborted", options = void 0) { + if (options !== void 0 && typeof options !== "object") { + throw new codes.ERR_INVALID_ARG_TYPE("options", "Object", options); + } + super(message, options); + this.code = "ABORT_ERR"; + this.name = "AbortError"; + } + }; + E("ERR_ASSERTION", "%s", Error); + E( + "ERR_INVALID_ARG_TYPE", + (name, expected, actual) => { + assert(typeof name === "string", "'name' must be a string"); + if (!Array.isArray(expected)) { + expected = [expected]; + } + let msg = "The "; + if (name.endsWith(" argument")) { + msg += `${name} `; + } else { + msg += `"${name}" ${name.includes(".") ? "property" : "argument"} `; + } + msg += "must be "; + const types = []; + const instances = []; + const other = []; + for (const value of expected) { + assert( + typeof value === "string", + "All expected entries have to be of type string" + ); + if (kTypes.includes(value)) { + types.push(value.toLowerCase()); + } else if (classRegExp.test(value)) { + instances.push(value); + } else { + assert( + value !== "object", + 'The value "object" should be written as "Object"' + ); + other.push(value); + } + } + if (instances.length > 0) { + const pos = types.indexOf("object"); + if (pos !== -1) { + types.splice(types, pos, 1); + instances.push("Object"); + } + } + if (types.length > 0) { + switch (types.length) { + case 1: + msg += `of type ${types[0]}`; + break; + case 2: + msg += `one of type ${types[0]} or ${types[1]}`; + break; + default: { + const last = types.pop(); + msg += `one of type ${types.join(", ")}, or ${last}`; + } + } + if (instances.length > 0 || other.length > 0) { + msg += " or "; + } + } + if (instances.length > 0) { + switch (instances.length) { + case 1: + msg += `an instance of ${instances[0]}`; + break; + case 2: + msg += `an instance of ${instances[0]} or ${instances[1]}`; + break; + default: { + const last = instances.pop(); + msg += `an instance of ${instances.join(", ")}, or ${last}`; + } + } + if (other.length > 0) { + msg += " or "; + } + } + switch (other.length) { + case 0: + break; + case 1: + if (other[0].toLowerCase() !== other[0]) { + msg += "an "; + } + msg += `${other[0]}`; + break; + case 2: + msg += `one of ${other[0]} or ${other[1]}`; + break; + default: { + const last = other.pop(); + msg += `one of ${other.join(", ")}, or ${last}`; + } + } + if (actual == null) { + msg += `. Received ${actual}`; + } else if (typeof actual === "function" && actual.name) { + msg += `. Received function ${actual.name}`; + } else if (typeof actual === "object") { + var _actual$constructor; + if ( + (_actual$constructor = actual.constructor) !== null && + _actual$constructor !== void 0 && + _actual$constructor.name + ) { + msg += `. Received an instance of ${actual.constructor.name}`; + } else { + const inspected = inspect(actual, { + depth: -1, + }); + msg += `. Received ${inspected}`; + } + } else { + let inspected = inspect(actual, { + colors: false, + }); + if (inspected.length > 25) { + inspected = `${inspected.slice(0, 25)}...`; + } + msg += `. Received type ${typeof actual} (${inspected})`; + } + return msg; + }, + TypeError + ); + E( + "ERR_INVALID_ARG_VALUE", + (name, value, reason = "is invalid") => { + let inspected = inspect(value); + if (inspected.length > 128) { + inspected = inspected.slice(0, 128) + "..."; + } + const type = name.includes(".") ? "property" : "argument"; + return `The ${type} '${name}' ${reason}. Received ${inspected}`; + }, + TypeError + ); + E( + "ERR_INVALID_RETURN_VALUE", + (input, name, value) => { + var _value$constructor; + const type = + value !== null && + value !== void 0 && + (_value$constructor = value.constructor) !== null && + _value$constructor !== void 0 && + _value$constructor.name + ? `instance of ${value.constructor.name}` + : `type ${typeof value}`; + return `Expected ${input} to be returned from the "${name}" function but got ${type}.`; + }, + TypeError + ); + E( + "ERR_MISSING_ARGS", + (...args) => { + assert(args.length > 0, "At least one arg needs to be specified"); + let msg; + const len = args.length; + args = (Array.isArray(args) ? args : [args]) + .map((a) => `"${a}"`) + .join(" or "); + switch (len) { + case 1: + msg += `The ${args[0]} argument`; + break; + case 2: + msg += `The ${args[0]} and ${args[1]} arguments`; + break; + default: + { + const last = args.pop(); + msg += `The ${args.join(", ")}, and ${last} arguments`; + } + break; + } + return `${msg} must be specified`; + }, + TypeError + ); + E( + "ERR_OUT_OF_RANGE", + (str, range, input) => { + assert(range, 'Missing "range" argument'); + let received; + if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) { + received = addNumericalSeparator(String(input)); + } else if (typeof input === "bigint") { + received = String(input); + if (input > 2n ** 32n || input < -(2n ** 32n)) { + received = addNumericalSeparator(received); + } + received += "n"; + } else { + received = inspect(input); + } + return `The value of "${str}" is out of range. It must be ${range}. Received ${received}`; + }, + RangeError + ); + E("ERR_MULTIPLE_CALLBACK", "Callback called multiple times", Error); + E( + "ERR_METHOD_NOT_IMPLEMENTED", + "The %s method is not implemented", + Error + ); + E( + "ERR_STREAM_ALREADY_FINISHED", + "Cannot call %s after a stream was finished", + Error + ); + E("ERR_STREAM_CANNOT_PIPE", "Cannot pipe, not readable", Error); + E( + "ERR_STREAM_DESTROYED", + "Cannot call %s after a stream was destroyed", + Error + ); + E( + "ERR_STREAM_NULL_VALUES", + "May not write null values to stream", + TypeError + ); + E("ERR_STREAM_PREMATURE_CLOSE", "Premature close", Error); + E("ERR_STREAM_PUSH_AFTER_EOF", "stream.push() after EOF", Error); + E( + "ERR_STREAM_UNSHIFT_AFTER_END_EVENT", + "stream.unshift() after end event", + Error + ); + E("ERR_STREAM_WRITE_AFTER_END", "write after end", Error); + E("ERR_UNKNOWN_ENCODING", "Unknown encoding: %s", TypeError); + module.exports = { + AbortError, + aggregateTwoErrors: hideStackFrames(aggregateTwoErrors), + hideStackFrames, + codes, + }; + }, + }); + + // node_modules/readable-stream/lib/internal/validators.js + var require_validators = __commonJS({ + "node_modules/readable-stream/lib/internal/validators.js"(exports, module) { + "use strict"; + init_process_shim(); + var { + ArrayIsArray, + ArrayPrototypeIncludes, + ArrayPrototypeJoin, + ArrayPrototypeMap, + NumberIsInteger, + NumberMAX_SAFE_INTEGER, + NumberMIN_SAFE_INTEGER, + NumberParseInt, + RegExpPrototypeTest, + String: String2, + StringPrototypeToUpperCase, + StringPrototypeTrim, + } = require_primordials(); + var { + hideStackFrames, + codes: { + ERR_SOCKET_BAD_PORT, + ERR_INVALID_ARG_TYPE, + ERR_INVALID_ARG_VALUE, + ERR_OUT_OF_RANGE, + ERR_UNKNOWN_SIGNAL, + }, + } = require_errors(); + var { normalizeEncoding } = require_util(); + var { isAsyncFunction, isArrayBufferView } = require_util().types; + var signals = {}; + function isInt32(value) { + return value === (value | 0); + } + function isUint32(value) { + return value === value >>> 0; + } + var octalReg = /^[0-7]+$/; + var modeDesc = "must be a 32-bit unsigned integer or an octal string"; + function parseFileMode(value, name, def) { + if (typeof value === "undefined") { + value = def; + } + if (typeof value === "string") { + if (!RegExpPrototypeTest(octalReg, value)) { + throw new ERR_INVALID_ARG_VALUE(name, value, modeDesc); + } + value = NumberParseInt(value, 8); + } + validateInt32(value, name, 0, 2 ** 32 - 1); + return value; + } + var validateInteger = hideStackFrames( + ( + value, + name, + min = NumberMIN_SAFE_INTEGER, + max = NumberMAX_SAFE_INTEGER + ) => { + if (typeof value !== "number") + throw new ERR_INVALID_ARG_TYPE(name, "number", value); + if (!NumberIsInteger(value)) + throw new ERR_OUT_OF_RANGE(name, "an integer", value); + if (value < min || value > max) + throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value); + } + ); + var validateInt32 = hideStackFrames( + (value, name, min = -2147483648, max = 2147483647) => { + if (typeof value !== "number") { + throw new ERR_INVALID_ARG_TYPE(name, "number", value); + } + if (!isInt32(value)) { + if (!NumberIsInteger(value)) { + throw new ERR_OUT_OF_RANGE(name, "an integer", value); + } + throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value); + } + if (value < min || value > max) { + throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value); + } + } + ); + var validateUint32 = hideStackFrames((value, name, positive) => { + if (typeof value !== "number") { + throw new ERR_INVALID_ARG_TYPE(name, "number", value); + } + if (!isUint32(value)) { + if (!NumberIsInteger(value)) { + throw new ERR_OUT_OF_RANGE(name, "an integer", value); + } + const min = positive ? 1 : 0; + throw new ERR_OUT_OF_RANGE(name, `>= ${min} && < 4294967296`, value); + } + if (positive && value === 0) { + throw new ERR_OUT_OF_RANGE(name, ">= 1 && < 4294967296", value); + } + }); + function validateString(value, name) { + if (typeof value !== "string") + throw new ERR_INVALID_ARG_TYPE(name, "string", value); + } + function validateNumber(value, name) { + if (typeof value !== "number") + throw new ERR_INVALID_ARG_TYPE(name, "number", value); + } + var validateOneOf = hideStackFrames((value, name, oneOf) => { + if (!ArrayPrototypeIncludes(oneOf, value)) { + const allowed = ArrayPrototypeJoin( + ArrayPrototypeMap(oneOf, (v) => + typeof v === "string" ? `'${v}'` : String2(v) + ), + ", " + ); + const reason = "must be one of: " + allowed; + throw new ERR_INVALID_ARG_VALUE(name, value, reason); + } + }); + function validateBoolean(value, name) { + if (typeof value !== "boolean") + throw new ERR_INVALID_ARG_TYPE(name, "boolean", value); + } + var validateObject = hideStackFrames((value, name, options) => { + const useDefaultOptions = options == null; + const allowArray = useDefaultOptions ? false : options.allowArray; + const allowFunction = useDefaultOptions ? false : options.allowFunction; + const nullable = useDefaultOptions ? false : options.nullable; + if ( + (!nullable && value === null) || + (!allowArray && ArrayIsArray(value)) || + (typeof value !== "object" && + (!allowFunction || typeof value !== "function")) + ) { + throw new ERR_INVALID_ARG_TYPE(name, "Object", value); + } + }); + var validateArray = hideStackFrames((value, name, minLength = 0) => { + if (!ArrayIsArray(value)) { + throw new ERR_INVALID_ARG_TYPE(name, "Array", value); + } + if (value.length < minLength) { + const reason = `must be longer than ${minLength}`; + throw new ERR_INVALID_ARG_VALUE(name, value, reason); + } + }); + function validateSignalName(signal, name = "signal") { + validateString(signal, name); + if (signals[signal] === void 0) { + if (signals[StringPrototypeToUpperCase(signal)] !== void 0) { + throw new ERR_UNKNOWN_SIGNAL( + signal + " (signals must use all capital letters)" + ); + } + throw new ERR_UNKNOWN_SIGNAL(signal); + } + } + var validateBuffer = hideStackFrames((buffer, name = "buffer") => { + if (!isArrayBufferView(buffer)) { + throw new ERR_INVALID_ARG_TYPE( + name, + ["Buffer", "TypedArray", "DataView"], + buffer + ); + } + }); + function validateEncoding(data, encoding) { + const normalizedEncoding = normalizeEncoding(encoding); + const length = data.length; + if (normalizedEncoding === "hex" && length % 2 !== 0) { + throw new ERR_INVALID_ARG_VALUE( + "encoding", + encoding, + `is invalid for data of length ${length}` + ); + } + } + function validatePort(port, name = "Port", allowZero = true) { + if ( + (typeof port !== "number" && typeof port !== "string") || + (typeof port === "string" && + StringPrototypeTrim(port).length === 0) || + +port !== +port >>> 0 || + port > 65535 || + (port === 0 && !allowZero) + ) { + throw new ERR_SOCKET_BAD_PORT(name, port, allowZero); + } + return port | 0; + } + var validateAbortSignal = hideStackFrames((signal, name) => { + if ( + signal !== void 0 && + (signal === null || + typeof signal !== "object" || + !("aborted" in signal)) + ) { + throw new ERR_INVALID_ARG_TYPE(name, "AbortSignal", signal); + } + }); + var validateFunction = hideStackFrames((value, name) => { + if (typeof value !== "function") + throw new ERR_INVALID_ARG_TYPE(name, "Function", value); + }); + var validatePlainFunction = hideStackFrames((value, name) => { + if (typeof value !== "function" || isAsyncFunction(value)) + throw new ERR_INVALID_ARG_TYPE(name, "Function", value); + }); + var validateUndefined = hideStackFrames((value, name) => { + if (value !== void 0) + throw new ERR_INVALID_ARG_TYPE(name, "undefined", value); + }); + module.exports = { + isInt32, + isUint32, + parseFileMode, + validateArray, + validateBoolean, + validateBuffer, + validateEncoding, + validateFunction, + validateInt32, + validateInteger, + validateNumber, + validateObject, + validateOneOf, + validatePlainFunction, + validatePort, + validateSignalName, + validateString, + validateUint32, + validateUndefined, + validateAbortSignal, + }; + }, + }); + + // node_modules/readable-stream/lib/internal/streams/utils.js + var require_utils = __commonJS({ + "node_modules/readable-stream/lib/internal/streams/utils.js"( + exports, + module + ) { + "use strict"; + init_process_shim(); + var { + Symbol: Symbol2, + SymbolAsyncIterator, + SymbolIterator, + } = require_primordials(); + var kDestroyed = Symbol2("kDestroyed"); + var kIsErrored = Symbol2("kIsErrored"); + var kIsReadable = Symbol2("kIsReadable"); + var kIsDisturbed = Symbol2("kIsDisturbed"); + function isReadableNodeStream(obj, strict = false) { + var _obj$_readableState; + return !!( + obj && + typeof obj.pipe === "function" && + typeof obj.on === "function" && + (!strict || + (typeof obj.pause === "function" && + typeof obj.resume === "function")) && + (!obj._writableState || + ((_obj$_readableState = obj._readableState) === null || + _obj$_readableState === void 0 + ? void 0 + : _obj$_readableState.readable) !== false) && + (!obj._writableState || obj._readableState) + ); + } + function isWritableNodeStream(obj) { + var _obj$_writableState; + return !!( + obj && + typeof obj.write === "function" && + typeof obj.on === "function" && + (!obj._readableState || + ((_obj$_writableState = obj._writableState) === null || + _obj$_writableState === void 0 + ? void 0 + : _obj$_writableState.writable) !== false) + ); + } + function isDuplexNodeStream(obj) { + return !!( + obj && + typeof obj.pipe === "function" && + obj._readableState && + typeof obj.on === "function" && + typeof obj.write === "function" + ); + } + function isNodeStream(obj) { + return ( + obj && + (obj._readableState || + obj._writableState || + (typeof obj.write === "function" && typeof obj.on === "function") || + (typeof obj.pipe === "function" && typeof obj.on === "function")) + ); + } + function isIterable(obj, isAsync) { + if (obj == null) return false; + if (isAsync === true) + return typeof obj[SymbolAsyncIterator] === "function"; + if (isAsync === false) return typeof obj[SymbolIterator] === "function"; + return ( + typeof obj[SymbolAsyncIterator] === "function" || + typeof obj[SymbolIterator] === "function" + ); + } + function isDestroyed(stream) { + if (!isNodeStream(stream)) return null; + const wState = stream._writableState; + const rState = stream._readableState; + const state = wState || rState; + return !!( + stream.destroyed || + stream[kDestroyed] || + (state !== null && state !== void 0 && state.destroyed) + ); + } + function isWritableEnded(stream) { + if (!isWritableNodeStream(stream)) return null; + if (stream.writableEnded === true) return true; + const wState = stream._writableState; + if (wState !== null && wState !== void 0 && wState.errored) + return false; + if ( + typeof (wState === null || wState === void 0 + ? void 0 + : wState.ended) !== "boolean" + ) + return null; + return wState.ended; + } + function isWritableFinished(stream, strict) { + if (!isWritableNodeStream(stream)) return null; + if (stream.writableFinished === true) return true; + const wState = stream._writableState; + if (wState !== null && wState !== void 0 && wState.errored) + return false; + if ( + typeof (wState === null || wState === void 0 + ? void 0 + : wState.finished) !== "boolean" + ) + return null; + return !!( + wState.finished || + (strict === false && wState.ended === true && wState.length === 0) + ); + } + function isReadableEnded(stream) { + if (!isReadableNodeStream(stream)) return null; + if (stream.readableEnded === true) return true; + const rState = stream._readableState; + if (!rState || rState.errored) return false; + if ( + typeof (rState === null || rState === void 0 + ? void 0 + : rState.ended) !== "boolean" + ) + return null; + return rState.ended; + } + function isReadableFinished(stream, strict) { + if (!isReadableNodeStream(stream)) return null; + const rState = stream._readableState; + if (rState !== null && rState !== void 0 && rState.errored) + return false; + if ( + typeof (rState === null || rState === void 0 + ? void 0 + : rState.endEmitted) !== "boolean" + ) + return null; + return !!( + rState.endEmitted || + (strict === false && rState.ended === true && rState.length === 0) + ); + } + function isReadable(stream) { + if (stream && stream[kIsReadable] != null) return stream[kIsReadable]; + if ( + typeof (stream === null || stream === void 0 + ? void 0 + : stream.readable) !== "boolean" + ) + return null; + if (isDestroyed(stream)) return false; + return ( + isReadableNodeStream(stream) && + stream.readable && + !isReadableFinished(stream) + ); + } + function isWritable(stream) { + if ( + typeof (stream === null || stream === void 0 + ? void 0 + : stream.writable) !== "boolean" + ) + return null; + if (isDestroyed(stream)) return false; + return ( + isWritableNodeStream(stream) && + stream.writable && + !isWritableEnded(stream) + ); + } + function isFinished(stream, opts) { + if (!isNodeStream(stream)) { + return null; + } + if (isDestroyed(stream)) { + return true; + } + if ( + (opts === null || opts === void 0 ? void 0 : opts.readable) !== + false && + isReadable(stream) + ) { + return false; + } + if ( + (opts === null || opts === void 0 ? void 0 : opts.writable) !== + false && + isWritable(stream) + ) { + return false; + } + return true; + } + function isWritableErrored(stream) { + var _stream$_writableStat, _stream$_writableStat2; + if (!isNodeStream(stream)) { + return null; + } + if (stream.writableErrored) { + return stream.writableErrored; + } + return (_stream$_writableStat = + (_stream$_writableStat2 = stream._writableState) === null || + _stream$_writableStat2 === void 0 + ? void 0 + : _stream$_writableStat2.errored) !== null && + _stream$_writableStat !== void 0 + ? _stream$_writableStat + : null; + } + function isReadableErrored(stream) { + var _stream$_readableStat, _stream$_readableStat2; + if (!isNodeStream(stream)) { + return null; + } + if (stream.readableErrored) { + return stream.readableErrored; + } + return (_stream$_readableStat = + (_stream$_readableStat2 = stream._readableState) === null || + _stream$_readableStat2 === void 0 + ? void 0 + : _stream$_readableStat2.errored) !== null && + _stream$_readableStat !== void 0 + ? _stream$_readableStat + : null; + } + function isClosed(stream) { + if (!isNodeStream(stream)) { + return null; + } + if (typeof stream.closed === "boolean") { + return stream.closed; + } + const wState = stream._writableState; + const rState = stream._readableState; + if ( + typeof (wState === null || wState === void 0 + ? void 0 + : wState.closed) === "boolean" || + typeof (rState === null || rState === void 0 + ? void 0 + : rState.closed) === "boolean" + ) { + return ( + (wState === null || wState === void 0 ? void 0 : wState.closed) || + (rState === null || rState === void 0 ? void 0 : rState.closed) + ); + } + if (typeof stream._closed === "boolean" && isOutgoingMessage(stream)) { + return stream._closed; + } + return null; + } + function isOutgoingMessage(stream) { + return ( + typeof stream._closed === "boolean" && + typeof stream._defaultKeepAlive === "boolean" && + typeof stream._removedConnection === "boolean" && + typeof stream._removedContLen === "boolean" + ); + } + function isServerResponse(stream) { + return ( + typeof stream._sent100 === "boolean" && isOutgoingMessage(stream) + ); + } + function isServerRequest(stream) { + var _stream$req; + return ( + typeof stream._consuming === "boolean" && + typeof stream._dumped === "boolean" && + ((_stream$req = stream.req) === null || _stream$req === void 0 + ? void 0 + : _stream$req.upgradeOrConnect) === void 0 + ); + } + function willEmitClose(stream) { + if (!isNodeStream(stream)) return null; + const wState = stream._writableState; + const rState = stream._readableState; + const state = wState || rState; + return ( + (!state && isServerResponse(stream)) || + !!( + state && + state.autoDestroy && + state.emitClose && + state.closed === false + ) + ); + } + function isDisturbed(stream) { + var _stream$kIsDisturbed; + return !!( + stream && + ((_stream$kIsDisturbed = stream[kIsDisturbed]) !== null && + _stream$kIsDisturbed !== void 0 + ? _stream$kIsDisturbed + : stream.readableDidRead || stream.readableAborted) + ); + } + function isErrored(stream) { + var _ref, + _ref2, + _ref3, + _ref4, + _ref5, + _stream$kIsErrored, + _stream$_readableStat3, + _stream$_writableStat3, + _stream$_readableStat4, + _stream$_writableStat4; + return !!( + stream && + ((_ref = + (_ref2 = + (_ref3 = + (_ref4 = + (_ref5 = + (_stream$kIsErrored = stream[kIsErrored]) !== null && + _stream$kIsErrored !== void 0 + ? _stream$kIsErrored + : stream.readableErrored) !== null && _ref5 !== void 0 + ? _ref5 + : stream.writableErrored) !== null && _ref4 !== void 0 + ? _ref4 + : (_stream$_readableStat3 = stream._readableState) === null || + _stream$_readableStat3 === void 0 + ? void 0 + : _stream$_readableStat3.errorEmitted) !== null && + _ref3 !== void 0 + ? _ref3 + : (_stream$_writableStat3 = stream._writableState) === null || + _stream$_writableStat3 === void 0 + ? void 0 + : _stream$_writableStat3.errorEmitted) !== null && + _ref2 !== void 0 + ? _ref2 + : (_stream$_readableStat4 = stream._readableState) === null || + _stream$_readableStat4 === void 0 + ? void 0 + : _stream$_readableStat4.errored) !== null && _ref !== void 0 + ? _ref + : (_stream$_writableStat4 = stream._writableState) === null || + _stream$_writableStat4 === void 0 + ? void 0 + : _stream$_writableStat4.errored) + ); + } + module.exports = { + kDestroyed, + isDisturbed, + kIsDisturbed, + isErrored, + kIsErrored, + isReadable, + kIsReadable, + isClosed, + isDestroyed, + isDuplexNodeStream, + isFinished, + isIterable, + isReadableNodeStream, + isReadableEnded, + isReadableFinished, + isReadableErrored, + isNodeStream, + isWritable, + isWritableNodeStream, + isWritableEnded, + isWritableFinished, + isWritableErrored, + isServerRequest, + isServerResponse, + willEmitClose, + }; + }, + }); + + // node_modules/readable-stream/lib/internal/streams/end-of-stream.js + var require_end_of_stream = __commonJS({ + "node_modules/readable-stream/lib/internal/streams/end-of-stream.js"( + exports, + module + ) { + "use strict"; + init_process_shim(); + var { AbortError, codes } = require_errors(); + var { ERR_INVALID_ARG_TYPE, ERR_STREAM_PREMATURE_CLOSE } = codes; + var { once } = require_util(); + var { validateAbortSignal, validateFunction, validateObject } = + require_validators(); + var { Promise: Promise2 } = require_primordials(); + var { + isClosed, + isReadable, + isReadableNodeStream, + isReadableFinished, + isReadableErrored, + isWritable, + isWritableNodeStream, + isWritableFinished, + isWritableErrored, + isNodeStream, + willEmitClose: _willEmitClose, + } = require_utils(); + function isRequest(stream) { + return stream.setHeader && typeof stream.abort === "function"; + } + var nop = () => {}; + function eos(stream, options, callback) { + var _options$readable, _options$writable; + if (arguments.length === 2) { + callback = options; + options = {}; + } else if (options == null) { + options = {}; + } else { + validateObject(options, "options"); + } + validateFunction(callback, "callback"); + validateAbortSignal(options.signal, "options.signal"); + callback = once(callback); + const readable = + (_options$readable = options.readable) !== null && + _options$readable !== void 0 + ? _options$readable + : isReadableNodeStream(stream); + const writable = + (_options$writable = options.writable) !== null && + _options$writable !== void 0 + ? _options$writable + : isWritableNodeStream(stream); + if (!isNodeStream(stream)) { + throw new ERR_INVALID_ARG_TYPE("stream", "Stream", stream); + } + const wState = stream._writableState; + const rState = stream._readableState; + const onlegacyfinish = () => { + if (!stream.writable) { + onfinish(); + } + }; + let willEmitClose = + _willEmitClose(stream) && + isReadableNodeStream(stream) === readable && + isWritableNodeStream(stream) === writable; + let writableFinished = isWritableFinished(stream, false); + const onfinish = () => { + writableFinished = true; + if (stream.destroyed) { + willEmitClose = false; + } + if (willEmitClose && (!stream.readable || readable)) { + return; + } + if (!readable || readableFinished) { + callback.call(stream); + } + }; + let readableFinished = isReadableFinished(stream, false); + const onend = () => { + readableFinished = true; + if (stream.destroyed) { + willEmitClose = false; + } + if (willEmitClose && (!stream.writable || writable)) { + return; + } + if (!writable || writableFinished) { + callback.call(stream); + } + }; + const onerror = (err) => { + callback.call(stream, err); + }; + let closed = isClosed(stream); + const onclose = () => { + closed = true; + const errored = + isWritableErrored(stream) || isReadableErrored(stream); + if (errored && typeof errored !== "boolean") { + return callback.call(stream, errored); + } + if ( + readable && + !readableFinished && + isReadableNodeStream(stream, true) + ) { + if (!isReadableFinished(stream, false)) + return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE()); + } + if (writable && !writableFinished) { + if (!isWritableFinished(stream, false)) + return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE()); + } + callback.call(stream); + }; + const onrequest = () => { + stream.req.on("finish", onfinish); + }; + if (isRequest(stream)) { + stream.on("complete", onfinish); + if (!willEmitClose) { + stream.on("abort", onclose); + } + if (stream.req) { + onrequest(); + } else { + stream.on("request", onrequest); + } + } else if (writable && !wState) { + stream.on("end", onlegacyfinish); + stream.on("close", onlegacyfinish); + } + if (!willEmitClose && typeof stream.aborted === "boolean") { + stream.on("aborted", onclose); + } + stream.on("end", onend); + stream.on("finish", onfinish); + if (options.error !== false) { + stream.on("error", onerror); + } + stream.on("close", onclose); + if (closed) { + process.nextTick(onclose); + } else if ( + (wState !== null && wState !== void 0 && wState.errorEmitted) || + (rState !== null && rState !== void 0 && rState.errorEmitted) + ) { + if (!willEmitClose) { + process.nextTick(onclose); + } + } else if ( + !readable && + (!willEmitClose || isReadable(stream)) && + (writableFinished || isWritable(stream) === false) + ) { + process.nextTick(onclose); + } else if ( + !writable && + (!willEmitClose || isWritable(stream)) && + (readableFinished || isReadable(stream) === false) + ) { + process.nextTick(onclose); + } else if (rState && stream.req && stream.aborted) { + process.nextTick(onclose); + } + const cleanup = () => { + callback = nop; + stream.removeListener("aborted", onclose); + stream.removeListener("complete", onfinish); + stream.removeListener("abort", onclose); + stream.removeListener("request", onrequest); + if (stream.req) stream.req.removeListener("finish", onfinish); + stream.removeListener("end", onlegacyfinish); + stream.removeListener("close", onlegacyfinish); + stream.removeListener("finish", onfinish); + stream.removeListener("end", onend); + stream.removeListener("error", onerror); + stream.removeListener("close", onclose); + }; + if (options.signal && !closed) { + const abort = () => { + const endCallback = callback; + cleanup(); + endCallback.call( + stream, + new AbortError(void 0, { + cause: options.signal.reason, + }) + ); + }; + if (options.signal.aborted) { + process.nextTick(abort); + } else { + const originalCallback = callback; + callback = once((...args) => { + options.signal.removeEventListener("abort", abort); + originalCallback.apply(stream, args); + }); + options.signal.addEventListener("abort", abort); + } + } + return cleanup; + } + function finished(stream, opts) { + return new Promise2((resolve, reject) => { + eos(stream, opts, (err) => { + if (err) { + reject(err); + } else { + resolve(); } - Buffer2.prototype.swap16 = function swap16() { - const len = this.length; - if (len % 2 !== 0) { - throw new RangeError("Buffer size must be a multiple of 16-bits"); - } - for (let i = 0; i < len; i += 2) { - swap(this, i, i + 1); - } - return this; - }; - Buffer2.prototype.swap32 = function swap32() { - const len = this.length; - if (len % 4 !== 0) { - throw new RangeError("Buffer size must be a multiple of 32-bits"); - } - for (let i = 0; i < len; i += 4) { - swap(this, i, i + 3); - swap(this, i + 1, i + 2); - } - return this; - }; - Buffer2.prototype.swap64 = function swap64() { - const len = this.length; - if (len % 8 !== 0) { - throw new RangeError("Buffer size must be a multiple of 64-bits"); - } - for (let i = 0; i < len; i += 8) { - swap(this, i, i + 7); - swap(this, i + 1, i + 6); - swap(this, i + 2, i + 5); - swap(this, i + 3, i + 4); - } - return this; - }; - Buffer2.prototype.toString = function toString() { - const length = this.length; - if (length === 0) - return ""; - if (arguments.length === 0) - return utf8Slice(this, 0, length); - return slowToString.apply(this, arguments); - }; - Buffer2.prototype.toLocaleString = Buffer2.prototype.toString; - Buffer2.prototype.equals = function equals(b) { - if (!Buffer2.isBuffer(b)) - throw new TypeError("Argument must be a Buffer"); - if (this === b) - return true; - return Buffer2.compare(this, b) === 0; - }; - Buffer2.prototype.inspect = function inspect() { - let str = ""; - const max = exports.INSPECT_MAX_BYTES; - str = this.toString("hex", 0, max).replace(/(.{2})/g, "$1 ").trim(); - if (this.length > max) - str += " ... "; - return ""; - }; - if (customInspectSymbol) { - Buffer2.prototype[customInspectSymbol] = Buffer2.prototype.inspect; - } - Buffer2.prototype.compare = function compare(target, start, end, thisStart, thisEnd) { - if (isInstance(target, Uint8Array)) { - target = Buffer2.from(target, target.offset, target.byteLength); - } - if (!Buffer2.isBuffer(target)) { - throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type ' + typeof target); - } - if (start === void 0) { - start = 0; - } - if (end === void 0) { - end = target ? target.length : 0; - } - if (thisStart === void 0) { - thisStart = 0; - } - if (thisEnd === void 0) { - thisEnd = this.length; - } - if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { - throw new RangeError("out of range index"); - } - if (thisStart >= thisEnd && start >= end) { - return 0; - } - if (thisStart >= thisEnd) { - return -1; - } - if (start >= end) { - return 1; - } - start >>>= 0; - end >>>= 0; - thisStart >>>= 0; - thisEnd >>>= 0; - if (this === target) - return 0; - let x = thisEnd - thisStart; - let y = end - start; - const len = Math.min(x, y); - const thisCopy = this.slice(thisStart, thisEnd); - const targetCopy = target.slice(start, end); - for (let i = 0; i < len; ++i) { - if (thisCopy[i] !== targetCopy[i]) { - x = thisCopy[i]; - y = targetCopy[i]; - break; - } - } - if (x < y) - return -1; - if (y < x) - return 1; - return 0; - }; - function bidirectionalIndexOf(buffer, val, byteOffset, encoding, dir) { - if (buffer.length === 0) - return -1; - if (typeof byteOffset === "string") { - encoding = byteOffset; - byteOffset = 0; - } else if (byteOffset > 2147483647) { - byteOffset = 2147483647; - } else if (byteOffset < -2147483648) { - byteOffset = -2147483648; - } - byteOffset = +byteOffset; - if (numberIsNaN(byteOffset)) { - byteOffset = dir ? 0 : buffer.length - 1; - } - if (byteOffset < 0) - byteOffset = buffer.length + byteOffset; - if (byteOffset >= buffer.length) { - if (dir) - return -1; - else - byteOffset = buffer.length - 1; - } else if (byteOffset < 0) { - if (dir) - byteOffset = 0; - else - return -1; - } - if (typeof val === "string") { - val = Buffer2.from(val, encoding); - } - if (Buffer2.isBuffer(val)) { - if (val.length === 0) { - return -1; - } - return arrayIndexOf(buffer, val, byteOffset, encoding, dir); - } else if (typeof val === "number") { - val = val & 255; - if (typeof Uint8Array.prototype.indexOf === "function") { - if (dir) { - return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset); - } else { - return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset); - } - } - return arrayIndexOf(buffer, [val], byteOffset, encoding, dir); - } - throw new TypeError("val must be string, number or Buffer"); - } - function arrayIndexOf(arr, val, byteOffset, encoding, dir) { - let indexSize = 1; - let arrLength = arr.length; - let valLength = val.length; - if (encoding !== void 0) { - encoding = String(encoding).toLowerCase(); - if (encoding === "ucs2" || encoding === "ucs-2" || encoding === "utf16le" || encoding === "utf-16le") { - if (arr.length < 2 || val.length < 2) { - return -1; - } - indexSize = 2; - arrLength /= 2; - valLength /= 2; - byteOffset /= 2; - } - } - function read(buf, i2) { - if (indexSize === 1) { - return buf[i2]; - } else { - return buf.readUInt16BE(i2 * indexSize); - } - } - let i; - if (dir) { - let foundIndex = -1; - for (i = byteOffset; i < arrLength; i++) { - if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { - if (foundIndex === -1) - foundIndex = i; - if (i - foundIndex + 1 === valLength) - return foundIndex * indexSize; - } else { - if (foundIndex !== -1) - i -= i - foundIndex; - foundIndex = -1; - } - } - } else { - if (byteOffset + valLength > arrLength) - byteOffset = arrLength - valLength; - for (i = byteOffset; i >= 0; i--) { - let found = true; - for (let j = 0; j < valLength; j++) { - if (read(arr, i + j) !== read(val, j)) { - found = false; - break; - } - } - if (found) - return i; - } + }); + }); + } + module.exports = eos; + module.exports.finished = finished; + }, + }); + + // node_modules/readable-stream/lib/internal/streams/operators.js + var require_operators = __commonJS({ + "node_modules/readable-stream/lib/internal/streams/operators.js"( + exports, + module + ) { + "use strict"; + init_process_shim(); + var abortControllerModule = require_abort_controller(); + var AbortController = + globalThis.AbortController || abortControllerModule.AbortController; + var { + codes: { ERR_INVALID_ARG_TYPE, ERR_MISSING_ARGS, ERR_OUT_OF_RANGE }, + AbortError, + } = require_errors(); + var { validateAbortSignal, validateInteger, validateObject } = + require_validators(); + var kWeakHandler = require_primordials().Symbol("kWeak"); + var { finished } = require_end_of_stream(); + var { + ArrayPrototypePush, + MathFloor, + Number: Number2, + NumberIsNaN, + Promise: Promise2, + PromiseReject, + PromisePrototypeCatch, + Symbol: Symbol2, + } = require_primordials(); + var kEmpty = Symbol2("kEmpty"); + var kEof = Symbol2("kEof"); + function map(fn, options) { + if (typeof fn !== "function") { + throw new ERR_INVALID_ARG_TYPE( + "fn", + ["Function", "AsyncFunction"], + fn + ); + } + if (options != null) { + validateObject(options, "options"); + } + if ( + (options === null || options === void 0 ? void 0 : options.signal) != + null + ) { + validateAbortSignal(options.signal, "options.signal"); + } + let concurrency = 1; + if ( + (options === null || options === void 0 + ? void 0 + : options.concurrency) != null + ) { + concurrency = MathFloor(options.concurrency); + } + validateInteger(concurrency, "concurrency", 1); + return async function* map2() { + var _options$signal, _options$signal2; + const ac = new AbortController(); + const stream = this; + const queue = []; + const signal = ac.signal; + const signalOpt = { + signal, + }; + const abort = () => ac.abort(); + if ( + options !== null && + options !== void 0 && + (_options$signal = options.signal) !== null && + _options$signal !== void 0 && + _options$signal.aborted + ) { + abort(); + } + options === null || options === void 0 + ? void 0 + : (_options$signal2 = options.signal) === null || + _options$signal2 === void 0 + ? void 0 + : _options$signal2.addEventListener("abort", abort); + let next; + let resume; + let done = false; + function onDone() { + done = true; + } + async function pump() { + try { + for await (let val of stream) { + var _val; + if (done) { + return; } - return -1; - } - Buffer2.prototype.includes = function includes(val, byteOffset, encoding) { - return this.indexOf(val, byteOffset, encoding) !== -1; - }; - Buffer2.prototype.indexOf = function indexOf(val, byteOffset, encoding) { - return bidirectionalIndexOf(this, val, byteOffset, encoding, true); - }; - Buffer2.prototype.lastIndexOf = function lastIndexOf(val, byteOffset, encoding) { - return bidirectionalIndexOf(this, val, byteOffset, encoding, false); - }; - function hexWrite(buf, string, offset, length) { - offset = Number(offset) || 0; - const remaining = buf.length - offset; - if (!length) { - length = remaining; - } else { - length = Number(length); - if (length > remaining) { - length = remaining; - } + if (signal.aborted) { + throw new AbortError(); } - const strLen = string.length; - if (length > strLen / 2) { - length = strLen / 2; - } - let i; - for (i = 0; i < length; ++i) { - const parsed = parseInt(string.substr(i * 2, 2), 16); - if (numberIsNaN(parsed)) - return i; - buf[offset + i] = parsed; - } - return i; - } - function utf8Write(buf, string, offset, length) { - return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length); - } - function asciiWrite(buf, string, offset, length) { - return blitBuffer(asciiToBytes(string), buf, offset, length); - } - function base64Write(buf, string, offset, length) { - return blitBuffer(base64ToBytes(string), buf, offset, length); - } - function ucs2Write(buf, string, offset, length) { - return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length); - } - Buffer2.prototype.write = function write(string, offset, length, encoding) { - if (offset === void 0) { - encoding = "utf8"; - length = this.length; - offset = 0; - } else if (length === void 0 && typeof offset === "string") { - encoding = offset; - length = this.length; - offset = 0; - } else if (isFinite(offset)) { - offset = offset >>> 0; - if (isFinite(length)) { - length = length >>> 0; - if (encoding === void 0) - encoding = "utf8"; - } else { - encoding = length; - length = void 0; - } - } else { - throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported"); - } - const remaining = this.length - offset; - if (length === void 0 || length > remaining) - length = remaining; - if (string.length > 0 && (length < 0 || offset < 0) || offset > this.length) { - throw new RangeError("Attempt to write outside buffer bounds"); - } - if (!encoding) - encoding = "utf8"; - let loweredCase = false; - for (; ; ) { - switch (encoding) { - case "hex": - return hexWrite(this, string, offset, length); - case "utf8": - case "utf-8": - return utf8Write(this, string, offset, length); - case "ascii": - case "latin1": - case "binary": - return asciiWrite(this, string, offset, length); - case "base64": - return base64Write(this, string, offset, length); - case "ucs2": - case "ucs-2": - case "utf16le": - case "utf-16le": - return ucs2Write(this, string, offset, length); - default: - if (loweredCase) - throw new TypeError("Unknown encoding: " + encoding); - encoding = ("" + encoding).toLowerCase(); - loweredCase = true; - } + try { + val = fn(val, signalOpt); + } catch (err) { + val = PromiseReject(err); + } + if (val === kEmpty) { + continue; + } + if ( + typeof ((_val = val) === null || _val === void 0 + ? void 0 + : _val.catch) === "function" + ) { + val.catch(onDone); + } + queue.push(val); + if (next) { + next(); + next = null; + } + if (!done && queue.length && queue.length >= concurrency) { + await new Promise2((resolve) => { + resume = resolve; + }); + } + } + queue.push(kEof); + } catch (err) { + const val = PromiseReject(err); + PromisePrototypeCatch(val, onDone); + queue.push(val); + } finally { + var _options$signal3; + done = true; + if (next) { + next(); + next = null; + } + options === null || options === void 0 + ? void 0 + : (_options$signal3 = options.signal) === null || + _options$signal3 === void 0 + ? void 0 + : _options$signal3.removeEventListener("abort", abort); + } + } + pump(); + try { + while (true) { + while (queue.length > 0) { + const val = await queue[0]; + if (val === kEof) { + return; } - }; - Buffer2.prototype.toJSON = function toJSON() { - return { - type: "Buffer", - data: Array.prototype.slice.call(this._arr || this, 0) - }; - }; - function base64Slice(buf, start, end) { - if (start === 0 && end === buf.length) { - return base64.fromByteArray(buf); - } else { - return base64.fromByteArray(buf.slice(start, end)); - } - } - function utf8Slice(buf, start, end) { - end = Math.min(buf.length, end); - const res = []; - let i = start; - while (i < end) { - const firstByte = buf[i]; - let codePoint = null; - let bytesPerSequence = firstByte > 239 ? 4 : firstByte > 223 ? 3 : firstByte > 191 ? 2 : 1; - if (i + bytesPerSequence <= end) { - let secondByte, thirdByte, fourthByte, tempCodePoint; - switch (bytesPerSequence) { - case 1: - if (firstByte < 128) { - codePoint = firstByte; - } - break; - case 2: - secondByte = buf[i + 1]; - if ((secondByte & 192) === 128) { - tempCodePoint = (firstByte & 31) << 6 | secondByte & 63; - if (tempCodePoint > 127) { - codePoint = tempCodePoint; - } - } - break; - case 3: - secondByte = buf[i + 1]; - thirdByte = buf[i + 2]; - if ((secondByte & 192) === 128 && (thirdByte & 192) === 128) { - tempCodePoint = (firstByte & 15) << 12 | (secondByte & 63) << 6 | thirdByte & 63; - if (tempCodePoint > 2047 && (tempCodePoint < 55296 || tempCodePoint > 57343)) { - codePoint = tempCodePoint; - } - } - break; - case 4: - secondByte = buf[i + 1]; - thirdByte = buf[i + 2]; - fourthByte = buf[i + 3]; - if ((secondByte & 192) === 128 && (thirdByte & 192) === 128 && (fourthByte & 192) === 128) { - tempCodePoint = (firstByte & 15) << 18 | (secondByte & 63) << 12 | (thirdByte & 63) << 6 | fourthByte & 63; - if (tempCodePoint > 65535 && tempCodePoint < 1114112) { - codePoint = tempCodePoint; - } - } - } - } - if (codePoint === null) { - codePoint = 65533; - bytesPerSequence = 1; - } else if (codePoint > 65535) { - codePoint -= 65536; - res.push(codePoint >>> 10 & 1023 | 55296); - codePoint = 56320 | codePoint & 1023; - } - res.push(codePoint); - i += bytesPerSequence; - } - return decodeCodePointsArray(res); - } - var MAX_ARGUMENTS_LENGTH = 4096; - function decodeCodePointsArray(codePoints) { - const len = codePoints.length; - if (len <= MAX_ARGUMENTS_LENGTH) { - return String.fromCharCode.apply(String, codePoints); - } - let res = ""; - let i = 0; - while (i < len) { - res += String.fromCharCode.apply(String, codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)); - } - return res; - } - function asciiSlice(buf, start, end) { - let ret = ""; - end = Math.min(buf.length, end); - for (let i = start; i < end; ++i) { - ret += String.fromCharCode(buf[i] & 127); - } - return ret; - } - function latin1Slice(buf, start, end) { - let ret = ""; - end = Math.min(buf.length, end); - for (let i = start; i < end; ++i) { - ret += String.fromCharCode(buf[i]); - } - return ret; - } - function hexSlice(buf, start, end) { - const len = buf.length; - if (!start || start < 0) - start = 0; - if (!end || end < 0 || end > len) - end = len; - let out = ""; - for (let i = start; i < end; ++i) { - out += hexSliceLookupTable[buf[i]]; - } - return out; - } - function utf16leSlice(buf, start, end) { - const bytes = buf.slice(start, end); - let res = ""; - for (let i = 0; i < bytes.length - 1; i += 2) { - res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256); - } - return res; - } - Buffer2.prototype.slice = function slice(start, end) { - const len = this.length; - start = ~~start; - end = end === void 0 ? len : ~~end; - if (start < 0) { - start += len; - if (start < 0) - start = 0; - } else if (start > len) { - start = len; - } - if (end < 0) { - end += len; - if (end < 0) - end = 0; - } else if (end > len) { - end = len; - } - if (end < start) - end = start; - const newBuf = this.subarray(start, end); - Object.setPrototypeOf(newBuf, Buffer2.prototype); - return newBuf; - }; - function checkOffset(offset, ext, length) { - if (offset % 1 !== 0 || offset < 0) - throw new RangeError("offset is not uint"); - if (offset + ext > length) - throw new RangeError("Trying to access beyond buffer length"); - } - Buffer2.prototype.readUintLE = Buffer2.prototype.readUIntLE = function readUIntLE(offset, byteLength2, noAssert) { - offset = offset >>> 0; - byteLength2 = byteLength2 >>> 0; - if (!noAssert) - checkOffset(offset, byteLength2, this.length); - let val = this[offset]; - let mul = 1; - let i = 0; - while (++i < byteLength2 && (mul *= 256)) { - val += this[offset + i] * mul; - } - return val; - }; - Buffer2.prototype.readUintBE = Buffer2.prototype.readUIntBE = function readUIntBE(offset, byteLength2, noAssert) { - offset = offset >>> 0; - byteLength2 = byteLength2 >>> 0; - if (!noAssert) { - checkOffset(offset, byteLength2, this.length); - } - let val = this[offset + --byteLength2]; - let mul = 1; - while (byteLength2 > 0 && (mul *= 256)) { - val += this[offset + --byteLength2] * mul; - } - return val; - }; - Buffer2.prototype.readUint8 = Buffer2.prototype.readUInt8 = function readUInt8(offset, noAssert) { - offset = offset >>> 0; - if (!noAssert) - checkOffset(offset, 1, this.length); - return this[offset]; - }; - Buffer2.prototype.readUint16LE = Buffer2.prototype.readUInt16LE = function readUInt16LE(offset, noAssert) { - offset = offset >>> 0; - if (!noAssert) - checkOffset(offset, 2, this.length); - return this[offset] | this[offset + 1] << 8; - }; - Buffer2.prototype.readUint16BE = Buffer2.prototype.readUInt16BE = function readUInt16BE(offset, noAssert) { - offset = offset >>> 0; - if (!noAssert) - checkOffset(offset, 2, this.length); - return this[offset] << 8 | this[offset + 1]; - }; - Buffer2.prototype.readUint32LE = Buffer2.prototype.readUInt32LE = function readUInt32LE(offset, noAssert) { - offset = offset >>> 0; - if (!noAssert) - checkOffset(offset, 4, this.length); - return (this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16) + this[offset + 3] * 16777216; - }; - Buffer2.prototype.readUint32BE = Buffer2.prototype.readUInt32BE = function readUInt32BE(offset, noAssert) { - offset = offset >>> 0; - if (!noAssert) - checkOffset(offset, 4, this.length); - return this[offset] * 16777216 + (this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3]); - }; - Buffer2.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE(offset) { - offset = offset >>> 0; - validateNumber(offset, "offset"); - const first = this[offset]; - const last = this[offset + 7]; - if (first === void 0 || last === void 0) { - boundsError(offset, this.length - 8); - } - const lo = first + this[++offset] * 2 ** 8 + this[++offset] * 2 ** 16 + this[++offset] * 2 ** 24; - const hi = this[++offset] + this[++offset] * 2 ** 8 + this[++offset] * 2 ** 16 + last * 2 ** 24; - return BigInt(lo) + (BigInt(hi) << BigInt(32)); - }); - Buffer2.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE(offset) { - offset = offset >>> 0; - validateNumber(offset, "offset"); - const first = this[offset]; - const last = this[offset + 7]; - if (first === void 0 || last === void 0) { - boundsError(offset, this.length - 8); - } - const hi = first * 2 ** 24 + this[++offset] * 2 ** 16 + this[++offset] * 2 ** 8 + this[++offset]; - const lo = this[++offset] * 2 ** 24 + this[++offset] * 2 ** 16 + this[++offset] * 2 ** 8 + last; - return (BigInt(hi) << BigInt(32)) + BigInt(lo); + if (signal.aborted) { + throw new AbortError(); + } + if (val !== kEmpty) { + yield val; + } + queue.shift(); + if (resume) { + resume(); + resume = null; + } + } + await new Promise2((resolve) => { + next = resolve; + }); + } + } finally { + ac.abort(); + done = true; + if (resume) { + resume(); + resume = null; + } + } + }.call(this); + } + function asIndexedPairs(options = void 0) { + if (options != null) { + validateObject(options, "options"); + } + if ( + (options === null || options === void 0 ? void 0 : options.signal) != + null + ) { + validateAbortSignal(options.signal, "options.signal"); + } + return async function* asIndexedPairs2() { + let index = 0; + for await (const val of this) { + var _options$signal4; + if ( + options !== null && + options !== void 0 && + (_options$signal4 = options.signal) !== null && + _options$signal4 !== void 0 && + _options$signal4.aborted + ) { + throw new AbortError({ + cause: options.signal.reason, + }); + } + yield [index++, val]; + } + }.call(this); + } + async function some(fn, options = void 0) { + for await (const unused of filter.call(this, fn, options)) { + return true; + } + return false; + } + async function every(fn, options = void 0) { + if (typeof fn !== "function") { + throw new ERR_INVALID_ARG_TYPE( + "fn", + ["Function", "AsyncFunction"], + fn + ); + } + return !(await some.call( + this, + async (...args) => { + return !(await fn(...args)); + }, + options + )); + } + async function find(fn, options) { + for await (const result of filter.call(this, fn, options)) { + return result; + } + return void 0; + } + async function forEach(fn, options) { + if (typeof fn !== "function") { + throw new ERR_INVALID_ARG_TYPE( + "fn", + ["Function", "AsyncFunction"], + fn + ); + } + async function forEachFn(value, options2) { + await fn(value, options2); + return kEmpty; + } + for await (const unused of map.call(this, forEachFn, options)); + } + function filter(fn, options) { + if (typeof fn !== "function") { + throw new ERR_INVALID_ARG_TYPE( + "fn", + ["Function", "AsyncFunction"], + fn + ); + } + async function filterFn(value, options2) { + if (await fn(value, options2)) { + return value; + } + return kEmpty; + } + return map.call(this, filterFn, options); + } + var ReduceAwareErrMissingArgs = class extends ERR_MISSING_ARGS { + constructor() { + super("reduce"); + this.message = "Reduce of an empty stream requires an initial value"; + } + }; + async function reduce(reducer, initialValue, options) { + var _options$signal5; + if (typeof reducer !== "function") { + throw new ERR_INVALID_ARG_TYPE( + "reducer", + ["Function", "AsyncFunction"], + reducer + ); + } + if (options != null) { + validateObject(options, "options"); + } + if ( + (options === null || options === void 0 ? void 0 : options.signal) != + null + ) { + validateAbortSignal(options.signal, "options.signal"); + } + let hasInitialValue = arguments.length > 1; + if ( + options !== null && + options !== void 0 && + (_options$signal5 = options.signal) !== null && + _options$signal5 !== void 0 && + _options$signal5.aborted + ) { + const err = new AbortError(void 0, { + cause: options.signal.reason, + }); + this.once("error", () => {}); + await finished(this.destroy(err)); + throw err; + } + const ac = new AbortController(); + const signal = ac.signal; + if (options !== null && options !== void 0 && options.signal) { + const opts = { + once: true, + [kWeakHandler]: this, + }; + options.signal.addEventListener("abort", () => ac.abort(), opts); + } + let gotAnyItemFromStream = false; + try { + for await (const value of this) { + var _options$signal6; + gotAnyItemFromStream = true; + if ( + options !== null && + options !== void 0 && + (_options$signal6 = options.signal) !== null && + _options$signal6 !== void 0 && + _options$signal6.aborted + ) { + throw new AbortError(); + } + if (!hasInitialValue) { + initialValue = value; + hasInitialValue = true; + } else { + initialValue = await reducer(initialValue, value, { + signal, + }); + } + } + if (!gotAnyItemFromStream && !hasInitialValue) { + throw new ReduceAwareErrMissingArgs(); + } + } finally { + ac.abort(); + } + return initialValue; + } + async function toArray(options) { + if (options != null) { + validateObject(options, "options"); + } + if ( + (options === null || options === void 0 ? void 0 : options.signal) != + null + ) { + validateAbortSignal(options.signal, "options.signal"); + } + const result = []; + for await (const val of this) { + var _options$signal7; + if ( + options !== null && + options !== void 0 && + (_options$signal7 = options.signal) !== null && + _options$signal7 !== void 0 && + _options$signal7.aborted + ) { + throw new AbortError(void 0, { + cause: options.signal.reason, }); - Buffer2.prototype.readIntLE = function readIntLE(offset, byteLength2, noAssert) { - offset = offset >>> 0; - byteLength2 = byteLength2 >>> 0; - if (!noAssert) - checkOffset(offset, byteLength2, this.length); - let val = this[offset]; - let mul = 1; - let i = 0; - while (++i < byteLength2 && (mul *= 256)) { - val += this[offset + i] * mul; - } - mul *= 128; - if (val >= mul) - val -= Math.pow(2, 8 * byteLength2); - return val; - }; - Buffer2.prototype.readIntBE = function readIntBE(offset, byteLength2, noAssert) { - offset = offset >>> 0; - byteLength2 = byteLength2 >>> 0; - if (!noAssert) - checkOffset(offset, byteLength2, this.length); - let i = byteLength2; - let mul = 1; - let val = this[offset + --i]; - while (i > 0 && (mul *= 256)) { - val += this[offset + --i] * mul; - } - mul *= 128; - if (val >= mul) - val -= Math.pow(2, 8 * byteLength2); - return val; - }; - Buffer2.prototype.readInt8 = function readInt8(offset, noAssert) { - offset = offset >>> 0; - if (!noAssert) - checkOffset(offset, 1, this.length); - if (!(this[offset] & 128)) - return this[offset]; - return (255 - this[offset] + 1) * -1; - }; - Buffer2.prototype.readInt16LE = function readInt16LE(offset, noAssert) { - offset = offset >>> 0; - if (!noAssert) - checkOffset(offset, 2, this.length); - const val = this[offset] | this[offset + 1] << 8; - return val & 32768 ? val | 4294901760 : val; - }; - Buffer2.prototype.readInt16BE = function readInt16BE(offset, noAssert) { - offset = offset >>> 0; - if (!noAssert) - checkOffset(offset, 2, this.length); - const val = this[offset + 1] | this[offset] << 8; - return val & 32768 ? val | 4294901760 : val; - }; - Buffer2.prototype.readInt32LE = function readInt32LE(offset, noAssert) { - offset = offset >>> 0; - if (!noAssert) - checkOffset(offset, 4, this.length); - return this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16 | this[offset + 3] << 24; - }; - Buffer2.prototype.readInt32BE = function readInt32BE(offset, noAssert) { - offset = offset >>> 0; - if (!noAssert) - checkOffset(offset, 4, this.length); - return this[offset] << 24 | this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3]; - }; - Buffer2.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE(offset) { - offset = offset >>> 0; - validateNumber(offset, "offset"); - const first = this[offset]; - const last = this[offset + 7]; - if (first === void 0 || last === void 0) { - boundsError(offset, this.length - 8); - } - const val = this[offset + 4] + this[offset + 5] * 2 ** 8 + this[offset + 6] * 2 ** 16 + (last << 24); - return (BigInt(val) << BigInt(32)) + BigInt(first + this[++offset] * 2 ** 8 + this[++offset] * 2 ** 16 + this[++offset] * 2 ** 24); - }); - Buffer2.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE(offset) { - offset = offset >>> 0; - validateNumber(offset, "offset"); - const first = this[offset]; - const last = this[offset + 7]; - if (first === void 0 || last === void 0) { - boundsError(offset, this.length - 8); - } - const val = (first << 24) + this[++offset] * 2 ** 16 + this[++offset] * 2 ** 8 + this[++offset]; - return (BigInt(val) << BigInt(32)) + BigInt(this[++offset] * 2 ** 24 + this[++offset] * 2 ** 16 + this[++offset] * 2 ** 8 + last); - }); - Buffer2.prototype.readFloatLE = function readFloatLE(offset, noAssert) { - offset = offset >>> 0; - if (!noAssert) - checkOffset(offset, 4, this.length); - return ieee754.read(this, offset, true, 23, 4); - }; - Buffer2.prototype.readFloatBE = function readFloatBE(offset, noAssert) { - offset = offset >>> 0; - if (!noAssert) - checkOffset(offset, 4, this.length); - return ieee754.read(this, offset, false, 23, 4); - }; - Buffer2.prototype.readDoubleLE = function readDoubleLE(offset, noAssert) { - offset = offset >>> 0; - if (!noAssert) - checkOffset(offset, 8, this.length); - return ieee754.read(this, offset, true, 52, 8); - }; - Buffer2.prototype.readDoubleBE = function readDoubleBE(offset, noAssert) { - offset = offset >>> 0; - if (!noAssert) - checkOffset(offset, 8, this.length); - return ieee754.read(this, offset, false, 52, 8); - }; - function checkInt(buf, value, offset, ext, max, min) { - if (!Buffer2.isBuffer(buf)) - throw new TypeError('"buffer" argument must be a Buffer instance'); - if (value > max || value < min) - throw new RangeError('"value" argument is out of bounds'); - if (offset + ext > buf.length) - throw new RangeError("Index out of range"); - } - Buffer2.prototype.writeUintLE = Buffer2.prototype.writeUIntLE = function writeUIntLE(value, offset, byteLength2, noAssert) { - value = +value; - offset = offset >>> 0; - byteLength2 = byteLength2 >>> 0; - if (!noAssert) { - const maxBytes = Math.pow(2, 8 * byteLength2) - 1; - checkInt(this, value, offset, byteLength2, maxBytes, 0); - } - let mul = 1; - let i = 0; - this[offset] = value & 255; - while (++i < byteLength2 && (mul *= 256)) { - this[offset + i] = value / mul & 255; - } - return offset + byteLength2; - }; - Buffer2.prototype.writeUintBE = Buffer2.prototype.writeUIntBE = function writeUIntBE(value, offset, byteLength2, noAssert) { - value = +value; - offset = offset >>> 0; - byteLength2 = byteLength2 >>> 0; - if (!noAssert) { - const maxBytes = Math.pow(2, 8 * byteLength2) - 1; - checkInt(this, value, offset, byteLength2, maxBytes, 0); - } - let i = byteLength2 - 1; - let mul = 1; - this[offset + i] = value & 255; - while (--i >= 0 && (mul *= 256)) { - this[offset + i] = value / mul & 255; - } - return offset + byteLength2; - }; - Buffer2.prototype.writeUint8 = Buffer2.prototype.writeUInt8 = function writeUInt8(value, offset, noAssert) { - value = +value; - offset = offset >>> 0; - if (!noAssert) - checkInt(this, value, offset, 1, 255, 0); - this[offset] = value & 255; - return offset + 1; - }; - Buffer2.prototype.writeUint16LE = Buffer2.prototype.writeUInt16LE = function writeUInt16LE(value, offset, noAssert) { - value = +value; - offset = offset >>> 0; - if (!noAssert) - checkInt(this, value, offset, 2, 65535, 0); - this[offset] = value & 255; - this[offset + 1] = value >>> 8; - return offset + 2; - }; - Buffer2.prototype.writeUint16BE = Buffer2.prototype.writeUInt16BE = function writeUInt16BE(value, offset, noAssert) { - value = +value; - offset = offset >>> 0; - if (!noAssert) - checkInt(this, value, offset, 2, 65535, 0); - this[offset] = value >>> 8; - this[offset + 1] = value & 255; - return offset + 2; - }; - Buffer2.prototype.writeUint32LE = Buffer2.prototype.writeUInt32LE = function writeUInt32LE(value, offset, noAssert) { - value = +value; - offset = offset >>> 0; - if (!noAssert) - checkInt(this, value, offset, 4, 4294967295, 0); - this[offset + 3] = value >>> 24; - this[offset + 2] = value >>> 16; - this[offset + 1] = value >>> 8; - this[offset] = value & 255; - return offset + 4; - }; - Buffer2.prototype.writeUint32BE = Buffer2.prototype.writeUInt32BE = function writeUInt32BE(value, offset, noAssert) { - value = +value; - offset = offset >>> 0; - if (!noAssert) - checkInt(this, value, offset, 4, 4294967295, 0); - this[offset] = value >>> 24; - this[offset + 1] = value >>> 16; - this[offset + 2] = value >>> 8; - this[offset + 3] = value & 255; - return offset + 4; - }; - function wrtBigUInt64LE(buf, value, offset, min, max) { - checkIntBI(value, min, max, buf, offset, 7); - let lo = Number(value & BigInt(4294967295)); - buf[offset++] = lo; - lo = lo >> 8; - buf[offset++] = lo; - lo = lo >> 8; - buf[offset++] = lo; - lo = lo >> 8; - buf[offset++] = lo; - let hi = Number(value >> BigInt(32) & BigInt(4294967295)); - buf[offset++] = hi; - hi = hi >> 8; - buf[offset++] = hi; - hi = hi >> 8; - buf[offset++] = hi; - hi = hi >> 8; - buf[offset++] = hi; - return offset; - } - function wrtBigUInt64BE(buf, value, offset, min, max) { - checkIntBI(value, min, max, buf, offset, 7); - let lo = Number(value & BigInt(4294967295)); - buf[offset + 7] = lo; - lo = lo >> 8; - buf[offset + 6] = lo; - lo = lo >> 8; - buf[offset + 5] = lo; - lo = lo >> 8; - buf[offset + 4] = lo; - let hi = Number(value >> BigInt(32) & BigInt(4294967295)); - buf[offset + 3] = hi; - hi = hi >> 8; - buf[offset + 2] = hi; - hi = hi >> 8; - buf[offset + 1] = hi; - hi = hi >> 8; - buf[offset] = hi; - return offset + 8; - } - Buffer2.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE(value, offset = 0) { - return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt("0xffffffffffffffff")); - }); - Buffer2.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE(value, offset = 0) { - return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt("0xffffffffffffffff")); - }); - Buffer2.prototype.writeIntLE = function writeIntLE(value, offset, byteLength2, noAssert) { - value = +value; - offset = offset >>> 0; - if (!noAssert) { - const limit = Math.pow(2, 8 * byteLength2 - 1); - checkInt(this, value, offset, byteLength2, limit - 1, -limit); - } - let i = 0; - let mul = 1; - let sub = 0; - this[offset] = value & 255; - while (++i < byteLength2 && (mul *= 256)) { - if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { - sub = 1; - } - this[offset + i] = (value / mul >> 0) - sub & 255; - } - return offset + byteLength2; - }; - Buffer2.prototype.writeIntBE = function writeIntBE(value, offset, byteLength2, noAssert) { - value = +value; - offset = offset >>> 0; - if (!noAssert) { - const limit = Math.pow(2, 8 * byteLength2 - 1); - checkInt(this, value, offset, byteLength2, limit - 1, -limit); - } - let i = byteLength2 - 1; - let mul = 1; - let sub = 0; - this[offset + i] = value & 255; - while (--i >= 0 && (mul *= 256)) { - if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { - sub = 1; - } - this[offset + i] = (value / mul >> 0) - sub & 255; - } - return offset + byteLength2; - }; - Buffer2.prototype.writeInt8 = function writeInt8(value, offset, noAssert) { - value = +value; - offset = offset >>> 0; - if (!noAssert) - checkInt(this, value, offset, 1, 127, -128); - if (value < 0) - value = 255 + value + 1; - this[offset] = value & 255; - return offset + 1; - }; - Buffer2.prototype.writeInt16LE = function writeInt16LE(value, offset, noAssert) { - value = +value; - offset = offset >>> 0; - if (!noAssert) - checkInt(this, value, offset, 2, 32767, -32768); - this[offset] = value & 255; - this[offset + 1] = value >>> 8; - return offset + 2; - }; - Buffer2.prototype.writeInt16BE = function writeInt16BE(value, offset, noAssert) { - value = +value; - offset = offset >>> 0; - if (!noAssert) - checkInt(this, value, offset, 2, 32767, -32768); - this[offset] = value >>> 8; - this[offset + 1] = value & 255; - return offset + 2; - }; - Buffer2.prototype.writeInt32LE = function writeInt32LE(value, offset, noAssert) { - value = +value; - offset = offset >>> 0; - if (!noAssert) - checkInt(this, value, offset, 4, 2147483647, -2147483648); - this[offset] = value & 255; - this[offset + 1] = value >>> 8; - this[offset + 2] = value >>> 16; - this[offset + 3] = value >>> 24; - return offset + 4; - }; - Buffer2.prototype.writeInt32BE = function writeInt32BE(value, offset, noAssert) { - value = +value; - offset = offset >>> 0; - if (!noAssert) - checkInt(this, value, offset, 4, 2147483647, -2147483648); - if (value < 0) - value = 4294967295 + value + 1; - this[offset] = value >>> 24; - this[offset + 1] = value >>> 16; - this[offset + 2] = value >>> 8; - this[offset + 3] = value & 255; - return offset + 4; + } + ArrayPrototypePush(result, val); + } + return result; + } + function flatMap(fn, options) { + const values = map.call(this, fn, options); + return async function* flatMap2() { + for await (const val of values) { + yield* val; + } + }.call(this); + } + function toIntegerOrInfinity(number) { + number = Number2(number); + if (NumberIsNaN(number)) { + return 0; + } + if (number < 0) { + throw new ERR_OUT_OF_RANGE("number", ">= 0", number); + } + return number; + } + function drop(number, options = void 0) { + if (options != null) { + validateObject(options, "options"); + } + if ( + (options === null || options === void 0 ? void 0 : options.signal) != + null + ) { + validateAbortSignal(options.signal, "options.signal"); + } + number = toIntegerOrInfinity(number); + return async function* drop2() { + var _options$signal8; + if ( + options !== null && + options !== void 0 && + (_options$signal8 = options.signal) !== null && + _options$signal8 !== void 0 && + _options$signal8.aborted + ) { + throw new AbortError(); + } + for await (const val of this) { + var _options$signal9; + if ( + options !== null && + options !== void 0 && + (_options$signal9 = options.signal) !== null && + _options$signal9 !== void 0 && + _options$signal9.aborted + ) { + throw new AbortError(); + } + if (number-- <= 0) { + yield val; + } + } + }.call(this); + } + function take(number, options = void 0) { + if (options != null) { + validateObject(options, "options"); + } + if ( + (options === null || options === void 0 ? void 0 : options.signal) != + null + ) { + validateAbortSignal(options.signal, "options.signal"); + } + number = toIntegerOrInfinity(number); + return async function* take2() { + var _options$signal10; + if ( + options !== null && + options !== void 0 && + (_options$signal10 = options.signal) !== null && + _options$signal10 !== void 0 && + _options$signal10.aborted + ) { + throw new AbortError(); + } + for await (const val of this) { + var _options$signal11; + if ( + options !== null && + options !== void 0 && + (_options$signal11 = options.signal) !== null && + _options$signal11 !== void 0 && + _options$signal11.aborted + ) { + throw new AbortError(); + } + if (number-- > 0) { + yield val; + } else { + return; + } + } + }.call(this); + } + module.exports.streamReturningOperators = { + asIndexedPairs, + drop, + filter, + flatMap, + map, + take, + }; + module.exports.promiseReturningOperators = { + every, + forEach, + reduce, + toArray, + some, + find, + }; + }, + }); + + // node_modules/readable-stream/lib/internal/streams/destroy.js + var require_destroy = __commonJS({ + "node_modules/readable-stream/lib/internal/streams/destroy.js"( + exports, + module + ) { + "use strict"; + init_process_shim(); + var { + aggregateTwoErrors, + codes: { ERR_MULTIPLE_CALLBACK }, + AbortError, + } = require_errors(); + var { Symbol: Symbol2 } = require_primordials(); + var { kDestroyed, isDestroyed, isFinished, isServerRequest } = + require_utils(); + var kDestroy = Symbol2("kDestroy"); + var kConstruct = Symbol2("kConstruct"); + function checkError(err, w, r) { + if (err) { + err.stack; + if (w && !w.errored) { + w.errored = err; + } + if (r && !r.errored) { + r.errored = err; + } + } + } + function destroy(err, cb) { + const r = this._readableState; + const w = this._writableState; + const s = w || r; + if ((w && w.destroyed) || (r && r.destroyed)) { + if (typeof cb === "function") { + cb(); + } + return this; + } + checkError(err, w, r); + if (w) { + w.destroyed = true; + } + if (r) { + r.destroyed = true; + } + if (!s.constructed) { + this.once(kDestroy, function (er) { + _destroy(this, aggregateTwoErrors(er, err), cb); + }); + } else { + _destroy(this, err, cb); + } + return this; + } + function _destroy(self2, err, cb) { + let called = false; + function onDestroy(err2) { + if (called) { + return; + } + called = true; + const r = self2._readableState; + const w = self2._writableState; + checkError(err2, w, r); + if (w) { + w.closed = true; + } + if (r) { + r.closed = true; + } + if (typeof cb === "function") { + cb(err2); + } + if (err2) { + process.nextTick(emitErrorCloseNT, self2, err2); + } else { + process.nextTick(emitCloseNT, self2); + } + } + try { + self2._destroy(err || null, onDestroy); + } catch (err2) { + onDestroy(err2); + } + } + function emitErrorCloseNT(self2, err) { + emitErrorNT(self2, err); + emitCloseNT(self2); + } + function emitCloseNT(self2) { + const r = self2._readableState; + const w = self2._writableState; + if (w) { + w.closeEmitted = true; + } + if (r) { + r.closeEmitted = true; + } + if ((w && w.emitClose) || (r && r.emitClose)) { + self2.emit("close"); + } + } + function emitErrorNT(self2, err) { + const r = self2._readableState; + const w = self2._writableState; + if ((w && w.errorEmitted) || (r && r.errorEmitted)) { + return; + } + if (w) { + w.errorEmitted = true; + } + if (r) { + r.errorEmitted = true; + } + self2.emit("error", err); + } + function undestroy() { + const r = this._readableState; + const w = this._writableState; + if (r) { + r.constructed = true; + r.closed = false; + r.closeEmitted = false; + r.destroyed = false; + r.errored = null; + r.errorEmitted = false; + r.reading = false; + r.ended = r.readable === false; + r.endEmitted = r.readable === false; + } + if (w) { + w.constructed = true; + w.destroyed = false; + w.closed = false; + w.closeEmitted = false; + w.errored = null; + w.errorEmitted = false; + w.finalCalled = false; + w.prefinished = false; + w.ended = w.writable === false; + w.ending = w.writable === false; + w.finished = w.writable === false; + } + } + function errorOrDestroy(stream, err, sync) { + const r = stream._readableState; + const w = stream._writableState; + if ((w && w.destroyed) || (r && r.destroyed)) { + return this; + } + if ((r && r.autoDestroy) || (w && w.autoDestroy)) stream.destroy(err); + else if (err) { + err.stack; + if (w && !w.errored) { + w.errored = err; + } + if (r && !r.errored) { + r.errored = err; + } + if (sync) { + process.nextTick(emitErrorNT, stream, err); + } else { + emitErrorNT(stream, err); + } + } + } + function construct(stream, cb) { + if (typeof stream._construct !== "function") { + return; + } + const r = stream._readableState; + const w = stream._writableState; + if (r) { + r.constructed = false; + } + if (w) { + w.constructed = false; + } + stream.once(kConstruct, cb); + if (stream.listenerCount(kConstruct) > 1) { + return; + } + process.nextTick(constructNT, stream); + } + function constructNT(stream) { + let called = false; + function onConstruct(err) { + if (called) { + errorOrDestroy( + stream, + err !== null && err !== void 0 ? err : new ERR_MULTIPLE_CALLBACK() + ); + return; + } + called = true; + const r = stream._readableState; + const w = stream._writableState; + const s = w || r; + if (r) { + r.constructed = true; + } + if (w) { + w.constructed = true; + } + if (s.destroyed) { + stream.emit(kDestroy, err); + } else if (err) { + errorOrDestroy(stream, err, true); + } else { + process.nextTick(emitConstructNT, stream); + } + } + try { + stream._construct(onConstruct); + } catch (err) { + onConstruct(err); + } + } + function emitConstructNT(stream) { + stream.emit(kConstruct); + } + function isRequest(stream) { + return stream && stream.setHeader && typeof stream.abort === "function"; + } + function emitCloseLegacy(stream) { + stream.emit("close"); + } + function emitErrorCloseLegacy(stream, err) { + stream.emit("error", err); + process.nextTick(emitCloseLegacy, stream); + } + function destroyer(stream, err) { + if (!stream || isDestroyed(stream)) { + return; + } + if (!err && !isFinished(stream)) { + err = new AbortError(); + } + if (isServerRequest(stream)) { + stream.socket = null; + stream.destroy(err); + } else if (isRequest(stream)) { + stream.abort(); + } else if (isRequest(stream.req)) { + stream.req.abort(); + } else if (typeof stream.destroy === "function") { + stream.destroy(err); + } else if (typeof stream.close === "function") { + stream.close(); + } else if (err) { + process.nextTick(emitErrorCloseLegacy, stream); + } else { + process.nextTick(emitCloseLegacy, stream); + } + if (!stream.destroyed) { + stream[kDestroyed] = true; + } + } + module.exports = { + construct, + destroyer, + destroy, + undestroy, + errorOrDestroy, + }; + }, + }); + + // node_modules/events/events.js + var require_events = __commonJS({ + "node_modules/events/events.js"(exports, module) { + "use strict"; + init_process_shim(); + var R = typeof Reflect === "object" ? Reflect : null; + var ReflectApply = + R && typeof R.apply === "function" + ? R.apply + : function ReflectApply2(target, receiver, args) { + return Function.prototype.apply.call(target, receiver, args); }; - Buffer2.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE(value, offset = 0) { - return wrtBigUInt64LE(this, value, offset, -BigInt("0x8000000000000000"), BigInt("0x7fffffffffffffff")); - }); - Buffer2.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE(value, offset = 0) { - return wrtBigUInt64BE(this, value, offset, -BigInt("0x8000000000000000"), BigInt("0x7fffffffffffffff")); + var ReflectOwnKeys; + if (R && typeof R.ownKeys === "function") { + ReflectOwnKeys = R.ownKeys; + } else if (Object.getOwnPropertySymbols) { + ReflectOwnKeys = function ReflectOwnKeys2(target) { + return Object.getOwnPropertyNames(target).concat( + Object.getOwnPropertySymbols(target) + ); + }; + } else { + ReflectOwnKeys = function ReflectOwnKeys2(target) { + return Object.getOwnPropertyNames(target); + }; + } + function ProcessEmitWarning(warning) { + if (console && console.warn) console.warn(warning); + } + var NumberIsNaN = + Number.isNaN || + function NumberIsNaN2(value) { + return value !== value; + }; + function EventEmitter() { + EventEmitter.init.call(this); + } + module.exports = EventEmitter; + module.exports.once = once; + EventEmitter.EventEmitter = EventEmitter; + EventEmitter.prototype._events = void 0; + EventEmitter.prototype._eventsCount = 0; + EventEmitter.prototype._maxListeners = void 0; + var defaultMaxListeners = 10; + function checkListener(listener) { + if (typeof listener !== "function") { + throw new TypeError( + 'The "listener" argument must be of type Function. Received type ' + + typeof listener + ); + } + } + Object.defineProperty(EventEmitter, "defaultMaxListeners", { + enumerable: true, + get: function () { + return defaultMaxListeners; + }, + set: function (arg) { + if (typeof arg !== "number" || arg < 0 || NumberIsNaN(arg)) { + throw new RangeError( + 'The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + + arg + + "." + ); + } + defaultMaxListeners = arg; + }, + }); + EventEmitter.init = function () { + if ( + this._events === void 0 || + this._events === Object.getPrototypeOf(this)._events + ) { + this._events = /* @__PURE__ */ Object.create(null); + this._eventsCount = 0; + } + this._maxListeners = this._maxListeners || void 0; + }; + EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== "number" || n < 0 || NumberIsNaN(n)) { + throw new RangeError( + 'The value of "n" is out of range. It must be a non-negative number. Received ' + + n + + "." + ); + } + this._maxListeners = n; + return this; + }; + function _getMaxListeners(that) { + if (that._maxListeners === void 0) + return EventEmitter.defaultMaxListeners; + return that._maxListeners; + } + EventEmitter.prototype.getMaxListeners = function getMaxListeners() { + return _getMaxListeners(this); + }; + EventEmitter.prototype.emit = function emit(type) { + var args = []; + for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); + var doError = type === "error"; + var events = this._events; + if (events !== void 0) doError = doError && events.error === void 0; + else if (!doError) return false; + if (doError) { + var er; + if (args.length > 0) er = args[0]; + if (er instanceof Error) { + throw er; + } + var err = new Error( + "Unhandled error." + (er ? " (" + er.message + ")" : "") + ); + err.context = er; + throw err; + } + var handler = events[type]; + if (handler === void 0) return false; + if (typeof handler === "function") { + ReflectApply(handler, this, args); + } else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) ReflectApply(listeners[i], this, args); + } + return true; + }; + function _addListener(target, type, listener, prepend) { + var m; + var events; + var existing; + checkListener(listener); + events = target._events; + if (events === void 0) { + events = target._events = /* @__PURE__ */ Object.create(null); + target._eventsCount = 0; + } else { + if (events.newListener !== void 0) { + target.emit( + "newListener", + type, + listener.listener ? listener.listener : listener + ); + events = target._events; + } + existing = events[type]; + } + if (existing === void 0) { + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === "function") { + existing = events[type] = prepend + ? [listener, existing] + : [existing, listener]; + } else if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + m = _getMaxListeners(target); + if (m > 0 && existing.length > m && !existing.warned) { + existing.warned = true; + var w = new Error( + "Possible EventEmitter memory leak detected. " + + existing.length + + " " + + String(type) + + " listeners added. Use emitter.setMaxListeners() to increase limit" + ); + w.name = "MaxListenersExceededWarning"; + w.emitter = target; + w.type = type; + w.count = existing.length; + ProcessEmitWarning(w); + } + } + return target; + } + EventEmitter.prototype.addListener = function addListener( + type, + listener + ) { + return _addListener(this, type, listener, false); + }; + EventEmitter.prototype.on = EventEmitter.prototype.addListener; + EventEmitter.prototype.prependListener = function prependListener( + type, + listener + ) { + return _addListener(this, type, listener, true); + }; + function onceWrapper() { + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + if (arguments.length === 0) return this.listener.call(this.target); + return this.listener.apply(this.target, arguments); + } + } + function _onceWrap(target, type, listener) { + var state = { fired: false, wrapFn: void 0, target, type, listener }; + var wrapped = onceWrapper.bind(state); + wrapped.listener = listener; + state.wrapFn = wrapped; + return wrapped; + } + EventEmitter.prototype.once = function once2(type, listener) { + checkListener(listener); + this.on(type, _onceWrap(this, type, listener)); + return this; + }; + EventEmitter.prototype.prependOnceListener = function prependOnceListener( + type, + listener + ) { + checkListener(listener); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; + }; + EventEmitter.prototype.removeListener = function removeListener( + type, + listener + ) { + var list, events, position, i, originalListener; + checkListener(listener); + events = this._events; + if (events === void 0) return this; + list = events[type]; + if (list === void 0) return this; + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) + this._events = /* @__PURE__ */ Object.create(null); + else { + delete events[type]; + if (events.removeListener) + this.emit("removeListener", type, list.listener || listener); + } + } else if (typeof list !== "function") { + position = -1; + for (i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; + } + } + if (position < 0) return this; + if (position === 0) list.shift(); + else { + spliceOne(list, position); + } + if (list.length === 1) events[type] = list[0]; + if (events.removeListener !== void 0) + this.emit("removeListener", type, originalListener || listener); + } + return this; + }; + EventEmitter.prototype.off = EventEmitter.prototype.removeListener; + EventEmitter.prototype.removeAllListeners = function removeAllListeners( + type + ) { + var listeners, events, i; + events = this._events; + if (events === void 0) return this; + if (events.removeListener === void 0) { + if (arguments.length === 0) { + this._events = /* @__PURE__ */ Object.create(null); + this._eventsCount = 0; + } else if (events[type] !== void 0) { + if (--this._eventsCount === 0) + this._events = /* @__PURE__ */ Object.create(null); + else delete events[type]; + } + return this; + } + if (arguments.length === 0) { + var keys = Object.keys(events); + var key; + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + if (key === "removeListener") continue; + this.removeAllListeners(key); + } + this.removeAllListeners("removeListener"); + this._events = /* @__PURE__ */ Object.create(null); + this._eventsCount = 0; + return this; + } + listeners = events[type]; + if (typeof listeners === "function") { + this.removeListener(type, listeners); + } else if (listeners !== void 0) { + for (i = listeners.length - 1; i >= 0; i--) { + this.removeListener(type, listeners[i]); + } + } + return this; + }; + function _listeners(target, type, unwrap) { + var events = target._events; + if (events === void 0) return []; + var evlistener = events[type]; + if (evlistener === void 0) return []; + if (typeof evlistener === "function") + return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + return unwrap + ? unwrapListeners(evlistener) + : arrayClone(evlistener, evlistener.length); + } + EventEmitter.prototype.listeners = function listeners(type) { + return _listeners(this, type, true); + }; + EventEmitter.prototype.rawListeners = function rawListeners(type) { + return _listeners(this, type, false); + }; + EventEmitter.listenerCount = function (emitter, type) { + if (typeof emitter.listenerCount === "function") { + return emitter.listenerCount(type); + } else { + return listenerCount.call(emitter, type); + } + }; + EventEmitter.prototype.listenerCount = listenerCount; + function listenerCount(type) { + var events = this._events; + if (events !== void 0) { + var evlistener = events[type]; + if (typeof evlistener === "function") { + return 1; + } else if (evlistener !== void 0) { + return evlistener.length; + } + } + return 0; + } + EventEmitter.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; + }; + function arrayClone(arr, n) { + var copy = new Array(n); + for (var i = 0; i < n; ++i) copy[i] = arr[i]; + return copy; + } + function spliceOne(list, index) { + for (; index + 1 < list.length; index++) list[index] = list[index + 1]; + list.pop(); + } + function unwrapListeners(arr) { + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + return ret; + } + function once(emitter, name) { + return new Promise(function (resolve, reject) { + function errorListener(err) { + emitter.removeListener(name, resolver); + reject(err); + } + function resolver() { + if (typeof emitter.removeListener === "function") { + emitter.removeListener("error", errorListener); + } + resolve([].slice.call(arguments)); + } + eventTargetAgnosticAddListener(emitter, name, resolver, { + once: true, + }); + if (name !== "error") { + addErrorHandlerIfEventEmitter(emitter, errorListener, { + once: true, }); - function checkIEEE754(buf, value, offset, ext, max, min) { - if (offset + ext > buf.length) - throw new RangeError("Index out of range"); - if (offset < 0) - throw new RangeError("Index out of range"); - } - function writeFloat(buf, value, offset, littleEndian, noAssert) { - value = +value; - offset = offset >>> 0; - if (!noAssert) { - checkIEEE754(buf, value, offset, 4, 34028234663852886e22, -34028234663852886e22); - } - ieee754.write(buf, value, offset, littleEndian, 23, 4); - return offset + 4; - } - Buffer2.prototype.writeFloatLE = function writeFloatLE(value, offset, noAssert) { - return writeFloat(this, value, offset, true, noAssert); - }; - Buffer2.prototype.writeFloatBE = function writeFloatBE(value, offset, noAssert) { - return writeFloat(this, value, offset, false, noAssert); - }; - function writeDouble(buf, value, offset, littleEndian, noAssert) { - value = +value; - offset = offset >>> 0; - if (!noAssert) { - checkIEEE754(buf, value, offset, 8, 17976931348623157e292, -17976931348623157e292); - } - ieee754.write(buf, value, offset, littleEndian, 52, 8); - return offset + 8; - } - Buffer2.prototype.writeDoubleLE = function writeDoubleLE(value, offset, noAssert) { - return writeDouble(this, value, offset, true, noAssert); - }; - Buffer2.prototype.writeDoubleBE = function writeDoubleBE(value, offset, noAssert) { - return writeDouble(this, value, offset, false, noAssert); - }; - Buffer2.prototype.copy = function copy(target, targetStart, start, end) { - if (!Buffer2.isBuffer(target)) - throw new TypeError("argument should be a Buffer"); - if (!start) - start = 0; - if (!end && end !== 0) - end = this.length; - if (targetStart >= target.length) - targetStart = target.length; - if (!targetStart) - targetStart = 0; - if (end > 0 && end < start) - end = start; - if (end === start) - return 0; - if (target.length === 0 || this.length === 0) - return 0; - if (targetStart < 0) { - throw new RangeError("targetStart out of bounds"); - } - if (start < 0 || start >= this.length) - throw new RangeError("Index out of range"); - if (end < 0) - throw new RangeError("sourceEnd out of bounds"); - if (end > this.length) - end = this.length; - if (target.length - targetStart < end - start) { - end = target.length - targetStart + start; - } - const len = end - start; - if (this === target && typeof Uint8Array.prototype.copyWithin === "function") { - this.copyWithin(targetStart, start, end); - } else { - Uint8Array.prototype.set.call(target, this.subarray(start, end), targetStart); - } - return len; - }; - Buffer2.prototype.fill = function fill(val, start, end, encoding) { - if (typeof val === "string") { - if (typeof start === "string") { - encoding = start; - start = 0; - end = this.length; - } else if (typeof end === "string") { - encoding = end; - end = this.length; - } - if (encoding !== void 0 && typeof encoding !== "string") { - throw new TypeError("encoding must be a string"); - } - if (typeof encoding === "string" && !Buffer2.isEncoding(encoding)) { - throw new TypeError("Unknown encoding: " + encoding); - } - if (val.length === 1) { - const code = val.charCodeAt(0); - if (encoding === "utf8" && code < 128 || encoding === "latin1") { - val = code; - } - } - } else if (typeof val === "number") { - val = val & 255; - } else if (typeof val === "boolean") { - val = Number(val); - } - if (start < 0 || this.length < start || this.length < end) { - throw new RangeError("Out of range index"); - } - if (end <= start) { - return this; - } - start = start >>> 0; - end = end === void 0 ? this.length : end >>> 0; - if (!val) - val = 0; - let i; - if (typeof val === "number") { - for (i = start; i < end; ++i) { - this[i] = val; - } + } + }); + } + function addErrorHandlerIfEventEmitter(emitter, handler, flags) { + if (typeof emitter.on === "function") { + eventTargetAgnosticAddListener(emitter, "error", handler, flags); + } + } + function eventTargetAgnosticAddListener(emitter, name, listener, flags) { + if (typeof emitter.on === "function") { + if (flags.once) { + emitter.once(name, listener); + } else { + emitter.on(name, listener); + } + } else if (typeof emitter.addEventListener === "function") { + emitter.addEventListener(name, function wrapListener(arg) { + if (flags.once) { + emitter.removeEventListener(name, wrapListener); + } + listener(arg); + }); + } else { + throw new TypeError( + 'The "emitter" argument must be of type EventEmitter. Received type ' + + typeof emitter + ); + } + } + }, + }); + + // node_modules/readable-stream/lib/internal/streams/legacy.js + var require_legacy = __commonJS({ + "node_modules/readable-stream/lib/internal/streams/legacy.js"( + exports, + module + ) { + "use strict"; + init_process_shim(); + var { ArrayIsArray, ObjectSetPrototypeOf } = require_primordials(); + var { EventEmitter: EE } = require_events(); + function Stream(opts) { + EE.call(this, opts); + } + ObjectSetPrototypeOf(Stream.prototype, EE.prototype); + ObjectSetPrototypeOf(Stream, EE); + Stream.prototype.pipe = function (dest, options) { + const source = this; + function ondata(chunk) { + if (dest.writable && dest.write(chunk) === false && source.pause) { + source.pause(); + } + } + source.on("data", ondata); + function ondrain() { + if (source.readable && source.resume) { + source.resume(); + } + } + dest.on("drain", ondrain); + if (!dest._isStdio && (!options || options.end !== false)) { + source.on("end", onend); + source.on("close", onclose); + } + let didOnEnd = false; + function onend() { + if (didOnEnd) return; + didOnEnd = true; + dest.end(); + } + function onclose() { + if (didOnEnd) return; + didOnEnd = true; + if (typeof dest.destroy === "function") dest.destroy(); + } + function onerror(er) { + cleanup(); + if (EE.listenerCount(this, "error") === 0) { + this.emit("error", er); + } + } + prependListener(source, "error", onerror); + prependListener(dest, "error", onerror); + function cleanup() { + source.removeListener("data", ondata); + dest.removeListener("drain", ondrain); + source.removeListener("end", onend); + source.removeListener("close", onclose); + source.removeListener("error", onerror); + dest.removeListener("error", onerror); + source.removeListener("end", cleanup); + source.removeListener("close", cleanup); + dest.removeListener("close", cleanup); + } + source.on("end", cleanup); + source.on("close", cleanup); + dest.on("close", cleanup); + dest.emit("pipe", source); + return dest; + }; + function prependListener(emitter, event, fn) { + if (typeof emitter.prependListener === "function") + return emitter.prependListener(event, fn); + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn); + else if (ArrayIsArray(emitter._events[event])) + emitter._events[event].unshift(fn); + else emitter._events[event] = [fn, emitter._events[event]]; + } + module.exports = { + Stream, + prependListener, + }; + }, + }); + + // node_modules/readable-stream/lib/internal/streams/add-abort-signal.js + var require_add_abort_signal = __commonJS({ + "node_modules/readable-stream/lib/internal/streams/add-abort-signal.js"( + exports, + module + ) { + "use strict"; + init_process_shim(); + var { AbortError, codes } = require_errors(); + var eos = require_end_of_stream(); + var { ERR_INVALID_ARG_TYPE } = codes; + var validateAbortSignal = (signal, name) => { + if (typeof signal !== "object" || !("aborted" in signal)) { + throw new ERR_INVALID_ARG_TYPE(name, "AbortSignal", signal); + } + }; + function isNodeStream(obj) { + return !!(obj && typeof obj.pipe === "function"); + } + module.exports.addAbortSignal = function addAbortSignal(signal, stream) { + validateAbortSignal(signal, "signal"); + if (!isNodeStream(stream)) { + throw new ERR_INVALID_ARG_TYPE("stream", "stream.Stream", stream); + } + return module.exports.addAbortSignalNoValidate(signal, stream); + }; + module.exports.addAbortSignalNoValidate = function (signal, stream) { + if (typeof signal !== "object" || !("aborted" in signal)) { + return stream; + } + const onAbort = () => { + stream.destroy( + new AbortError(void 0, { + cause: signal.reason, + }) + ); + }; + if (signal.aborted) { + onAbort(); + } else { + signal.addEventListener("abort", onAbort); + eos(stream, () => signal.removeEventListener("abort", onAbort)); + } + return stream; + }; + }, + }); + + // node_modules/readable-stream/lib/internal/streams/buffer_list.js + var require_buffer_list = __commonJS({ + "node_modules/readable-stream/lib/internal/streams/buffer_list.js"( + exports, + module + ) { + "use strict"; + init_process_shim(); + var { + StringPrototypeSlice, + SymbolIterator, + TypedArrayPrototypeSet, + Uint8Array: Uint8Array2, + } = require_primordials(); + var { inspect } = require_util(); + module.exports = class BufferList { + constructor() { + this.head = null; + this.tail = null; + this.length = 0; + } + push(v) { + const entry = { + data: v, + next: null, + }; + if (this.length > 0) this.tail.next = entry; + else this.head = entry; + this.tail = entry; + ++this.length; + } + unshift(v) { + const entry = { + data: v, + next: this.head, + }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + } + shift() { + if (this.length === 0) return; + const ret = this.head.data; + if (this.length === 1) this.head = this.tail = null; + else this.head = this.head.next; + --this.length; + return ret; + } + clear() { + this.head = this.tail = null; + this.length = 0; + } + join(s) { + if (this.length === 0) return ""; + let p = this.head; + let ret = "" + p.data; + while ((p = p.next) !== null) ret += s + p.data; + return ret; + } + concat(n) { + if (this.length === 0) return Buffer.alloc(0); + const ret = Buffer.allocUnsafe(n >>> 0); + let p = this.head; + let i = 0; + while (p) { + TypedArrayPrototypeSet(ret, p.data, i); + i += p.data.length; + p = p.next; + } + return ret; + } + consume(n, hasStrings) { + const data = this.head.data; + if (n < data.length) { + const slice = data.slice(0, n); + this.head.data = data.slice(n); + return slice; + } + if (n === data.length) { + return this.shift(); + } + return hasStrings ? this._getString(n) : this._getBuffer(n); + } + first() { + return this.head.data; + } + *[SymbolIterator]() { + for (let p = this.head; p; p = p.next) { + yield p.data; + } + } + _getString(n) { + let ret = ""; + let p = this.head; + let c = 0; + do { + const str = p.data; + if (n > str.length) { + ret += str; + n -= str.length; + } else { + if (n === str.length) { + ret += str; + ++c; + if (p.next) this.head = p.next; + else this.head = this.tail = null; + } else { + ret += StringPrototypeSlice(str, 0, n); + this.head = p; + p.data = StringPrototypeSlice(str, n); + } + break; + } + ++c; + } while ((p = p.next) !== null); + this.length -= c; + return ret; + } + _getBuffer(n) { + const ret = Buffer.allocUnsafe(n); + const retLen = n; + let p = this.head; + let c = 0; + do { + const buf = p.data; + if (n > buf.length) { + TypedArrayPrototypeSet(ret, buf, retLen - n); + n -= buf.length; + } else { + if (n === buf.length) { + TypedArrayPrototypeSet(ret, buf, retLen - n); + ++c; + if (p.next) this.head = p.next; + else this.head = this.tail = null; + } else { + TypedArrayPrototypeSet( + ret, + new Uint8Array2(buf.buffer, buf.byteOffset, n), + retLen - n + ); + this.head = p; + p.data = buf.slice(n); + } + break; + } + ++c; + } while ((p = p.next) !== null); + this.length -= c; + return ret; + } + [Symbol.for("nodejs.util.inspect.custom")](_, options) { + return inspect(this, { + ...options, + depth: 0, + customInspect: false, + }); + } + }; + }, + }); + + // node_modules/readable-stream/lib/internal/streams/state.js + var require_state = __commonJS({ + "node_modules/readable-stream/lib/internal/streams/state.js"( + exports, + module + ) { + "use strict"; + init_process_shim(); + var { MathFloor, NumberIsInteger } = require_primordials(); + var { ERR_INVALID_ARG_VALUE } = require_errors().codes; + function highWaterMarkFrom(options, isDuplex, duplexKey) { + return options.highWaterMark != null + ? options.highWaterMark + : isDuplex + ? options[duplexKey] + : null; + } + function getDefaultHighWaterMark(objectMode) { + return objectMode ? 16 : 16 * 1024; + } + function getHighWaterMark(state, options, duplexKey, isDuplex) { + const hwm = highWaterMarkFrom(options, isDuplex, duplexKey); + if (hwm != null) { + if (!NumberIsInteger(hwm) || hwm < 0) { + const name = isDuplex + ? `options.${duplexKey}` + : "options.highWaterMark"; + throw new ERR_INVALID_ARG_VALUE(name, hwm); + } + return MathFloor(hwm); + } + return getDefaultHighWaterMark(state.objectMode); + } + module.exports = { + getHighWaterMark, + getDefaultHighWaterMark, + }; + }, + }); + + // node_modules/safe-buffer/index.js + var require_safe_buffer = __commonJS({ + "node_modules/safe-buffer/index.js"(exports, module) { + init_process_shim(); + var buffer = require_buffer(); + var Buffer2 = buffer.Buffer; + function copyProps(src, dst) { + for (var key in src) { + dst[key] = src[key]; + } + } + if ( + Buffer2.from && + Buffer2.alloc && + Buffer2.allocUnsafe && + Buffer2.allocUnsafeSlow + ) { + module.exports = buffer; + } else { + copyProps(buffer, exports); + exports.Buffer = SafeBuffer; + } + function SafeBuffer(arg, encodingOrOffset, length) { + return Buffer2(arg, encodingOrOffset, length); + } + SafeBuffer.prototype = Object.create(Buffer2.prototype); + copyProps(Buffer2, SafeBuffer); + SafeBuffer.from = function (arg, encodingOrOffset, length) { + if (typeof arg === "number") { + throw new TypeError("Argument must not be a number"); + } + return Buffer2(arg, encodingOrOffset, length); + }; + SafeBuffer.alloc = function (size, fill, encoding) { + if (typeof size !== "number") { + throw new TypeError("Argument must be a number"); + } + var buf = Buffer2(size); + if (fill !== void 0) { + if (typeof encoding === "string") { + buf.fill(fill, encoding); + } else { + buf.fill(fill); + } + } else { + buf.fill(0); + } + return buf; + }; + SafeBuffer.allocUnsafe = function (size) { + if (typeof size !== "number") { + throw new TypeError("Argument must be a number"); + } + return Buffer2(size); + }; + SafeBuffer.allocUnsafeSlow = function (size) { + if (typeof size !== "number") { + throw new TypeError("Argument must be a number"); + } + return buffer.SlowBuffer(size); + }; + }, + }); + + // node_modules/string_decoder/lib/string_decoder.js + var require_string_decoder = __commonJS({ + "node_modules/string_decoder/lib/string_decoder.js"(exports) { + "use strict"; + init_process_shim(); + var Buffer2 = require_safe_buffer().Buffer; + var isEncoding = + Buffer2.isEncoding || + function (encoding) { + encoding = "" + encoding; + switch (encoding && encoding.toLowerCase()) { + case "hex": + case "utf8": + case "utf-8": + case "ascii": + case "binary": + case "base64": + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + case "raw": + return true; + default: + return false; + } + }; + function _normalizeEncoding(enc) { + if (!enc) return "utf8"; + var retried; + while (true) { + switch (enc) { + case "utf8": + case "utf-8": + return "utf8"; + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return "utf16le"; + case "latin1": + case "binary": + return "latin1"; + case "base64": + case "ascii": + case "hex": + return enc; + default: + if (retried) return; + enc = ("" + enc).toLowerCase(); + retried = true; + } + } + } + function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if ( + typeof nenc !== "string" && + (Buffer2.isEncoding === isEncoding || !isEncoding(enc)) + ) + throw new Error("Unknown encoding: " + enc); + return nenc || enc; + } + exports.StringDecoder = StringDecoder; + function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case "utf16le": + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case "utf8": + this.fillLast = utf8FillLast; + nb = 4; + break; + case "base64": + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer2.allocUnsafe(nb); + } + StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ""; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === void 0) return ""; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) + return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ""; + }; + StringDecoder.prototype.end = utf8End; + StringDecoder.prototype.text = utf8Text; + StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy( + this.lastChar, + this.lastTotal - this.lastNeed, + 0, + this.lastNeed + ); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; + }; + function utf8CheckByte(byte) { + if (byte <= 127) return 0; + else if (byte >> 5 === 6) return 2; + else if (byte >> 4 === 14) return 3; + else if (byte >> 3 === 30) return 4; + return byte >> 6 === 2 ? -1 : -2; + } + function utf8CheckIncomplete(self2, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self2.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self2.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0; + else self2.lastNeed = nb - 3; + } + return nb; + } + return 0; + } + function utf8CheckExtraBytes(self2, buf, p) { + if ((buf[0] & 192) !== 128) { + self2.lastNeed = 0; + return "\uFFFD"; + } + if (self2.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 192) !== 128) { + self2.lastNeed = 1; + return "\uFFFD"; + } + if (self2.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 192) !== 128) { + self2.lastNeed = 2; + return "\uFFFD"; + } + } + } + } + function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== void 0) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; + } + function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString("utf8", i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString("utf8", i, end); + } + function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ""; + if (this.lastNeed) return r + "\uFFFD"; + return r; + } + function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString("utf16le", i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 55296 && c <= 56319) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString("utf16le", i, buf.length - 1); + } + function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ""; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString("utf16le", 0, end); + } + return r; + } + function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString("base64", i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString("base64", i, buf.length - n); + } + function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ""; + if (this.lastNeed) + return r + this.lastChar.toString("base64", 0, 3 - this.lastNeed); + return r; + } + function simpleWrite(buf) { + return buf.toString(this.encoding); + } + function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ""; + } + }, + }); + + // node_modules/readable-stream/lib/internal/streams/from.js + var require_from = __commonJS({ + "node_modules/readable-stream/lib/internal/streams/from.js"( + exports, + module + ) { + "use strict"; + init_process_shim(); + var { PromisePrototypeThen, SymbolAsyncIterator, SymbolIterator } = + require_primordials(); + var { ERR_INVALID_ARG_TYPE, ERR_STREAM_NULL_VALUES } = + require_errors().codes; + function from(Readable, iterable, opts) { + let iterator; + if (typeof iterable === "string" || iterable instanceof Buffer) { + return new Readable({ + objectMode: true, + ...opts, + read() { + this.push(iterable); + this.push(null); + }, + }); + } + let isAsync; + if (iterable && iterable[SymbolAsyncIterator]) { + isAsync = true; + iterator = iterable[SymbolAsyncIterator](); + } else if (iterable && iterable[SymbolIterator]) { + isAsync = false; + iterator = iterable[SymbolIterator](); + } else { + throw new ERR_INVALID_ARG_TYPE("iterable", ["Iterable"], iterable); + } + const readable = new Readable({ + objectMode: true, + highWaterMark: 1, + ...opts, + }); + let reading = false; + readable._read = function () { + if (!reading) { + reading = true; + next(); + } + }; + readable._destroy = function (error, cb) { + PromisePrototypeThen( + close(error), + () => process.nextTick(cb, error), + (e) => process.nextTick(cb, e || error) + ); + }; + async function close(error) { + const hadError = error !== void 0 && error !== null; + const hasThrow = typeof iterator.throw === "function"; + if (hadError && hasThrow) { + const { value, done } = await iterator.throw(error); + await value; + if (done) { + return; + } + } + if (typeof iterator.return === "function") { + const { value } = await iterator.return(); + await value; + } + } + async function next() { + for (;;) { + try { + const { value, done } = isAsync + ? await iterator.next() + : iterator.next(); + if (done) { + readable.push(null); + } else { + const res = + value && typeof value.then === "function" + ? await value + : value; + if (res === null) { + reading = false; + throw new ERR_STREAM_NULL_VALUES(); + } else if (readable.push(res)) { + continue; } else { - const bytes = Buffer2.isBuffer(val) ? val : Buffer2.from(val, encoding); - const len = bytes.length; - if (len === 0) { - throw new TypeError('The value "' + val + '" is invalid for argument "value"'); - } - for (i = 0; i < end - start; ++i) { - this[i + start] = bytes[i % len]; - } - } - return this; - }; - var errors = {}; - function E(sym, getMessage, Base) { - errors[sym] = class NodeError extends Base { - constructor() { - super(); - Object.defineProperty(this, "message", { - value: getMessage.apply(this, arguments), - writable: true, - configurable: true - }); - this.name = `${this.name} [${sym}]`; - this.stack; - delete this.name; - } - get code() { - return sym; - } - set code(value) { - Object.defineProperty(this, "code", { - configurable: true, - enumerable: true, - value, - writable: true - }); - } - toString() { - return `${this.name} [${sym}]: ${this.message}`; - } - }; - } - E("ERR_BUFFER_OUT_OF_BOUNDS", function(name) { - if (name) { - return `${name} is outside of buffer bounds`; - } - return "Attempt to access memory outside buffer bounds"; - }, RangeError); - E("ERR_INVALID_ARG_TYPE", function(name, actual) { - return `The "${name}" argument must be of type number. Received type ${typeof actual}`; - }, TypeError); - E("ERR_OUT_OF_RANGE", function(str, range, input) { - let msg = `The value of "${str}" is out of range.`; - let received = input; - if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) { - received = addNumericalSeparator(String(input)); - } else if (typeof input === "bigint") { - received = String(input); - if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) { - received = addNumericalSeparator(received); - } - received += "n"; - } - msg += ` It must be ${range}. Received ${received}`; - return msg; - }, RangeError); - function addNumericalSeparator(val) { - let res = ""; - let i = val.length; - const start = val[0] === "-" ? 1 : 0; - for (; i >= start + 4; i -= 3) { - res = `_${val.slice(i - 3, i)}${res}`; - } - return `${val.slice(0, i)}${res}`; - } - function checkBounds(buf, offset, byteLength2) { - validateNumber(offset, "offset"); - if (buf[offset] === void 0 || buf[offset + byteLength2] === void 0) { - boundsError(offset, buf.length - (byteLength2 + 1)); - } - } - function checkIntBI(value, min, max, buf, offset, byteLength2) { - if (value > max || value < min) { - const n = typeof min === "bigint" ? "n" : ""; - let range; - if (byteLength2 > 3) { - if (min === 0 || min === BigInt(0)) { - range = `>= 0${n} and < 2${n} ** ${(byteLength2 + 1) * 8}${n}`; - } else { - range = `>= -(2${n} ** ${(byteLength2 + 1) * 8 - 1}${n}) and < 2 ** ${(byteLength2 + 1) * 8 - 1}${n}`; - } - } else { - range = `>= ${min}${n} and <= ${max}${n}`; - } - throw new errors.ERR_OUT_OF_RANGE("value", range, value); - } - checkBounds(buf, offset, byteLength2); - } - function validateNumber(value, name) { - if (typeof value !== "number") { - throw new errors.ERR_INVALID_ARG_TYPE(name, "number", value); - } - } - function boundsError(value, length, type) { - if (Math.floor(value) !== value) { - validateNumber(value, type); - throw new errors.ERR_OUT_OF_RANGE(type || "offset", "an integer", value); - } - if (length < 0) { - throw new errors.ERR_BUFFER_OUT_OF_BOUNDS(); - } - throw new errors.ERR_OUT_OF_RANGE(type || "offset", `>= ${type ? 1 : 0} and <= ${length}`, value); - } - var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g; - function base64clean(str) { - str = str.split("=")[0]; - str = str.trim().replace(INVALID_BASE64_RE, ""); - if (str.length < 2) - return ""; - while (str.length % 4 !== 0) { - str = str + "="; - } - return str; - } - function utf8ToBytes(string, units) { - units = units || Infinity; - let codePoint; - const length = string.length; - let leadSurrogate = null; - const bytes = []; - for (let i = 0; i < length; ++i) { - codePoint = string.charCodeAt(i); - if (codePoint > 55295 && codePoint < 57344) { - if (!leadSurrogate) { - if (codePoint > 56319) { - if ((units -= 3) > -1) - bytes.push(239, 191, 189); - continue; - } else if (i + 1 === length) { - if ((units -= 3) > -1) - bytes.push(239, 191, 189); - continue; - } - leadSurrogate = codePoint; - continue; - } - if (codePoint < 56320) { - if ((units -= 3) > -1) - bytes.push(239, 191, 189); - leadSurrogate = codePoint; - continue; - } - codePoint = (leadSurrogate - 55296 << 10 | codePoint - 56320) + 65536; - } else if (leadSurrogate) { - if ((units -= 3) > -1) - bytes.push(239, 191, 189); - } - leadSurrogate = null; - if (codePoint < 128) { - if ((units -= 1) < 0) - break; - bytes.push(codePoint); - } else if (codePoint < 2048) { - if ((units -= 2) < 0) - break; - bytes.push(codePoint >> 6 | 192, codePoint & 63 | 128); - } else if (codePoint < 65536) { - if ((units -= 3) < 0) - break; - bytes.push(codePoint >> 12 | 224, codePoint >> 6 & 63 | 128, codePoint & 63 | 128); - } else if (codePoint < 1114112) { - if ((units -= 4) < 0) - break; - bytes.push(codePoint >> 18 | 240, codePoint >> 12 & 63 | 128, codePoint >> 6 & 63 | 128, codePoint & 63 | 128); - } else { - throw new Error("Invalid code point"); - } - } - return bytes; - } - function asciiToBytes(str) { - const byteArray = []; - for (let i = 0; i < str.length; ++i) { - byteArray.push(str.charCodeAt(i) & 255); - } - return byteArray; - } - function utf16leToBytes(str, units) { - let c, hi, lo; - const byteArray = []; - for (let i = 0; i < str.length; ++i) { - if ((units -= 2) < 0) - break; - c = str.charCodeAt(i); - hi = c >> 8; - lo = c % 256; - byteArray.push(lo); - byteArray.push(hi); - } - return byteArray; - } - function base64ToBytes(str) { - return base64.toByteArray(base64clean(str)); - } - function blitBuffer(src, dst, offset, length) { - let i; - for (i = 0; i < length; ++i) { - if (i + offset >= dst.length || i >= src.length) - break; - dst[i + offset] = src[i]; - } - return i; - } - function isInstance(obj, type) { - return obj instanceof type || obj != null && obj.constructor != null && obj.constructor.name != null && obj.constructor.name === type.name; - } - function numberIsNaN(obj) { - return obj !== obj; - } - var hexSliceLookupTable = function() { - const alphabet = "0123456789abcdef"; - const table = new Array(256); - for (let i = 0; i < 16; ++i) { - const i16 = i * 16; - for (let j = 0; j < 16; ++j) { - table[i16 + j] = alphabet[i] + alphabet[j]; - } + reading = false; } - return table; - }(); - function defineBigIntMethod(fn) { - return typeof BigInt === "undefined" ? BufferBigIntNotDefined : fn; - } - function BufferBigIntNotDefined() { - throw new Error("BigInt not supported"); + } + } catch (err) { + readable.destroy(err); } + break; + } } - }); + return readable; + } + module.exports = from; + }, + }); - // node_modules/readable-stream/lib/ours/util.js - var require_util = __commonJS({ - "node_modules/readable-stream/lib/ours/util.js"(exports, module) { - "use strict"; - init_process_shim(); - var bufferModule = require_buffer(); - var AsyncFunction = Object.getPrototypeOf(async function() { - }).constructor; - var Blob = globalThis.Blob || bufferModule.Blob; - var isBlob = typeof Blob !== "undefined" ? function isBlob2(b) { - return b instanceof Blob; - } : function isBlob2(b) { - return false; - }; - var AggregateError = class extends Error { - constructor(errors) { - if (!Array.isArray(errors)) { - throw new TypeError(`Expected input to be an Array, got ${typeof errors}`); - } - let message = ""; - for (let i = 0; i < errors.length; i++) { - message += ` ${errors[i].stack} -`; - } - super(message); - this.name = "AggregateError"; - this.errors = errors; - } - }; - module.exports = { - AggregateError, - once(callback) { - let called = false; - return function(...args) { - if (called) { - return; - } - called = true; - callback.apply(this, args); - }; - }, - createDeferredPromise: function() { - let resolve; - let reject; - const promise = new Promise((res, rej) => { - resolve = res; - reject = rej; - }); - return { - promise, - resolve, - reject - }; - }, - promisify(fn) { - return new Promise((resolve, reject) => { - fn((err, ...args) => { - if (err) { - return reject(err); - } - return resolve(...args); - }); - }); - }, - debuglog() { - return function() { - }; - }, - format(format, ...args) { - return format.replace(/%([sdifj])/g, function(...[_unused, type]) { - const replacement = args.shift(); - if (type === "f") { - return replacement.toFixed(6); - } else if (type === "j") { - return JSON.stringify(replacement); - } else if (type === "s" && typeof replacement === "object") { - const ctor = replacement.constructor !== Object ? replacement.constructor.name : ""; - return `${ctor} {}`.trim(); - } else { - return replacement.toString(); - } - }); - }, - inspect(value) { - switch (typeof value) { - case "string": - if (value.includes("'")) { - if (!value.includes('"')) { - return `"${value}"`; - } else if (!value.includes("`") && !value.includes("${")) { - return `\`${value}\``; - } - } - return `'${value}'`; - case "number": - if (isNaN(value)) { - return "NaN"; - } else if (Object.is(value, -0)) { - return String(value); - } - return value; - case "bigint": - return `${String(value)}n`; - case "boolean": - case "undefined": - return String(value); - case "object": - return "{}"; - } - }, - types: { - isAsyncFunction(fn) { - return fn instanceof AsyncFunction; - }, - isArrayBufferView(arr) { - return ArrayBuffer.isView(arr); - } - }, - isBlob - }; - module.exports.promisify.custom = Symbol.for("nodejs.util.promisify.custom"); + // node_modules/readable-stream/lib/internal/streams/readable.js + var require_readable = __commonJS({ + "node_modules/readable-stream/lib/internal/streams/readable.js"( + exports, + module + ) { + "use strict"; + init_process_shim(); + var { + ArrayPrototypeIndexOf, + NumberIsInteger, + NumberIsNaN, + NumberParseInt, + ObjectDefineProperties, + ObjectKeys, + ObjectSetPrototypeOf, + Promise: Promise2, + SafeSet, + SymbolAsyncIterator, + Symbol: Symbol2, + } = require_primordials(); + module.exports = Readable; + Readable.ReadableState = ReadableState; + var { EventEmitter: EE } = require_events(); + var { Stream, prependListener } = require_legacy(); + var { addAbortSignal } = require_add_abort_signal(); + var eos = require_end_of_stream(); + var debug = require_util().debuglog("stream", (fn) => { + debug = fn; + }); + var BufferList = require_buffer_list(); + var destroyImpl = require_destroy(); + var { getHighWaterMark, getDefaultHighWaterMark } = require_state(); + var { + aggregateTwoErrors, + codes: { + ERR_INVALID_ARG_TYPE, + ERR_METHOD_NOT_IMPLEMENTED, + ERR_OUT_OF_RANGE, + ERR_STREAM_PUSH_AFTER_EOF, + ERR_STREAM_UNSHIFT_AFTER_END_EVENT, + }, + } = require_errors(); + var { validateObject } = require_validators(); + var kPaused = Symbol2("kPaused"); + var { StringDecoder } = require_string_decoder(); + var from = require_from(); + ObjectSetPrototypeOf(Readable.prototype, Stream.prototype); + ObjectSetPrototypeOf(Readable, Stream); + var nop = () => {}; + var { errorOrDestroy } = destroyImpl; + function ReadableState(options, stream, isDuplex) { + if (typeof isDuplex !== "boolean") + isDuplex = stream instanceof require_duplex(); + this.objectMode = !!(options && options.objectMode); + if (isDuplex) + this.objectMode = + this.objectMode || !!(options && options.readableObjectMode); + this.highWaterMark = options + ? getHighWaterMark(this, options, "readableHighWaterMark", isDuplex) + : getDefaultHighWaterMark(false); + this.buffer = new BufferList(); + this.length = 0; + this.pipes = []; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + this.constructed = true; + this.sync = true; + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + this[kPaused] = null; + this.errorEmitted = false; + this.emitClose = !options || options.emitClose !== false; + this.autoDestroy = !options || options.autoDestroy !== false; + this.destroyed = false; + this.errored = null; + this.closed = false; + this.closeEmitted = false; + this.defaultEncoding = (options && options.defaultEncoding) || "utf8"; + this.awaitDrainWriters = null; + this.multiAwaitDrain = false; + this.readingMore = false; + this.dataEmitted = false; + this.decoder = null; + this.encoding = null; + if (options && options.encoding) { + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; } - }); - - // node_modules/event-target-shim/dist/event-target-shim.js - var require_event_target_shim = __commonJS({ - "node_modules/event-target-shim/dist/event-target-shim.js"(exports, module) { - "use strict"; - init_process_shim(); - Object.defineProperty(exports, "__esModule", { value: true }); - var privateData = /* @__PURE__ */ new WeakMap(); - var wrappers = /* @__PURE__ */ new WeakMap(); - function pd(event) { - const retv = privateData.get(event); - console.assert(retv != null, "'this' is expected an Event object, but got", event); - return retv; - } - function setCancelFlag(data) { - if (data.passiveListener != null) { - if (typeof console !== "undefined" && typeof console.error === "function") { - console.error("Unable to preventDefault inside passive event listener invocation.", data.passiveListener); - } - return; - } - if (!data.event.cancelable) { - return; - } - data.canceled = true; - if (typeof data.event.preventDefault === "function") { - data.event.preventDefault(); - } - } - function Event(eventTarget, event) { - privateData.set(this, { - eventTarget, - event, - eventPhase: 2, - currentTarget: eventTarget, - canceled: false, - stopped: false, - immediateStopped: false, - passiveListener: null, - timeStamp: event.timeStamp || Date.now() - }); - Object.defineProperty(this, "isTrusted", { value: false, enumerable: true }); - const keys = Object.keys(event); - for (let i = 0; i < keys.length; ++i) { - const key = keys[i]; - if (!(key in this)) { - Object.defineProperty(this, key, defineRedirectDescriptor(key)); - } - } + } + function Readable(options) { + if (!(this instanceof Readable)) return new Readable(options); + const isDuplex = this instanceof require_duplex(); + this._readableState = new ReadableState(options, this, isDuplex); + if (options) { + if (typeof options.read === "function") this._read = options.read; + if (typeof options.destroy === "function") + this._destroy = options.destroy; + if (typeof options.construct === "function") + this._construct = options.construct; + if (options.signal && !isDuplex) addAbortSignal(options.signal, this); + } + Stream.call(this, options); + destroyImpl.construct(this, () => { + if (this._readableState.needReadable) { + maybeReadMore(this, this._readableState); + } + }); + } + Readable.prototype.destroy = destroyImpl.destroy; + Readable.prototype._undestroy = destroyImpl.undestroy; + Readable.prototype._destroy = function (err, cb) { + cb(err); + }; + Readable.prototype[EE.captureRejectionSymbol] = function (err) { + this.destroy(err); + }; + Readable.prototype.push = function (chunk, encoding) { + return readableAddChunk(this, chunk, encoding, false); + }; + Readable.prototype.unshift = function (chunk, encoding) { + return readableAddChunk(this, chunk, encoding, true); + }; + function readableAddChunk(stream, chunk, encoding, addToFront) { + debug("readableAddChunk", chunk); + const state = stream._readableState; + let err; + if (!state.objectMode) { + if (typeof chunk === "string") { + encoding = encoding || state.defaultEncoding; + if (state.encoding !== encoding) { + if (addToFront && state.encoding) { + chunk = Buffer.from(chunk, encoding).toString(state.encoding); + } else { + chunk = Buffer.from(chunk, encoding); + encoding = ""; + } + } + } else if (chunk instanceof Buffer) { + encoding = ""; + } else if (Stream._isUint8Array(chunk)) { + chunk = Stream._uint8ArrayToBuffer(chunk); + encoding = ""; + } else if (chunk != null) { + err = new ERR_INVALID_ARG_TYPE( + "chunk", + ["string", "Buffer", "Uint8Array"], + chunk + ); + } + } + if (err) { + errorOrDestroy(stream, err); + } else if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else if (state.objectMode || (chunk && chunk.length > 0)) { + if (addToFront) { + if (state.endEmitted) + errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT()); + else if (state.destroyed || state.errored) return false; + else addChunk(stream, state, chunk, true); + } else if (state.ended) { + errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF()); + } else if (state.destroyed || state.errored) { + return false; + } else { + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) + addChunk(stream, state, chunk, false); + else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); } - Event.prototype = { - get type() { - return pd(this).event.type; - }, - get target() { - return pd(this).eventTarget; - }, - get currentTarget() { - return pd(this).currentTarget; - }, - composedPath() { - const currentTarget = pd(this).currentTarget; - if (currentTarget == null) { - return []; - } - return [currentTarget]; - }, - get NONE() { - return 0; - }, - get CAPTURING_PHASE() { - return 1; - }, - get AT_TARGET() { - return 2; - }, - get BUBBLING_PHASE() { - return 3; - }, - get eventPhase() { - return pd(this).eventPhase; - }, - stopPropagation() { - const data = pd(this); - data.stopped = true; - if (typeof data.event.stopPropagation === "function") { - data.event.stopPropagation(); - } - }, - stopImmediatePropagation() { - const data = pd(this); - data.stopped = true; - data.immediateStopped = true; - if (typeof data.event.stopImmediatePropagation === "function") { - data.event.stopImmediatePropagation(); - } - }, - get bubbles() { - return Boolean(pd(this).event.bubbles); - }, - get cancelable() { - return Boolean(pd(this).event.cancelable); - }, - preventDefault() { - setCancelFlag(pd(this)); - }, - get defaultPrevented() { - return pd(this).canceled; - }, - get composed() { - return Boolean(pd(this).event.composed); - }, - get timeStamp() { - return pd(this).timeStamp; - }, - get srcElement() { - return pd(this).eventTarget; - }, - get cancelBubble() { - return pd(this).stopped; - }, - set cancelBubble(value) { - if (!value) { - return; - } - const data = pd(this); - data.stopped = true; - if (typeof data.event.cancelBubble === "boolean") { - data.event.cancelBubble = true; - } - }, - get returnValue() { - return !pd(this).canceled; - }, - set returnValue(value) { - if (!value) { - setCancelFlag(pd(this)); - } + } + } else if (!addToFront) { + state.reading = false; + maybeReadMore(stream, state); + } + return ( + !state.ended && + (state.length < state.highWaterMark || state.length === 0) + ); + } + function addChunk(stream, state, chunk, addToFront) { + if ( + state.flowing && + state.length === 0 && + !state.sync && + stream.listenerCount("data") > 0 + ) { + if (state.multiAwaitDrain) { + state.awaitDrainWriters.clear(); + } else { + state.awaitDrainWriters = null; + } + state.dataEmitted = true; + stream.emit("data", chunk); + } else { + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk); + else state.buffer.push(chunk); + if (state.needReadable) emitReadable(stream); + } + maybeReadMore(stream, state); + } + Readable.prototype.isPaused = function () { + const state = this._readableState; + return state[kPaused] === true || state.flowing === false; + }; + Readable.prototype.setEncoding = function (enc) { + const decoder = new StringDecoder(enc); + this._readableState.decoder = decoder; + this._readableState.encoding = this._readableState.decoder.encoding; + const buffer = this._readableState.buffer; + let content = ""; + for (const data of buffer) { + content += decoder.write(data); + } + buffer.clear(); + if (content !== "") buffer.push(content); + this._readableState.length = content.length; + return this; + }; + var MAX_HWM = 1073741824; + function computeNewHighWaterMark(n) { + if (n > MAX_HWM) { + throw new ERR_OUT_OF_RANGE("size", "<= 1GiB", n); + } else { + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; + } + function howMuchToRead(n, state) { + if (n <= 0 || (state.length === 0 && state.ended)) return 0; + if (state.objectMode) return 1; + if (NumberIsNaN(n)) { + if (state.flowing && state.length) return state.buffer.first().length; + return state.length; + } + if (n <= state.length) return n; + return state.ended ? state.length : 0; + } + Readable.prototype.read = function (n) { + debug("read", n); + if (n === void 0) { + n = NaN; + } else if (!NumberIsInteger(n)) { + n = NumberParseInt(n, 10); + } + const state = this._readableState; + const nOrig = n; + if (n > state.highWaterMark) + state.highWaterMark = computeNewHighWaterMark(n); + if (n !== 0) state.emittedReadable = false; + if ( + n === 0 && + state.needReadable && + ((state.highWaterMark !== 0 + ? state.length >= state.highWaterMark + : state.length > 0) || + state.ended) + ) { + debug("read: emitReadable", state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this); + else emitReadable(this); + return null; + } + n = howMuchToRead(n, state); + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + let doRead = state.needReadable; + debug("need readable", doRead); + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug("length less than watermark", doRead); + } + if ( + state.ended || + state.reading || + state.destroyed || + state.errored || + !state.constructed + ) { + doRead = false; + debug("reading, ended or constructing", doRead); + } else if (doRead) { + debug("do read"); + state.reading = true; + state.sync = true; + if (state.length === 0) state.needReadable = true; + try { + this._read(state.highWaterMark); + } catch (err) { + errorOrDestroy(this, err); + } + state.sync = false; + if (!state.reading) n = howMuchToRead(nOrig, state); + } + let ret; + if (n > 0) ret = fromList(n, state); + else ret = null; + if (ret === null) { + state.needReadable = state.length <= state.highWaterMark; + n = 0; + } else { + state.length -= n; + if (state.multiAwaitDrain) { + state.awaitDrainWriters.clear(); + } else { + state.awaitDrainWriters = null; + } + } + if (state.length === 0) { + if (!state.ended) state.needReadable = true; + if (nOrig !== n && state.ended) endReadable(this); + } + if (ret !== null && !state.errorEmitted && !state.closeEmitted) { + state.dataEmitted = true; + this.emit("data", ret); + } + return ret; + }; + function onEofChunk(stream, state) { + debug("onEofChunk"); + if (state.ended) return; + if (state.decoder) { + const chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + if (state.sync) { + emitReadable(stream); + } else { + state.needReadable = false; + state.emittedReadable = true; + emitReadable_(stream); + } + } + function emitReadable(stream) { + const state = stream._readableState; + debug("emitReadable", state.needReadable, state.emittedReadable); + state.needReadable = false; + if (!state.emittedReadable) { + debug("emitReadable", state.flowing); + state.emittedReadable = true; + process.nextTick(emitReadable_, stream); + } + } + function emitReadable_(stream) { + const state = stream._readableState; + debug("emitReadable_", state.destroyed, state.length, state.ended); + if ( + !state.destroyed && + !state.errored && + (state.length || state.ended) + ) { + stream.emit("readable"); + state.emittedReadable = false; + } + state.needReadable = + !state.flowing && !state.ended && state.length <= state.highWaterMark; + flow(stream); + } + function maybeReadMore(stream, state) { + if (!state.readingMore && state.constructed) { + state.readingMore = true; + process.nextTick(maybeReadMore_, stream, state); + } + } + function maybeReadMore_(stream, state) { + while ( + !state.reading && + !state.ended && + (state.length < state.highWaterMark || + (state.flowing && state.length === 0)) + ) { + const len = state.length; + debug("maybeReadMore read 0"); + stream.read(0); + if (len === state.length) break; + } + state.readingMore = false; + } + Readable.prototype._read = function (n) { + throw new ERR_METHOD_NOT_IMPLEMENTED("_read()"); + }; + Readable.prototype.pipe = function (dest, pipeOpts) { + const src = this; + const state = this._readableState; + if (state.pipes.length === 1) { + if (!state.multiAwaitDrain) { + state.multiAwaitDrain = true; + state.awaitDrainWriters = new SafeSet( + state.awaitDrainWriters ? [state.awaitDrainWriters] : [] + ); + } + } + state.pipes.push(dest); + debug("pipe count=%d opts=%j", state.pipes.length, pipeOpts); + const doEnd = + (!pipeOpts || pipeOpts.end !== false) && + dest !== process.stdout && + dest !== process.stderr; + const endFn = doEnd ? onend : unpipe; + if (state.endEmitted) process.nextTick(endFn); + else src.once("end", endFn); + dest.on("unpipe", onunpipe); + function onunpipe(readable, unpipeInfo) { + debug("onunpipe"); + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + function onend() { + debug("onend"); + dest.end(); + } + let ondrain; + let cleanedUp = false; + function cleanup() { + debug("cleanup"); + dest.removeListener("close", onclose); + dest.removeListener("finish", onfinish); + if (ondrain) { + dest.removeListener("drain", ondrain); + } + dest.removeListener("error", onerror); + dest.removeListener("unpipe", onunpipe); + src.removeListener("end", onend); + src.removeListener("end", unpipe); + src.removeListener("data", ondata); + cleanedUp = true; + if ( + ondrain && + state.awaitDrainWriters && + (!dest._writableState || dest._writableState.needDrain) + ) + ondrain(); + } + function pause() { + if (!cleanedUp) { + if (state.pipes.length === 1 && state.pipes[0] === dest) { + debug("false write response, pause", 0); + state.awaitDrainWriters = dest; + state.multiAwaitDrain = false; + } else if (state.pipes.length > 1 && state.pipes.includes(dest)) { + debug( + "false write response, pause", + state.awaitDrainWriters.size + ); + state.awaitDrainWriters.add(dest); + } + src.pause(); + } + if (!ondrain) { + ondrain = pipeOnDrain(src, dest); + dest.on("drain", ondrain); + } + } + src.on("data", ondata); + function ondata(chunk) { + debug("ondata"); + const ret = dest.write(chunk); + debug("dest.write", ret); + if (ret === false) { + pause(); + } + } + function onerror(er) { + debug("onerror", er); + unpipe(); + dest.removeListener("error", onerror); + if (dest.listenerCount("error") === 0) { + const s = dest._writableState || dest._readableState; + if (s && !s.errorEmitted) { + errorOrDestroy(dest, er); + } else { + dest.emit("error", er); + } + } + } + prependListener(dest, "error", onerror); + function onclose() { + dest.removeListener("finish", onfinish); + unpipe(); + } + dest.once("close", onclose); + function onfinish() { + debug("onfinish"); + dest.removeListener("close", onclose); + unpipe(); + } + dest.once("finish", onfinish); + function unpipe() { + debug("unpipe"); + src.unpipe(dest); + } + dest.emit("pipe", src); + if (dest.writableNeedDrain === true) { + if (state.flowing) { + pause(); + } + } else if (!state.flowing) { + debug("pipe resume"); + src.resume(); + } + return dest; + }; + function pipeOnDrain(src, dest) { + return function pipeOnDrainFunctionResult() { + const state = src._readableState; + if (state.awaitDrainWriters === dest) { + debug("pipeOnDrain", 1); + state.awaitDrainWriters = null; + } else if (state.multiAwaitDrain) { + debug("pipeOnDrain", state.awaitDrainWriters.size); + state.awaitDrainWriters.delete(dest); + } + if ( + (!state.awaitDrainWriters || state.awaitDrainWriters.size === 0) && + src.listenerCount("data") + ) { + src.resume(); + } + }; + } + Readable.prototype.unpipe = function (dest) { + const state = this._readableState; + const unpipeInfo = { + hasUnpiped: false, + }; + if (state.pipes.length === 0) return this; + if (!dest) { + const dests = state.pipes; + state.pipes = []; + this.pause(); + for (let i = 0; i < dests.length; i++) + dests[i].emit("unpipe", this, { + hasUnpiped: false, + }); + return this; + } + const index = ArrayPrototypeIndexOf(state.pipes, dest); + if (index === -1) return this; + state.pipes.splice(index, 1); + if (state.pipes.length === 0) this.pause(); + dest.emit("unpipe", this, unpipeInfo); + return this; + }; + Readable.prototype.on = function (ev, fn) { + const res = Stream.prototype.on.call(this, ev, fn); + const state = this._readableState; + if (ev === "data") { + state.readableListening = this.listenerCount("readable") > 0; + if (state.flowing !== false) this.resume(); + } else if (ev === "readable") { + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.flowing = false; + state.emittedReadable = false; + debug("on readable", state.length, state.reading); + if (state.length) { + emitReadable(this); + } else if (!state.reading) { + process.nextTick(nReadingNextTick, this); + } + } + } + return res; + }; + Readable.prototype.addListener = Readable.prototype.on; + Readable.prototype.removeListener = function (ev, fn) { + const res = Stream.prototype.removeListener.call(this, ev, fn); + if (ev === "readable") { + process.nextTick(updateReadableListening, this); + } + return res; + }; + Readable.prototype.off = Readable.prototype.removeListener; + Readable.prototype.removeAllListeners = function (ev) { + const res = Stream.prototype.removeAllListeners.apply(this, arguments); + if (ev === "readable" || ev === void 0) { + process.nextTick(updateReadableListening, this); + } + return res; + }; + function updateReadableListening(self2) { + const state = self2._readableState; + state.readableListening = self2.listenerCount("readable") > 0; + if (state.resumeScheduled && state[kPaused] === false) { + state.flowing = true; + } else if (self2.listenerCount("data") > 0) { + self2.resume(); + } else if (!state.readableListening) { + state.flowing = null; + } + } + function nReadingNextTick(self2) { + debug("readable nexttick read 0"); + self2.read(0); + } + Readable.prototype.resume = function () { + const state = this._readableState; + if (!state.flowing) { + debug("resume"); + state.flowing = !state.readableListening; + resume(this, state); + } + state[kPaused] = false; + return this; + }; + function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + process.nextTick(resume_, stream, state); + } + } + function resume_(stream, state) { + debug("resume", state.reading); + if (!state.reading) { + stream.read(0); + } + state.resumeScheduled = false; + stream.emit("resume"); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); + } + Readable.prototype.pause = function () { + debug("call pause flowing=%j", this._readableState.flowing); + if (this._readableState.flowing !== false) { + debug("pause"); + this._readableState.flowing = false; + this.emit("pause"); + } + this._readableState[kPaused] = true; + return this; + }; + function flow(stream) { + const state = stream._readableState; + debug("flow", state.flowing); + while (state.flowing && stream.read() !== null); + } + Readable.prototype.wrap = function (stream) { + let paused = false; + stream.on("data", (chunk) => { + if (!this.push(chunk) && stream.pause) { + paused = true; + stream.pause(); + } + }); + stream.on("end", () => { + this.push(null); + }); + stream.on("error", (err) => { + errorOrDestroy(this, err); + }); + stream.on("close", () => { + this.destroy(); + }); + stream.on("destroy", () => { + this.destroy(); + }); + this._read = () => { + if (paused && stream.resume) { + paused = false; + stream.resume(); + } + }; + const streamKeys = ObjectKeys(stream); + for (let j = 1; j < streamKeys.length; j++) { + const i = streamKeys[j]; + if (this[i] === void 0 && typeof stream[i] === "function") { + this[i] = stream[i].bind(stream); + } + } + return this; + }; + Readable.prototype[SymbolAsyncIterator] = function () { + return streamToAsyncIterator(this); + }; + Readable.prototype.iterator = function (options) { + if (options !== void 0) { + validateObject(options, "options"); + } + return streamToAsyncIterator(this, options); + }; + function streamToAsyncIterator(stream, options) { + if (typeof stream.read !== "function") { + stream = Readable.wrap(stream, { + objectMode: true, + }); + } + const iter = createAsyncIterator(stream, options); + iter.stream = stream; + return iter; + } + async function* createAsyncIterator(stream, options) { + let callback = nop; + function next(resolve) { + if (this === stream) { + callback(); + callback = nop; + } else { + callback = resolve; + } + } + stream.on("readable", next); + let error; + const cleanup = eos( + stream, + { + writable: false, + }, + (err) => { + error = err ? aggregateTwoErrors(error, err) : null; + callback(); + callback = nop; + } + ); + try { + while (true) { + const chunk = stream.destroyed ? null : stream.read(); + if (chunk !== null) { + yield chunk; + } else if (error) { + throw error; + } else if (error === null) { + return; + } else { + await new Promise2(next); + } + } + } catch (err) { + error = aggregateTwoErrors(error, err); + throw error; + } finally { + if ( + (error || + (options === null || options === void 0 + ? void 0 + : options.destroyOnReturn) !== false) && + (error === void 0 || stream._readableState.autoDestroy) + ) { + destroyImpl.destroyer(stream, null); + } else { + stream.off("readable", next); + cleanup(); + } + } + } + ObjectDefineProperties(Readable.prototype, { + readable: { + get() { + const r = this._readableState; + return ( + !!r && + r.readable !== false && + !r.destroyed && + !r.errorEmitted && + !r.endEmitted + ); + }, + set(val) { + if (this._readableState) { + this._readableState.readable = !!val; + } + }, + }, + readableDidRead: { + enumerable: false, + get: function () { + return this._readableState.dataEmitted; + }, + }, + readableAborted: { + enumerable: false, + get: function () { + return !!( + this._readableState.readable !== false && + (this._readableState.destroyed || this._readableState.errored) && + !this._readableState.endEmitted + ); + }, + }, + readableHighWaterMark: { + enumerable: false, + get: function () { + return this._readableState.highWaterMark; + }, + }, + readableBuffer: { + enumerable: false, + get: function () { + return this._readableState && this._readableState.buffer; + }, + }, + readableFlowing: { + enumerable: false, + get: function () { + return this._readableState.flowing; + }, + set: function (state) { + if (this._readableState) { + this._readableState.flowing = state; + } + }, + }, + readableLength: { + enumerable: false, + get() { + return this._readableState.length; + }, + }, + readableObjectMode: { + enumerable: false, + get() { + return this._readableState ? this._readableState.objectMode : false; + }, + }, + readableEncoding: { + enumerable: false, + get() { + return this._readableState ? this._readableState.encoding : null; + }, + }, + errored: { + enumerable: false, + get() { + return this._readableState ? this._readableState.errored : null; + }, + }, + closed: { + get() { + return this._readableState ? this._readableState.closed : false; + }, + }, + destroyed: { + enumerable: false, + get() { + return this._readableState ? this._readableState.destroyed : false; + }, + set(value) { + if (!this._readableState) { + return; + } + this._readableState.destroyed = value; + }, + }, + readableEnded: { + enumerable: false, + get() { + return this._readableState ? this._readableState.endEmitted : false; + }, + }, + }); + ObjectDefineProperties(ReadableState.prototype, { + pipesCount: { + get() { + return this.pipes.length; + }, + }, + paused: { + get() { + return this[kPaused] !== false; + }, + set(value) { + this[kPaused] = !!value; + }, + }, + }); + Readable._fromList = fromList; + function fromList(n, state) { + if (state.length === 0) return null; + let ret; + if (state.objectMode) ret = state.buffer.shift(); + else if (!n || n >= state.length) { + if (state.decoder) ret = state.buffer.join(""); + else if (state.buffer.length === 1) ret = state.buffer.first(); + else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + ret = state.buffer.consume(n, state.decoder); + } + return ret; + } + function endReadable(stream) { + const state = stream._readableState; + debug("endReadable", state.endEmitted); + if (!state.endEmitted) { + state.ended = true; + process.nextTick(endReadableNT, state, stream); + } + } + function endReadableNT(state, stream) { + debug("endReadableNT", state.endEmitted, state.length); + if ( + !state.errored && + !state.closeEmitted && + !state.endEmitted && + state.length === 0 + ) { + state.endEmitted = true; + stream.emit("end"); + if (stream.writable && stream.allowHalfOpen === false) { + process.nextTick(endWritableNT, stream); + } else if (state.autoDestroy) { + const wState = stream._writableState; + const autoDestroy = + !wState || + (wState.autoDestroy && + (wState.finished || wState.writable === false)); + if (autoDestroy) { + stream.destroy(); + } + } + } + } + function endWritableNT(stream) { + const writable = + stream.writable && !stream.writableEnded && !stream.destroyed; + if (writable) { + stream.end(); + } + } + Readable.from = function (iterable, opts) { + return from(Readable, iterable, opts); + }; + var webStreamsAdapters; + function lazyWebStreams() { + if (webStreamsAdapters === void 0) webStreamsAdapters = {}; + return webStreamsAdapters; + } + Readable.fromWeb = function (readableStream, options) { + return lazyWebStreams().newStreamReadableFromReadableStream( + readableStream, + options + ); + }; + Readable.toWeb = function (streamReadable) { + return lazyWebStreams().newReadableStreamFromStreamReadable( + streamReadable + ); + }; + Readable.wrap = function (src, options) { + var _ref, _src$readableObjectMo; + return new Readable({ + objectMode: + (_ref = + (_src$readableObjectMo = src.readableObjectMode) !== null && + _src$readableObjectMo !== void 0 + ? _src$readableObjectMo + : src.objectMode) !== null && _ref !== void 0 + ? _ref + : true, + ...options, + destroy(err, callback) { + destroyImpl.destroyer(src, err); + callback(err); + }, + }).wrap(src); + }; + }, + }); + + // node_modules/readable-stream/lib/internal/streams/writable.js + var require_writable = __commonJS({ + "node_modules/readable-stream/lib/internal/streams/writable.js"( + exports, + module + ) { + "use strict"; + init_process_shim(); + var { + ArrayPrototypeSlice, + Error: Error2, + FunctionPrototypeSymbolHasInstance, + ObjectDefineProperty, + ObjectDefineProperties, + ObjectSetPrototypeOf, + StringPrototypeToLowerCase, + Symbol: Symbol2, + SymbolHasInstance, + } = require_primordials(); + module.exports = Writable; + Writable.WritableState = WritableState; + var { EventEmitter: EE } = require_events(); + var Stream = require_legacy().Stream; + var destroyImpl = require_destroy(); + var { addAbortSignal } = require_add_abort_signal(); + var { getHighWaterMark, getDefaultHighWaterMark } = require_state(); + var { + ERR_INVALID_ARG_TYPE, + ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK, + ERR_STREAM_CANNOT_PIPE, + ERR_STREAM_DESTROYED, + ERR_STREAM_ALREADY_FINISHED, + ERR_STREAM_NULL_VALUES, + ERR_STREAM_WRITE_AFTER_END, + ERR_UNKNOWN_ENCODING, + } = require_errors().codes; + var { errorOrDestroy } = destroyImpl; + ObjectSetPrototypeOf(Writable.prototype, Stream.prototype); + ObjectSetPrototypeOf(Writable, Stream); + function nop() {} + var kOnFinished = Symbol2("kOnFinished"); + function WritableState(options, stream, isDuplex) { + if (typeof isDuplex !== "boolean") + isDuplex = stream instanceof require_duplex(); + this.objectMode = !!(options && options.objectMode); + if (isDuplex) + this.objectMode = + this.objectMode || !!(options && options.writableObjectMode); + this.highWaterMark = options + ? getHighWaterMark(this, options, "writableHighWaterMark", isDuplex) + : getDefaultHighWaterMark(false); + this.finalCalled = false; + this.needDrain = false; + this.ending = false; + this.ended = false; + this.finished = false; + this.destroyed = false; + const noDecode = !!(options && options.decodeStrings === false); + this.decodeStrings = !noDecode; + this.defaultEncoding = (options && options.defaultEncoding) || "utf8"; + this.length = 0; + this.writing = false; + this.corked = 0; + this.sync = true; + this.bufferProcessing = false; + this.onwrite = onwrite.bind(void 0, stream); + this.writecb = null; + this.writelen = 0; + this.afterWriteTickInfo = null; + resetBuffer(this); + this.pendingcb = 0; + this.constructed = true; + this.prefinished = false; + this.errorEmitted = false; + this.emitClose = !options || options.emitClose !== false; + this.autoDestroy = !options || options.autoDestroy !== false; + this.errored = null; + this.closed = false; + this.closeEmitted = false; + this[kOnFinished] = []; + } + function resetBuffer(state) { + state.buffered = []; + state.bufferedIndex = 0; + state.allBuffers = true; + state.allNoop = true; + } + WritableState.prototype.getBuffer = function getBuffer() { + return ArrayPrototypeSlice(this.buffered, this.bufferedIndex); + }; + ObjectDefineProperty(WritableState.prototype, "bufferedRequestCount", { + get() { + return this.buffered.length - this.bufferedIndex; + }, + }); + function Writable(options) { + const isDuplex = this instanceof require_duplex(); + if (!isDuplex && !FunctionPrototypeSymbolHasInstance(Writable, this)) + return new Writable(options); + this._writableState = new WritableState(options, this, isDuplex); + if (options) { + if (typeof options.write === "function") this._write = options.write; + if (typeof options.writev === "function") + this._writev = options.writev; + if (typeof options.destroy === "function") + this._destroy = options.destroy; + if (typeof options.final === "function") this._final = options.final; + if (typeof options.construct === "function") + this._construct = options.construct; + if (options.signal) addAbortSignal(options.signal, this); + } + Stream.call(this, options); + destroyImpl.construct(this, () => { + const state = this._writableState; + if (!state.writing) { + clearBuffer(this, state); + } + finishMaybe(this, state); + }); + } + ObjectDefineProperty(Writable, SymbolHasInstance, { + value: function (object) { + if (FunctionPrototypeSymbolHasInstance(this, object)) return true; + if (this !== Writable) return false; + return object && object._writableState instanceof WritableState; + }, + }); + Writable.prototype.pipe = function () { + errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE()); + }; + function _write(stream, chunk, encoding, cb) { + const state = stream._writableState; + if (typeof encoding === "function") { + cb = encoding; + encoding = state.defaultEncoding; + } else { + if (!encoding) encoding = state.defaultEncoding; + else if (encoding !== "buffer" && !Buffer.isEncoding(encoding)) + throw new ERR_UNKNOWN_ENCODING(encoding); + if (typeof cb !== "function") cb = nop; + } + if (chunk === null) { + throw new ERR_STREAM_NULL_VALUES(); + } else if (!state.objectMode) { + if (typeof chunk === "string") { + if (state.decodeStrings !== false) { + chunk = Buffer.from(chunk, encoding); + encoding = "buffer"; + } + } else if (chunk instanceof Buffer) { + encoding = "buffer"; + } else if (Stream._isUint8Array(chunk)) { + chunk = Stream._uint8ArrayToBuffer(chunk); + encoding = "buffer"; + } else { + throw new ERR_INVALID_ARG_TYPE( + "chunk", + ["string", "Buffer", "Uint8Array"], + chunk + ); + } + } + let err; + if (state.ending) { + err = new ERR_STREAM_WRITE_AFTER_END(); + } else if (state.destroyed) { + err = new ERR_STREAM_DESTROYED("write"); + } + if (err) { + process.nextTick(cb, err); + errorOrDestroy(stream, err, true); + return err; + } + state.pendingcb++; + return writeOrBuffer(stream, state, chunk, encoding, cb); + } + Writable.prototype.write = function (chunk, encoding, cb) { + return _write(this, chunk, encoding, cb) === true; + }; + Writable.prototype.cork = function () { + this._writableState.corked++; + }; + Writable.prototype.uncork = function () { + const state = this._writableState; + if (state.corked) { + state.corked--; + if (!state.writing) clearBuffer(this, state); + } + }; + Writable.prototype.setDefaultEncoding = function setDefaultEncoding( + encoding + ) { + if (typeof encoding === "string") + encoding = StringPrototypeToLowerCase(encoding); + if (!Buffer.isEncoding(encoding)) + throw new ERR_UNKNOWN_ENCODING(encoding); + this._writableState.defaultEncoding = encoding; + return this; + }; + function writeOrBuffer(stream, state, chunk, encoding, callback) { + const len = state.objectMode ? 1 : chunk.length; + state.length += len; + const ret = state.length < state.highWaterMark; + if (!ret) state.needDrain = true; + if ( + state.writing || + state.corked || + state.errored || + !state.constructed + ) { + state.buffered.push({ + chunk, + encoding, + callback, + }); + if (state.allBuffers && encoding !== "buffer") { + state.allBuffers = false; + } + if (state.allNoop && callback !== nop) { + state.allNoop = false; + } + } else { + state.writelen = len; + state.writecb = callback; + state.writing = true; + state.sync = true; + stream._write(chunk, encoding, state.onwrite); + state.sync = false; + } + return ret && !state.errored && !state.destroyed; + } + function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED("write")); + else if (writev) stream._writev(chunk, state.onwrite); + else stream._write(chunk, encoding, state.onwrite); + state.sync = false; + } + function onwriteError(stream, state, er, cb) { + --state.pendingcb; + cb(er); + errorBuffer(state); + errorOrDestroy(stream, er); + } + function onwrite(stream, er) { + const state = stream._writableState; + const sync = state.sync; + const cb = state.writecb; + if (typeof cb !== "function") { + errorOrDestroy(stream, new ERR_MULTIPLE_CALLBACK()); + return; + } + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; + if (er) { + er.stack; + if (!state.errored) { + state.errored = er; + } + if (stream._readableState && !stream._readableState.errored) { + stream._readableState.errored = er; + } + if (sync) { + process.nextTick(onwriteError, stream, state, er, cb); + } else { + onwriteError(stream, state, er, cb); + } + } else { + if (state.buffered.length > state.bufferedIndex) { + clearBuffer(stream, state); + } + if (sync) { + if ( + state.afterWriteTickInfo !== null && + state.afterWriteTickInfo.cb === cb + ) { + state.afterWriteTickInfo.count++; + } else { + state.afterWriteTickInfo = { + count: 1, + cb, + stream, + state, + }; + process.nextTick(afterWriteTick, state.afterWriteTickInfo); + } + } else { + afterWrite(stream, state, 1, cb); + } + } + } + function afterWriteTick({ stream, state, count, cb }) { + state.afterWriteTickInfo = null; + return afterWrite(stream, state, count, cb); + } + function afterWrite(stream, state, count, cb) { + const needDrain = + !state.ending && + !stream.destroyed && + state.length === 0 && + state.needDrain; + if (needDrain) { + state.needDrain = false; + stream.emit("drain"); + } + while (count-- > 0) { + state.pendingcb--; + cb(); + } + if (state.destroyed) { + errorBuffer(state); + } + finishMaybe(stream, state); + } + function errorBuffer(state) { + if (state.writing) { + return; + } + for (let n = state.bufferedIndex; n < state.buffered.length; ++n) { + var _state$errored; + const { chunk, callback } = state.buffered[n]; + const len = state.objectMode ? 1 : chunk.length; + state.length -= len; + callback( + (_state$errored = state.errored) !== null && + _state$errored !== void 0 + ? _state$errored + : new ERR_STREAM_DESTROYED("write") + ); + } + const onfinishCallbacks = state[kOnFinished].splice(0); + for (let i = 0; i < onfinishCallbacks.length; i++) { + var _state$errored2; + onfinishCallbacks[i]( + (_state$errored2 = state.errored) !== null && + _state$errored2 !== void 0 + ? _state$errored2 + : new ERR_STREAM_DESTROYED("end") + ); + } + resetBuffer(state); + } + function clearBuffer(stream, state) { + if ( + state.corked || + state.bufferProcessing || + state.destroyed || + !state.constructed + ) { + return; + } + const { buffered, bufferedIndex, objectMode } = state; + const bufferedLength = buffered.length - bufferedIndex; + if (!bufferedLength) { + return; + } + let i = bufferedIndex; + state.bufferProcessing = true; + if (bufferedLength > 1 && stream._writev) { + state.pendingcb -= bufferedLength - 1; + const callback = state.allNoop + ? nop + : (err) => { + for (let n = i; n < buffered.length; ++n) { + buffered[n].callback(err); + } + }; + const chunks = + state.allNoop && i === 0 + ? buffered + : ArrayPrototypeSlice(buffered, i); + chunks.allBuffers = state.allBuffers; + doWrite(stream, state, true, state.length, chunks, "", callback); + resetBuffer(state); + } else { + do { + const { chunk, encoding, callback } = buffered[i]; + buffered[i++] = null; + const len = objectMode ? 1 : chunk.length; + doWrite(stream, state, false, len, chunk, encoding, callback); + } while (i < buffered.length && !state.writing); + if (i === buffered.length) { + resetBuffer(state); + } else if (i > 256) { + buffered.splice(0, i); + state.bufferedIndex = 0; + } else { + state.bufferedIndex = i; + } + } + state.bufferProcessing = false; + } + Writable.prototype._write = function (chunk, encoding, cb) { + if (this._writev) { + this._writev( + [ + { + chunk, + encoding, + }, + ], + cb + ); + } else { + throw new ERR_METHOD_NOT_IMPLEMENTED("_write()"); + } + }; + Writable.prototype._writev = null; + Writable.prototype.end = function (chunk, encoding, cb) { + const state = this._writableState; + if (typeof chunk === "function") { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === "function") { + cb = encoding; + encoding = null; + } + let err; + if (chunk !== null && chunk !== void 0) { + const ret = _write(this, chunk, encoding); + if (ret instanceof Error2) { + err = ret; + } + } + if (state.corked) { + state.corked = 1; + this.uncork(); + } + if (err) { + } else if (!state.errored && !state.ending) { + state.ending = true; + finishMaybe(this, state, true); + state.ended = true; + } else if (state.finished) { + err = new ERR_STREAM_ALREADY_FINISHED("end"); + } else if (state.destroyed) { + err = new ERR_STREAM_DESTROYED("end"); + } + if (typeof cb === "function") { + if (err || state.finished) { + process.nextTick(cb, err); + } else { + state[kOnFinished].push(cb); + } + } + return this; + }; + function needFinish(state) { + return ( + state.ending && + !state.destroyed && + state.constructed && + state.length === 0 && + !state.errored && + state.buffered.length === 0 && + !state.finished && + !state.writing && + !state.errorEmitted && + !state.closeEmitted + ); + } + function callFinal(stream, state) { + let called = false; + function onFinish(err) { + if (called) { + errorOrDestroy( + stream, + err !== null && err !== void 0 ? err : ERR_MULTIPLE_CALLBACK() + ); + return; + } + called = true; + state.pendingcb--; + if (err) { + const onfinishCallbacks = state[kOnFinished].splice(0); + for (let i = 0; i < onfinishCallbacks.length; i++) { + onfinishCallbacks[i](err); + } + errorOrDestroy(stream, err, state.sync); + } else if (needFinish(state)) { + state.prefinished = true; + stream.emit("prefinish"); + state.pendingcb++; + process.nextTick(finish, stream, state); + } + } + state.sync = true; + state.pendingcb++; + try { + stream._final(onFinish); + } catch (err) { + onFinish(err); + } + state.sync = false; + } + function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === "function" && !state.destroyed) { + state.finalCalled = true; + callFinal(stream, state); + } else { + state.prefinished = true; + stream.emit("prefinish"); + } + } + } + function finishMaybe(stream, state, sync) { + if (needFinish(state)) { + prefinish(stream, state); + if (state.pendingcb === 0) { + if (sync) { + state.pendingcb++; + process.nextTick( + (stream2, state2) => { + if (needFinish(state2)) { + finish(stream2, state2); + } else { + state2.pendingcb--; + } }, - initEvent() { - } + stream, + state + ); + } else if (needFinish(state)) { + state.pendingcb++; + finish(stream, state); + } + } + } + } + function finish(stream, state) { + state.pendingcb--; + state.finished = true; + const onfinishCallbacks = state[kOnFinished].splice(0); + for (let i = 0; i < onfinishCallbacks.length; i++) { + onfinishCallbacks[i](); + } + stream.emit("finish"); + if (state.autoDestroy) { + const rState = stream._readableState; + const autoDestroy = + !rState || + (rState.autoDestroy && + (rState.endEmitted || rState.readable === false)); + if (autoDestroy) { + stream.destroy(); + } + } + } + ObjectDefineProperties(Writable.prototype, { + closed: { + get() { + return this._writableState ? this._writableState.closed : false; + }, + }, + destroyed: { + get() { + return this._writableState ? this._writableState.destroyed : false; + }, + set(value) { + if (this._writableState) { + this._writableState.destroyed = value; + } + }, + }, + writable: { + get() { + const w = this._writableState; + return ( + !!w && + w.writable !== false && + !w.destroyed && + !w.errored && + !w.ending && + !w.ended + ); + }, + set(val) { + if (this._writableState) { + this._writableState.writable = !!val; + } + }, + }, + writableFinished: { + get() { + return this._writableState ? this._writableState.finished : false; + }, + }, + writableObjectMode: { + get() { + return this._writableState ? this._writableState.objectMode : false; + }, + }, + writableBuffer: { + get() { + return this._writableState && this._writableState.getBuffer(); + }, + }, + writableEnded: { + get() { + return this._writableState ? this._writableState.ending : false; + }, + }, + writableNeedDrain: { + get() { + const wState = this._writableState; + if (!wState) return false; + return !wState.destroyed && !wState.ending && wState.needDrain; + }, + }, + writableHighWaterMark: { + get() { + return this._writableState && this._writableState.highWaterMark; + }, + }, + writableCorked: { + get() { + return this._writableState ? this._writableState.corked : 0; + }, + }, + writableLength: { + get() { + return this._writableState && this._writableState.length; + }, + }, + errored: { + enumerable: false, + get() { + return this._writableState ? this._writableState.errored : null; + }, + }, + writableAborted: { + enumerable: false, + get: function () { + return !!( + this._writableState.writable !== false && + (this._writableState.destroyed || this._writableState.errored) && + !this._writableState.finished + ); + }, + }, + }); + var destroy = destroyImpl.destroy; + Writable.prototype.destroy = function (err, cb) { + const state = this._writableState; + if ( + !state.destroyed && + (state.bufferedIndex < state.buffered.length || + state[kOnFinished].length) + ) { + process.nextTick(errorBuffer, state); + } + destroy.call(this, err, cb); + return this; + }; + Writable.prototype._undestroy = destroyImpl.undestroy; + Writable.prototype._destroy = function (err, cb) { + cb(err); + }; + Writable.prototype[EE.captureRejectionSymbol] = function (err) { + this.destroy(err); + }; + var webStreamsAdapters; + function lazyWebStreams() { + if (webStreamsAdapters === void 0) webStreamsAdapters = {}; + return webStreamsAdapters; + } + Writable.fromWeb = function (writableStream, options) { + return lazyWebStreams().newStreamWritableFromWritableStream( + writableStream, + options + ); + }; + Writable.toWeb = function (streamWritable) { + return lazyWebStreams().newWritableStreamFromStreamWritable( + streamWritable + ); + }; + }, + }); + + // node_modules/readable-stream/lib/internal/streams/duplexify.js + var require_duplexify = __commonJS({ + "node_modules/readable-stream/lib/internal/streams/duplexify.js"( + exports, + module + ) { + "use strict"; + init_process_shim(); + var abortControllerModule = require_abort_controller(); + var bufferModule = require_buffer(); + var { + isReadable, + isWritable, + isIterable, + isNodeStream, + isReadableNodeStream, + isWritableNodeStream, + isDuplexNodeStream, + } = require_utils(); + var eos = require_end_of_stream(); + var { + AbortError, + codes: { ERR_INVALID_ARG_TYPE, ERR_INVALID_RETURN_VALUE }, + } = require_errors(); + var { destroyer } = require_destroy(); + var Duplex = require_duplex(); + var Readable = require_readable(); + var { createDeferredPromise } = require_util(); + var from = require_from(); + var Blob = globalThis.Blob || bufferModule.Blob; + var isBlob = + typeof Blob !== "undefined" + ? function isBlob2(b) { + return b instanceof Blob; + } + : function isBlob2(b) { + return false; }; - Object.defineProperty(Event.prototype, "constructor", { - value: Event, - configurable: true, - writable: true + var AbortController = + globalThis.AbortController || abortControllerModule.AbortController; + var { FunctionPrototypeCall } = require_primordials(); + var Duplexify = class extends Duplex { + constructor(options) { + super(options); + if ( + (options === null || options === void 0 + ? void 0 + : options.readable) === false + ) { + this._readableState.readable = false; + this._readableState.ended = true; + this._readableState.endEmitted = true; + } + if ( + (options === null || options === void 0 + ? void 0 + : options.writable) === false + ) { + this._writableState.writable = false; + this._writableState.ending = true; + this._writableState.ended = true; + this._writableState.finished = true; + } + } + }; + module.exports = function duplexify(body, name) { + if (isDuplexNodeStream(body)) { + return body; + } + if (isReadableNodeStream(body)) { + return _duplexify({ + readable: body, + }); + } + if (isWritableNodeStream(body)) { + return _duplexify({ + writable: body, + }); + } + if (isNodeStream(body)) { + return _duplexify({ + writable: false, + readable: false, + }); + } + if (typeof body === "function") { + const { value, write, final, destroy } = fromAsyncGen(body); + if (isIterable(value)) { + return from(Duplexify, value, { + objectMode: true, + write, + final, + destroy, }); - if (typeof window !== "undefined" && typeof window.Event !== "undefined") { - Object.setPrototypeOf(Event.prototype, window.Event.prototype); - wrappers.set(window.Event.prototype, Event); - } - function defineRedirectDescriptor(key) { - return { - get() { - return pd(this).event[key]; - }, - set(value) { - pd(this).event[key] = value; - }, - configurable: true, - enumerable: true - }; - } - function defineCallDescriptor(key) { - return { - value() { - const event = pd(this).event; - return event[key].apply(event, arguments); - }, - configurable: true, - enumerable: true - }; - } - function defineWrapper(BaseEvent, proto) { - const keys = Object.keys(proto); - if (keys.length === 0) { - return BaseEvent; - } - function CustomEvent(eventTarget, event) { - BaseEvent.call(this, eventTarget, event); - } - CustomEvent.prototype = Object.create(BaseEvent.prototype, { - constructor: { value: CustomEvent, configurable: true, writable: true } + } + const then2 = + value === null || value === void 0 ? void 0 : value.then; + if (typeof then2 === "function") { + let d; + const promise = FunctionPrototypeCall( + then2, + value, + (val) => { + if (val != null) { + throw new ERR_INVALID_RETURN_VALUE("nully", "body", val); + } + }, + (err) => { + destroyer(d, err); + } + ); + return (d = new Duplexify({ + objectMode: true, + readable: false, + write, + final(cb) { + final(async () => { + try { + await promise; + process.nextTick(cb, null); + } catch (err) { + process.nextTick(cb, err); + } }); - for (let i = 0; i < keys.length; ++i) { - const key = keys[i]; - if (!(key in BaseEvent.prototype)) { - const descriptor = Object.getOwnPropertyDescriptor(proto, key); - const isFunc = typeof descriptor.value === "function"; - Object.defineProperty(CustomEvent.prototype, key, isFunc ? defineCallDescriptor(key) : defineRedirectDescriptor(key)); - } - } - return CustomEvent; - } - function getWrapper(proto) { - if (proto == null || proto === Object.prototype) { - return Event; - } - let wrapper = wrappers.get(proto); - if (wrapper == null) { - wrapper = defineWrapper(getWrapper(Object.getPrototypeOf(proto)), proto); - wrappers.set(proto, wrapper); - } - return wrapper; - } - function wrapEvent(eventTarget, event) { - const Wrapper = getWrapper(Object.getPrototypeOf(event)); - return new Wrapper(eventTarget, event); - } - function isStopped(event) { - return pd(event).immediateStopped; - } - function setEventPhase(event, eventPhase) { - pd(event).eventPhase = eventPhase; - } - function setCurrentTarget(event, currentTarget) { - pd(event).currentTarget = currentTarget; - } - function setPassiveListener(event, passiveListener) { - pd(event).passiveListener = passiveListener; - } - var listenersMap = /* @__PURE__ */ new WeakMap(); - var CAPTURE = 1; - var BUBBLE = 2; - var ATTRIBUTE = 3; - function isObject(x) { - return x !== null && typeof x === "object"; - } - function getListeners(eventTarget) { - const listeners = listenersMap.get(eventTarget); - if (listeners == null) { - throw new TypeError("'this' is expected an EventTarget object, but got another value."); - } - return listeners; - } - function defineEventAttributeDescriptor(eventName) { - return { - get() { - const listeners = getListeners(this); - let node = listeners.get(eventName); - while (node != null) { - if (node.listenerType === ATTRIBUTE) { - return node.listener; - } - node = node.next; - } - return null; - }, - set(listener) { - if (typeof listener !== "function" && !isObject(listener)) { - listener = null; - } - const listeners = getListeners(this); - let prev = null; - let node = listeners.get(eventName); - while (node != null) { - if (node.listenerType === ATTRIBUTE) { - if (prev !== null) { - prev.next = node.next; - } else if (node.next !== null) { - listeners.set(eventName, node.next); - } else { - listeners.delete(eventName); - } - } else { - prev = node; - } - node = node.next; - } - if (listener !== null) { - const newNode = { - listener, - listenerType: ATTRIBUTE, - passive: false, - once: false, - next: null - }; - if (prev === null) { - listeners.set(eventName, newNode); - } else { - prev.next = newNode; - } - } - }, - configurable: true, - enumerable: true - }; - } - function defineEventAttribute(eventTargetPrototype, eventName) { - Object.defineProperty(eventTargetPrototype, `on${eventName}`, defineEventAttributeDescriptor(eventName)); - } - function defineCustomEventTarget(eventNames) { - function CustomEventTarget() { - EventTarget.call(this); - } - CustomEventTarget.prototype = Object.create(EventTarget.prototype, { - constructor: { - value: CustomEventTarget, - configurable: true, - writable: true - } + }, + destroy, + })); + } + throw new ERR_INVALID_RETURN_VALUE( + "Iterable, AsyncIterable or AsyncFunction", + name, + value + ); + } + if (isBlob(body)) { + return duplexify(body.arrayBuffer()); + } + if (isIterable(body)) { + return from(Duplexify, body, { + objectMode: true, + writable: false, + }); + } + if ( + typeof (body === null || body === void 0 ? void 0 : body.writable) === + "object" || + typeof (body === null || body === void 0 ? void 0 : body.readable) === + "object" + ) { + const readable = + body !== null && body !== void 0 && body.readable + ? isReadableNodeStream( + body === null || body === void 0 ? void 0 : body.readable + ) + ? body === null || body === void 0 + ? void 0 + : body.readable + : duplexify(body.readable) + : void 0; + const writable = + body !== null && body !== void 0 && body.writable + ? isWritableNodeStream( + body === null || body === void 0 ? void 0 : body.writable + ) + ? body === null || body === void 0 + ? void 0 + : body.writable + : duplexify(body.writable) + : void 0; + return _duplexify({ + readable, + writable, + }); + } + const then = body === null || body === void 0 ? void 0 : body.then; + if (typeof then === "function") { + let d; + FunctionPrototypeCall( + then, + body, + (val) => { + if (val != null) { + d.push(val); + } + d.push(null); + }, + (err) => { + destroyer(d, err); + } + ); + return (d = new Duplexify({ + objectMode: true, + writable: false, + read() {}, + })); + } + throw new ERR_INVALID_ARG_TYPE( + name, + [ + "Blob", + "ReadableStream", + "WritableStream", + "Stream", + "Iterable", + "AsyncIterable", + "Function", + "{ readable, writable } pair", + "Promise", + ], + body + ); + }; + function fromAsyncGen(fn) { + let { promise, resolve } = createDeferredPromise(); + const ac = new AbortController(); + const signal = ac.signal; + const value = fn( + (async function* () { + while (true) { + const _promise = promise; + promise = null; + const { chunk, done, cb } = await _promise; + process.nextTick(cb); + if (done) return; + if (signal.aborted) + throw new AbortError(void 0, { + cause: signal.reason, }); - for (let i = 0; i < eventNames.length; ++i) { - defineEventAttribute(CustomEventTarget.prototype, eventNames[i]); - } - return CustomEventTarget; - } - function EventTarget() { - if (this instanceof EventTarget) { - listenersMap.set(this, /* @__PURE__ */ new Map()); - return; - } - if (arguments.length === 1 && Array.isArray(arguments[0])) { - return defineCustomEventTarget(arguments[0]); - } - if (arguments.length > 0) { - const types = new Array(arguments.length); - for (let i = 0; i < arguments.length; ++i) { - types[i] = arguments[i]; - } - return defineCustomEventTarget(types); - } - throw new TypeError("Cannot call a class as a function"); - } - EventTarget.prototype = { - addEventListener(eventName, listener, options) { - if (listener == null) { - return; - } - if (typeof listener !== "function" && !isObject(listener)) { - throw new TypeError("'listener' should be a function or an object."); - } - const listeners = getListeners(this); - const optionsIsObj = isObject(options); - const capture = optionsIsObj ? Boolean(options.capture) : Boolean(options); - const listenerType = capture ? CAPTURE : BUBBLE; - const newNode = { - listener, - listenerType, - passive: optionsIsObj && Boolean(options.passive), - once: optionsIsObj && Boolean(options.once), - next: null - }; - let node = listeners.get(eventName); - if (node === void 0) { - listeners.set(eventName, newNode); - return; - } - let prev = null; - while (node != null) { - if (node.listener === listener && node.listenerType === listenerType) { - return; - } - prev = node; - node = node.next; - } - prev.next = newNode; - }, - removeEventListener(eventName, listener, options) { - if (listener == null) { - return; - } - const listeners = getListeners(this); - const capture = isObject(options) ? Boolean(options.capture) : Boolean(options); - const listenerType = capture ? CAPTURE : BUBBLE; - let prev = null; - let node = listeners.get(eventName); - while (node != null) { - if (node.listener === listener && node.listenerType === listenerType) { - if (prev !== null) { - prev.next = node.next; - } else if (node.next !== null) { - listeners.set(eventName, node.next); - } else { - listeners.delete(eventName); - } - return; - } - prev = node; - node = node.next; - } - }, - dispatchEvent(event) { - if (event == null || typeof event.type !== "string") { - throw new TypeError('"event.type" should be a string.'); - } - const listeners = getListeners(this); - const eventName = event.type; - let node = listeners.get(eventName); - if (node == null) { - return true; - } - const wrappedEvent = wrapEvent(this, event); - let prev = null; - while (node != null) { - if (node.once) { - if (prev !== null) { - prev.next = node.next; - } else if (node.next !== null) { - listeners.set(eventName, node.next); - } else { - listeners.delete(eventName); - } - } else { - prev = node; - } - setPassiveListener(wrappedEvent, node.passive ? node.listener : null); - if (typeof node.listener === "function") { - try { - node.listener.call(this, wrappedEvent); - } catch (err) { - if (typeof console !== "undefined" && typeof console.error === "function") { - console.error(err); - } - } - } else if (node.listenerType !== ATTRIBUTE && typeof node.listener.handleEvent === "function") { - node.listener.handleEvent(wrappedEvent); - } - if (isStopped(wrappedEvent)) { - break; - } - node = node.next; - } - setPassiveListener(wrappedEvent, null); - setEventPhase(wrappedEvent, 0); - setCurrentTarget(wrappedEvent, null); - return !wrappedEvent.defaultPrevented; - } - }; - Object.defineProperty(EventTarget.prototype, "constructor", { - value: EventTarget, - configurable: true, - writable: true + ({ promise, resolve } = createDeferredPromise()); + yield chunk; + } + })(), + { + signal, + } + ); + return { + value, + write(chunk, encoding, cb) { + const _resolve = resolve; + resolve = null; + _resolve({ + chunk, + done: false, + cb, }); - if (typeof window !== "undefined" && typeof window.EventTarget !== "undefined") { - Object.setPrototypeOf(EventTarget.prototype, window.EventTarget.prototype); - } - exports.defineEventAttribute = defineEventAttribute; - exports.EventTarget = EventTarget; - exports.default = EventTarget; - module.exports = EventTarget; - module.exports.EventTarget = module.exports["default"] = EventTarget; - module.exports.defineEventAttribute = defineEventAttribute; + }, + final(cb) { + const _resolve = resolve; + resolve = null; + _resolve({ + done: true, + cb, + }); + }, + destroy(err, cb) { + ac.abort(); + cb(err); + }, + }; + } + function _duplexify(pair) { + const r = + pair.readable && typeof pair.readable.read !== "function" + ? Readable.wrap(pair.readable) + : pair.readable; + const w = pair.writable; + let readable = !!isReadable(r); + let writable = !!isWritable(w); + let ondrain; + let onfinish; + let onreadable; + let onclose; + let d; + function onfinished(err) { + const cb = onclose; + onclose = null; + if (cb) { + cb(err); + } else if (err) { + d.destroy(err); + } else if (!readable && !writable) { + d.destroy(); + } } - }); + d = new Duplexify({ + readableObjectMode: !!( + r !== null && + r !== void 0 && + r.readableObjectMode + ), + writableObjectMode: !!( + w !== null && + w !== void 0 && + w.writableObjectMode + ), + readable, + writable, + }); + if (writable) { + eos(w, (err) => { + writable = false; + if (err) { + destroyer(r, err); + } + onfinished(err); + }); + d._write = function (chunk, encoding, callback) { + if (w.write(chunk, encoding)) { + callback(); + } else { + ondrain = callback; + } + }; + d._final = function (callback) { + w.end(); + onfinish = callback; + }; + w.on("drain", function () { + if (ondrain) { + const cb = ondrain; + ondrain = null; + cb(); + } + }); + w.on("finish", function () { + if (onfinish) { + const cb = onfinish; + onfinish = null; + cb(); + } + }); + } + if (readable) { + eos(r, (err) => { + readable = false; + if (err) { + destroyer(r, err); + } + onfinished(err); + }); + r.on("readable", function () { + if (onreadable) { + const cb = onreadable; + onreadable = null; + cb(); + } + }); + r.on("end", function () { + d.push(null); + }); + d._read = function () { + while (true) { + const buf = r.read(); + if (buf === null) { + onreadable = d._read; + return; + } + if (!d.push(buf)) { + return; + } + } + }; + } + d._destroy = function (err, callback) { + if (!err && onclose !== null) { + err = new AbortError(); + } + onreadable = null; + ondrain = null; + onfinish = null; + if (onclose === null) { + callback(err); + } else { + onclose = callback; + destroyer(w, err); + destroyer(r, err); + } + }; + return d; + } + }, + }); - // node_modules/abort-controller/dist/abort-controller.js - var require_abort_controller = __commonJS({ - "node_modules/abort-controller/dist/abort-controller.js"(exports, module) { - "use strict"; - init_process_shim(); - Object.defineProperty(exports, "__esModule", { value: true }); - var eventTargetShim = require_event_target_shim(); - var AbortSignal = class extends eventTargetShim.EventTarget { - constructor() { - super(); - throw new TypeError("AbortSignal cannot be constructed directly"); - } - get aborted() { - const aborted = abortedFlags.get(this); - if (typeof aborted !== "boolean") { - throw new TypeError(`Expected 'this' to be an 'AbortSignal' object, but got ${this === null ? "null" : typeof this}`); - } - return aborted; - } - }; - eventTargetShim.defineEventAttribute(AbortSignal.prototype, "abort"); - function createAbortSignal() { - const signal = Object.create(AbortSignal.prototype); - eventTargetShim.EventTarget.call(signal); - abortedFlags.set(signal, false); - return signal; - } - function abortSignal(signal) { - if (abortedFlags.get(signal) !== false) { - return; - } - abortedFlags.set(signal, true); - signal.dispatchEvent({ type: "abort" }); + // node_modules/readable-stream/lib/internal/streams/duplex.js + var require_duplex = __commonJS({ + "node_modules/readable-stream/lib/internal/streams/duplex.js"( + exports, + module + ) { + "use strict"; + init_process_shim(); + var { + ObjectDefineProperties, + ObjectGetOwnPropertyDescriptor, + ObjectKeys, + ObjectSetPrototypeOf, + } = require_primordials(); + module.exports = Duplex; + var Readable = require_readable(); + var Writable = require_writable(); + ObjectSetPrototypeOf(Duplex.prototype, Readable.prototype); + ObjectSetPrototypeOf(Duplex, Readable); + { + const keys = ObjectKeys(Writable.prototype); + for (let i = 0; i < keys.length; i++) { + const method = keys[i]; + if (!Duplex.prototype[method]) + Duplex.prototype[method] = Writable.prototype[method]; + } + } + function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + Readable.call(this, options); + Writable.call(this, options); + if (options) { + this.allowHalfOpen = options.allowHalfOpen !== false; + if (options.readable === false) { + this._readableState.readable = false; + this._readableState.ended = true; + this._readableState.endEmitted = true; + } + if (options.writable === false) { + this._writableState.writable = false; + this._writableState.ending = true; + this._writableState.ended = true; + this._writableState.finished = true; + } + } else { + this.allowHalfOpen = true; + } + } + ObjectDefineProperties(Duplex.prototype, { + writable: ObjectGetOwnPropertyDescriptor( + Writable.prototype, + "writable" + ), + writableHighWaterMark: ObjectGetOwnPropertyDescriptor( + Writable.prototype, + "writableHighWaterMark" + ), + writableObjectMode: ObjectGetOwnPropertyDescriptor( + Writable.prototype, + "writableObjectMode" + ), + writableBuffer: ObjectGetOwnPropertyDescriptor( + Writable.prototype, + "writableBuffer" + ), + writableLength: ObjectGetOwnPropertyDescriptor( + Writable.prototype, + "writableLength" + ), + writableFinished: ObjectGetOwnPropertyDescriptor( + Writable.prototype, + "writableFinished" + ), + writableCorked: ObjectGetOwnPropertyDescriptor( + Writable.prototype, + "writableCorked" + ), + writableEnded: ObjectGetOwnPropertyDescriptor( + Writable.prototype, + "writableEnded" + ), + writableNeedDrain: ObjectGetOwnPropertyDescriptor( + Writable.prototype, + "writableNeedDrain" + ), + destroyed: { + get() { + if ( + this._readableState === void 0 || + this._writableState === void 0 + ) { + return false; + } + return ( + this._readableState.destroyed && this._writableState.destroyed + ); + }, + set(value) { + if (this._readableState && this._writableState) { + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } + }, + }, + }); + var webStreamsAdapters; + function lazyWebStreams() { + if (webStreamsAdapters === void 0) webStreamsAdapters = {}; + return webStreamsAdapters; + } + Duplex.fromWeb = function (pair, options) { + return lazyWebStreams().newStreamDuplexFromReadableWritablePair( + pair, + options + ); + }; + Duplex.toWeb = function (duplex) { + return lazyWebStreams().newReadableWritablePairFromDuplex(duplex); + }; + var duplexify; + Duplex.from = function (body) { + if (!duplexify) { + duplexify = require_duplexify(); + } + return duplexify(body, "body"); + }; + }, + }); + + // node_modules/readable-stream/lib/internal/streams/transform.js + var require_transform = __commonJS({ + "node_modules/readable-stream/lib/internal/streams/transform.js"( + exports, + module + ) { + "use strict"; + init_process_shim(); + var { ObjectSetPrototypeOf, Symbol: Symbol2 } = require_primordials(); + module.exports = Transform; + var { ERR_METHOD_NOT_IMPLEMENTED } = require_errors().codes; + var Duplex = require_duplex(); + ObjectSetPrototypeOf(Transform.prototype, Duplex.prototype); + ObjectSetPrototypeOf(Transform, Duplex); + var kCallback = Symbol2("kCallback"); + function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + Duplex.call(this, options); + this._readableState.sync = false; + this[kCallback] = null; + if (options) { + if (typeof options.transform === "function") + this._transform = options.transform; + if (typeof options.flush === "function") this._flush = options.flush; + } + this.on("prefinish", prefinish); + } + function final(cb) { + if (typeof this._flush === "function" && !this.destroyed) { + this._flush((er, data) => { + if (er) { + if (cb) { + cb(er); + } else { + this.destroy(er); + } + return; } - var abortedFlags = /* @__PURE__ */ new WeakMap(); - Object.defineProperties(AbortSignal.prototype, { - aborted: { enumerable: true } - }); - if (typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol") { - Object.defineProperty(AbortSignal.prototype, Symbol.toStringTag, { - configurable: true, - value: "AbortSignal" - }); + if (data != null) { + this.push(data); } - var AbortController = class { - constructor() { - signals.set(this, createAbortSignal()); - } - get signal() { - return getSignal(this); - } - abort() { - abortSignal(getSignal(this)); - } - }; - var signals = /* @__PURE__ */ new WeakMap(); - function getSignal(controller) { - const signal = signals.get(controller); - if (signal == null) { - throw new TypeError(`Expected 'this' to be an 'AbortController' object, but got ${controller === null ? "null" : typeof controller}`); - } - return signal; + this.push(null); + if (cb) { + cb(); } - Object.defineProperties(AbortController.prototype, { - signal: { enumerable: true }, - abort: { enumerable: true } + }); + } else { + this.push(null); + if (cb) { + cb(); + } + } + } + function prefinish() { + if (this._final !== final) { + final.call(this); + } + } + Transform.prototype._final = final; + Transform.prototype._transform = function (chunk, encoding, callback) { + throw new ERR_METHOD_NOT_IMPLEMENTED("_transform()"); + }; + Transform.prototype._write = function (chunk, encoding, callback) { + const rState = this._readableState; + const wState = this._writableState; + const length = rState.length; + this._transform(chunk, encoding, (err, val) => { + if (err) { + callback(err); + return; + } + if (val != null) { + this.push(val); + } + if ( + wState.ended || + length === rState.length || + rState.length < rState.highWaterMark || + rState.highWaterMark === 0 || + rState.length === 0 + ) { + callback(); + } else { + this[kCallback] = callback; + } + }); + }; + Transform.prototype._read = function () { + if (this[kCallback]) { + const callback = this[kCallback]; + this[kCallback] = null; + callback(); + } + }; + }, + }); + + // node_modules/readable-stream/lib/internal/streams/passthrough.js + var require_passthrough = __commonJS({ + "node_modules/readable-stream/lib/internal/streams/passthrough.js"( + exports, + module + ) { + "use strict"; + init_process_shim(); + var { ObjectSetPrototypeOf } = require_primordials(); + module.exports = PassThrough; + var Transform = require_transform(); + ObjectSetPrototypeOf(PassThrough.prototype, Transform.prototype); + ObjectSetPrototypeOf(PassThrough, Transform); + function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + Transform.call(this, options); + } + PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); + }; + }, + }); + + // node_modules/readable-stream/lib/internal/streams/pipeline.js + var require_pipeline = __commonJS({ + "node_modules/readable-stream/lib/internal/streams/pipeline.js"( + exports, + module + ) { + "use strict"; + init_process_shim(); + var abortControllerModule = require_abort_controller(); + var { + ArrayIsArray, + Promise: Promise2, + SymbolAsyncIterator, + } = require_primordials(); + var eos = require_end_of_stream(); + var { once } = require_util(); + var destroyImpl = require_destroy(); + var Duplex = require_duplex(); + var { + aggregateTwoErrors, + codes: { + ERR_INVALID_ARG_TYPE, + ERR_INVALID_RETURN_VALUE, + ERR_MISSING_ARGS, + ERR_STREAM_DESTROYED, + }, + AbortError, + } = require_errors(); + var { validateFunction, validateAbortSignal } = require_validators(); + var { isIterable, isReadable, isReadableNodeStream, isNodeStream } = + require_utils(); + var AbortController = + globalThis.AbortController || abortControllerModule.AbortController; + var PassThrough; + var Readable; + function destroyer(stream, reading, writing) { + let finished = false; + stream.on("close", () => { + finished = true; + }); + const cleanup = eos( + stream, + { + readable: reading, + writable: writing, + }, + (err) => { + finished = !err; + } + ); + return { + destroy: (err) => { + if (finished) return; + finished = true; + destroyImpl.destroyer( + stream, + err || new ERR_STREAM_DESTROYED("pipe") + ); + }, + cleanup, + }; + } + function popCallback(streams) { + validateFunction( + streams[streams.length - 1], + "streams[stream.length - 1]" + ); + return streams.pop(); + } + function makeAsyncIterable(val) { + if (isIterable(val)) { + return val; + } else if (isReadableNodeStream(val)) { + return fromReadable(val); + } + throw new ERR_INVALID_ARG_TYPE( + "val", + ["Readable", "Iterable", "AsyncIterable"], + val + ); + } + async function* fromReadable(val) { + if (!Readable) { + Readable = require_readable(); + } + yield* Readable.prototype[SymbolAsyncIterator].call(val); + } + async function pump(iterable, writable, finish, { end }) { + let error; + let onresolve = null; + const resume = (err) => { + if (err) { + error = err; + } + if (onresolve) { + const callback = onresolve; + onresolve = null; + callback(); + } + }; + const wait = () => + new Promise2((resolve, reject) => { + if (error) { + reject(error); + } else { + onresolve = () => { + if (error) { + reject(error); + } else { + resolve(); + } + }; + } + }); + writable.on("drain", resume); + const cleanup = eos( + writable, + { + readable: false, + }, + resume + ); + try { + if (writable.writableNeedDrain) { + await wait(); + } + for await (const chunk of iterable) { + if (!writable.write(chunk)) { + await wait(); + } + } + if (end) { + writable.end(); + } + await wait(); + finish(); + } catch (err) { + finish(error !== err ? aggregateTwoErrors(error, err) : err); + } finally { + cleanup(); + writable.off("drain", resume); + } + } + function pipeline(...streams) { + return pipelineImpl(streams, once(popCallback(streams))); + } + function pipelineImpl(streams, callback, opts) { + if (streams.length === 1 && ArrayIsArray(streams[0])) { + streams = streams[0]; + } + if (streams.length < 2) { + throw new ERR_MISSING_ARGS("streams"); + } + const ac = new AbortController(); + const signal = ac.signal; + const outerSignal = + opts === null || opts === void 0 ? void 0 : opts.signal; + const lastStreamCleanup = []; + validateAbortSignal(outerSignal, "options.signal"); + function abort() { + finishImpl(new AbortError()); + } + outerSignal === null || outerSignal === void 0 + ? void 0 + : outerSignal.addEventListener("abort", abort); + let error; + let value; + const destroys = []; + let finishCount = 0; + function finish(err) { + finishImpl(err, --finishCount === 0); + } + function finishImpl(err, final) { + if (err && (!error || error.code === "ERR_STREAM_PREMATURE_CLOSE")) { + error = err; + } + if (!error && !final) { + return; + } + while (destroys.length) { + destroys.shift()(error); + } + outerSignal === null || outerSignal === void 0 + ? void 0 + : outerSignal.removeEventListener("abort", abort); + ac.abort(); + if (final) { + if (!error) { + lastStreamCleanup.forEach((fn) => fn()); + } + process.nextTick(callback, error, value); + } + } + let ret; + for (let i = 0; i < streams.length; i++) { + const stream = streams[i]; + const reading = i < streams.length - 1; + const writing = i > 0; + const end = + reading || + (opts === null || opts === void 0 ? void 0 : opts.end) !== false; + const isLastStream = i === streams.length - 1; + if (isNodeStream(stream)) { + let onError = function (err) { + if ( + err && + err.name !== "AbortError" && + err.code !== "ERR_STREAM_PREMATURE_CLOSE" + ) { + finish(err); + } + }; + if (end) { + const { destroy, cleanup } = destroyer(stream, reading, writing); + destroys.push(destroy); + if (isReadable(stream) && isLastStream) { + lastStreamCleanup.push(cleanup); + } + } + stream.on("error", onError); + if (isReadable(stream) && isLastStream) { + lastStreamCleanup.push(() => { + stream.removeListener("error", onError); + }); + } + } + if (i === 0) { + if (typeof stream === "function") { + ret = stream({ + signal, + }); + if (!isIterable(ret)) { + throw new ERR_INVALID_RETURN_VALUE( + "Iterable, AsyncIterable or Stream", + "source", + ret + ); + } + } else if (isIterable(stream) || isReadableNodeStream(stream)) { + ret = stream; + } else { + ret = Duplex.from(stream); + } + } else if (typeof stream === "function") { + ret = makeAsyncIterable(ret); + ret = stream(ret, { + signal, }); - if (typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol") { - Object.defineProperty(AbortController.prototype, Symbol.toStringTag, { - configurable: true, - value: "AbortController" + if (reading) { + if (!isIterable(ret, true)) { + throw new ERR_INVALID_RETURN_VALUE( + "AsyncIterable", + `transform[${i - 1}]`, + ret + ); + } + } else { + var _ret; + if (!PassThrough) { + PassThrough = require_passthrough(); + } + const pt = new PassThrough({ + objectMode: true, + }); + const then = + (_ret = ret) === null || _ret === void 0 ? void 0 : _ret.then; + if (typeof then === "function") { + finishCount++; + then.call( + ret, + (val) => { + value = val; + if (val != null) { + pt.write(val); + } + if (end) { + pt.end(); + } + process.nextTick(finish); + }, + (err) => { + pt.destroy(err); + process.nextTick(finish, err); + } + ); + } else if (isIterable(ret, true)) { + finishCount++; + pump(ret, pt, finish, { + end, }); - } - exports.AbortController = AbortController; - exports.AbortSignal = AbortSignal; - exports.default = AbortController; - module.exports = AbortController; - module.exports.AbortController = module.exports["default"] = AbortController; - module.exports.AbortSignal = AbortSignal; + } else { + throw new ERR_INVALID_RETURN_VALUE( + "AsyncIterable or Promise", + "destination", + ret + ); + } + ret = pt; + const { destroy, cleanup } = destroyer(ret, false, true); + destroys.push(destroy); + if (isLastStream) { + lastStreamCleanup.push(cleanup); + } + } + } else if (isNodeStream(stream)) { + if (isReadableNodeStream(ret)) { + finishCount += 2; + const cleanup = pipe(ret, stream, finish, { + end, + }); + if (isReadable(stream) && isLastStream) { + lastStreamCleanup.push(cleanup); + } + } else if (isIterable(ret)) { + finishCount++; + pump(ret, stream, finish, { + end, + }); + } else { + throw new ERR_INVALID_ARG_TYPE( + "val", + ["Readable", "Iterable", "AsyncIterable"], + ret + ); + } + ret = stream; + } else { + ret = Duplex.from(stream); + } } - }); + if ( + (signal !== null && signal !== void 0 && signal.aborted) || + (outerSignal !== null && + outerSignal !== void 0 && + outerSignal.aborted) + ) { + process.nextTick(abort); + } + return ret; + } + function pipe(src, dst, finish, { end }) { + src.pipe(dst, { + end, + }); + if (end) { + src.once("end", () => dst.end()); + } else { + finish(); + } + eos( + src, + { + readable: true, + writable: false, + }, + (err) => { + const rState = src._readableState; + if ( + err && + err.code === "ERR_STREAM_PREMATURE_CLOSE" && + rState && + rState.ended && + !rState.errored && + !rState.errorEmitted + ) { + src.once("end", finish).once("error", finish); + } else { + finish(err); + } + } + ); + return eos( + dst, + { + readable: false, + writable: true, + }, + finish + ); + } + module.exports = { + pipelineImpl, + pipeline, + }; + }, + }); - // node_modules/readable-stream/lib/ours/errors.js - var require_errors = __commonJS({ - "node_modules/readable-stream/lib/ours/errors.js"(exports, module) { - "use strict"; - init_process_shim(); - var { format, inspect, AggregateError: CustomAggregateError } = require_util(); - var AggregateError = globalThis.AggregateError || CustomAggregateError; - var kIsNodeError = Symbol("kIsNodeError"); - var kTypes = [ - "string", - "function", - "number", - "object", - "Function", - "Object", - "boolean", - "bigint", - "symbol" - ]; - var classRegExp = /^([A-Z][a-z0-9]*)+$/; - var nodeInternalPrefix = "__node_internal_"; - var codes = {}; - function assert(value, message) { - if (!value) { - throw new codes.ERR_INTERNAL_ASSERTION(message); - } - } - function addNumericalSeparator(val) { - let res = ""; - let i = val.length; - const start = val[0] === "-" ? 1 : 0; - for (; i >= start + 4; i -= 3) { - res = `_${val.slice(i - 3, i)}${res}`; - } - return `${val.slice(0, i)}${res}`; - } - function getMessage(key, msg, args) { - if (typeof msg === "function") { - assert(msg.length <= args.length, `Code: ${key}; The provided arguments length (${args.length}) does not match the required ones (${msg.length}).`); - return msg(...args); - } - const expectedLength = (msg.match(/%[dfijoOs]/g) || []).length; - assert(expectedLength === args.length, `Code: ${key}; The provided arguments length (${args.length}) does not match the required ones (${expectedLength}).`); - if (args.length === 0) { - return msg; - } - return format(msg, ...args); - } - function E(code, message, Base) { - if (!Base) { - Base = Error; - } - class NodeError extends Base { - constructor(...args) { - super(getMessage(code, message, args)); - } - toString() { - return `${this.name} [${code}]: ${this.message}`; - } - } - NodeError.prototype.name = Base.name; - NodeError.prototype.code = code; - NodeError.prototype[kIsNodeError] = true; - NodeError.prototype.toString = function() { - return `${this.name} [${code}]: ${this.message}`; - }; - codes[code] = NodeError; + // node_modules/readable-stream/lib/internal/streams/compose.js + var require_compose = __commonJS({ + "node_modules/readable-stream/lib/internal/streams/compose.js"( + exports, + module + ) { + "use strict"; + init_process_shim(); + var { pipeline } = require_pipeline(); + var Duplex = require_duplex(); + var { destroyer } = require_destroy(); + var { isNodeStream, isReadable, isWritable } = require_utils(); + var { + AbortError, + codes: { ERR_INVALID_ARG_VALUE, ERR_MISSING_ARGS }, + } = require_errors(); + module.exports = function compose(...streams) { + if (streams.length === 0) { + throw new ERR_MISSING_ARGS("streams"); + } + if (streams.length === 1) { + return Duplex.from(streams[0]); + } + const orgStreams = [...streams]; + if (typeof streams[0] === "function") { + streams[0] = Duplex.from(streams[0]); + } + if (typeof streams[streams.length - 1] === "function") { + const idx = streams.length - 1; + streams[idx] = Duplex.from(streams[idx]); + } + for (let n = 0; n < streams.length; ++n) { + if (!isNodeStream(streams[n])) { + continue; + } + if (n < streams.length - 1 && !isReadable(streams[n])) { + throw new ERR_INVALID_ARG_VALUE( + `streams[${n}]`, + orgStreams[n], + "must be readable" + ); + } + if (n > 0 && !isWritable(streams[n])) { + throw new ERR_INVALID_ARG_VALUE( + `streams[${n}]`, + orgStreams[n], + "must be writable" + ); + } + } + let ondrain; + let onfinish; + let onreadable; + let onclose; + let d; + function onfinished(err) { + const cb = onclose; + onclose = null; + if (cb) { + cb(err); + } else if (err) { + d.destroy(err); + } else if (!readable && !writable) { + d.destroy(); + } + } + const head = streams[0]; + const tail = pipeline(streams, onfinished); + const writable = !!isWritable(head); + const readable = !!isReadable(tail); + d = new Duplex({ + writableObjectMode: !!( + head !== null && + head !== void 0 && + head.writableObjectMode + ), + readableObjectMode: !!( + tail !== null && + tail !== void 0 && + tail.writableObjectMode + ), + writable, + readable, + }); + if (writable) { + d._write = function (chunk, encoding, callback) { + if (head.write(chunk, encoding)) { + callback(); + } else { + ondrain = callback; + } + }; + d._final = function (callback) { + head.end(); + onfinish = callback; + }; + head.on("drain", function () { + if (ondrain) { + const cb = ondrain; + ondrain = null; + cb(); + } + }); + tail.on("finish", function () { + if (onfinish) { + const cb = onfinish; + onfinish = null; + cb(); + } + }); + } + if (readable) { + tail.on("readable", function () { + if (onreadable) { + const cb = onreadable; + onreadable = null; + cb(); + } + }); + tail.on("end", function () { + d.push(null); + }); + d._read = function () { + while (true) { + const buf = tail.read(); + if (buf === null) { + onreadable = d._read; + return; + } + if (!d.push(buf)) { + return; + } + } + }; + } + d._destroy = function (err, callback) { + if (!err && onclose !== null) { + err = new AbortError(); + } + onreadable = null; + ondrain = null; + onfinish = null; + if (onclose === null) { + callback(err); + } else { + onclose = callback; + destroyer(tail, err); + } + }; + return d; + }; + }, + }); + + // node_modules/readable-stream/lib/stream/promises.js + var require_promises = __commonJS({ + "node_modules/readable-stream/lib/stream/promises.js"(exports, module) { + "use strict"; + init_process_shim(); + var { ArrayPrototypePop, Promise: Promise2 } = require_primordials(); + var { isIterable, isNodeStream } = require_utils(); + var { pipelineImpl: pl } = require_pipeline(); + var { finished } = require_end_of_stream(); + function pipeline(...streams) { + return new Promise2((resolve, reject) => { + let signal; + let end; + const lastArg = streams[streams.length - 1]; + if ( + lastArg && + typeof lastArg === "object" && + !isNodeStream(lastArg) && + !isIterable(lastArg) + ) { + const options = ArrayPrototypePop(streams); + signal = options.signal; + end = options.end; + } + pl( + streams, + (err, value) => { + if (err) { + reject(err); + } else { + resolve(value); + } + }, + { + signal, + end, } - function hideStackFrames(fn) { - const hidden = nodeInternalPrefix + fn.name; - Object.defineProperty(fn, "name", { - value: hidden - }); - return fn; + ); + }); + } + module.exports = { + finished, + pipeline, + }; + }, + }); + + // node_modules/readable-stream/lib/stream.js + var require_stream = __commonJS({ + "node_modules/readable-stream/lib/stream.js"(exports, module) { + "use strict"; + init_process_shim(); + var { ObjectDefineProperty, ObjectKeys, ReflectApply } = + require_primordials(); + var { + promisify: { custom: customPromisify }, + } = require_util(); + var { streamReturningOperators, promiseReturningOperators } = + require_operators(); + var { + codes: { ERR_ILLEGAL_CONSTRUCTOR }, + } = require_errors(); + var compose = require_compose(); + var { pipeline } = require_pipeline(); + var { destroyer } = require_destroy(); + var eos = require_end_of_stream(); + var promises = require_promises(); + var utils = require_utils(); + var Stream = (module.exports = require_legacy().Stream); + Stream.isDisturbed = utils.isDisturbed; + Stream.isErrored = utils.isErrored; + Stream.isReadable = utils.isReadable; + Stream.Readable = require_readable(); + for (const key of ObjectKeys(streamReturningOperators)) { + let fn = function (...args) { + if (new.target) { + throw ERR_ILLEGAL_CONSTRUCTOR(); + } + return Stream.Readable.from(ReflectApply(op, this, args)); + }; + const op = streamReturningOperators[key]; + ObjectDefineProperty(fn, "name", { + value: op.name, + }); + ObjectDefineProperty(fn, "length", { + value: op.length, + }); + ObjectDefineProperty(Stream.Readable.prototype, key, { + value: fn, + enumerable: false, + configurable: true, + writable: true, + }); + } + for (const key of ObjectKeys(promiseReturningOperators)) { + let fn = function (...args) { + if (new.target) { + throw ERR_ILLEGAL_CONSTRUCTOR(); + } + return ReflectApply(op, this, args); + }; + const op = promiseReturningOperators[key]; + ObjectDefineProperty(fn, "name", { + value: op.name, + }); + ObjectDefineProperty(fn, "length", { + value: op.length, + }); + ObjectDefineProperty(Stream.Readable.prototype, key, { + value: fn, + enumerable: false, + configurable: true, + writable: true, + }); + } + Stream.Writable = require_writable(); + Stream.Duplex = require_duplex(); + Stream.Transform = require_transform(); + Stream.PassThrough = require_passthrough(); + Stream.pipeline = pipeline; + var { addAbortSignal } = require_add_abort_signal(); + Stream.addAbortSignal = addAbortSignal; + Stream.finished = eos; + Stream.destroy = destroyer; + Stream.compose = compose; + ObjectDefineProperty(Stream, "promises", { + configurable: true, + enumerable: true, + get() { + return promises; + }, + }); + ObjectDefineProperty(pipeline, customPromisify, { + enumerable: true, + get() { + return promises.pipeline; + }, + }); + ObjectDefineProperty(eos, customPromisify, { + enumerable: true, + get() { + return promises.finished; + }, + }); + Stream.Stream = Stream; + Stream._isUint8Array = function isUint8Array(value) { + return value instanceof Uint8Array; + }; + Stream._uint8ArrayToBuffer = function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength); + }; + }, + }); + + // node_modules/readable-stream/lib/ours/index.js + var require_ours = __commonJS({ + "node_modules/readable-stream/lib/ours/index.js"(exports, module) { + "use strict"; + init_process_shim(); + var Stream = require_stream2(); + if (Stream && process.env.READABLE_STREAM === "disable") { + const promises = Stream.promises; + module.exports._uint8ArrayToBuffer = Stream._uint8ArrayToBuffer; + module.exports._isUint8Array = Stream._isUint8Array; + module.exports.isDisturbed = Stream.isDisturbed; + module.exports.isErrored = Stream.isErrored; + module.exports.isReadable = Stream.isReadable; + module.exports.Readable = Stream.Readable; + module.exports.Writable = Stream.Writable; + module.exports.Duplex = Stream.Duplex; + module.exports.Transform = Stream.Transform; + module.exports.PassThrough = Stream.PassThrough; + module.exports.addAbortSignal = Stream.addAbortSignal; + module.exports.finished = Stream.finished; + module.exports.destroy = Stream.destroy; + module.exports.pipeline = Stream.pipeline; + module.exports.compose = Stream.compose; + Object.defineProperty(Stream, "promises", { + configurable: true, + enumerable: true, + get() { + return promises; + }, + }); + module.exports.Stream = Stream.Stream; + } else { + const CustomStream = require_stream(); + const promises = require_promises(); + const originalDestroy = CustomStream.Readable.destroy; + module.exports = CustomStream.Readable; + module.exports._uint8ArrayToBuffer = CustomStream._uint8ArrayToBuffer; + module.exports._isUint8Array = CustomStream._isUint8Array; + module.exports.isDisturbed = CustomStream.isDisturbed; + module.exports.isErrored = CustomStream.isErrored; + module.exports.isReadable = CustomStream.isReadable; + module.exports.Readable = CustomStream.Readable; + module.exports.Writable = CustomStream.Writable; + module.exports.Duplex = CustomStream.Duplex; + module.exports.Transform = CustomStream.Transform; + module.exports.PassThrough = CustomStream.PassThrough; + module.exports.addAbortSignal = CustomStream.addAbortSignal; + module.exports.finished = CustomStream.finished; + module.exports.destroy = CustomStream.destroy; + module.exports.destroy = originalDestroy; + module.exports.pipeline = CustomStream.pipeline; + module.exports.compose = CustomStream.compose; + Object.defineProperty(CustomStream, "promises", { + configurable: true, + enumerable: true, + get() { + return promises; + }, + }); + module.exports.Stream = CustomStream.Stream; + } + module.exports.default = module.exports; + }, + }); + + // ../../graalvm-react/src/main/node/stream/index.js + var require_stream2 = __commonJS({ + "../../graalvm-react/src/main/node/stream/index.js"(exports, module) { + init_process_shim(); + var { Readable, Writable, Transform, Duplex, pipeline, finished } = + require_ours(); + module.exports.Readable = Readable; + module.exports.Writable = Writable; + module.exports.Transform = Transform; + module.exports.Duplex = Duplex; + module.exports.pipeline = pipeline; + module.exports.finished = finished; + }, + }); + + // node_modules/react-dom/cjs/react-dom-server-legacy.node.production.min.js + var require_react_dom_server_legacy_node_production_min = __commonJS({ + "node_modules/react-dom/cjs/react-dom-server-legacy.node.production.min.js"( + exports + ) { + "use strict"; + init_process_shim(); + var ea = require_react(); + var fa = require_stream2(); + var n = Object.prototype.hasOwnProperty; + var ha = + /^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/; + var ia = {}; + var ja = {}; + function ka(a) { + if (n.call(ja, a)) return true; + if (n.call(ia, a)) return false; + if (ha.test(a)) return (ja[a] = true); + ia[a] = true; + return false; + } + function q(a, b, c, d, f, e, g) { + this.acceptsBooleans = b === 2 || b === 3 || b === 4; + this.attributeName = d; + this.attributeNamespace = f; + this.mustUseProperty = c; + this.propertyName = a; + this.type = b; + this.sanitizeURL = e; + this.removeEmptyString = g; + } + var r = {}; + "children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style" + .split(" ") + .forEach(function (a) { + r[a] = new q(a, 0, false, a, null, false, false); + }); + [ + ["acceptCharset", "accept-charset"], + ["className", "class"], + ["htmlFor", "for"], + ["httpEquiv", "http-equiv"], + ].forEach(function (a) { + var b = a[0]; + r[b] = new q(b, 1, false, a[1], null, false, false); + }); + ["contentEditable", "draggable", "spellCheck", "value"].forEach(function ( + a + ) { + r[a] = new q(a, 2, false, a.toLowerCase(), null, false, false); + }); + [ + "autoReverse", + "externalResourcesRequired", + "focusable", + "preserveAlpha", + ].forEach(function (a) { + r[a] = new q(a, 2, false, a, null, false, false); + }); + "allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope" + .split(" ") + .forEach(function (a) { + r[a] = new q(a, 3, false, a.toLowerCase(), null, false, false); + }); + ["checked", "multiple", "muted", "selected"].forEach(function (a) { + r[a] = new q(a, 3, true, a, null, false, false); + }); + ["capture", "download"].forEach(function (a) { + r[a] = new q(a, 4, false, a, null, false, false); + }); + ["cols", "rows", "size", "span"].forEach(function (a) { + r[a] = new q(a, 6, false, a, null, false, false); + }); + ["rowSpan", "start"].forEach(function (a) { + r[a] = new q(a, 5, false, a.toLowerCase(), null, false, false); + }); + var la = /[\-:]([a-z])/g; + function ma(a) { + return a[1].toUpperCase(); + } + "accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height" + .split(" ") + .forEach(function (a) { + var b = a.replace(la, ma); + r[b] = new q(b, 1, false, a, null, false, false); + }); + "xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type" + .split(" ") + .forEach(function (a) { + var b = a.replace(la, ma); + r[b] = new q( + b, + 1, + false, + a, + "http://www.w3.org/1999/xlink", + false, + false + ); + }); + ["xml:base", "xml:lang", "xml:space"].forEach(function (a) { + var b = a.replace(la, ma); + r[b] = new q( + b, + 1, + false, + a, + "http://www.w3.org/XML/1998/namespace", + false, + false + ); + }); + ["tabIndex", "crossOrigin"].forEach(function (a) { + r[a] = new q(a, 1, false, a.toLowerCase(), null, false, false); + }); + r.xlinkHref = new q( + "xlinkHref", + 1, + false, + "xlink:href", + "http://www.w3.org/1999/xlink", + true, + false + ); + ["src", "href", "action", "formAction"].forEach(function (a) { + r[a] = new q(a, 1, false, a.toLowerCase(), null, true, true); + }); + var t = { + animationIterationCount: true, + aspectRatio: true, + borderImageOutset: true, + borderImageSlice: true, + borderImageWidth: true, + boxFlex: true, + boxFlexGroup: true, + boxOrdinalGroup: true, + columnCount: true, + columns: true, + flex: true, + flexGrow: true, + flexPositive: true, + flexShrink: true, + flexNegative: true, + flexOrder: true, + gridArea: true, + gridRow: true, + gridRowEnd: true, + gridRowSpan: true, + gridRowStart: true, + gridColumn: true, + gridColumnEnd: true, + gridColumnSpan: true, + gridColumnStart: true, + fontWeight: true, + lineClamp: true, + lineHeight: true, + opacity: true, + order: true, + orphans: true, + tabSize: true, + widows: true, + zIndex: true, + zoom: true, + fillOpacity: true, + floodOpacity: true, + stopOpacity: true, + strokeDasharray: true, + strokeDashoffset: true, + strokeMiterlimit: true, + strokeOpacity: true, + strokeWidth: true, + }; + var na = ["Webkit", "ms", "Moz", "O"]; + Object.keys(t).forEach(function (a) { + na.forEach(function (b) { + b = b + a.charAt(0).toUpperCase() + a.substring(1); + t[b] = t[a]; + }); + }); + var oa = /["'&<>]/; + function u(a) { + if (typeof a === "boolean" || typeof a === "number") return "" + a; + a = "" + a; + var b = oa.exec(a); + if (b) { + var c = "", + d, + f = 0; + for (d = b.index; d < a.length; d++) { + switch (a.charCodeAt(d)) { + case 34: + b = """; + break; + case 38: + b = "&"; + break; + case 39: + b = "'"; + break; + case 60: + b = "<"; + break; + case 62: + b = ">"; + break; + default: + continue; + } + f !== d && (c += a.substring(f, d)); + f = d + 1; + c += b; + } + a = f !== d ? c + a.substring(f, d) : c; + } + return a; + } + var pa = /([A-Z])/g; + var qa = /^ms-/; + var ra = Array.isArray; + function v(a, b) { + return { insertionMode: a, selectedValue: b }; + } + function sa(a, b, c) { + switch (b) { + case "select": + return v(1, c.value != null ? c.value : c.defaultValue); + case "svg": + return v(2, null); + case "math": + return v(3, null); + case "foreignObject": + return v(1, null); + case "table": + return v(4, null); + case "thead": + case "tbody": + case "tfoot": + return v(5, null); + case "colgroup": + return v(7, null); + case "tr": + return v(6, null); + } + return 4 <= a.insertionMode || a.insertionMode === 0 ? v(1, null) : a; + } + var ta = /* @__PURE__ */ new Map(); + function ua(a, b, c) { + if (typeof c !== "object") + throw Error( + "The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX." + ); + b = true; + for (var d in c) + if (n.call(c, d)) { + var f = c[d]; + if (f != null && typeof f !== "boolean" && f !== "") { + if (d.indexOf("--") === 0) { + var e = u(d); + f = u(("" + f).trim()); + } else { + e = d; + var g = ta.get(e); + g !== void 0 + ? (e = g) + : ((g = u( + e.replace(pa, "-$1").toLowerCase().replace(qa, "-ms-") + )), + ta.set(e, g), + (e = g)); + f = + typeof f === "number" + ? f === 0 || n.call(t, d) + ? "" + f + : f + "px" + : u(("" + f).trim()); + } + b + ? ((b = false), a.push(' style="', e, ":", f)) + : a.push(";", e, ":", f); + } + } + b || a.push('"'); + } + function w(a, b, c, d) { + switch (c) { + case "style": + ua(a, b, d); + return; + case "defaultValue": + case "defaultChecked": + case "innerHTML": + case "suppressContentEditableWarning": + case "suppressHydrationWarning": + return; + } + if ( + !(2 < c.length) || + (c[0] !== "o" && c[0] !== "O") || + (c[1] !== "n" && c[1] !== "N") + ) { + if (((b = r.hasOwnProperty(c) ? r[c] : null), b !== null)) { + switch (typeof d) { + case "function": + case "symbol": + return; + case "boolean": + if (!b.acceptsBooleans) return; + } + c = b.attributeName; + switch (b.type) { + case 3: + d && a.push(" ", c, '=""'); + break; + case 4: + d === true + ? a.push(" ", c, '=""') + : d !== false && a.push(" ", c, '="', u(d), '"'); + break; + case 5: + isNaN(d) || a.push(" ", c, '="', u(d), '"'); + break; + case 6: + !isNaN(d) && 1 <= d && a.push(" ", c, '="', u(d), '"'); + break; + default: + b.sanitizeURL && (d = "" + d), a.push(" ", c, '="', u(d), '"'); + } + } else if (ka(c)) { + switch (typeof d) { + case "function": + case "symbol": + return; + case "boolean": + if ( + ((b = c.toLowerCase().slice(0, 5)), + b !== "data-" && b !== "aria-") + ) + return; + } + a.push(" ", c, '="', u(d), '"'); + } + } + } + function x(a, b, c) { + if (b != null) { + if (c != null) + throw Error( + "Can only set one of `children` or `props.dangerouslySetInnerHTML`." + ); + if (typeof b !== "object" || !("__html" in b)) + throw Error( + "`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://reactjs.org/link/dangerously-set-inner-html for more information." + ); + b = b.__html; + b !== null && b !== void 0 && a.push("" + b); + } + } + function va(a) { + var b = ""; + ea.Children.forEach(a, function (a2) { + a2 != null && (b += a2); + }); + return b; + } + function wa(a, b, c, d) { + a.push(z(c)); + var f = (c = null), + e; + for (e in b) + if (n.call(b, e)) { + var g = b[e]; + if (g != null) + switch (e) { + case "children": + c = g; + break; + case "dangerouslySetInnerHTML": + f = g; + break; + default: + w(a, d, e, g); + } + } + a.push(">"); + x(a, f, c); + return typeof c === "string" ? (a.push(u(c)), null) : c; + } + var xa = /^[a-zA-Z][a-zA-Z:_\.\-\d]*$/; + var ya = /* @__PURE__ */ new Map(); + function z(a) { + var b = ya.get(a); + if (b === void 0) { + if (!xa.test(a)) throw Error("Invalid tag: " + a); + b = "<" + a; + ya.set(a, b); + } + return b; + } + function za(a, b, c, d, f) { + switch (b) { + case "select": + a.push(z("select")); + var e = null, + g = null; + for (l in c) + if (n.call(c, l)) { + var h = c[l]; + if (h != null) + switch (l) { + case "children": + e = h; + break; + case "dangerouslySetInnerHTML": + g = h; + break; + case "defaultValue": + case "value": + break; + default: + w(a, d, l, h); + } + } + a.push(">"); + x(a, g, e); + return e; + case "option": + g = f.selectedValue; + a.push(z("option")); + var k = (h = null), + m = null; + var l = null; + for (e in c) + if (n.call(c, e)) { + var p = c[e]; + if (p != null) + switch (e) { + case "children": + h = p; + break; + case "selected": + m = p; + break; + case "dangerouslySetInnerHTML": + l = p; + break; + case "value": + k = p; + default: + w(a, d, e, p); + } + } + if (g != null) + if (((c = k !== null ? "" + k : va(h)), ra(g))) + for (d = 0; d < g.length; d++) { + if ("" + g[d] === c) { + a.push(' selected=""'); + break; + } + } + else "" + g === c && a.push(' selected=""'); + else m && a.push(' selected=""'); + a.push(">"); + x(a, l, h); + return h; + case "textarea": + a.push(z("textarea")); + l = g = e = null; + for (h in c) + if (n.call(c, h) && ((k = c[h]), k != null)) + switch (h) { + case "children": + l = k; + break; + case "value": + e = k; + break; + case "defaultValue": + g = k; + break; + case "dangerouslySetInnerHTML": + throw Error( + "`dangerouslySetInnerHTML` does not make sense on